📄 flv_table.cxx
字号:
if (edit_when() == FLV_EDIT_MANUAL) break; r = row(); c = col(); if (r < 0 || c < 0) break; cell_area(X, Y, W, H); stat = internal_handle(event); if (stat && r == row() && c == col() && x >= X && x < X + W && y >= Y && y < Y + H) { start_edit(); return 1; } return 0; } // If these are occur outside the editor, we don't want the // child widget processing them if (x < veditor->x() || y < veditor->y() || x > veditor->x() + veditor->w() || y > veditor->y() + veditor->h()) break; stat = veditor->handle(event); if (stat) { veditor->draw(); return 1; } break; } if (event == FL_SHORTCUT && vediting) { if (Fl::event_key() == FL_Enter) { end_edit(); Fl::focus(this); // take_focus(); internal_handle(FL_KEYBOARD); damage(FL_DAMAGE_CHILD); return 1; } switch (Fl::event_key()) { case FL_Shift_L: case FL_Shift_R: case FL_Control_L: case FL_Control_R: case FL_Meta_L: case FL_Meta_R: case FL_Alt_L: case FL_Alt_R: break; default: stat = internal_handle(FL_KEYBOARD); } } else { stat = internal_handle(event); if (!stat) { // Jump start editing if automatic if (event == FL_KEYBOARD && !vediting && edit_when() == FLV_EDIT_AUTOMATIC) { switch (Fl::event_key()) { case FL_Shift_L: case FL_Shift_R: case FL_Control_L: case FL_Control_R: case FL_Meta_L: case FL_Meta_R: case FL_Alt_L: case FL_Alt_R: break; default: start_edit(); if (veditor) { stat = veditor->handle(event); if (stat) { Fl::focus(veditor); // veditor->take_focus(); return 1; } } cancel_edit(); } } } } if (vediting && veditor && Fl::focus() == this) { Fl::focus(veditor);// veditor->take_focus(); veditor->handle(FL_FOCUS); } if (stat && veditor) veditor->draw(); return stat;}intFlv_Table::internal_handle(int event){ int TX, TY, r = 0, c, cd, rd; Flv_Style s; static int LX, LY; switch (event) { case FL_KEYBOARD: break; case FL_ENTER: case FL_LEAVE: vclicks = 0; return Fl_Group::handle(event); case FL_FOCUS: case FL_UNFOCUS: return 1; case FL_MOVE: TY = Fl::event_y(); TX = Fl::event_x(); if (LX - TX < -3 || LX - TX > 3 || LY - TY < -3 || LY - TY > 3) { LX = TX; LY = TY; vclicks = 0; } check_cursor(); return Fl_Group::handle(event); case FL_RELEASE: drag_row = drag_col = -4; Fl_Group::handle(event); return 1; case FL_DRAG: vclicks = 0; if (check_resize()) return 1; case FL_PUSH: // Dragging not clicking if (drag_row != -4 || drag_col != -4) {// Fl_Group::handle(event); return 1; } r = 0;#if FL_MAJOR_VERSION == 1 if (Fl::event_button1() && (buttons() & FLV_BUTTON1)) r = 1; if (Fl::event_button2() && (buttons() & FLV_BUTTON2)) r = 1; if (Fl::event_button3() && (buttons() & FLV_BUTTON3)) r = 1;#else if ((Fl::event_state() & FL_BUTTON1) && (buttons() & FLV_BUTTON1)) r = 1; if ((Fl::event_state() & FL_BUTTON2) && (buttons() & FLV_BUTTON2)) r = 1; if ((Fl::event_state() & FL_BUTTON3) && (buttons() & FLV_BUTTON3)) r = 1;#endif if (r == 0) { vclicks = 0; return 0; //return Fl_Group::handle(event); } // Determine if col was clicked and highlight it TY = Fl::event_y(); TX = Fl::event_x(); r = get_row(TX, TY); c = get_col(TX, TY); if ((r == -4 && c < 0) || (r < 0 && c == -4)) { vclicks = 0; return Fl_Group::handle(event); } if (LX - TX > -3 && LX - TX < 3 && LY - TY > -3 && LY - TY < 3) vclicks++; else { vclicks = 1; LX = TX; LY = TY; } damage(FL_DAMAGE_CHILD); rd = (r > row()? 1 : r == row()? 0 : -1); cd = (c > col()? 1 : c == col()? 0 : -1); if (r >= 0) row(r); if (c >= 0) col(c); if (!multi_select() || (event == FL_PUSH && !Fl::event_state(FL_SHIFT))) { select_start_row(row()); select_start_col(col()); } // At least one header clicked if (r < 0 || c < 0) { if (r > -4 && c > -4 && r < 0 && c < 0 && r != -3) { if (DOcb(FLVEcb_ALL_CLICKED)) { vwhy_event = FLVE_ALL_CLICKED; do_callback(this, user_data()); vwhy_event = 0; } return 1; } if (c >= 0 || r == -3) { vwhy_event = 0; switch (r) { case -3: if (DOcb(FLVEcb_TITLE_CLICKED)) vwhy_event = FLVE_TITLE_CLICKED; break; case -2: if (DOcb(FLVEcb_ROW_FOOTER_CLICKED)) vwhy_event = FLVE_ROW_FOOTER_CLICKED; break; case -1: if (DOcb(FLVEcb_ROW_HEADER_CLICKED)) vwhy_event = FLVE_ROW_HEADER_CLICKED; break; } if (vwhy_event) { do_callback(this, user_data()); vwhy_event = 0; return 1; } } if (r >= 0) { vwhy_event = 0; switch (c) { case -2: if (DOcb(FLVEcb_COL_FOOTER_CLICKED)) vwhy_event = FLVE_COL_FOOTER_CLICKED; break; case -1: if (DOcb(FLVEcb_COL_HEADER_CLICKED)) vwhy_event = FLVE_COL_HEADER_CLICKED; break; } if (vwhy_event) { do_callback(this, user_data()); vwhy_event = 0; return 1; } } return 0; } if (event == FL_PUSH && (rd || cd)) { // Skip over locked cells while (!select_locked()) { get_style(s, r, c); if (!s.locked()) { if (r != row() || c != col()) vclicks = 0; row(r); col(c); break; } r += rd; c += cd; if (r < 0 || r >= rows() || c < 0 || c >= cols()) break; } } if (event == FL_PUSH) { if (DOcb(FLVEcb_CLICKED)) { vwhy_event = FLVE_CLICKED; do_callback(this, user_data()); vwhy_event = 0; } if (vclicks >= vmax_clicks) vclicks = 0; } return 1; default: return Fl_Group::handle(event); } switch (Fl::event_key()) { case FL_Enter: switch (vmove_on_enter) { case FLV_MOVE_ON_ENTER_ROW_COL: if (!move_row(1)) { row(0); col(col() + 1); if (!select_locked()) { get_style(s, r, col()); if (!s.locked()) move_row(1); } } return 1; case FLV_MOVE_ON_ENTER_COL_ROW: if (!move_col(1)) { col(0); row(row() + 1); if (!select_locked()) { get_style(s, r, col()); if (!s.locked()) move_row(1); } } return 1; } return 0; case FL_Up: if (Fl::event_state(FL_CTRL)) move_row(-row()); else move_row(-1); break; case FL_Down: if (Fl::event_state(FL_CTRL)) move_row(rows()); else move_row(1); break; case FL_Page_Down: if (Fl::event_state(FL_CTRL)) move_row(rows()); else move_row(page_size()); break; case FL_Page_Up: if (Fl::event_state(FL_CTRL)) move_row(-row()); else move_row(-page_size()); break; case FL_Home: // Adjust rows before columns so we redraw everything if (Fl::event_state(FL_CTRL)) move_row(-rows()); move_col(-cols()); break; case FL_End: // Adjust rows before columns so we redraw everything if (Fl::event_state(FL_CTRL)) move_row(rows()); move_col(cols()); break; case FL_Right: if (select_row()) return 0; if (Fl::event_state(FL_CTRL)) move_col(cols()); else move_col(1); break; case FL_Left: if (select_row()) return 0; if (Fl::event_state(FL_CTRL)) move_col(-col()); else move_col(-1); break; default: return Fl_Group::handle(event); } if (!multi_select() || !Fl::event_state(FL_SHIFT)) { select_start_col(col()); select_start_row(row()); } return 1;}intFlv_Table::row(int n){ int X, Y, W, H; if (n >= rows()) n = rows() - 1; if (n < 0) n = 0; if (n != vrow) { vrow = n; client_area(X, Y, W, H); update_top_row(H); end_edit(); if (edit_when() == FLV_EDIT_ALWAYS) switch_editor(row(), col()); //cancel_edit(); vlast_row = vrow; if (DOcb(FLVEcb_ROW_CHANGED)) { vwhy_event = FLVE_ROW_CHANGED; do_callback(this, user_data()); vwhy_event = 0; } damage(FL_DAMAGE_CHILD); } return vrow;}intFlv_Table::col(int n){ if (n >= vcols) n = vcols - 1; if (n < 0) n = 0; if (n != vcol) { vcol = n; end_edit(); if (edit_when() == FLV_EDIT_ALWAYS) switch_editor(row(), col()); //cancel_edit(); adjust_for_cell(); if (DOcb(FLVEcb_COL_CHANGED)) { vwhy_event = FLVE_COL_CHANGED; do_callback(this, user_data()); vwhy_event = 0; } damage(FL_DAMAGE_CHILD); } return vcol;}boolFlv_Table::col_resizable(int c) // Get/set column locked status{ Flv_Style *s; bool l = true; if (global_style.resizable_defined()) l = global_style.resizable(); s = col_style.find(c); if (s) if (s->resizable_defined()) l = s->resizable(); return l;}boolFlv_Table::col_resizable(bool n, int c){ col_style[c].resizable(n); return n;}intFlv_Table::cols(int n){ if (n >= 0 && n != vcols) { vcols = n; if (vcol >= vcols) col(vcols - 1); if (vselect_col > vcol) select_start_col(vcol); update_width(); if (DOcb(FLVEcb_COLS_CHANGED)) { vwhy_event = FLVE_COLS_CHANGED; do_callback(this, user_data()); vwhy_event = 0; } damage(FL_DAMAGE_CHILD); } return vcols;}boolFlv_Table::col_selected(int n){ if (vselect_col < vcol) return (vselect_col <= n && n <= vcol); else return (vcol <= n && n <= vselect_col);}// Get column from x,yintFlv_Table::get_col(int x, int y){ int X, Y, W, H, CX; int rw, cw, t, Offset; client_area(X, Y, W, H); if (label()) { cw = row_height(-3); Y += cw; H -= cw; } if (col_header()) { cw = col_width(-1); if (X <= x && x <= X + cw) return -1; X += cw; W -= cw; } if (col_footer()) { cw = col_width(-2); if (X + W >= x && x >= X + W - cw) return -2; W -= cw; } rw = row_width(); if (!rw) rw = W; if (x < X || x >= X + W || y < Y || y >= Y + H || x > X - row_offset() + rw) return -4; Offset = row_offset(); for (CX = X, t = 0; t < vcols && CX - Offset < X + W; t++, CX += cw) { cw = col_width(t); if (x >= CX - Offset && x < CX - Offset + cw) return t; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -