static void iMatrixExPasteSetData(Ihandle *ih, const char* data, int data_num_lin, int data_num_col, char sep, int start_lin, int start_col, int num_lin, int num_col, const char* busyname) { ImatExData* matex_data = (ImatExData*)iupAttribGet(ih, "_IUP_MATEX_DATA"); int lin, col, len, l, c; char* value = NULL; int value_max_size = 0, value_len; iupMatrixExBusyStart(matex_data, data_num_lin*data_num_col, busyname); lin = start_lin; l = 0; while (lin <= num_lin && l<data_num_lin) { if (iupMatrixExIsLineVisible(ih, lin)) { const char* next_line = iupStrNextLine(data, &len); l++; col = start_col; c = 0; while (col <= num_col && c<data_num_col) { if (iupMatrixExIsColumnVisible(ih, col)) { const char* next_value = iupStrNextValue(data, len, &value_len, sep); c++; value = iMatrixExStrCopyValue(value, &value_max_size, data, value_len); iupMatrixExSetCellValue(matex_data->ih, lin, col, value); data = next_value; len -= value_len+1; if (!iupMatrixExBusyInc(matex_data)) { if (value) free(value); return; } } col++; } data = next_line; } lin++; } iupMatrixExBusyEnd(matex_data); if (value) free(value); iupBaseCallValueChangedCb(matex_data->ih); }
static int iMatrixSetRedoAttrib(Ihandle* ih, const char* value) { ImatExData* matex_data = (ImatExData*)iupAttribGet(ih, "_IUP_MATEX_DATA"); int undo_stack_count = matex_data->undo_stack? iupArrayCount(matex_data->undo_stack): 0; if (undo_stack_count && matex_data->undo_stack_pos<undo_stack_count) { int i, count = 1, total_cell_count = 0, undo_stack_count = iupArrayCount(matex_data->undo_stack); IundoData* undo_stack_data = (IundoData*)iupArrayGetData(matex_data->undo_stack); iupStrToInt(value, &count); if (count > undo_stack_count - matex_data->undo_stack_pos) count = undo_stack_count - matex_data->undo_stack_pos; for (i=0; i<count; i++) total_cell_count += undo_stack_data[matex_data->undo_stack_pos + i].cell_count; iMatrixSetUndoRedoAttrib(ih, "NO"); /* Disable Undo/Redo systrem during restore */ iupMatrixExBusyStart(matex_data, total_cell_count, "REDO"); for (i=0; i<count; i++) { if (!iMatrixExUndoDataSwap(matex_data, &(undo_stack_data[matex_data->undo_stack_pos + i]))) { matex_data->undo_stack_pos += i; iMatrixSetUndoRedoAttrib(ih, "Yes"); return 0; } } iupMatrixExBusyEnd(matex_data); iMatrixSetUndoRedoAttrib(ih, "Yes"); matex_data->undo_stack_pos += i; iupBaseCallValueChangedCb(ih); } return 0; }