From 612a097878de07556b76f7445a5564320987ff97 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=BCrgen=20Vigna?= Date: Mon, 7 Aug 2000 15:21:05 +0000 Subject: [PATCH] Better parbox use in tabulars, add of scrolling of inset and automatic scrolling of tabularinsets. Much better update performance in inset-tabular. Still some stuff todo. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@955 a592a061-630c-0410-9148-cb99ea01b6c8 --- ChangeLog | 41 ++++++++ src/BufferView_pimpl.C | 31 +++--- src/LyXAction.C | 2 + src/commandtags.h | 1 + src/frontends/xforms/FormCitation.C | 1 + src/frontends/xforms/FormTabular.C | 20 +--- src/frontends/xforms/FormUrl.C | 1 + src/frontends/xforms/form_tabular.C | 61 ++++++----- src/frontends/xforms/form_tabular.h | 3 +- src/frontends/xforms/forms/form_tabular.fd | 78 ++++++-------- src/insets/inset.C | 113 +++++++++++++++------ src/insets/insettabular.C | 99 ++++++++++-------- src/insets/insettabular.h | 4 +- src/insets/insettext.C | 35 +++++-- src/insets/insettext.h | 2 + src/insets/lyxinset.h | 17 ++-- src/lyxfunc.C | 1 + src/tabular.C | 48 ++++++--- src/tabular.h | 13 ++- src/text.C | 5 +- 20 files changed, 348 insertions(+), 228 deletions(-) diff --git a/ChangeLog b/ChangeLog index bc09f5e061..6c38709abf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,44 @@ +2000-08-07 Juergen Vigna + + * src/insets/insettabular.C (recomputeTextInsets): removed function + + * src/tabular.C (SetWidthOfMulticolCell): + (SetWidthOfCell): + (calculate_width_of_column_NMC): fixed return value so that it really + only returns true if the column-width has changed (there where + problems with muliticolumn-cells in this column). + +2000-08-04 Juergen Vigna + + * src/BufferView_pimpl.C (checkInsetHit): changed so that it looks + also on the scrollstatus of the inset. + (workAreaMotionNotify): ditto. + + * src/texrow.C (getIdFromRow): fixed compile problem on egcs-1.1.2. + +2000-08-01 Juergen Vigna + + * src/insets/insettabular.C (resetPos): scroll tabular automatically. + + * src/commandtags.h: + * src/LyXAction.C (init): + * src/insets/inset.C (LocalDispatch): added support for + LFUN_SCROLL_INSET. + + * src/insets/inset.C (scroll): new functions. + + * src/insets/insettext.C (removeNewlines): new function. + (SetAutoBreakRows): removes forced newlines in the text of the + paragraph if autoBreakRows is set to false. + + * src/tabular.C (Latex): generates a parbox around the cell contents + if needed. + + * src/frontends/xforms/FormTabular.C (local_update): removed + the radio_useparbox button. + + * src/tabular.C (UseParbox): new function + 2000-08-05 Lars Gullik Bjønnes * src/support/translator.h: move all typedefs to public section diff --git a/src/BufferView_pimpl.C b/src/BufferView_pimpl.C index f7151736c6..7dc44c6def 100644 --- a/src/BufferView_pimpl.C +++ b/src/BufferView_pimpl.C @@ -506,7 +506,8 @@ void BufferView::Pimpl::workAreaMotionNotify(int x, int y, unsigned int state) LyXCursor cursor = bv_->text->cursor; bv_->the_locking_inset-> InsetMotionNotify(bv_, - x - cursor.x(), + x - cursor.x() - + bv_->the_locking_inset->scroll(), y - cursor.y() + bv_->text->first, state); return; @@ -906,10 +907,7 @@ Inset * BufferView::Pimpl::checkInsetHit(LyXText * text, int & x, int & y, LyXCursor cursor; text->SetCursorFromCoordinates(bv_, cursor, x, y_tmp); -#if 0 // Are you planning to use this Jürgen? (Lgb) - bool move_cursor = ((cursor.par != text->cursor.par) || - (cursor.pos != text->cursor.pos())); -#endif + if (cursor.pos() < cursor.par()->Last() && cursor.par()->GetChar(cursor.pos()) == LyXParagraph::META_INSET && cursor.par()->GetInset(cursor.pos()) @@ -923,20 +921,17 @@ Inset * BufferView::Pimpl::checkInsetHit(LyXText * text, int & x, int & y, int start_x, end_x; if (is_rtl) { - start_x = cursor.x() - tmpinset->width(bv_, font); - end_x = cursor.x(); + start_x = cursor.x() - tmpinset->width(bv_, font) + tmpinset->scroll(); + end_x = cursor.x() + tmpinset->scroll(); } else { - start_x = cursor.x(); - end_x = cursor.x() + tmpinset->width(bv_, font); + start_x = cursor.x() + tmpinset->scroll(); + end_x = cursor.x() + tmpinset->width(bv_, font) + tmpinset->scroll(); } if (x > start_x && x < end_x && y_tmp > cursor.y() - tmpinset->ascent(bv_, font) && y_tmp < cursor.y() + tmpinset->descent(bv_, font)) { -#if 0 - if (move_cursor && (tmpinset != bv_->the_locking_inset)) -#endif - text->SetCursor(bv_, cursor.par(),cursor.pos(),true); + text->SetCursor(bv_, cursor.par(),cursor.pos(),true); x = x - start_x; // The origin of an inset is on the baseline y = y_tmp - (text->cursor.y()); @@ -955,11 +950,13 @@ Inset * BufferView::Pimpl::checkInsetHit(LyXText * text, int & x, int & y, int start_x, end_x; if (!is_rtl) { - start_x = cursor.x() - tmpinset->width(bv_, font); - end_x = cursor.x(); + start_x = cursor.x() - tmpinset->width(bv_, font) + + tmpinset->scroll(); + end_x = cursor.x() + tmpinset->scroll(); } else { - start_x = cursor.x(); - end_x = cursor.x() + tmpinset->width(bv_, font); + start_x = cursor.x() + tmpinset->scroll(); + end_x = cursor.x() + tmpinset->width(bv_, font) + + tmpinset->scroll(); } if (x > start_x && x < end_x && y_tmp > cursor.y() - tmpinset->ascent(bv_, font) diff --git a/src/LyXAction.C b/src/LyXAction.C index 0a80b37246..fae2dc2a4b 100644 --- a/src/LyXAction.C +++ b/src/LyXAction.C @@ -365,6 +365,8 @@ void LyXAction::init() { LFUN_CENTER, "screen-recenter", "", ReadOnly }, { LFUN_PRIOR, "screen-up", "", ReadOnly }, { LFUN_PRIORSEL, "screen-up-select", "", ReadOnly }, + { LFUN_SCROLL_INSET, "inset-scroll", N_("Scroll inset"), + ReadOnly }, { LFUN_SELFINSERT, "self-insert", "", Noop }, { LFUN_CHARATCURSOR, "server-char-after", "", ReadOnly }, { LFUN_GETFONT, "server-get-font", "", ReadOnly }, diff --git a/src/commandtags.h b/src/commandtags.h index 1789a476c7..93725f29d8 100644 --- a/src/commandtags.h +++ b/src/commandtags.h @@ -273,6 +273,7 @@ enum kb_action { LFUN_INSERT_URL, // Angus 20000726 LFUN_TABULAR_FEATURE, // Jug 20000728 LFUN_LAYOUT_TABULAR, // Jug 20000731 + LFUN_SCROLL_INSET, // Jug 20000801 LFUN_INDEX_INSERT, // Angus 20000803 LFUN_LASTACTION /* this marks the end of the table */ }; diff --git a/src/frontends/xforms/FormCitation.C b/src/frontends/xforms/FormCitation.C index 731e14e17e..5fb44e53c5 100644 --- a/src/frontends/xforms/FormCitation.C +++ b/src/frontends/xforms/FormCitation.C @@ -38,6 +38,7 @@ using std::find; FormCitation::FormCitation(LyXView * lv, Dialogs * d) : FormCommand(lv, d, _("Citation")), dialog_(0) { + dialog_ = 0; // let the dialog be shown // These are permanent connections so we won't bother // storing a copy because we won't be disconnecting. diff --git a/src/frontends/xforms/FormTabular.C b/src/frontends/xforms/FormTabular.C index 574fa10999..a7f15164c3 100644 --- a/src/frontends/xforms/FormTabular.C +++ b/src/frontends/xforms/FormTabular.C @@ -407,24 +407,13 @@ bool FormTabular::local_update(bool) fl_activate_object(column_options_->input_column_width); } if (!pwidth.empty()) { - fl_activate_object(cell_options_->radio_useparbox); fl_activate_object(cell_options_->radio_useminipage); - fl_set_object_lcol(cell_options_->radio_useparbox, FL_BLACK); fl_set_object_lcol(cell_options_->radio_useminipage, FL_BLACK); - fl_set_button(cell_options_->radio_useparbox, 0); - fl_set_button(cell_options_->radio_useminipage, 0); - switch (tabular->GetUsebox(cell)) { - case 1: - fl_set_button(cell_options_->radio_useparbox, 1); - break; - case 2: + if (tabular->GetUsebox(cell) == 2) fl_set_button(cell_options_->radio_useminipage, 1); - break; - } + else + fl_set_button(cell_options_->radio_useminipage, 0); } else { - fl_deactivate_object(cell_options_->radio_useparbox); - fl_set_object_lcol(cell_options_->radio_useparbox, FL_INACTIVE); - fl_set_button(cell_options_->radio_useparbox,0); fl_deactivate_object(cell_options_->radio_useminipage); fl_set_object_lcol(cell_options_->radio_useminipage, FL_INACTIVE); fl_set_button(cell_options_->radio_useminipage,0); @@ -674,9 +663,6 @@ void FormTabular::SetTabularOptions(FL_OBJECT * ob, long) num = LyXTabular::SET_ROTATE_CELL; else num = LyXTabular::UNSET_ROTATE_CELL; - } else if (ob == cell_options_->radio_useparbox) { - num = LyXTabular::SET_USEBOX; - special = "1"; } else if (ob == cell_options_->radio_useminipage) { num = LyXTabular::SET_USEBOX; special = "2"; diff --git a/src/frontends/xforms/FormUrl.C b/src/frontends/xforms/FormUrl.C index 8edfe11e16..f0495b546b 100644 --- a/src/frontends/xforms/FormUrl.C +++ b/src/frontends/xforms/FormUrl.C @@ -29,6 +29,7 @@ FormUrl::FormUrl(LyXView * lv, Dialogs * d) : FormCommand(lv, d, _("Url")), dialog_(0) { + dialog_ = 0; // let the dialog be shown // These are permanent connections so we won't bother // storing a copy because we won't be disconnecting. diff --git a/src/frontends/xforms/form_tabular.C b/src/frontends/xforms/form_tabular.C index e7f86c07dc..16045705aa 100644 --- a/src/frontends/xforms/form_tabular.C +++ b/src/frontends/xforms/form_tabular.C @@ -15,22 +15,22 @@ FD_form_tabular * FormTabular::build_tabular() FL_OBJECT *obj; FD_form_tabular *fdui = new FD_form_tabular; - fdui->form_tabular = fl_bgn_form(FL_NO_BOX, 510, 315); + fdui->form_tabular = fl_bgn_form(FL_NO_BOX, 510, 295); fdui->form_tabular->u_vdata = this; - obj = fl_add_box(FL_FLAT_BOX, 0, 0, 510, 315, ""); - fdui->tabFolder = obj = fl_add_tabfolder(FL_TOP_TABFOLDER, 0, 0, 505, 275, _("Tabbed folder")); + obj = fl_add_box(FL_FLAT_BOX, 0, 0, 510, 295, ""); + fdui->tabFolder = obj = fl_add_tabfolder(FL_TOP_TABFOLDER, 0, 0, 505, 250, _("Tabbed folder")); fl_set_object_resize(obj, FL_RESIZE_ALL); - fdui->button_close = obj = fl_add_button(FL_NORMAL_BUTTON, 415, 280, 90, 30, idex(_("Close|#C"))); + fdui->button_close = obj = fl_add_button(FL_NORMAL_BUTTON, 415, 260, 90, 30, idex(_("Close|#C"))); fl_set_button_shortcut(obj, scex(_("Close|#C")), 1); fl_set_object_lsize(obj, FL_NORMAL_SIZE); fl_set_object_callback(obj, C_FormTabularCloseCB, 0); - fdui->input_tabular_column = obj = fl_add_input(FL_NORMAL_INPUT, 65, 280, 60, 30, ""); + fdui->input_tabular_column = obj = fl_add_input(FL_NORMAL_INPUT, 65, 260, 60, 30, ""); fl_set_object_lsize(obj, FL_NORMAL_SIZE); fl_set_object_lalign(obj, FL_ALIGN_TOP_LEFT); - fdui->input_tabular_row = obj = fl_add_input(FL_NORMAL_INPUT, 5, 280, 60, 30, ""); + fdui->input_tabular_row = obj = fl_add_input(FL_NORMAL_INPUT, 5, 260, 60, 30, ""); fl_set_object_lsize(obj, FL_NORMAL_SIZE); fl_set_object_lalign(obj, FL_ALIGN_TOP_LEFT); - fdui->text_warning = obj = fl_add_text(FL_NORMAL_TEXT, 125, 275, 290, 30, ""); + fdui->text_warning = obj = fl_add_text(FL_NORMAL_TEXT, 125, 260, 290, 30, ""); fl_set_object_lsize(obj, FL_NORMAL_SIZE); fl_set_object_lalign(obj, FL_ALIGN_LEFT|FL_ALIGN_INSIDE); fl_set_object_lstyle(obj, FL_BOLD_STYLE); @@ -190,28 +190,28 @@ FD_form_cell_options * FormTabular::build_cell_options() FL_OBJECT *obj; FD_form_cell_options *fdui = new FD_form_cell_options; - fdui->form_cell_options = fl_bgn_form(FL_NO_BOX, 505, 257); + fdui->form_cell_options = fl_bgn_form(FL_NO_BOX, 505, 227); fdui->form_cell_options->u_vdata = this; - obj = fl_add_box(FL_UP_BOX, 0, 0, 505, 257, ""); - obj = fl_add_frame(FL_ENGRAVED_FRAME, 335, 145, 155, 100, ""); - obj = fl_add_frame(FL_ENGRAVED_FRAME, 10, 145, 180, 100, ""); + obj = fl_add_box(FL_UP_BOX, 0, 0, 505, 227, ""); + obj = fl_add_frame(FL_ENGRAVED_FRAME, 335, 115, 155, 100, ""); + obj = fl_add_frame(FL_ENGRAVED_FRAME, 10, 115, 180, 100, ""); fl_set_object_color(obj, FL_COL1, FL_COL1); fl_set_object_lsize(obj, FL_NORMAL_SIZE); - obj = fl_add_text(FL_NORMAL_TEXT, 15, 135, 70, 20, _("Borders")); + obj = fl_add_text(FL_NORMAL_TEXT, 15, 105, 70, 20, _("Borders")); fl_set_object_lsize(obj, FL_NORMAL_SIZE); fl_set_object_lalign(obj, FL_ALIGN_LEFT|FL_ALIGN_INSIDE); fl_set_object_lstyle(obj, FL_BOLD_STYLE); - obj = fl_add_frame(FL_ENGRAVED_FRAME, 195, 145, 130, 100, ""); + obj = fl_add_frame(FL_ENGRAVED_FRAME, 195, 115, 130, 100, ""); fl_set_object_color(obj, FL_COL1, FL_COL1); - obj = fl_add_text(FL_NORMAL_TEXT, 200, 135, 115, 20, _("H. Alignment")); + obj = fl_add_text(FL_NORMAL_TEXT, 200, 105, 115, 20, _("H. Alignment")); fl_set_object_lsize(obj, FL_NORMAL_SIZE); fl_set_object_lalign(obj, FL_ALIGN_LEFT|FL_ALIGN_INSIDE); fl_set_object_lstyle(obj, FL_BOLD_STYLE); - obj = fl_add_text(FL_NORMAL_TEXT, 345, 135, 115, 20, _("V. Alignment")); + obj = fl_add_text(FL_NORMAL_TEXT, 345, 105, 115, 20, _("V. Alignment")); fl_set_object_lsize(obj, FL_NORMAL_SIZE); fl_set_object_lalign(obj, FL_ALIGN_LEFT|FL_ALIGN_INSIDE); fl_set_object_lstyle(obj, FL_BOLD_STYLE); - obj = fl_add_frame(FL_ENGRAVED_FRAME, 10, 15, 150, 115, ""); + obj = fl_add_frame(FL_ENGRAVED_FRAME, 10, 15, 150, 90, ""); obj = fl_add_text(FL_NORMAL_TEXT, 15, 5, 140, 20, _("Special Cell")); fl_set_object_lsize(obj, FL_NORMAL_SIZE); fl_set_object_lalign(obj, FL_ALIGN_LEFT|FL_ALIGN_INSIDE); @@ -219,12 +219,9 @@ FD_form_cell_options * FormTabular::build_cell_options() fdui->radio_multicolumn = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 10, 25, 145, 25, idex(_("Multicolumn|#M"))); fl_set_button_shortcut(obj, scex(_("Multicolumn|#M")), 1); fl_set_object_callback(obj, C_FormTabularInputCB, 0); - fdui->radio_useparbox = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 10, 50, 145, 25, idex(_("Use ParBox|#U"))); - fl_set_button_shortcut(obj, scex(_("Use ParBox|#U")), 1); - fl_set_object_callback(obj, C_FormTabularInputCB, 0); - fdui->radio_rotate_cell = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 10, 100, 145, 25, _("Rotate 90°")); + fdui->radio_rotate_cell = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 10, 75, 145, 25, _("Rotate 90°")); fl_set_object_callback(obj, C_FormTabularInputCB, 0); - obj = fl_add_frame(FL_ENGRAVED_FRAME, 165, 15, 325, 115, ""); + obj = fl_add_frame(FL_ENGRAVED_FRAME, 165, 15, 325, 90, ""); fl_set_object_color(obj, FL_COL1, FL_COL1); fl_set_object_lsize(obj, FL_NORMAL_SIZE); fdui->input_special_multialign = obj = fl_add_input(FL_NORMAL_INPUT, 175, 30, 310, 30, ""); @@ -237,51 +234,51 @@ FD_form_cell_options * FormTabular::build_cell_options() fdui->input_mcolumn_width = obj = fl_add_input(FL_NORMAL_INPUT, 360, 65, 125, 30, _("Width of multi-column:")); fl_set_object_lsize(obj, FL_NORMAL_SIZE); fl_set_object_callback(obj, C_FormTabularInputCB, 0); - fdui->radio_border_top = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 75, 170, 25, 25, idex(_("Top|#t"))); + fdui->radio_border_top = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 75, 140, 25, 25, idex(_("Top|#t"))); fl_set_button_shortcut(obj, scex(_("Top|#t")), 1); fl_set_object_lsize(obj, FL_NORMAL_SIZE); fl_set_object_lalign(obj, FL_ALIGN_TOP_LEFT); fl_set_object_callback(obj, C_FormTabularInputCB, 0); - fdui->radio_border_bottom = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 75, 200, 25, 25, idex(_("Bottom|#b"))); + fdui->radio_border_bottom = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 75, 170, 25, 25, idex(_("Bottom|#b"))); fl_set_button_shortcut(obj, scex(_("Bottom|#b")), 1); fl_set_object_lsize(obj, FL_NORMAL_SIZE); fl_set_object_lalign(obj, FL_ALIGN_BOTTOM_LEFT); fl_set_object_callback(obj, C_FormTabularInputCB, 0); - fdui->radio_border_left = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 55, 185, 25, 25, idex(_("Left|#l"))); + fdui->radio_border_left = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 55, 155, 25, 25, idex(_("Left|#l"))); fl_set_button_shortcut(obj, scex(_("Left|#l")), 1); fl_set_object_lsize(obj, FL_NORMAL_SIZE); fl_set_object_lalign(obj, FL_ALIGN_LEFT); fl_set_object_callback(obj, C_FormTabularInputCB, 0); - fdui->radio_border_right = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 95, 185, 25, 25, idex(_("Right|#r"))); + fdui->radio_border_right = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 95, 155, 25, 25, idex(_("Right|#r"))); fl_set_button_shortcut(obj, scex(_("Right|#r")), 1); fl_set_object_lsize(obj, FL_NORMAL_SIZE); fl_set_object_lalign(obj, FL_ALIGN_RIGHT); fl_set_object_callback(obj, C_FormTabularInputCB, 0); - fdui->radio_align_left = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 195, 155, 110, 25, idex(_("Left|#e"))); + fdui->radio_align_left = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 195, 125, 110, 25, idex(_("Left|#e"))); fl_set_button_shortcut(obj, scex(_("Left|#e")), 1); fl_set_object_lsize(obj, FL_NORMAL_SIZE); fl_set_object_callback(obj, C_FormTabularInputCB, 0); - fdui->radio_align_right = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 195, 205, 115, 25, idex(_("Right|#i"))); + fdui->radio_align_right = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 195, 175, 115, 25, idex(_("Right|#i"))); fl_set_button_shortcut(obj, scex(_("Right|#i")), 1); fl_set_object_lsize(obj, FL_NORMAL_SIZE); fl_set_object_callback(obj, C_FormTabularInputCB, 0); - fdui->radio_align_center = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 195, 180, 115, 25, idex(_("Center|#c"))); + fdui->radio_align_center = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 195, 150, 115, 25, idex(_("Center|#c"))); fl_set_button_shortcut(obj, scex(_("Center|#c")), 1); fl_set_object_lsize(obj, FL_NORMAL_SIZE); fl_set_object_callback(obj, C_FormTabularInputCB, 0); - fdui->radio_valign_top = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 345, 155, 140, 25, idex(_("Top|#p"))); + fdui->radio_valign_top = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 345, 125, 140, 25, idex(_("Top|#p"))); fl_set_button_shortcut(obj, scex(_("Top|#p")), 1); fl_set_object_lsize(obj, FL_NORMAL_SIZE); fl_set_object_callback(obj, C_FormTabularInputCB, 0); - fdui->radio_valign_center = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 345, 180, 140, 25, idex(_("Center|#n"))); + fdui->radio_valign_center = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 345, 150, 140, 25, idex(_("Center|#n"))); fl_set_button_shortcut(obj, scex(_("Center|#n")), 1); fl_set_object_lsize(obj, FL_NORMAL_SIZE); fl_set_object_callback(obj, C_FormTabularInputCB, 0); - fdui->radio_valign_bottom = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 345, 205, 140, 25, idex(_("Bottom|#o"))); + fdui->radio_valign_bottom = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 345, 175, 140, 25, idex(_("Bottom|#o"))); fl_set_button_shortcut(obj, scex(_("Bottom|#o")), 1); fl_set_object_lsize(obj, FL_NORMAL_SIZE); fl_set_object_callback(obj, C_FormTabularInputCB, 0); - fdui->radio_useminipage = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 10, 75, 145, 25, idex(_("Use Minipage|#s"))); + fdui->radio_useminipage = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 10, 50, 145, 25, idex(_("Use Minipage|#s"))); fl_set_button_shortcut(obj, scex(_("Use Minipage|#s")), 1); fl_set_object_callback(obj, C_FormTabularInputCB, 0); fl_end_form(); diff --git a/src/frontends/xforms/form_tabular.h b/src/frontends/xforms/form_tabular.h index 74f646937a..e97f7c079d 100644 --- a/src/frontends/xforms/form_tabular.h +++ b/src/frontends/xforms/form_tabular.h @@ -1,4 +1,4 @@ -/** Header file generated with fdesign on Wed Aug 2 13:56:57 2000.**/ +/** Header file generated with fdesign on Tue Aug 1 15:15:57 2000.**/ #ifndef FD_form_tabular_h_ #define FD_form_tabular_h_ @@ -61,7 +61,6 @@ struct FD_form_cell_options { FL_FORM *form_cell_options; FL_OBJECT *radio_multicolumn; - FL_OBJECT *radio_useparbox; FL_OBJECT *radio_rotate_cell; FL_OBJECT *input_special_multialign; FL_OBJECT *input_mcolumn_width; diff --git a/src/frontends/xforms/forms/form_tabular.fd b/src/frontends/xforms/forms/form_tabular.fd index 841ed7d551..62c1999092 100644 --- a/src/frontends/xforms/forms/form_tabular.fd +++ b/src/frontends/xforms/forms/form_tabular.fd @@ -10,13 +10,13 @@ SnapGrid: 5 =============== FORM =============== Name: form_tabular Width: 510 -Height: 315 +Height: 295 Number of Objects: 6 -------------------- class: FL_BOX type: FLAT_BOX -box: 0 0 510 315 +box: 0 0 510 295 boxtype: FL_FLAT_BOX colors: FL_COL1 FL_COL1 alignment: FL_ALIGN_CENTER @@ -34,7 +34,7 @@ argument: -------------------- class: FL_TABFOLDER type: TOP_TABFOLDER -box: 0 0 505 275 +box: 0 0 505 250 boxtype: FL_UP_BOX colors: FL_COL1 FL_COL1 alignment: FL_ALIGN_TOP_LEFT @@ -52,7 +52,7 @@ argument: -------------------- class: FL_BUTTON type: NORMAL_BUTTON -box: 415 280 90 30 +box: 415 260 90 30 boxtype: FL_UP_BOX colors: FL_COL1 FL_COL1 alignment: FL_ALIGN_CENTER @@ -70,7 +70,7 @@ argument: 0 -------------------- class: FL_INPUT type: NORMAL_INPUT -box: 65 280 60 30 +box: 65 260 60 30 boxtype: FL_DOWN_BOX colors: FL_COL1 FL_MCOL alignment: FL_ALIGN_TOP_LEFT @@ -88,7 +88,7 @@ argument: -------------------- class: FL_INPUT type: NORMAL_INPUT -box: 5 280 60 30 +box: 5 260 60 30 boxtype: FL_DOWN_BOX colors: FL_COL1 FL_MCOL alignment: FL_ALIGN_TOP_LEFT @@ -106,7 +106,7 @@ argument: -------------------- class: FL_TEXT type: NORMAL_TEXT -box: 125 275 290 30 +box: 125 260 290 30 boxtype: FL_FLAT_BOX colors: FL_COL1 FL_MCOL alignment: FL_ALIGN_LEFT|FL_ALIGN_INSIDE @@ -712,13 +712,13 @@ argument: 0 =============== FORM =============== Name: form_cell_options Width: 505 -Height: 257 -Number of Objects: 27 +Height: 227 +Number of Objects: 26 -------------------- class: FL_BOX type: UP_BOX -box: 0 0 505 257 +box: 0 0 505 227 boxtype: FL_UP_BOX colors: FL_COL1 FL_COL1 alignment: FL_ALIGN_CENTER @@ -736,7 +736,7 @@ argument: -------------------- class: FL_FRAME type: ENGRAVED_FRAME -box: 335 145 155 100 +box: 335 115 155 100 boxtype: FL_NO_BOX colors: FL_BLACK FL_COL1 alignment: FL_ALIGN_CENTER @@ -754,7 +754,7 @@ argument: -------------------- class: FL_FRAME type: ENGRAVED_FRAME -box: 10 145 180 100 +box: 10 115 180 100 boxtype: FL_NO_BOX colors: FL_COL1 FL_COL1 alignment: FL_ALIGN_CENTER @@ -772,7 +772,7 @@ argument: -------------------- class: FL_TEXT type: NORMAL_TEXT -box: 15 135 70 20 +box: 15 105 70 20 boxtype: FL_FLAT_BOX colors: FL_COL1 FL_MCOL alignment: FL_ALIGN_LEFT|FL_ALIGN_INSIDE @@ -790,7 +790,7 @@ argument: -------------------- class: FL_FRAME type: ENGRAVED_FRAME -box: 195 145 130 100 +box: 195 115 130 100 boxtype: FL_NO_BOX colors: FL_COL1 FL_COL1 alignment: FL_ALIGN_CENTER @@ -808,7 +808,7 @@ argument: -------------------- class: FL_TEXT type: NORMAL_TEXT -box: 200 135 115 20 +box: 200 105 115 20 boxtype: FL_FLAT_BOX colors: FL_COL1 FL_MCOL alignment: FL_ALIGN_LEFT|FL_ALIGN_INSIDE @@ -826,7 +826,7 @@ argument: -------------------- class: FL_TEXT type: NORMAL_TEXT -box: 345 135 115 20 +box: 345 105 115 20 boxtype: FL_FLAT_BOX colors: FL_COL1 FL_MCOL alignment: FL_ALIGN_LEFT|FL_ALIGN_INSIDE @@ -844,7 +844,7 @@ argument: -------------------- class: FL_FRAME type: ENGRAVED_FRAME -box: 10 15 150 115 +box: 10 15 150 90 boxtype: FL_NO_BOX colors: FL_BLACK FL_COL1 alignment: FL_ALIGN_CENTER @@ -898,25 +898,7 @@ argument: 0 -------------------- class: FL_CHECKBUTTON type: PUSH_BUTTON -box: 10 50 145 25 -boxtype: FL_NO_BOX -colors: FL_COL1 FL_YELLOW -alignment: FL_ALIGN_CENTER -style: FL_NORMAL_STYLE -size: FL_DEFAULT_SIZE -lcol: FL_BLACK -label: Use ParBox|#U -shortcut: -resize: FL_RESIZE_ALL -gravity: FL_NoGravity FL_NoGravity -name: radio_useparbox -callback: C_FormTabularInputCB -argument: 0 - --------------------- -class: FL_CHECKBUTTON -type: PUSH_BUTTON -box: 10 100 145 25 +box: 10 75 145 25 boxtype: FL_NO_BOX colors: FL_COL1 FL_YELLOW alignment: FL_ALIGN_CENTER @@ -934,7 +916,7 @@ argument: 0 -------------------- class: FL_FRAME type: ENGRAVED_FRAME -box: 165 15 325 115 +box: 165 15 325 90 boxtype: FL_NO_BOX colors: FL_COL1 FL_COL1 alignment: FL_ALIGN_CENTER @@ -1006,7 +988,7 @@ argument: 0 -------------------- class: FL_CHECKBUTTON type: PUSH_BUTTON -box: 75 170 25 25 +box: 75 140 25 25 boxtype: FL_NO_BOX colors: FL_COL1 FL_YELLOW alignment: FL_ALIGN_TOP_LEFT @@ -1024,7 +1006,7 @@ argument: 0 -------------------- class: FL_CHECKBUTTON type: PUSH_BUTTON -box: 75 200 25 25 +box: 75 170 25 25 boxtype: FL_NO_BOX colors: FL_COL1 FL_YELLOW alignment: FL_ALIGN_BOTTOM_LEFT @@ -1042,7 +1024,7 @@ argument: 0 -------------------- class: FL_CHECKBUTTON type: PUSH_BUTTON -box: 55 185 25 25 +box: 55 155 25 25 boxtype: FL_NO_BOX colors: FL_COL1 FL_YELLOW alignment: FL_ALIGN_LEFT @@ -1060,7 +1042,7 @@ argument: 0 -------------------- class: FL_CHECKBUTTON type: PUSH_BUTTON -box: 95 185 25 25 +box: 95 155 25 25 boxtype: FL_NO_BOX colors: FL_COL1 FL_YELLOW alignment: FL_ALIGN_RIGHT @@ -1078,7 +1060,7 @@ argument: 0 -------------------- class: FL_CHECKBUTTON type: RADIO_BUTTON -box: 195 155 110 25 +box: 195 125 110 25 boxtype: FL_NO_BOX colors: FL_COL1 FL_YELLOW alignment: FL_ALIGN_CENTER @@ -1096,7 +1078,7 @@ argument: 0 -------------------- class: FL_CHECKBUTTON type: RADIO_BUTTON -box: 195 205 115 25 +box: 195 175 115 25 boxtype: FL_NO_BOX colors: FL_COL1 FL_YELLOW alignment: FL_ALIGN_CENTER @@ -1114,7 +1096,7 @@ argument: 0 -------------------- class: FL_CHECKBUTTON type: RADIO_BUTTON -box: 195 180 115 25 +box: 195 150 115 25 boxtype: FL_NO_BOX colors: FL_COL1 FL_YELLOW alignment: FL_ALIGN_CENTER @@ -1132,7 +1114,7 @@ argument: 0 -------------------- class: FL_CHECKBUTTON type: PUSH_BUTTON -box: 345 155 140 25 +box: 345 125 140 25 boxtype: FL_NO_BOX colors: FL_COL1 FL_YELLOW alignment: FL_ALIGN_CENTER @@ -1150,7 +1132,7 @@ argument: 0 -------------------- class: FL_CHECKBUTTON type: PUSH_BUTTON -box: 345 180 140 25 +box: 345 150 140 25 boxtype: FL_NO_BOX colors: FL_COL1 FL_YELLOW alignment: FL_ALIGN_CENTER @@ -1168,7 +1150,7 @@ argument: 0 -------------------- class: FL_CHECKBUTTON type: PUSH_BUTTON -box: 345 205 140 25 +box: 345 175 140 25 boxtype: FL_NO_BOX colors: FL_COL1 FL_YELLOW alignment: FL_ALIGN_CENTER @@ -1186,7 +1168,7 @@ argument: 0 -------------------- class: FL_CHECKBUTTON type: PUSH_BUTTON -box: 10 75 145 25 +box: 10 50 145 25 boxtype: FL_NO_BOX colors: FL_COL1 FL_YELLOW alignment: FL_ALIGN_CENTER diff --git a/src/insets/inset.C b/src/insets/inset.C index 333c1a6b2c..e948979a6b 100644 --- a/src/insets/inset.C +++ b/src/insets/inset.C @@ -14,11 +14,17 @@ #pragma implementation "lyxinset.h" #endif +#define SCROLL_INSET + #include "lyxinset.h" #include "debug.h" #include "BufferView.h" #include "support/lstrings.h" #include "Painter.h" +#ifdef SCROLL_INSET +#include "commandtags.h" +#include "support/lstrings.h" +#endif using std::endl; @@ -26,19 +32,19 @@ using std::endl; bool Inset::Deletable() const { - return true; + return true; } bool Inset::DirectWrite() const { - return false; + return false; } Inset::EDITABLE Inset::Editable() const { - return NOT_EDITABLE; + return NOT_EDITABLE; } @@ -49,7 +55,7 @@ void Inset::Validate(LaTeXFeatures &) const bool Inset::AutoDelete() const { - return false; + return false; } @@ -60,13 +66,13 @@ void Inset::Edit(BufferView *, int, int, unsigned int) LyXFont Inset::ConvertFont(LyXFont const & font) const { - return LyXFont(font); + return LyXFont(font); } char const * Inset::EditMessage() const { - return _("Opened inset"); + return _("Opened inset"); } @@ -83,41 +89,41 @@ LyXText * Inset::getLyXText(BufferView * bv) const void UpdatableInset::InsetButtonPress(BufferView *, int x, int y, int button) { - lyxerr.debug() << "Inset Button Press x=" << x - << ", y=" << y << ", button=" << button << endl; + lyxerr.debug() << "Inset Button Press x=" << x + << ", y=" << y << ", button=" << button << endl; } void UpdatableInset::InsetButtonRelease(BufferView *, int x, int y, int button) { - lyxerr.debug() << "Inset Button Release x=" << x - << ", y=" << y << ", button=" << button << endl; + lyxerr.debug() << "Inset Button Release x=" << x + << ", y=" << y << ", button=" << button << endl; } void UpdatableInset::InsetKeyPress(XKeyEvent *) { - lyxerr.debug() << "Inset Keypress" << endl; + lyxerr.debug() << "Inset Keypress" << endl; } void UpdatableInset::InsetMotionNotify(BufferView *, int x, int y, int state) { - lyxerr.debug() << "Inset Motion Notify x=" << x - << ", y=" << y << ", state=" << state << endl; + lyxerr.debug() << "Inset Motion Notify x=" << x + << ", y=" << y << ", state=" << state << endl; } void UpdatableInset::InsetUnlock(BufferView *) { - lyxerr.debug() << "Inset Unlock" << endl; + lyxerr.debug() << "Inset Unlock" << endl; } // An updatable inset is highly editable by definition Inset::EDITABLE UpdatableInset::Editable() const { - return HIGHLY_EDITABLE; + return HIGHLY_EDITABLE; } @@ -136,20 +142,15 @@ void UpdatableInset::HideInsetCursor(BufferView *) } -void UpdatableInset::Edit(BufferView * bv, int, int, unsigned int) +void UpdatableInset::Edit(BufferView *, int, int, unsigned int) { - LyXFont font; - - scx = 0; - - mx_scx = abs((width(bv, font) - bv->workWidth()) / 2); } void UpdatableInset::draw(BufferView *, LyXFont const &, int /* baseline */, float & x, bool/*cleared*/) const { - if (scx) x += float(scx); + x += float(scx); // ATTENTION: don't do the following here!!! // top_x = int(x); // top_baseline = baseline; @@ -161,10 +162,59 @@ void UpdatableInset::SetFont(BufferView *, LyXFont const &, bool ) } +#ifdef SCROLL_INSET +void UpdatableInset::scroll(BufferView * bv, float s) const +{ + LyXFont font; + + if (((top_x - scx) > 0) && + (top_x - scx + width(bv, font)) < bv->workWidth()) + return; + if ((s > 0) && (top_x > 0)) + return; + +// int mx_scx=abs((width(bv,font) - bv->workWidth())/2); + int save_scx = scx; + + scx = int(s*bv->workWidth()/2); +// if (!display()) +// scx += 20; + + if ((top_x - save_scx + scx + width(bv, font)) < (bv->workWidth()/2)) { + scx += (bv->workWidth()/2) - (top_x - save_scx + scx + width(bv,font)); + } +// bv->updateInset(const_cast(this), false); +} + +void UpdatableInset::scroll(BufferView * bv, int offset) const +{ + if (offset > 0) { + if (!scx && top_x > 0) + return; + if ((top_x + offset) > 20) + scx += offset - (top_x - scx + offset - 20); + else + scx += offset; + } else { + LyXFont font; + if (!scx && (top_x+width(bv, font)) < (bv->workWidth()-20)) + return; + if ((top_x - scx + offset + width(bv,font)) < (bv->workWidth()-20)) { + scx = bv->workWidth() - width(bv,font) - top_x + scx - 20; + } else { + scx += offset; + } + } +// bv->updateInset(const_cast(this), false); +} + + +#endif + /// An updatable inset could handle lyx editing commands #ifdef SCROLL_INSET UpdatableInset::RESULT -UpdatableInset::LocalDispatch(BufferView *, +UpdatableInset::LocalDispatch(BufferView * bv, int action, string const & arg) #else UpdatableInset::RESULT @@ -172,14 +222,19 @@ UpdatableInset::LocalDispatch(BufferView *, int, string const &) #endif { #ifdef SCROLL_INSET - if (action==LFUN_SCROLL_INSET) - { - float xx; - sscanf(arg.c_str(), "%f", &xx); - scroll(xx); - return DISPATCHED; + if (!arg.empty() && (action==LFUN_SCROLL_INSET)) { + if (arg.find('.') != arg.npos) { + float xx = static_cast(strToDbl(arg)); + scroll(bv, xx); + } else { + int xx = strToInt(arg); + scroll(bv, xx); } + bv->updateInset(this, false); + + return DISPATCHED; + } #endif return UNDISPATCHED; } diff --git a/src/insets/insettabular.C b/src/insets/insettabular.C index 842dc8e3d4..d630ac98d1 100644 --- a/src/insets/insettabular.C +++ b/src/insets/insettabular.C @@ -259,9 +259,19 @@ void InsetTabular::draw(BufferView * bv, LyXFont const & font, int baseline, DrawCellSelection(pain, nx, baseline, i, j, cell); if (dodraw && !cleared && locked && the_locking_inset) { if (the_locking_inset == tabular->GetCellInset(cell)) +#warning Reminder make this better! (Jug) + if (need_update == CELL) // clear this cell + pain.fillRectangle(cx, + baseline - + tabular->GetAscentOfRow(i), + tabular->GetWidthOfColumn(cell), + tabular->GetAscentOfRow(i) + + tabular->GetDescentOfRow(i)); tabular->GetCellInset(cell)->draw(bv, font, baseline, cx, - cleared); + need_update==CELL); + if (need_update == CELL) + DrawCellLines(pain, nx, baseline, i, cell); } else if (dodraw) { tabular->GetCellInset(cell)->draw(bv, font, baseline, cx, cleared); @@ -276,7 +286,10 @@ void InsetTabular::draw(BufferView * bv, LyXFont const & font, int baseline, } } x += width(bv, font); - need_update = NONE; + if (bv->text->status == LyXText::CHANGED_IN_DRAW) + need_update = INIT; + else + need_update = NONE; } @@ -403,23 +416,27 @@ void InsetTabular::InsetUnlock(BufferView * bv) the_locking_inset = 0; } HideInsetCursor(bv); - if (hasSelection()) { - sel_pos_start = sel_pos_end = 0; - sel_cell_start = sel_cell_end = 0; - UpdateLocal(bv, FULL, false); - } no_selection = false; oldcell = -1; locked = false; + if (scroll() || hasSelection()) { + if (scroll()) { + scroll(bv, (float)0.0); + } else { + sel_pos_start = sel_pos_end = 0; + sel_cell_start = sel_cell_end = 0; + } + UpdateLocal(bv, FULL, false); + } } void InsetTabular::UpdateLocal(BufferView * bv, UpdateCodes what, - bool mark_dirty) + bool mark_dirty) const { need_update = what; - bv->updateInset(this, mark_dirty); - if (what != NONE) + bv->updateInset(const_cast(this), mark_dirty); + if (locked && (what != NONE)) resetPos(bv); } @@ -536,8 +553,12 @@ void InsetTabular::InsetButtonPress(BufferView * bv, int x, int y, int button) no_selection = false; int ocell = actcell; + int orow = actrow; + HideInsetCursor(bv); setPos(bv, x, y); + if (actrow != orow) + UpdateLocal(bv, NONE, false); sel_pos_start = sel_pos_end = cursor.pos(); sel_cell_start = sel_cell_end = actcell; @@ -554,6 +575,7 @@ void InsetTabular::InsetButtonPress(BufferView * bv, int x, int y, int button) ActivateCellInset(bv, x, y, button); the_locking_inset->InsetButtonPress(bv, x-inset_x, y-inset_y, button); } + ShowInsetCursor(bv); } @@ -905,17 +927,21 @@ void InsetTabular::ShowInsetCursor(BufferView * bv) void InsetTabular::HideInsetCursor(BufferView * bv) { - if (cursor_visible) - ToggleInsetCursor(bv); + if (cursor_visible) { + bv->hideLockedInsetCursor(); + cursor_visible = false; + } +// if (cursor_visible) +// ToggleInsetCursor(bv); } void InsetTabular::setPos(BufferView * bv, int x, int y) const { - cursor.y(0); - cursor.pos(0); + cursor.y(0); + cursor.pos(0); - actcell = actrow = actcol = 0; + actcell = actrow = actcol = 0; int ly = tabular->GetDescentOfRow(actrow); // first search the right row @@ -935,12 +961,12 @@ void InsetTabular::setPos(BufferView * bv, int x, int y) const for(; !tabular->IsLastCellInRow(actcell) && (lx < x); ++actcell,lx += tabular->GetWidthOfColumn(actcell) + tabular->GetAdditionalWidth(actcell - 1)); - cursor.pos(((actcell+1) * 2) - 1); + cursor.pos(0); resetPos(bv); if ((lx - (tabular->GetWidthOfColumn(actcell)/2)) < x) { cursor.x(lx + top_x - 2); + cursor.pos(1); } else { - cursor.pos(cursor.pos() - 1); cursor.x(lx - tabular->GetWidthOfColumn(actcell) + top_x + 2); } resetPos(bv); @@ -957,8 +983,7 @@ int InsetTabular::getCellXPos(int cell) const for(; (c < cell); ++c) { lx += tabular->GetWidthOfColumn(c); } - return (lx - tabular->GetWidthOfColumn(cell) + top_x + - ADD_TO_TABULAR_WIDTH); + return (lx - tabular->GetWidthOfColumn(cell) + top_x); } @@ -979,8 +1004,18 @@ void InsetTabular::resetPos(BufferView * bv) const ++actrow; } } - cursor.x(getCellXPos(actcell) + 2); - if (cursor.pos() % 2) { + static int offset = ADD_TO_TABULAR_WIDTH + 2; + cursor.x(getCellXPos(actcell) + offset); + if (((cursor.x() - offset) > 20) && + ((cursor.x()-offset+tabular->GetWidthOfColumn(actcell)) > + (bv->workWidth()-20))) + { + scroll(bv, -tabular->GetWidthOfColumn(actcell)-20); + UpdateLocal(bv, FULL, false); + } else if ((cursor.x() - offset) < 20) { + scroll(bv, 20 - cursor.x() + offset); + UpdateLocal(bv, FULL, false); + } else if (!cellstart(cursor.pos())) { LyXFont font(LyXFont::ALL_SANE); cursor.x(cursor.x() + tabular->GetCellInset(actcell)->width(bv,font) + tabular->GetBeginningOfTextInCell(actcell)); @@ -1500,28 +1535,6 @@ int InsetTabular::getMaxWidth(Painter & pain, } -void InsetTabular::recomputeTextInsets(BufferView * bv, - LyXFont const & font) const -{ - InsetText * inset; - int cell; - -// cx = top_x; - for(int j= 0; j < tabular->columns(); ++j) { - for(int i = 0; i < tabular->rows(); ++i) { - if (tabular->IsPartOfMultiColumn(i,j)) - continue; - cell = tabular->GetCellNumber(i,j); - inset = tabular->GetCellInset(cell); - inset->update(bv, font); - tabular->SetWidthOfCell(cell, inset->width(bv, font)); - } -// cell = tabular->GetCellNumber(0, j); -// cx += tabular->GetWidthOfColumn(cell); - } -} - - void InsetTabular::resizeLyXText(BufferView *) const { need_update = FULL; diff --git a/src/insets/insettabular.h b/src/insets/insettabular.h index 936d56d670..436744abf5 100644 --- a/src/insets/insettabular.h +++ b/src/insets/insettabular.h @@ -102,7 +102,7 @@ public: /// void InsetUnlock(BufferView *); /// - void UpdateLocal(BufferView *, UpdateCodes, bool mark_dirty); + void UpdateLocal(BufferView *, UpdateCodes, bool mark_dirty) const; /// bool LockInsetInInset(BufferView *, UpdatableInset *); /// @@ -209,8 +209,6 @@ private: bool InsetHit(BufferView * bv, int x, int y) const; /// int GetMaxWidthOfCell(Painter &, int cell) const; - /// - void recomputeTextInsets(BufferView *, const LyXFont &) const; /// /// Private structures and variables diff --git a/src/insets/insettext.C b/src/insets/insettext.C index 7e1f654d68..484463ba21 100644 --- a/src/insets/insettext.C +++ b/src/insets/insettext.C @@ -175,14 +175,14 @@ void InsetText::Read(Buffer const * buf, LyXLex & lex) continue; if (token == "\\end_inset") break; - if (const_cast(buf)->parseSingleLyXformat2Token(lex, par, return_par, - token, pos, depth, - font + if (const_cast(buf)-> + parseSingleLyXformat2Token(lex, par, return_par,token, pos, depth, + font #ifndef NEW_INSETS - , footnoteflag, - footnotekind + , footnoteflag, footnotekind #endif - )) { + )) + { // the_end read this should NEVER happen lex.printError("\\the_end read in inset! Error in document!"); return; @@ -267,9 +267,9 @@ void InsetText::draw(BufferView * bv, LyXFont const & f, if (top_x != int(x)) { need_update = INIT; top_x = int(x); - owner()->update(bv, f, true); +// owner()->update(bv, f, true); bv->text->status = LyXText::CHANGED_IN_DRAW; -// return; + return; } top_baseline = baseline; @@ -319,7 +319,9 @@ void InsetText::draw(BufferView * bv, LyXFont const & f, LColor::background); } x += insetWidth - TEXT_TO_INSET_OFFSET; - if (need_update != INIT) + if (bv->text->status==LyXText::CHANGED_IN_DRAW) + need_update = INIT; + else if (need_update != INIT) need_update = NONE; } @@ -1244,6 +1246,8 @@ void InsetText::SetAutoBreakRows(bool flag) if (flag != autoBreakRows) { autoBreakRows = flag; need_update = FULL; + if (!flag) + removeNewlines(); } } @@ -1390,3 +1394,16 @@ void InsetText::resizeLyXText(BufferView * bv) const } need_update = FULL; } + + +void InsetText::removeNewlines() +{ + LyXParagraph * p = par; + + for(;p; p = p->next) { + for(int i = 0; i < p->Last(); ++i) { + if (p->GetChar(i) == LyXParagraph::META_NEWLINE) + p->Erase(i); + } + } +} diff --git a/src/insets/insettext.h b/src/insets/insettext.h index a848bc55d5..39bc1abf75 100644 --- a/src/insets/insettext.h +++ b/src/insets/insettext.h @@ -205,6 +205,8 @@ private: /// bool checkAndActivateInset(BufferView * bv, int x = 0, int y = 0, int button = 0); + void removeNewlines(); + /// int cx(BufferView *) const; /// diff --git a/src/insets/lyxinset.h b/src/insets/lyxinset.h index 05a9b7586b..05dde1c36f 100644 --- a/src/insets/lyxinset.h +++ b/src/insets/lyxinset.h @@ -116,7 +116,7 @@ public: }; /// - Inset() { owner_ = 0; top_x = top_baseline = 0; } + Inset() { owner_ = 0; top_x = top_baseline = 0; scx = 0; } /// virtual ~Inset() {} /// @@ -215,11 +215,14 @@ public: virtual LyXText * getLyXText(BufferView *) const; virtual void deleteLyXText(BufferView *, bool =true) const {} virtual void resizeLyXText(BufferView *) const {} + // returns the actuall scroll-value + int scroll() const { return scx; } protected: /// mutable int top_x; mutable int top_baseline; + mutable int scx; private: /// @@ -283,7 +286,7 @@ public: } /// - UpdatableInset() { scx = mx_scx = 0; } + UpdatableInset() {} /// virtual EDITABLE Editable() const; @@ -341,14 +344,16 @@ public: virtual bool isCursorVisible() const { return cursor_visible; } /// virtual int getMaxWidth(Painter & pain, UpdatableInset const *) const; + /// + int scroll() const { return scx; } protected: /// mutable bool cursor_visible; -private: - /// - int mx_scx; - mutable int scx; + // scrolls to absolute position in bufferview-workwidth * sx units + void scroll(BufferView *, float sx) const; + // scrolls offset pixels + void scroll(BufferView *, int offset) const; }; #endif diff --git a/src/lyxfunc.C b/src/lyxfunc.C index 519414281f..955b64ffc0 100644 --- a/src/lyxfunc.C +++ b/src/lyxfunc.C @@ -930,6 +930,7 @@ string LyXFunc::Dispatch(int ac, break; case LFUN_TABULAR_FEATURE: + case LFUN_SCROLL_INSET: // this is not handled here as this funktion is only aktive // if we have a locking_inset and that one is (or contains) // a tabular-inset diff --git a/src/tabular.C b/src/tabular.C index a2bd4a2a1e..9d75e17045 100644 --- a/src/tabular.C +++ b/src/tabular.C @@ -249,7 +249,7 @@ void LyXTabular::AppendColumn(int cell) cellstruct())); int column = column_of_cell(cell); int i, j; - column_vector::iterator cit = column_info.begin() + column; + column_vector::iterator cit = column_info.begin() + column + 1; column_info.insert(cit, columnstruct()); for (i = 0; i < rows_; ++i) { @@ -544,11 +544,13 @@ bool LyXTabular::SetWidthOfMulticolCell(int cell, int new_width) } // set the width to MAX_WIDTH until width > 0 int width = (new_width + 2 * WIDTH_OF_LINE); - for (i = column1; (i < column2) && (width > 0); ++i) { + for (i = column1; (i < column2) && (width>column_info[i].width_of_column); + ++i) + { cell_info[row][i].width_of_cell = column_info[i].width_of_column; width -= column_info[i].width_of_column; } - if (i == column2) { + if (width > 0) { cell_info[row][i].width_of_cell = width; } return true; @@ -578,10 +580,12 @@ bool LyXTabular::SetWidthOfCell(int cell, int new_width) { int row = row_of_cell(cell); int column1 = column_of_cell(cell); - int tmp = 0; + bool tmp = false; int width = 0; - if (IsMultiColumn(cell)) { + if (GetWidthOfCell(cell) == (new_width+2*WIDTH_OF_LINE)) + return false; + if (IsMultiColumn(cell, true)) { tmp = SetWidthOfMulticolCell(cell, new_width); } else { width = (new_width + 2*WIDTH_OF_LINE); @@ -779,9 +783,6 @@ int LyXTabular::GetWidthOfCell(int cell) const for (; i <= column2; ++i) { result += cell_info[row][i].width_of_cell; } - -// result += GetAdditionalWidth(cell); - return result; } @@ -847,12 +848,16 @@ bool LyXTabular::calculate_width_of_column(int column) } +/// +/// calculate the with of the column without regarding REAL MultiColumn +/// cells. This means MultiColumn-cells spanning more than 1 column. +/// bool LyXTabular::calculate_width_of_column_NMC(int column) { int old_column_width = column_info[column].width_of_column; int max = 0; for (int i = 0; i < rows_; ++i) { - if (!IsMultiColumn(GetCellNumber(i, column)) && + if (!IsMultiColumn(GetCellNumber(i, column), true) && (cell_info[i][column].width_of_cell > max)) { max = cell_info[i][column].width_of_cell; } @@ -1509,9 +1514,10 @@ int LyXTabular::DocBookEndOfCell(ostream & os, int cell, int & depth) const } -bool LyXTabular::IsMultiColumn(int cell) const +bool LyXTabular::IsMultiColumn(int cell, bool real) const { - return (cellinfo_of_cell(cell)->multicolumn != LyXTabular::CELL_NORMAL); + return ((!real || (column_of_cell(cell) != right_column_of_cell(cell))) && + (cellinfo_of_cell(cell)->multicolumn !=LyXTabular::CELL_NORMAL)); } @@ -1694,8 +1700,10 @@ int LyXTabular::GetUsebox(int cell) const { if (column_info[column_of_cell(cell)].p_width.empty() && !(IsMultiColumn(cell) && !cellinfo_of_cell(cell)->p_width.empty())) - return false; - return cellinfo_of_cell(cell)->usebox; + return 0; + if (cellinfo_of_cell(cell)->usebox > 1) + return cellinfo_of_cell(cell)->usebox; + return UseParbox(cell); } @@ -2169,3 +2177,17 @@ void LyXTabular::Validate(LaTeXFeatures & features) const GetCellInset(cell)->Validate(features); } } + + +bool LyXTabular::UseParbox(int cell) const +{ + LyXParagraph *par = GetCellInset(cell)->par; + + for(;par; par = par->next) { + for(int i = 0; i < par->Last(); ++i) { + if (par->GetChar(i) == LyXParagraph::META_NEWLINE) + return true; + } + } + return false; +} diff --git a/src/tabular.h b/src/tabular.h index e4dab2652d..cb2381ad3c 100644 --- a/src/tabular.h +++ b/src/tabular.h @@ -230,7 +230,7 @@ public: char const * GetDocBookAlign(int cell, bool isColumn = false) const; /// - bool IsMultiColumn(int cell) const; + bool IsMultiColumn(int cell, bool real = false) const; /// void SetMultiColumn(int cell, int number); /// @@ -407,8 +407,12 @@ private: ////////////////////////////////////////////////////////////////// /// int width_of_tabular; /// + int rotate; + /// /// for long tabulars /// + int is_long_tabular; + /// int endhead; // row of endhead int endfirsthead; // row of endfirsthead int endfoot; // row of endfoot @@ -430,19 +434,14 @@ private: ////////////////////////////////////////////////////////////////// bool calculate_width_of_column_NMC(int column); // no multi cells /// void calculate_width_of_tabular(); - /// cellstruct * cellinfo_of_cell(int cell) const; - /// void delete_column(int column); - /// int cells_in_multicolumn(int cell) const; /// - int is_long_tabular; - /// - int rotate; + bool UseParbox(int cell) const; }; #endif diff --git a/src/text.C b/src/text.C index c87acd2146..a18b7b6a10 100644 --- a/src/text.C +++ b/src/text.C @@ -3038,9 +3038,10 @@ void LyXText::PrepareToPrint(BufferView * bview, #endif // center displayed insets + Inset * inset; if (row->par()->GetChar(row->pos()) == LyXParagraph::META_INSET - && row->par()->GetInset(row->pos()) - && row->par()->GetInset(row->pos())->display()) + && (inset=row->par()->GetInset(row->pos())) + && (inset->display())) // || (inset->scroll() < 0))) align = LYX_ALIGN_CENTER; switch (align) { -- 2.39.2