X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView_pimpl.C;h=4890ac972e91bbf4aa2a8a6715b722d3bd5d5023;hb=77639efa94ce5c071cf47bfd3ba0026f157a1e6a;hp=ef248328b92528ad33e568298455346b04ace6f2;hpb=3eea90dbbc24f9dafc6c0a42d5b14fe213dbcd6a;p=lyx.git diff --git a/src/BufferView_pimpl.C b/src/BufferView_pimpl.C index ef248328b9..4890ac972e 100644 --- a/src/BufferView_pimpl.C +++ b/src/BufferView_pimpl.C @@ -3,6 +3,7 @@ #include #include #include +#include #ifdef __GNUG__ #pragma implementation @@ -30,7 +31,7 @@ #include "insets/insettext.h" /// added for Dispatch functions #include "lyx_cb.h" -#include "filedlg.h" +#include "frontends/FileDialog.h" #include "lyx_main.h" #include "FloatList.h" #include "support/filetools.h" @@ -56,19 +57,15 @@ #include "insets/insetcaption.h" #include "mathed/formulamacro.h" extern LyXTextClass::size_type current_layout; -extern void math_insert_symbol(BufferView *, string const &); -extern bool math_insert_greek(BufferView *, char); extern int greek_kb_flag; -#ifdef SIGC_CXX_NAMESPACES -using SigC::slot; -#endif - +using std::vector; using std::find_if; using std::pair; using std::endl; using std::make_pair; using std::min; +using SigC::slot; /* the selection possible is needed, that only motion events are * used, where the bottom press event was on the drawing area too */ @@ -77,19 +74,21 @@ bool selection_possible = false; extern BufferList bufferlist; extern char ascii_type; +extern bool math_insert_greek(BufferView *, char); extern void sigchldhandler(pid_t pid, int * status); extern int bibitemMaxWidth(BufferView *, LyXFont const &); const unsigned int saved_positions_num = 20; -static inline +namespace { + +inline void waitForX() { XSync(fl_get_display(), 0); } -static void SetXtermCursor(Window win) { static Cursor cursor; @@ -103,6 +102,8 @@ void SetXtermCursor(Window win) XFlush(fl_get_display()); } +} // anon namespace + BufferView::Pimpl::Pimpl(BufferView * b, LyXView * o, int xpos, int ypos, int width, int height) @@ -110,9 +111,6 @@ BufferView::Pimpl::Pimpl(BufferView * b, LyXView * o, current_scrollbar_value(0), cursor_timeout(400), workarea_(xpos, ypos, width, height), using_xterm_cursor(false) { - //buffer_ = 0; - //workarea_ = new WorkArea(xpos, ypos, width, height); - // Setup the signals workarea_.scrollCB.connect(slot(this, &BufferView::Pimpl::scrollCB)); workarea_.workAreaExpose @@ -281,11 +279,11 @@ int BufferView::Pimpl::resizeCurrentBuffer() LyXParagraph * selendpar = 0; UpdatableInset * the_locking_inset = 0; - int pos = 0; - int selstartpos = 0; - int selendpos = 0; - int selection = 0; - int mark_set = 0; + LyXParagraph::size_type pos = 0; + LyXParagraph::size_type selstartpos = 0; + LyXParagraph::size_type selendpos = 0; + bool selection = false; + bool mark_set = false; ProhibitInput(bv_); @@ -350,7 +348,8 @@ int BufferView::Pimpl::resizeCurrentBuffer() bv_->setState(); AllowInput(bv_); - owner_->getDialogs()->hideSplash(); + /// get rid of the splash screen if it's not gone already + owner_->getDialogs()->destroySplash(); return 0; } @@ -767,7 +766,8 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y, selection_possible = false; - if (button >= 2) return; + if (button == 2) + return; bv_->setState(); owner_->showState(); @@ -808,6 +808,7 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y, return; } +#ifndef NEW_INSETS // check whether we want to open a float if (bv_->text) { bool hit = false; @@ -817,7 +818,6 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y, c = bv_->text->cursor.par()-> GetChar(bv_->text->cursor.pos()); } -#ifndef NEW_INSETS if(!bv_->text->selection) if (c == LyXParagraph::META_FOOTNOTE || c == LyXParagraph::META_MARGIN @@ -828,11 +828,9 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y, || c == LyXParagraph::META_ALGORITHM){ hit = true; } else -#endif if (bv_->text->cursor.pos() - 1 >= 0) { c = bv_->text->cursor.par()-> GetChar(bv_->text->cursor.pos() - 1); -#ifndef NEW_INSETS if (c == LyXParagraph::META_FOOTNOTE || c == LyXParagraph::META_MARGIN || c == LyXParagraph::META_FIG @@ -844,18 +842,13 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y, bv_->text->CursorLeft(bv_); hit = true; } -#endif } if (hit == true) { -#ifndef NEW_INSETS bv_->toggleFloat(); -#endif selection_possible = false; return; } } - -#ifndef NEW_INSETS // Do we want to close a float? (click on the float-label) if (bv_->text->cursor.row()->par()->footnoteflag == LyXParagraph::OPEN_FOOTNOTE @@ -881,8 +874,26 @@ void BufferView::Pimpl::workAreaButtonRelease(int x, int y, return; } } +#else + // check whether we want to open a float + if (bv_->text) { + bool hit = false; + char c = ' '; + if (bv_->text->cursor.pos() < + bv_->text->cursor.par()->size()) { + c = bv_->text->cursor.par()-> + GetChar(bv_->text->cursor.pos()); + } + if (bv_->text->cursor.pos() - 1 >= 0) { + c = bv_->text->cursor.par()-> + GetChar(bv_->text->cursor.pos() - 1); + } + if (hit == true) { + selection_possible = false; + return; + } + } #endif - // Maybe we want to edit a bibitem ale970302 if (bv_->text->cursor.par()->bibkey && x < 20 + bibitemMaxWidth(bv_, textclasslist. @@ -910,8 +921,14 @@ Inset * BufferView::Pimpl::checkInsetHit(LyXText * text, int & x, int & y, LyXCursor cursor; text->SetCursorFromCoordinates(bv_, cursor, x, y_tmp); + text->SetCursor(bv_, cursor, cursor.par(),cursor.pos(),true); + +#ifndef NEW_INSETS if (cursor.pos() < cursor.par()->Last() +#else + if (cursor.pos() < cursor.par()->size() +#endif && cursor.par()->GetChar(cursor.pos()) == LyXParagraph::META_INSET && cursor.par()->GetInset(cursor.pos()) && cursor.par()->GetInset(cursor.pos())->Editable()) { @@ -928,7 +945,8 @@ Inset * BufferView::Pimpl::checkInsetHit(LyXText * text, int & x, int & y, if (x > start_x && x < end_x && y_tmp > cursor.y() - tmpinset->ascent(bv_, font) - && y_tmp < cursor.y() + tmpinset->descent(bv_, font)) { + && y_tmp < cursor.y() + tmpinset->descent(bv_, font)) + { text->SetCursor(bv_, cursor.par(),cursor.pos(),true); x = x - start_x; // The origin of an inset is on the baseline @@ -1224,8 +1242,13 @@ void BufferView::Pimpl::restorePosition(unsigned int i) if (!par) return; +#ifndef NEW_INSETS bv_->text->SetCursor(bv_, par, min(par->Last(), saved_positions[i].par_pos)); +#else + bv_->text->SetCursor(bv_, par, + min(par->size(), saved_positions[i].par_pos)); +#endif update(bv_->text, BufferView::SELECT|BufferView::FITCUR); if (i > 0) owner_->getMiniBuffer()->Set(_("Moved to bookmark ") + tostr(i)); @@ -1249,10 +1272,10 @@ void BufferView::Pimpl::setState() LyXText * text = bv_->getLyXText(); if (text->real_current_font.isRightToLeft() && text->real_current_font.latex() != LyXFont::ON) { - if (owner_->getIntl()->primarykeymap) + if (owner_->getIntl()->keymap == Intl::PRIMARY) owner_->getIntl()->KeyMapSec(); } else { - if (!owner_->getIntl()->primarykeymap) + if (owner_->getIntl()->keymap == Intl::SECONDARY) owner_->getIntl()->KeyMapPrim(); } } @@ -1424,7 +1447,6 @@ void BufferView::Pimpl::MenuInsertLyXFile(string const & filen) if (filename.empty()) { // Launch a file browser string initpath = lyxrc.document_path; - LyXFileDlg fileDlg; if (available()) { string const trypath = owner_->buffer()->filepath; @@ -1433,21 +1455,24 @@ void BufferView::Pimpl::MenuInsertLyXFile(string const & filen) initpath = trypath; } - // launches dialog - ProhibitInput(bv_); - fileDlg.SetButton(0, _("Documents"), lyxrc.document_path); - fileDlg.SetButton(1, _("Examples"), - AddPath(system_lyxdir, "examples")); - filename = fileDlg.Select(_("Select Document to Insert"), - initpath, "*.lyx"); - AllowInput(bv_); + FileDialog fileDlg(bv_->owner(), _("Select LyX document to insert"), + LFUN_FILE_INSERT, + make_pair(string(_("Documents")), string(lyxrc.document_path)), + make_pair(string(_("Examples")), string(AddPath(system_lyxdir, "examples")))); + + FileDialog::Result result = fileDlg.Select(initpath, _("*.lyx| LyX Documents (*.lyx)")); + + if (result.first == FileDialog::Later) + return; + + filename = result.second; // check selected filename if (filename.empty()) { owner_->getMiniBuffer()->Set(_("Canceled.")); return; } - } + } // get absolute path of file and make sure the filename ends // with .lyx @@ -1618,12 +1643,13 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) } break; + case LFUN_FILE_INSERT_ASCII_PARA: + InsertAsciiFile(bv_, argument, true); + break; + case LFUN_FILE_INSERT_ASCII: - { - bool asPara = (argument == "paragraph"); - InsertAsciiFile(bv_, string(), asPara); - } - break; + InsertAsciiFile(bv_, argument, false); + break; case LFUN_LAYOUT: { @@ -1807,7 +1833,11 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) update(TEXT(bv_), BufferView::SELECT|BufferView::FITCUR); if (is_rtl) TEXT(bv_)->CursorLeft(bv_, false); +#ifndef NEW_INSETS if (TEXT(bv_)->cursor.pos() < TEXT(bv_)->cursor.par()->Last() +#else + if (TEXT(bv_)->cursor.pos() < TEXT(bv_)->cursor.par()->size() +#endif && TEXT(bv_)->cursor.par()->GetChar(TEXT(bv_)->cursor.pos()) == LyXParagraph::META_INSET && TEXT(bv_)->cursor.par()->GetInset(TEXT(bv_)->cursor.pos()) @@ -1845,7 +1875,11 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) if (!is_rtl) TEXT(bv_)->CursorLeft(bv_, false); if ((is_rtl || cur != TEXT(bv_)->cursor) && // only if really moved! +#ifndef NEW_INSETS TEXT(bv_)->cursor.pos() < TEXT(bv_)->cursor.par()->Last() && +#else + TEXT(bv_)->cursor.pos() < TEXT(bv_)->cursor.par()->size() && +#endif (TEXT(bv_)->cursor.par()->GetChar(TEXT(bv_)->cursor.pos()) == LyXParagraph::META_INSET) && TEXT(bv_)->cursor.par()->GetInset(TEXT(bv_)->cursor.pos()) && @@ -2216,7 +2250,11 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) LyXCursor cursor = TEXT(bv_)->cursor; if (!TEXT(bv_)->selection) { +#ifndef NEW_INSETS if (cursor.pos() == cursor.par()->Last()) { +#else + if (cursor.pos() == cursor.par()->size()) { +#endif TEXT(bv_)->CursorRight(bv_); cursor = TEXT(bv_)->cursor; if (cursor.pos() == 0 @@ -2715,7 +2753,12 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) case LFUN_INSERT_MATH: { - math_insert_symbol(bv_, argument); + if (!available()) + break; + + InsetFormula * f = new InsetFormula(true); + bv_->open_new_inset(f); + f->LocalDispatch(bv_, LFUN_INSERT_MATH, argument); } break; @@ -2888,18 +2931,22 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) if (!bv_->insertInset(inset, "Standard", true)) delete inset; } + break; case LFUN_CHILD_INSERT: { - InsetCommandParams p; - p.setFromString(argument); + InsetInclude::Params p; + p.cparams.setFromString(argument); + p.masterFilename_ = buffer_->fileName(); - InsetInclude * inset = new InsetInclude(p, *buffer_); + InsetInclude * inset = new InsetInclude(p); if (!bv_->insertInset(inset)) delete inset; - else + else { bv_->updateInset(inset, true); + bv_->owner()->getDialogs()->showInclude(inset); + } } break; @@ -2984,8 +3031,7 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) for (string::size_type i = 0; i < argument.length(); ++i) { if (greek_kb_flag) { - if (!math_insert_greek(bv_, - argument[i])) + if (!math_insert_greek(bv_, argument[i])) owner_->getIntl()->getTrans().TranslateAndInsert(argument[i], TEXT(bv_)); } else owner_->getIntl()->getTrans().TranslateAndInsert(argument[i], TEXT(bv_)); @@ -3003,7 +3049,7 @@ bool BufferView::Pimpl::Dispatch(kb_action action, string const & argument) } else { // if we don't have an argument there was something // strange going on so we just tell this to someone! - owner_->getLyXFunc()->setErrorMessage(N_("No argument givven")); + owner_->getLyXFunc()->setErrorMessage(N_("No argument given")); } break; }