From: Jean-Marc Lasgouttes Date: Mon, 3 Apr 2000 11:36:35 +0000 (+0000) Subject: Various fixes from Dekel Tsur. X-Git-Tag: 1.6.10~22313 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=0542d7af5db091f03a79af09a6f5ef2587ee43f9;p=features.git Various fixes from Dekel Tsur. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@637 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/ChangeLog b/ChangeLog index 2ec7f801cd..0fb75d29f5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,61 @@ +2000-04-03 Jean-Marc Lasgouttes + + * src/text.C (Backspace): some additional cleanups (we already + know whether cursor.pos is 0 or not). + + * lib/reLyX/Makefile.am (DESTDIR): add an empty value (since + automake does not provide one). + + * src/bmtable.h: replace C++ comments with C comments. + +2000-04-02 Dekel Tsur + + * src/screen.C (ShowCursor): Change the shape of the cursor if + the current language is not equal to the language of the document. + (If the cursor change its shape unexpectedly, then you've found a bug) + + * src/insets/insettext.C (LocalDispatch, UpdateLocal) Fixed some + bugs [I hope...] + + * src/insets/insetnumber.[Ch]: New files. + + * src/LyXAction.C (init) + * src/lyxfunc.C (dispatch): Add command number-inset-insert + + * lyxrc.example + * src/lyxrc.C: Renamed command \auto_mathmode to \number_inset + + * src/lyxparagraph.h + * src/paragraph.C: Changed insetlist to Vector. + (the vector is kept sorted). + + * src/text.C (GetVisibleRow): Draw selection correctly when there + is both LTR and RTL text. + + * src/paragraph.C (Clone): Use the assignment operator for cloning, + which is much faster. + + * src/text.C (GetVisibleRow and other): Do not draw the last space + in a row if the direction of the last letter is not equal to the + direction of the paragraph. + + * src/lyxfont.C (latexWriteStartChanges): + Check that font language is not equal to basefont language. + (latexWriteEndChanges): ditto + + * src/lyx_cb.C (StyleReset): Don't change the language while using + the font-default command. + + * src/paragraph.C (GetFirstFontSettings): Handle correctly an + empty paragraph before a footnote. + + * src/insets/insetcommand.C (draw): Increase x correctly. + + * src/screen.C (ShowCursor): Change cursor shape if + current language != document language. + + * src/lyxfunc.C (dispatch): Added calls to owner->view()->setState() + 2000-03-31 Juergen Vigna * src/paragraph.C (GetInset): commented out text[pos] = ' ' diff --git a/lib/lyxrc.example b/lib/lyxrc.example index ab064ef672..7b38b65402 100644 --- a/lib/lyxrc.example +++ b/lib/lyxrc.example @@ -631,12 +631,12 @@ # Arabic). Default is false. #\rtl true -# If auto_mathmode is set to "true", each time a digit key is pressed, -# LyX will automatically enter into math-mode. -# If auto_mathmode is set to "rtl", the above behavior will take place -# only when editing right-to-left text. -# Default is false. -#\auto_mathmode true +# If number_inset is set to "true", each time a digit key is pressed, +# LyX will automatically open a new number inset. +# If number_inset is set to "rtl", the above behavior will take place +# only when the cursor is on right-to-left text. +# Default is rtl. +#\number_inset true # The latex command for loading the language package. # Default is \usepackage{babel}. @@ -670,7 +670,7 @@ #\kbmap_secondary hebrew #\latex_command elatex #\font_encoding default -#\auto_mathmode rtl +#\number_inset rtl # You also need to bind a key for switching between Hebrew and English. # For example, @@ -694,7 +694,7 @@ #\kbmap true #\kbmap_primary null #\kbmap_secondary arabic -#\auto_mathmode false +#\number_inset false # You also need to bind a key for switching between Arabic and English. # For example, diff --git a/lib/reLyX/Makefile.am b/lib/reLyX/Makefile.am index 1e5e5054ef..5e13ef49fe 100644 --- a/lib/reLyX/Makefile.am +++ b/lib/reLyX/Makefile.am @@ -10,6 +10,7 @@ EXTRA_DIST = BUGS BasicLyX.pm CHANGES CleanTeX.pm LastLyX.pm MANIFEST \ reLyXmain.pl syntax.default test.ltx test.lyx reLyX.man \ RelyxFigure.pm Verbatim.pm \ $(LYXDISTDIRS) +DESTDIR = LIBINSTFILES = *.pm *.pl README BUGS CHANGES reLyX.pod syntax.default Text/*.pm diff --git a/src/LyXAction.C b/src/LyXAction.C index f7a2e4b3e6..656e0d8f56 100644 --- a/src/LyXAction.C +++ b/src/LyXAction.C @@ -291,6 +291,8 @@ void LyXAction::init() { LFUN_META_FAKE, "meta-prefix", "", NoBuffer }, { LFUN_INSERT_NOTE, "note-insert", "", Noop }, { LFUN_GOTONOTE, "note-next", "", ReadOnly }, + { LFUN_INSET_NUMBER , "number-inset-insert", + N_("Insert a new Number Inset"), Noop }, { LFUN_OPENSTUFF, "open-stuff", "", ReadOnly }, { LFUN_DOWN_PARAGRAPH, "paragraph-down", N_("Go one paragraph down"), ReadOnly }, diff --git a/src/bmtable.h b/src/bmtable.h index 687baa1bd8..e0bb4af27d 100644 --- a/src/bmtable.h +++ b/src/bmtable.h @@ -23,11 +23,11 @@ extern "C" { #endif -/// +/**/ #define FL_BMTABLE 1500 -/// A flat bitmap table +/* A flat bitmap table */ #define FL_BMTABLE_FLAT 0 -/// A grided bitmap table +/* A grided bitmap table */ #define FL_BMTABLE_GRID 1 @@ -40,25 +40,25 @@ extern "C" #define FL_BMTABLE_BOXTYPE FL_UP_BOX -/// +/**/ FL_OBJECT *fl_create_bmtable(int, FL_Coord, FL_Coord, FL_Coord, FL_Coord, char const *); -/// +/**/ FL_OBJECT *fl_add_bmtable(int, FL_Coord, FL_Coord, FL_Coord, FL_Coord, char const *); /** Same as fl_get_button_numb() */ int fl_get_bmtable_numb(FL_OBJECT *ob); -/// +/**/ void fl_set_bmtable(FL_OBJECT *, int pushed, int pos); /** Number of columns and rows, and the background bitmap */ void fl_set_bmtable_data(FL_OBJECT *, int, int, int, int , unsigned char const *); -/// +/**/ void fl_set_bmtable_pixmap_data(FL_OBJECT *, int, int, char **); -/// +/**/ void fl_set_bmtable_file(FL_OBJECT *, int, int, char const *); -/// +/**/ void fl_set_bmtable_pixmap_file(FL_OBJECT *, int, int, char const *); /** Adjust bitmap origin (ox, oy) and cell dimensions (dx, dy) incrementally */ @@ -66,7 +66,7 @@ void fl_set_bmtable_adjust(FL_OBJECT *, int ox, int oy, int dx, int dy); /** The number of items is by default nc x nr, but you can change it */ void fl_set_bmtable_maxitems(FL_OBJECT *, int); -/// +/**/ int fl_get_bmtable_maxitems(FL_OBJECT *); /** Returns the index of the selected item or -1 if none was selected */ diff --git a/src/buffer.C b/src/buffer.C index 46d3cf4160..9d6b55b0ff 100644 --- a/src/buffer.C +++ b/src/buffer.C @@ -74,6 +74,7 @@ using std::setw; #include "insets/insetspecialchar.h" #include "insets/figinset.h" #include "insets/insettext.h" +#include "insets/insetnumber.h" #include "insets/insetert.h" #include "insets/insetgraphics.h" #include "insets/insetfoot.h" @@ -812,6 +813,13 @@ bool Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par, par->InsertInset(pos, inset); par->SetFont(pos, font); ++pos; + } else if (tmptok == "Number") { + inset = new InsetNumber(this); + inset->Read(lex); + par->InsertChar(pos, LyXParagraph::META_INSET); + par->InsertInset(pos, inset); + par->SetFont(pos, font); + ++pos; } else if (tmptok == "Foot") { inset = new InsetFoot(this); inset->Read(lex); diff --git a/src/commandtags.h b/src/commandtags.h index b9cd3615ee..bbda36c114 100644 --- a/src/commandtags.h +++ b/src/commandtags.h @@ -246,6 +246,7 @@ enum kb_action { LFUN_INSET_ERT, // Jug 20000218 LFUN_INSERT_GRAPHICS, // Lgb 20000226 LFUN_INSET_FOOTNOTE, // Jug 20000307 + LFUN_INSET_NUMBER, // Dekel 20000402 LFUN_LASTACTION /* this marks the end of the table */ }; diff --git a/src/insets/Makefile.am b/src/insets/Makefile.am index 1480e4d383..8ae305968d 100644 --- a/src/insets/Makefile.am +++ b/src/insets/Makefile.am @@ -44,6 +44,8 @@ libinsets_la_SOURCES = \ insetlof.h \ insetlot.C \ insetlot.h \ + insetnumber.C \ + insetnumber.h \ insetparent.C \ insetparent.h \ insetquotes.C \ diff --git a/src/insets/insettext.C b/src/insets/insettext.C index f3c0367203..73048d08a8 100644 --- a/src/insets/insettext.C +++ b/src/insets/insettext.C @@ -493,7 +493,7 @@ InsetText::LocalDispatch(BufferView * bv, cutSelection(); actpos = selection_start; par->InsertChar(actpos,arg[0]); - par->SetFont(actpos,real_current_font); + SetCharFont(actpos,current_font); ++actpos; selection_start = selection_end = actpos; UpdateLocal(bv, true); @@ -665,7 +665,7 @@ InsetText::LocalDispatch(BufferView * bv, bv->text->cursor.par->ParFromPos(bv->text->cursor.pos)->previous, bv->text->cursor.par->ParFromPos(bv->text->cursor.pos)->next); par->InsertChar(actpos,LyXParagraph::META_NEWLINE); - par->SetFont(actpos,real_current_font); + SetCharFont(actpos,current_font); UpdateLocal(bv, true); ++actpos; selection_start = selection_end = actpos; @@ -1308,9 +1308,10 @@ void InsetText::UpdateLocal(BufferView *bv, bool flag) if (flag) { computeTextRows(bv->painter(), xpos); computeBaselines(top_baseline); - resetPos(bv); } bv->updateInset(this, flag); + if (flag) + resetPos(bv); ShowInsetCursor(bv); } diff --git a/src/insets/lyxinset.h b/src/insets/lyxinset.h index bf45450c71..48d3a1540b 100644 --- a/src/insets/lyxinset.h +++ b/src/insets/lyxinset.h @@ -89,7 +89,9 @@ public: /// MARGIN_CODE, /// - SPECIALCHAR_CODE + SPECIALCHAR_CODE, + /// + NUMBER_CODE }; enum EDITABLE { diff --git a/src/lyx_cb.C b/src/lyx_cb.C index 24bffaf89f..9fc8848f04 100644 --- a/src/lyx_cb.C +++ b/src/lyx_cb.C @@ -2160,7 +2160,7 @@ void LangCB(string const & l) void StyleReset() { - LyXFont font(LyXFont::ALL_INHERIT); + LyXFont font(LyXFont::ALL_INHERIT, ignore_language); ToggleAndShow(current_view, font); } @@ -2697,11 +2697,9 @@ extern "C" void DocumentApplyCB(FL_OBJECT *, long) if (!current_view->available()) return; - if (lyxrc.rtl_support) { - current_view->text->SetCursor(current_view->text->cursor.par, - current_view->text->cursor.pos); - current_view->setState(); - } + current_view->text->SetCursor(current_view->text->cursor.par, + current_view->text->cursor.pos); + current_view->setState(); LyXTextClassList::ClassList::size_type new_class = fl_get_choice(fd_form_document->choice_class) - 1; diff --git a/src/lyxfont.C b/src/lyxfont.C index 45dc9b9da7..0be8d2e473 100644 --- a/src/lyxfont.C +++ b/src/lyxfont.C @@ -663,7 +663,7 @@ int LyXFont::latexWriteStartChanges(ostream & os, LyXFont const & base, int count = 0; bool env = false; - if (language() != prev.language()) { + if (language() != base.language() && language() != prev.language()) { if (isRightToLeft() != prev.isRightToLeft()) { if (isRightToLeft()) { os << "\\R{"; @@ -755,7 +755,7 @@ int LyXFont::latexWriteEndChanges(ostream & os, LyXFont const & base, int count = 0; bool env = false; - if (language() != next.language()) { + if (language() != base.language() && language() != next.language()) { os << "}"; ++count; env = true; // Size change need not bother about closing env. diff --git a/src/lyxfunc.C b/src/lyxfunc.C index 11bcf8ba29..762864d731 100644 --- a/src/lyxfunc.C +++ b/src/lyxfunc.C @@ -42,6 +42,7 @@ #include "insets/insetinclude.h" #include "insets/insetbib.h" #include "insets/insettext.h" +#include "insets/insetnumber.h" #include "insets/insetert.h" #include "insets/insetgraphics.h" #include "insets/insetfoot.h" @@ -567,24 +568,33 @@ string LyXFunc::Dispatch(int ac, setMessage(N_("Text mode")); LyXDirection direction = owner->view()->text-> cursor.par->getParDirection(); - if ((action == -1) || - ((action == LFUN_RIGHT) && - (direction == LYX_DIR_LEFT_TO_RIGHT))) { + switch(action) { + case LFUN_UNKNOWN_ACTION: + case LFUN_BREAKPARAGRAPH: + case LFUN_BREAKLINE: owner->view()->text->CursorRight(); - moveCursorUpdate(false); - owner->getMiniBuffer()-> - Set(CurrentState()); - } - if ((action == LFUN_LEFT) && - (direction == LYX_DIR_RIGHT_TO_LEFT)) { - owner->view()->text->CursorRight(); - moveCursorUpdate(false); - owner->getMiniBuffer()-> - Set(CurrentState()); - } - if ((action == LFUN_LEFT) || - (action == LFUN_RIGHT)) + owner->view()->setState(); + owner->getMiniBuffer()->Set(CurrentState()); + break; + case LFUN_RIGHT: + if (direction == LYX_DIR_LEFT_TO_RIGHT) { + owner->view()->text->CursorRight(); + moveCursorUpdate(false); + owner->getMiniBuffer()-> + Set(CurrentState()); + } + return string(); + case LFUN_LEFT: + if (direction == LYX_DIR_RIGHT_TO_LEFT) { + owner->view()->text->CursorRight(); + moveCursorUpdate(false); + owner->getMiniBuffer()-> + Set(CurrentState()); + } return string(); + default: + break; + } } } } @@ -881,6 +891,7 @@ string LyXFunc::Dispatch(int ac, case LFUN_PASTE: owner->view()->paste(); + owner->view()->setState(); break; case LFUN_PASTESELECTION: @@ -905,6 +916,7 @@ string LyXFunc::Dispatch(int ac, case LFUN_LAYOUT_PASTE: owner->view()->pasteEnvironment(); + owner->view()->setState(); break; case LFUN_GOTOERROR: @@ -1138,6 +1150,7 @@ string LyXFunc::Dispatch(int ac, text->cursor.par-> GetLayout() + 1); owner->view()->update(1); + owner->view()->setState(); } } break; @@ -1947,6 +1960,13 @@ string LyXFunc::Dispatch(int ac, new_inset->Edit(owner->view(), 0, 0, 0); } break; + case LFUN_INSET_NUMBER: + { + InsetNumber * new_inset = new InsetNumber(owner->buffer()); + owner->view()->insertInset(new_inset); + new_inset->Edit(owner->view(), 0, 0, 0); + } + break; case LFUN_INSET_ERT: { InsetERT * new_inset = new InsetERT(owner->buffer()); @@ -2545,28 +2565,13 @@ string LyXFunc::Dispatch(int ac, owner->view()->beforeChange(); if (isdigit(argument[0]) && - (lyxrc.auto_mathmode == "true" || - (lyxrc.auto_mathmode == "rtl" && + (lyxrc.number_inset == "true" || + (lyxrc.number_inset == "rtl" && owner->view()->text->real_current_font.isVisibleRightToLeft() ))) { - UpdatableInset * tmpinset = new InsetFormula; - LyXCursor & cursor = owner->view()->text->cursor; - if (cursor.pos > 0 && - cursor.par->GetChar(cursor.pos - 1) == '-' && - (cursor.pos == 1 || - cursor.par->IsSeparator(cursor.pos - 2) || - cursor.par->IsNewline(cursor.pos - 2) ) - ) { - owner->view()->text->Backspace(); - owner->view()->open_new_inset(tmpinset); - tmpinset->LocalDispatch(owner->view(), - LFUN_UNKNOWN_ACTION, - "-"); - } else { - owner->view()->open_new_inset(tmpinset); - } - tmpinset->LocalDispatch(owner->view(), - LFUN_UNKNOWN_ACTION, + UpdatableInset * tmpinset = new InsetNumber(owner->buffer()); + owner->view()->open_new_inset(tmpinset); + tmpinset->LocalDispatch(owner->view(), action, argument); return string(); } diff --git a/src/lyxparagraph.h b/src/lyxparagraph.h index 2f212e8b70..6f546222be 100644 --- a/src/lyxparagraph.h +++ b/src/lyxparagraph.h @@ -537,13 +537,15 @@ private: size_type pos; /// Inset * inset; + /// + InsetTable(size_type p, Inset * i) { pos = p; inset = i;} }; /// typedef list FontList; /// FontList fontlist; /// - typedef list InsetList; + typedef vector InsetList; /// InsetList insetlist; /// @@ -578,4 +580,11 @@ private: /// static unsigned int paragraph_id; }; + +inline bool operator<(LyXParagraph::InsetTable const & a, + LyXParagraph::InsetTable const & b) +{ + return a.pos < b.pos; +} + #endif diff --git a/src/lyxrc.C b/src/lyxrc.C index 51fa67eb55..88ab514572 100644 --- a/src/lyxrc.C +++ b/src/lyxrc.C @@ -134,7 +134,7 @@ enum LyXRCTags { RC_MAKE_BACKUP, RC_BACKUPDIR_PATH, RC_RTL_SUPPORT, - RC_AUTO_MATHMODE, + RC_NUMBER_INSET, RC_LANGUAGE_PACKAGE, RC_LANGUAGE_AUTO_BEGIN, RC_LANGUAGE_AUTO_END, @@ -164,7 +164,6 @@ keyword_item lyxrcTags[] = { { "\\alternate_language", RC_ALT_LANG }, { "\\ascii_linelen", RC_ASCII_LINELEN }, { "\\ascii_roff_command", RC_ASCIIROFF_COMMAND }, - { "\\auto_mathmode", RC_AUTO_MATHMODE }, { "\\auto_region_delete", RC_AUTOREGIONDELETE }, { "\\autosave", RC_AUTOSAVE }, { "\\background_color", RC_BACKGROUND_COLOR }, @@ -212,6 +211,7 @@ keyword_item lyxrcTags[] = { { "\\literate_extension", RC_LITERATE_EXTENSION }, { "\\make_backup", RC_MAKE_BACKUP }, { "\\num_lastfiles", RC_NUMLASTFILES }, + { "\\number_inset", RC_NUMBER_INSET }, { "\\pdf_mode", RC_PDF_MODE }, { "\\pdf_to_ps_command", RC_PDF_TO_PS_COMMAND }, { "\\pdflatex_command", RC_PDFLATEX_COMMAND }, @@ -362,7 +362,7 @@ void LyXRC::setDefaults() { use_kbmap = false; hasBindFile = false; rtl_support = false; - auto_mathmode = "rtl"; + number_inset = "rtl"; language_package = "\\usepackage{babel}"; language_auto_begin = true; language_auto_end = true; @@ -1001,9 +1001,9 @@ int LyXRC::read(string const & filename) if (lexrc.next()) rtl_support = lexrc.GetBool(); break; - case RC_AUTO_MATHMODE: + case RC_NUMBER_INSET: if (lexrc.next()) - auto_mathmode = lowercase(lexrc.GetString()); + number_inset = lowercase(lexrc.GetString()); break; case RC_SHOW_BANNER: if (lexrc.next()) @@ -1326,8 +1326,8 @@ void LyXRC::output(ostream & os) const os << "\\escape_chars \"" << isp_esc_chars << "\"\n"; case RC_RTL_SUPPORT: os << "\\rtl " << tostr(rtl_support) << "\n"; - case RC_AUTO_MATHMODE: - os << "\\auto_mathmode" << auto_mathmode << "\n"; + case RC_NUMBER_INSET: + os << "\\number_inset " << number_inset << "\n"; case RC_LANGUAGE_AUTO_BEGIN: os << "\\language_auto_begin " << tostr(language_auto_begin) << "\n"; diff --git a/src/lyxrc.h b/src/lyxrc.h index fed78555dc..521dbea0a4 100644 --- a/src/lyxrc.h +++ b/src/lyxrc.h @@ -222,7 +222,7 @@ public: /// bool rtl_support; /// - string auto_mathmode; + string number_inset; /// bool show_banner; /// Do we have to use a GUI? diff --git a/src/lyxtext.h b/src/lyxtext.h index 408965d3b6..1fd782a254 100644 --- a/src/lyxtext.h +++ b/src/lyxtext.h @@ -299,9 +299,8 @@ public: decide, wether it is selected text or not. This is a strange solution but faster. */ - void GetVisibleRow(int offset, - Row * row_ptr, long y); - + void GetVisibleRow(int offset, Row * row_ptr, long y); + /* footnotes: */ /// void ToggleFootnote(); @@ -615,6 +614,9 @@ private: /// mutable LyXParagraph::size_type bidi_start; + /// + mutable bool bidi_same_direction; + /// void ComputeBidiTables(Row *row) const; diff --git a/src/paragraph.C b/src/paragraph.C index 12cb47523c..20afdcb602 100644 --- a/src/paragraph.C +++ b/src/paragraph.C @@ -37,7 +37,6 @@ using std::endl; using std::fstream; using std::ios; -using std::greater; int tex_code_break_column = 72; // needs non-zero initialization. set later. // this is a bad idea, but how can LyXParagraph find its buffer to get @@ -425,14 +424,11 @@ void LyXParagraph::CutIntoMinibuffer(LyXParagraph::size_type pos) // the inset, not just a clone. Otherwise // the inset would be deleted when calling Erase(pos) // find the entry - for (InsetList::iterator it = insetlist.begin(); - it != insetlist.end(); ++it) { - if ((*it).pos == pos) { - (*it).inset = 0; - break; - } - - } + InsetList::iterator it = lower_bound(insetlist.begin(), + insetlist.end(), + InsetTable(pos,0)); + if (it != insetlist.end() && (*it).pos == pos) + (*it).inset = 0; } else { minibuffer_inset = 0; minibuffer_char = ' '; @@ -526,13 +522,12 @@ void LyXParagraph::Erase(LyXParagraph::size_type pos) // if it is an inset, delete the inset entry if (text[pos] == LyXParagraph::META_INSET) { // find the entry - for (InsetList::iterator it = insetlist.begin(); - it != insetlist.end(); ++it) { - if ((*it).pos == pos) { - delete (*it).inset; - insetlist.erase(it); - break; - } + InsetList::iterator it = lower_bound(insetlist.begin(), + insetlist.end(), + InsetTable(pos,0)); + if (it != insetlist.end() && (*it).pos == pos) { + delete (*it).inset; + insetlist.erase(it); } } text.erase(text.begin() + pos); @@ -560,11 +555,11 @@ void LyXParagraph::Erase(LyXParagraph::size_type pos) } // Update the inset table. - for (InsetList::iterator it = insetlist.begin(); - it != insetlist.end(); ++it) { - if ((*it).pos > pos) - (*it).pos--; - } + for (InsetList::iterator it = upper_bound(insetlist.begin(), + insetlist.end(), + InsetTable(pos,0)); + it != insetlist.end(); ++it) + --(*it).pos; } else { lyxerr << "ERROR (LyXParagraph::Erase): " "can't erase non-existant char." << endl; @@ -597,11 +592,11 @@ void LyXParagraph::InsertChar(LyXParagraph::size_type pos, char c) } // Update the inset table. - for (InsetList::iterator it = insetlist.begin(); - it != insetlist.end(); ++it) { - if ((*it).pos >= pos) - (*it).pos++; - } + for (InsetList::iterator it = lower_bound(insetlist.begin(), + insetlist.end(), + InsetTable(pos,0)); + it != insetlist.end(); ++it) + ++(*it).pos; } @@ -628,10 +623,14 @@ void LyXParagraph::InsertInset(LyXParagraph::size_type pos, if (inset) { // Add a new entry in the inset table. - InsetList::iterator it = - insetlist.insert(insetlist.begin(), InsetTable()); - (*it).inset = inset; - (*it).pos = pos; + InsetList::iterator it = lower_bound(insetlist.begin(), + insetlist.end(), + InsetTable(pos,0)); + if (it != insetlist.end() && (*it).pos == pos) + lyxerr << "ERROR (LyXParagraph::InsertInset): " + "there is an inset in position: " << pos << endl; + else + insetlist.insert(it,InsetTable(pos,inset)); } } @@ -651,12 +650,12 @@ Inset * LyXParagraph::GetInset(LyXParagraph::size_type pos) return 0; } // Find the inset. - for (InsetList::iterator it = insetlist.begin(); - it != insetlist.end(); ++it) { - if ((*it).pos == pos) { - return (*it).inset; - } - } + InsetList::iterator it = lower_bound(insetlist.begin(), + insetlist.end(), + InsetTable(pos,0)); + if (it != insetlist.end() && (*it).pos == pos) + return (*it).inset; + lyxerr << "ERROR (LyXParagraph::GetInset): " "Inset does not exist: " << pos << endl; // text[pos] = ' '; // WHY!!! does this set the pos to ' '???? @@ -683,12 +682,12 @@ Inset const * LyXParagraph::GetInset(LyXParagraph::size_type pos) const return 0; } // Find the inset. - for (InsetList::const_iterator cit = insetlist.begin(); - cit != insetlist.end(); ++cit) { - if ((*cit).pos == pos) { - return (*cit).inset; - } - } + InsetList::const_iterator cit = lower_bound(insetlist.begin(), + insetlist.end(), + InsetTable(pos,0)); + if (cit != insetlist.end() && (*cit).pos == pos) + return (*cit).inset; + lyxerr << "ERROR (LyXParagraph::GetInset): " "Inset does not exist: " << pos << endl; //text[pos] = ' '; // WHY!!! does this set the pos to ' '???? @@ -756,7 +755,8 @@ LyXFont LyXParagraph::GetFirstFontSettings() const if (0 >= (*cit).pos && 0 <= (*cit).pos_end) return (*cit).font; #endif - } + } else if (next && next->footnoteflag != LyXParagraph::NO_FOOTNOTE) + return NextAfterFootnote()->GetFirstFontSettings(); return LyXFont(LyXFont::ALL_INHERIT); } @@ -1478,27 +1478,12 @@ LyXParagraph * LyXParagraph::Clone() const // copy everything behind the break-position to the new paragraph - // IMO this is not correct. Here we should not use the Minibuffer to - // copy stuff, as the Minibuffer is global and we could be in a - // situation where we copy a paragraph inside a paragraph (this now - // is possible think of Text-Insets!). So I'm changing this so that - // then inside the Text-Inset I can use par->Clone() to copy the - // paragraph data from one inset to the other! -#if 0 - for (size_type i = 0; i < size(); ++i) { - CopyIntoMinibuffer(i); - result->InsertFromMinibuffer(i); - } -#else - for(size_type i = 0; i < size(); ++i) { - result->InsertChar(i, GetChar(i)); - result->SetFont(i, GetFontSettings(i)); - if ((GetChar(i) == LyXParagraph::META_INSET) && GetInset(i)) { - result->InsertInset(i, GetInset(i)->Clone()); - } - } -#endif - result->text.resize(result->text.size()); + result->text = text; + result->fontlist = fontlist; + result->insetlist = insetlist; + for (InsetList::iterator it = result->insetlist.begin(); + it != result->insetlist.end(); ++it) + (*it).inset = (*it).inset->Clone(); return result; } @@ -1891,37 +1876,29 @@ LyXParagraph const * LyXParagraph::DepthHook(int deth) const int LyXParagraph::AutoDeleteInsets() { - vector tmpvec; - int i = 0; - for (InsetList::iterator it = insetlist.begin(); - it != insetlist.end(); ++it) { - if ((*it).inset && (*it).inset->AutoDelete()) { - tmpvec.push_back((*it).pos); + int count = 0; + unsigned int i = 0; + while (i < insetlist.size()) { + if (insetlist[i].inset && insetlist[i].inset->AutoDelete()) { + Erase(insetlist[i].pos); + // Erase() calls to insetlist.erase(&insetlist[i]) + // so i shouldn't be increased. + ++count; + } else ++i; - } - } - sort(tmpvec.begin(), tmpvec.end(), greater()); - for (vector::const_iterator cit = tmpvec.begin(); - cit != tmpvec.end(); ++cit) { - Erase((*cit)); } - return i; + return count; } Inset * LyXParagraph::ReturnNextInsetPointer(LyXParagraph::size_type & pos) { - InsetList::iterator it2 = insetlist.end(); - for (InsetList::iterator it = insetlist.begin(); - it != insetlist.end(); ++it) { - if ((*it).pos >= pos) { - if (it2 == insetlist.end() || (*it).pos < (*it2).pos) - it2 = it; - } - } - if (it2 != insetlist.end()) { - pos = (*it2).pos; - return (*it2).inset; + InsetList::iterator it = lower_bound(insetlist.begin(), + insetlist.end(), + InsetTable(pos,0)); + if (it != insetlist.end()) { + pos = (*it).pos; + return (*it).inset; } return 0; } @@ -3097,14 +3074,21 @@ void LyXParagraph::SimpleTeXSpecialChars(ostream & os, TexRow & texrow, && running_font.isRightToLeft()) { os << "\\L{"; close = true; + } else if (inset->LyxCode() == Inset::NUMBER_CODE + && running_font.isRightToLeft()) { + os << "{\\beginL "; + close = true; } int tmp = inset->Latex(os, style.isCommand(), style.free_spacing); if (close) - os << "}"; - + if (inset->LyxCode() == Inset::NUMBER_CODE) + os << "\\endL}"; + else + os << "}"; + if (tmp) { column = 0; } else { diff --git a/src/screen.C b/src/screen.C index aaf4898b41..5428a215f6 100644 --- a/src/screen.C +++ b/src/screen.C @@ -188,7 +188,9 @@ void LyXScreen::ShowCursor() { if (!cursor_visible) { Cursor_Shape shape = BAR_SHAPE; - if (text->real_current_font.isVisibleRightToLeft() + if (text->real_current_font.language() != + text->parameters->language_info + || text->real_current_font.isVisibleRightToLeft() != text->parameters->language_info->RightToLeft) shape = (text->real_current_font.isVisibleRightToLeft()) ? REVERSED_L_SHAPE : L_SHAPE; diff --git a/src/text.C b/src/text.C index 1043b7038d..e05567f44d 100644 --- a/src/text.C +++ b/src/text.C @@ -247,7 +247,7 @@ LyXParagraph::size_type LyXText::RowLast(Row const * row) const void LyXText::ComputeBidiTables(Row * row) const { - + bidi_same_direction = true; if (!lyxrc.rtl_support) { bidi_start = -1; return; @@ -336,6 +336,7 @@ void LyXText::ComputeBidiTablesFromTo(Row * row, ++lpos; } direction = static_cast(-direction); + bidi_same_direction = false; } } @@ -2855,7 +2856,10 @@ void LyXText::PrepareToPrint(Row * row, float & x, && !row->par->table && last != vis2log(last) && row->par->IsLineSeparator(last)) { - if (!(main_body > 0 && main_body-1 == last)) + if ((main_body = 0 || main_body-1 != last) && + (!row->next || row->next->par != row->par || + row->par->getLetterDirection(last) == + LYX_DIR_RIGHT_TO_LEFT)) x -= fill_separator+SingleWidth(row->par,last); } else if (main_body > 0 && (main_body-1 > last || @@ -3342,8 +3346,8 @@ void LyXText::Backspace() && !(cursor.par->Next() && cursor.par->footnoteflag == LyXParagraph::NO_FOOTNOTE && cursor.par->Next()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)) { - // This is an empty paragraph and we delete it just by moving the curosr one step - // left and let the DeleteEmptyParagraphMechanism handle the actual deleteion + // This is an empty paragraph and we delete it just by moving the cursor one step + // left and let the DeleteEmptyParagraphMechanism handle the actual deletion // of the paragraph. if (cursor.par->previous) { @@ -3385,17 +3389,12 @@ void LyXText::Backspace() // not a good idea since it triggers the auto-delete // mechanism. So we do a CursorLeftIntern()-lite, // without the dreaded mechanism. (JMarc) - if (cursor.pos > 0) { - SetCursorIntern(cursor.par, cursor.pos - 1); - } - else if (cursor.par->Previous()) { + if (cursor.par->Previous()) { // steps into the above paragraph. SetCursorIntern(cursor.par->Previous(), cursor.par->Previous()->Last()); } - -#warning See comment on top of text.C /* Pasting is not allowed, if the paragraphs have different layout. I think it is a real bug of all other word processors to allow it. It confuses the user. @@ -3458,22 +3457,14 @@ void LyXText::Backspace() // not a good idea since it triggers the auto-delete // mechanism. So we do a CursorLeftIntern()-lite, // without the dreaded mechanism. (JMarc) - if (cursor.pos > 0) { - SetCursorIntern(cursor.par, cursor.pos - 1); - } - else if (cursor.par->Previous()) { - // steps into the above paragraph. - SetCursorIntern(cursor.par->Previous(), - cursor.par->Previous()->Last()); - } -// CursorLeftIntern(); + SetCursorIntern(cursor.par, cursor.pos - 1); // some insets are undeletable here if (cursor.par->GetChar(cursor.pos) == LyXParagraph::META_INSET) { if (!cursor.par->GetInset(cursor.pos)->Deletable()) return; // force complete redo when erasing display insets - // this is a cruel mathod but save..... Matthias + // this is a cruel method but safe..... Matthias if (cursor.par->GetInset(cursor.pos)->display()){ cursor.par->Erase(cursor.pos); RedoParagraph(); @@ -3666,14 +3657,15 @@ void LyXText::Backspace() } -void LyXText::GetVisibleRow(int offset, - Row * row_ptr, long y) +void LyXText::GetVisibleRow(int offset, Row * row_ptr, long y) { /* returns a printed row */ Painter & pain = owner_->painter(); LyXDirection direction = row_ptr->par->getParDirection(); - LyXParagraph::size_type vpos, pos, pos_end; + LyXParagraph::size_type last = RowLast(row_ptr); + + LyXParagraph::size_type vpos, pos; float x, tmpx; int y_top, y_bottom; float fill_separator, fill_hfill, fill_label_hfill; @@ -3692,49 +3684,143 @@ void LyXText::GetVisibleRow(int offset, pain.fillRectangle(0, offset, paperwidth, row_ptr->height); if (selection) { - /* selection code */ - if (sel_start_cursor.row == row_ptr && - sel_end_cursor.row == row_ptr) { - if (sel_start_cursor.x < sel_end_cursor.x) - pain.fillRectangle(sel_start_cursor.x, offset, - sel_end_cursor.x - sel_start_cursor.x, - row_ptr->height, - LColor::selection); - else - pain.fillRectangle(sel_end_cursor.x, offset, - sel_start_cursor.x - sel_end_cursor.x, - row_ptr->height, - LColor::selection); - } else if (sel_start_cursor.row == row_ptr) { - if (direction == LYX_DIR_LEFT_TO_RIGHT) - pain.fillRectangle(sel_start_cursor.x, offset, - paperwidth - sel_start_cursor.x, - row_ptr->height, - LColor::selection); - else + /* selection code */ + if (bidi_same_direction) { + if (sel_start_cursor.row == row_ptr && + sel_end_cursor.row == row_ptr) { + if (sel_start_cursor.x < sel_end_cursor.x) + pain.fillRectangle(sel_start_cursor.x, offset, + sel_end_cursor.x - sel_start_cursor.x, + row_ptr->height, + LColor::selection); + else + pain.fillRectangle(sel_end_cursor.x, offset, + sel_start_cursor.x - sel_end_cursor.x, + row_ptr->height, + LColor::selection); + } else if (sel_start_cursor.row == row_ptr) { + if (direction == LYX_DIR_LEFT_TO_RIGHT) + pain.fillRectangle(sel_start_cursor.x, offset, + paperwidth - sel_start_cursor.x, + row_ptr->height, + LColor::selection); + else + pain.fillRectangle(0, offset, + sel_start_cursor.x, + row_ptr->height, + LColor::selection); + } else if (sel_end_cursor.row == row_ptr) { + if (direction == LYX_DIR_LEFT_TO_RIGHT) + pain.fillRectangle(0, offset, + sel_end_cursor.x, + row_ptr->height, + LColor::selection); + else + pain.fillRectangle(sel_end_cursor.x, offset, + paperwidth - sel_end_cursor.x, + row_ptr->height, + LColor::selection); + } else if (y > sel_start_cursor.y && y < sel_end_cursor.y) { pain.fillRectangle(0, offset, - sel_start_cursor.x, - row_ptr->height, + paperwidth, row_ptr->height, LColor::selection); - } else if (sel_end_cursor.row == row_ptr) { - if (direction == LYX_DIR_LEFT_TO_RIGHT) + } + } else if ( sel_start_cursor.row != row_ptr && + sel_end_cursor.row != row_ptr && + y > sel_start_cursor.y && y < sel_end_cursor.y) { + pain.fillRectangle(0, offset, + paperwidth, row_ptr->height, + LColor::selection); + } else if (sel_start_cursor.row == row_ptr || + sel_end_cursor.row == row_ptr) { + float tmpx = x; + int cell = 0; + if (row_ptr->par->table) { + cell = NumberOfCell(row_ptr->par, row_ptr->pos); + tmpx += row_ptr->par->table->GetBeginningOfTextInCell(cell); + } + if ( (sel_start_cursor.row != row_ptr && + direction == LYX_DIR_LEFT_TO_RIGHT) || + (sel_end_cursor.row != row_ptr && + direction == LYX_DIR_RIGHT_TO_LEFT)) pain.fillRectangle(0, offset, - sel_end_cursor.x, - row_ptr->height, + tmpx, row_ptr->height, LColor::selection); - else - pain.fillRectangle(sel_end_cursor.x, offset, - paperwidth - sel_end_cursor.x, + if (row_ptr->par->table) { + float x_old = x; + for (vpos = row_ptr->pos; vpos <= last; ++vpos) { + pos = vis2log(vpos); + float old_tmpx = tmpx; + if (row_ptr->par->IsNewline(pos)) { + tmpx = x_old + row_ptr->par->table->WidthOfColumn(cell); + x_old = tmpx; + ++cell; + tmpx += row_ptr->par->table->GetBeginningOfTextInCell(cell); + } else { + tmpx += SingleWidth(row_ptr->par, pos); + } + if ( (sel_start_cursor.row != row_ptr || + sel_start_cursor.pos <= pos) && + (sel_end_cursor.row != row_ptr || + pos < sel_end_cursor.pos) ) + pain.fillRectangle(old_tmpx, offset, + tmpx - old_tmpx + 1, + row_ptr->height, + LColor::selection); + } + } else { + LyXParagraph::size_type main_body = + BeginningOfMainBody(row_ptr->par); + + for (vpos = row_ptr->pos; vpos <= last; ++vpos) { + pos = vis2log(vpos); + float old_tmpx = tmpx; + if (main_body > 0 && pos == main_body-1) { + tmpx += fill_label_hfill + + GetFont(row_ptr->par, -2).stringWidth( + textclasslist.Style(parameters->textclass, row_ptr->par->GetLayout()).labelsep); + if (row_ptr->par->IsLineSeparator(main_body-1)) + tmpx -= SingleWidth(row_ptr->par, main_body-1); + } + if (HfillExpansion(row_ptr, pos)) { + tmpx += SingleWidth(row_ptr->par, pos); + if (pos >= main_body) + tmpx += fill_hfill; + else + tmpx += fill_label_hfill; + } + else if (row_ptr->par->IsSeparator(pos)) { + if (pos != last || !row_ptr->next || + row_ptr->next->par != row_ptr->par || + direction == row_ptr->par->getLetterDirection(last)) { + tmpx += SingleWidth(row_ptr->par, pos); + if (pos >= main_body) + tmpx += fill_separator; + } + } else + tmpx += SingleWidth(row_ptr->par, pos); + + if ( (sel_start_cursor.row != row_ptr || + sel_start_cursor.pos <= pos) && + (sel_end_cursor.row != row_ptr || + pos < sel_end_cursor.pos) ) + pain.fillRectangle(old_tmpx, offset, + tmpx - old_tmpx + 1, + row_ptr->height, + LColor::selection); + } + } + if ( (sel_start_cursor.row != row_ptr && + direction == LYX_DIR_RIGHT_TO_LEFT) || + (sel_end_cursor.row != row_ptr && + direction == LYX_DIR_LEFT_TO_RIGHT) ) + pain.fillRectangle(tmpx, offset, + paperwidth - tmpx, row_ptr->height, LColor::selection); - - } else if (y > sel_start_cursor.y && y < sel_end_cursor.y) { - pain.fillRectangle(0, offset, - paperwidth, row_ptr->height, - LColor::selection); } } - + if (row_ptr->par->appendix){ pain.line(1, offset, 1, offset + row_ptr->height, @@ -4033,7 +4119,7 @@ void LyXText::GetVisibleRow(int offset, /* is it a last row? */ par = row_ptr->par->LastPhysicalPar(); - if (row_ptr->par->ParFromPos(RowLast(row_ptr) + 1) == par + if (row_ptr->par->ParFromPos(last + 1) == par && (!row_ptr->next || row_ptr->next->par != row_ptr->par)) { /* think about the margins */ @@ -4108,7 +4194,7 @@ void LyXText::GetVisibleRow(int offset, int endlabel = row_ptr->par->GetEndLabel(); if (endlabel == END_LABEL_BOX || endlabel == END_LABEL_FILLED_BOX) { - LyXFont font = GetFont(row_ptr->par, RowLast(row_ptr)); + LyXFont font = GetFont(row_ptr->par, last); int size = int(0.75*font.maxAscent()); int y = (offset + row_ptr->baseline) - size; int x = (direction == LYX_DIR_LEFT_TO_RIGHT) @@ -4140,7 +4226,6 @@ void LyXText::GetVisibleRow(int offset, } /* draw the text in the pixmap */ - pos_end = RowLast(row_ptr); vpos = row_ptr->pos; /* table stuff -- begin*/ @@ -4150,7 +4235,7 @@ void LyXText::GetVisibleRow(int offset, float x_old = x; x += row_ptr->par->table->GetBeginningOfTextInCell(cell); - while (vpos <= pos_end) { + while (vpos <= last) { pos = vis2log(vpos); if (row_ptr->par->IsNewline(pos)) { @@ -4305,11 +4390,11 @@ void LyXText::GetVisibleRow(int offset, LyXParagraph::size_type main_body = BeginningOfMainBody(row_ptr->par); if (main_body > 0 && - (main_body-1 > pos_end || + (main_body-1 > last || !row_ptr->par->IsLineSeparator(main_body-1))) main_body = 0; - while (vpos <= pos_end) { + while (vpos <= last) { pos = vis2log(vpos); if (main_body > 0 && pos == main_body-1) { x += fill_label_hfill @@ -4353,10 +4438,16 @@ void LyXText::GetVisibleRow(int offset, x += 2; ++vpos; } else if (row_ptr->par->IsSeparator(pos)) { - tmpx = x; - x+= SingleWidth(row_ptr->par, pos); - if (pos >= main_body) - x+= fill_separator; + if (pos != last || !row_ptr->next || + row_ptr->next->par != row_ptr->par || + direction == row_ptr->par->getLetterDirection(last)) { +#if 0 + tmpx = x; +#endif + x += SingleWidth(row_ptr->par, pos); + if (pos >= main_body) + x += fill_separator; + } #warning Think about this #if 0 /* -------> Only draw protected spaces when @@ -4471,17 +4562,24 @@ int LyXText::GetColumnNearX(Row * row, int & x) const tmpx -= SingleWidth(row->par, main_body-1); } - tmpx += SingleWidth(row->par, c); if (HfillExpansion(row, c)) { + x += SingleWidth(row->par, c); if (c >= main_body) tmpx += fill_hfill; else tmpx += fill_label_hfill; } - else if (c >= main_body - && row->par->IsSeparator(c)) { - tmpx+= fill_separator; - } + else if (row->par->IsSeparator(c)) { + if (c != last || + !row->next || + row->next->par != row->par || + direction == row->par->getLetterDirection(last)) { + tmpx += SingleWidth(row->par, c); + if (c >= main_body) + tmpx+= fill_separator; + } + } else + tmpx += SingleWidth(row->par, c); ++vc; } diff --git a/src/text2.C b/src/text2.C index ed0927b1ef..427f4d02d6 100644 --- a/src/text2.C +++ b/src/text2.C @@ -540,13 +540,13 @@ void LyXText::SetLayout(LyXTextClass::size_type layout) // we have to reset the selection, because the // geometry could have changed */ - SetCursor(sel_start_cursor.par, sel_start_cursor.pos); + SetCursor(sel_start_cursor.par, sel_start_cursor.pos, false); sel_cursor = cursor; - SetCursor(sel_end_cursor.par, sel_end_cursor.pos); + SetCursor(sel_end_cursor.par, sel_end_cursor.pos, false); UpdateCounters(cursor.row); ClearSelection(); SetSelection(); - SetCursor(tmpcursor.par, tmpcursor.pos); + SetCursor(tmpcursor.par, tmpcursor.pos, true); } @@ -3107,16 +3107,25 @@ void LyXText::SetCursorIntern(LyXParagraph * par, x -= SingleWidth(row->par, main_body-1); } - x += SingleWidth(row->par, pos); if (HfillExpansion(row, pos)) { + x += SingleWidth(row->par, pos); if (pos >= main_body) x += fill_hfill; else x += fill_label_hfill; } - else if (pos >= main_body && row->par->IsSeparator(pos)) { - x+= fill_separator; - } + else if (row->par->IsSeparator(pos)) { + if (pos != last || + !row->next || + row->next->par != row->par || + row->par->getParDirection() == + row->par->getLetterDirection(last)) { + x += SingleWidth(row->par, pos); + if (pos >= main_body) + x += fill_separator; + } + } else + x += SingleWidth(row->par, pos); } }