void CL_ListView_Impl::update_scrollbar() { cancel_edit(); if (!layout) { return; } CL_Rect rect( rect_content.get_width()-scrollbar->get_preferred_width(), rect_content.top, rect_content.get_width(), rect_content.get_height()); scrollbar->set_geometry(rect); int total_height = layout->get_total_size().height; bool visible = total_height > rect_columns_content.get_height(); scrollbar->calculate_ranges(rect_columns_content.get_height(), total_height); scrollbar->set_line_step(layout->get_row_height()); scrollbar->set_visible(visible); if (visible == false) layout->set_scroll_offset(CL_Point(0, 0)); }
void CL_ListView_Impl::on_mouse_rbutton_down(CL_GUIMessage_Input &input, CL_InputEvent &input_event) { cancel_edit(); // This is intentional, NOT a typo! Call lbutton_down when rbutton_down happens. on_mouse_lbutton_down(input, input_event); }
void CL_ListView_Impl::update_part_positions() { cancel_edit(); CL_Rect rect(listview->get_geometry().get_size()); rect_content = part_component.get_content_box(rect); header->update_geometry(rect_content); rect_columns.left = rect_content.left; rect_columns.top = rect_content.top + header->get_geometry().get_height(); rect_columns.right = rect_content.right; rect_columns.bottom = rect_content.bottom; rect_columns_content = part_columns_bg.get_content_box(rect_columns); if (layout) { std::vector<ListViewColumn> &columns = layout->get_columns(); std::vector<ListViewColumn>::iterator it; for (it = columns.begin(); it != columns.end(); ++it) { ListViewColumn &col = (*it); col.rect.bottom = rect_columns_content.bottom; } layout->set_view_rect(rect_columns_content); } update_scrollbar(); }
void CL_ListView_Impl::on_scroll() { cancel_edit(); layout->set_scroll_offset(CL_Point(0,scrollbar->get_position())); layout->invalidate(); listview->request_repaint(); }
void CL_ListView_Impl::on_style_changed() { renderer->create_parts(); layout->create_parts(); layout->invalidate(); update_scrollbar(); listview->request_repaint(); cancel_edit(); }
end_edit(TableUI *tui) { if (is_editing(tui)) { char buf[65536]; /* An EDIT control's limit */ int len = GetWindowTextLength(tui->edit); GetWindowTextA (tui->edit, buf, len + 1); set_cell(tui->table, tui->cur_row, tui->cur_col, buf, len); cancel_edit(tui); redraw_rows(tui, tui->cur_row, tui->cur_row); } }
void CL_ListView_Impl::on_before_edit_item(CL_InputEvent &e) { if (edited_item.is_null()) return; if (e.type == CL_InputEvent::pressed) { if (e.id == CL_KEY_RETURN || e.id == CL_KEY_NUMPAD_ENTER) { CL_String col_id = header->get_first_column().get_column_id(); CL_String new_text = lineedit->get_text(); bool apply_change = true; if (!func_item_edited.is_null()) { apply_change = func_item_edited.invoke(edited_item, new_text); } if (apply_change) { edited_item.set_column_text(col_id, new_text); } edited_item.impl->selected = true; edited_item = CL_ListViewItem(); lineedit->set_text(""); lineedit->set_visible(false); lineedit->request_repaint(); listview->set_focus(); layout->invalidate(); } if (e.id == CL_KEY_ESCAPE) { cancel_edit(); listview->set_focus(); } } }
void CL_ListView_Impl::on_resized() { cancel_edit(); update_part_positions(); layout->invalidate(); }
void CL_ListView_Impl::on_column_added(CL_ListViewColumnHeader col) { cancel_edit(); update_part_positions(); }
void CL_ListView_Impl::on_process_message(CL_GUIMessage &msg) { if (msg.is_type(CL_GUIMessage_Input::get_type_name())) { CL_GUIMessage_Input input = msg; CL_InputEvent input_event = input.get_event(); if (input_event.type == CL_InputEvent::pointer_moved) { on_mouse_move(input, input_event); } else if (input_event.type == CL_InputEvent::pressed && input_event.id == CL_MOUSE_LEFT) { on_mouse_lbutton_down(input, input_event); msg.set_consumed(); } else if (input_event.type == CL_InputEvent::pressed && input_event.id == CL_MOUSE_WHEEL_UP) { scrollbar->set_position(scrollbar->get_position()-scrollbar->get_line_step()); on_scroll(); msg.set_consumed(); } else if (input_event.type == CL_InputEvent::pressed && input_event.id == CL_MOUSE_WHEEL_DOWN) { scrollbar->set_position(scrollbar->get_position() + scrollbar->get_line_step()); on_scroll(); msg.set_consumed(); } else if (input_event.type == CL_InputEvent::released && input_event.id == CL_MOUSE_LEFT) { on_mouse_lbutton_up(input, input_event); msg.set_consumed(); } else if (input_event.type == CL_InputEvent::doubleclick && input_event.id == CL_MOUSE_LEFT) { on_mouse_lbutton_doubleclick(input, input_event); msg.set_consumed(); } else if (input_event.type == CL_InputEvent::pressed && input_event.id == CL_MOUSE_RIGHT) { on_mouse_rbutton_down(input, input_event); msg.set_consumed(); } else if (input_event.type == CL_InputEvent::released && input_event.id == CL_MOUSE_RIGHT) { on_mouse_rbutton_up(input, input_event); msg.set_consumed(); } else if (input_event.type == CL_InputEvent::pressed && input_event.device.get_type() == CL_InputDevice::keyboard) { bool consumed = on_keyboard_pressed(input_event); if (consumed) msg.set_consumed(); } else if (input_event.type == CL_InputEvent::released && input_event.device.get_type() == CL_InputDevice::keyboard) { bool consumed = on_keyboard_released(input_event); if (consumed) msg.set_consumed(); } } else if (msg.is_type(CL_GUIMessage_Pointer::get_type_name())) { CL_GUIMessage_Pointer pointer = msg; if (pointer.get_pointer_type() == CL_GUIMessage_Pointer::pointer_leave) on_mouse_leave(); else if (pointer.get_pointer_type() == CL_GUIMessage_Pointer::pointer_enter) on_mouse_enter(); } else if (msg.is_type(CL_GUIMessage_FocusChange::get_type_name())) { CL_GUIMessage_FocusChange fc = msg; if (fc.get_focus_type() == CL_GUIMessage_FocusChange::gained_focus) { // .. } else { if (just_launched_lineedit) just_launched_lineedit = false; else cancel_edit(); } listview->request_repaint(); } }
void CL_ListView_Impl::on_lineedit_focus_lost() { cancel_edit(); }
void process_key() { Dword mouse_btn, ckeys, shift, ctrl; int mouse_x, mouse_y, dx = 0, dy = 0; // key pressed, read it Byte keyCode; ckeys = kos_GetSpecialKeyState(); shift = ckeys & 0x3; ctrl = ckeys & 0x0c; //if (ctrl) // rtlDebugOutString("control pressed!"); dx = 0, dy = 0; sel_moved = 0; sel_end_move = 0; kos_GetKey(keyCode); __asm { mov ah, keyCode } edit_box_key((dword)&cell_box); edit_box_key((dword)&file_box); switch (keyCode) { case 178: // стрелки //dx = 0; dy = -1; break; case 176: dx = -1; //dy = 0; break; case 179: dx = 1; //dy = 0; break; case 177: //dx = 0; dy = 1; break; /* case 183: if (sel_y < row_count-(ny - scroll_y)) // page down dy = ny - scroll_y; else dy = row_count-(ny - scroll_y) - sel_y; dx = 0; redraw = 1; break; case 184: if (sel_y > ny - scroll_y) // page up dy= - (ny - scroll_y); else dy = - (ny - scroll_y) + sel_y; dx = 0; redraw = 1; break; */ case 180: //home dx = -sel_x + 1; dy = 0; draw_grid(); //draw_window(); break; case 181: //end dx = col_count - (nx - scroll_x) - 1 - sel_x; dy = 0; draw_grid(); //draw_window(); break; case 27: // escape cancel_edit(); break; case 182: // delete { int i,j,n0,n1,k0,k1; n0 = min(sel_x, sel_end_x); n1 = max(sel_x, sel_end_x); k0 = min(sel_y, sel_end_y); k1 = max(sel_y, sel_end_y); for (i = n0; i <= n1; i++) for (j = k0; j <= k1; j++) { if (cells[i][j]) { freemem(cells[i][j]); cells[i][j] = NULL; } } calculate_values(); draw_grid(); break; } case 0x0D: // enter if (is_edit) { stop_edit(); draw_window(); } break; case 22: // contol-v { if (ctrl) { //rtlDebugOutString("control-v!"); int i, j, x0, y0; x0 = min(sel_x, sel_end_x); y0 = min(sel_y, sel_end_y); int delta_x = x0 - buf_old_x; int delta_y = y0 - buf_old_y; for (i = 0; i < buf_col; i++) for (j = 0; j < buf_row; j++) { if (i + x0 >= col_count || j + y0 >= row_count) continue; if (cells[i + x0][j + y0]) freemem(cells[i + x0][j + y0]); if (buffer[i][j]) { cf_x0 = buf_old_x; cf_y0 = buf_old_y; cf_x1 = buf_old_x + buf_col; cf_y1 = buf_old_y + buf_row; cells[i + x0][j + y0] = change_formula(buffer[i][j], delta_x, delta_y); //cells[i + x0][j + y0] = (char*)allocmem(strlen(buffer[i][j])); //strcpy(cells[i + x0][j + y0], buffer[i][j]); } else cells[i + x0][j + y0] = NULL; } calculate_values(); draw_window(); break; } } case 24: // control-x case 03: // control-c { if (ctrl) { //rtlDebugOutString("control-c!"); int i, j, x0, y0; freeBuffer(); buf_col = abs(sel_end_x - sel_x) + 1; buf_row = abs(sel_end_y - sel_y) + 1; x0 = min(sel_x, sel_end_x); y0 = min(sel_y, sel_end_y); buf_old_x = x0; buf_old_y = y0; //sprintf(debuf, "%U %U %U %U", buf_col, buf_row, x0, y0); //rtlDebugOutString(debuf); buffer = (char***)allocmem(buf_col * sizeof(char**)); for (i = 0; i < buf_col; i++) { buffer[i] = (char**)allocmem(buf_row * sizeof(char*)); for (j = 0; j < buf_row; j++) { if (cells[i + x0][j + y0]) { if (keyCode == 03) // ctrl-c { buffer[i][j] = (char*)allocmem(strlen(cells[i + x0][j + y0])); strcpy(buffer[i][j], cells[i + x0][j + y0]); } else { buffer[i][j] = cells[i + x0][j + y0]; cells[i + x0][j + y0] = NULL; } } else buffer[i][j] = NULL; } } if (keyCode == 24) calculate_values(); draw_window(); break; } } case 06: // control-f { display_formulas = !display_formulas; draw_grid(); //draw_window(); break; } default: if (!is_edit && !(file_box.flags & ed_focus)) { start_edit(sel_x, sel_y); if (keyCode == 8) { cell_box.pos = strlen(edit_text); } else { __asm { mov ah, keyCode } edit_box_key((dword)&cell_box); } } if (is_edit) edit_box_draw((dword)&cell_box); break; } if (dx != 0) { if (shift) { sel_end_x += dx; if (sel_end_x <= 1) sel_end_x = 1; else if (sel_end_x >= col_count) sel_end_x = col_count - 1; // sprintf(debuf,"sel end x change. sel end %U %U",sel_end_x,sel_end_y); // rtlDebugOutString(debuf); sel_moved = sel_end_move = 1; //stop_edit(); //draw_grid(); } else { } } if (dy != 0) { if (shift) { sel_end_y += dy; if (sel_end_y <= 1) sel_end_y = 1; else if (sel_end_y >= row_count) sel_end_y = row_count - 1; // sprintf(debuf,"sel end y change. sel end %U %U",sel_end_x,sel_end_y); // rtlDebugOutString(debuf); sel_moved = sel_end_move = 1; //stop_edit(); //draw_grid(); } } /* if (sel_end_x < sel_x) { Dword tmp = sel_end_x; sel_end_x = sel_x; sel_x = tmp; } if (sel_end_y < sel_y) { Dword tmp = sel_end_y; sel_end_y = sel_y; sel_y = tmp; } */ if ((dx || dy)) { if (!shift) { if ((sel_end_x + dx) >= (col_count-1)) {dx=0;} //заглушка else if ((sel_end_y + dy) >= (row_count-1)) {dy=0;} else { move_sel(sel_x + dx, sel_y + dy); } } else { sel_moved = 0; stop_edit(); draw_grid(); } } }
command(TableUI *tui, int cmd) { switch (cmd) { case CmdClearFile: clear_file(tui); break; case CmdOpenFile: clear_and_open(tui, tui->filename); if (row_count(tui->table) < MAX_ROWS_FOR_FIT && max_col_count(tui->table) < MAX_COLS_FOR_FIT) { unsigned i; for (i = 0; i < max_col_count(tui->table); i++) auto_resize_col(tui, i); } break; case CmdSaveFile: save_csv(tui, tui->filename); break; case CmdSetAnchor: set_anchor(tui); break; case CmdClearAnchor: clear_anchor(tui); break; case CmdClearRow: clear_selected_rows(tui); break; case CmdDeleteRow: delete_selected_rows(tui); break; case CmdDeleteCell: delete_selected_cells(tui); break; case CmdClearCell: clear_selected_cells(tui); break; case CmdCopy: copy_to_clipboard(tui); break; case CmdCutClear: copy_to_clipboard(tui); clear_selected_cells(tui); break; case CmdCutDelete: copy_to_clipboard(tui); delete_selected_cells(tui); break; case CmdPaste: clear_anchor(tui); paste_clipboard(tui); break; case CmdReturn: clear_anchor(tui); move_cursor(tui, 1, 0); break; case CmdTab: clear_anchor(tui); move_cursor(tui, 0, 1); break; case CmdUnReturn: clear_anchor(tui); move_cursor(tui, -1, 0); break; case CmdUnTab: clear_anchor(tui); move_cursor(tui, 0, -1); break; case CmdEditCell: start_edit(tui, 1); break; case CmdEditCellClear: start_edit(tui, 0); break; case CmdCommitEdit: end_edit(tui); break; case CmdCancelEdit: cancel_edit(tui); break; case CmdMoveUp: move_cursor(tui, -1, 0); break; case CmdMoveDown: move_cursor(tui, 1, 0); break; case CmdMoveLeft: move_cursor(tui, 0, -1); break; case CmdMoveRight: move_cursor(tui, 0, 1); break; case CmdScrollUp: scroll(tui, -1, 0); break; case CmdScrollDown: scroll(tui, 1, 0); break; case CmdScrollLeft: scroll(tui, 0, -1); break; case CmdScrollRight: scroll(tui, 0, 1); break; case CmdHomeCol: jump_cursor(tui, 0, tui->cur_col); break; case CmdHomeRow: jump_cursor(tui, tui->cur_row, 0); break; case CmdEndCol: jump_cursor(tui, row_count(tui->table) - 1, tui->cur_col); break; case CmdEndRow: jump_cursor(tui, tui->cur_row, col_count(tui->table, tui->cur_row) - 1); break; case CmdInsertDate: insert_datetime(tui, 0); break; case CmdInsertDateTime: insert_datetime(tui, 1); break; case CmdInsertCell: insert_cells(tui->table, tui->cur_row, tui->cur_col, 1); redraw_rows(tui, tui->cur_row, tui->cur_row); break; case CmdInsertRow: insert_rows(tui->table, tui->cur_row, 1); redraw_rows(tui, tui->cur_row, -1); break; case CmdFindColumn: find_cell_text_col(tui, tui->cur_row, tui->cur_col, tui->find_text); break; case CmdFindRow: find_cell_text_row(tui, tui->cur_row, tui->cur_col, tui->find_text); break; } }