X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2FLyXView.C;h=8c6059bf75b9419b0055af0382edd4d3247ec4a4;hb=25079a83c2c4efd877a735e6571f149f703d4a16;hp=4b00b244fe97370c77a7659088b86a12f712abe4;hpb=92d522b7f1be6046adcac062c558bbf0bf021612;p=lyx.git diff --git a/src/frontends/LyXView.C b/src/frontends/LyXView.C index 4b00b244fe..8c6059bf75 100644 --- a/src/frontends/LyXView.C +++ b/src/frontends/LyXView.C @@ -6,101 +6,345 @@ * \author Lars Gullik Bjønnes * \author John Levon * - * Full author contact details are available in file CREDITS + * Full author contact details are available in file CREDITS. */ #include #include "LyXView.h" +#include "Dialogs.h" +#include "Timeout.h" +#include "Toolbars.h" +#include "Menubar.h" +#include "WorkArea.h" +#include "Gui.h" + +#include "buffer.h" +#include "bufferparams.h" +#include "BufferView.h" +#include "bufferview_funcs.h" +#include "cursor.h" #include "debug.h" +#include "errorlist.h" +#include "funcrequest.h" +#include "gettext.h" #include "intl.h" +#include "lyx_cb.h" +#include "lyxfunc.h" #include "lyxrc.h" #include "lyxtext.h" -#include "buffer.h" #include "MenuBackend.h" -#include "gettext.h" -#include "lyxfunc.h" -#include "funcrequest.h" -#include "lyx_cb.h" -#include "BufferView.h" -#include "bufferview_funcs.h" +#include "paragraph.h" -#include "Dialogs.h" -#include "Toolbar.h" -#include "Timeout.h" -#include "Menubar.h" #include "controllers/ControlCommandBuffer.h" -#include "mathed/math_cursor.h" +#include "support/lstrings.h" #include "support/filetools.h" // OnlyFilename() #include -#include -#include -using namespace lyx::support; +namespace lyx { + +#ifdef HAVE_SYS_TIME_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif + +using frontend::WorkArea; + +using support::bformat; +using support::FileName; +using support::makeDisplayPath; +using support::onlyFilename; + using std::endl; +using std::string; + +using lyx::frontend::ControlCommandBuffer; string current_layout; -LyXView::LyXView() - : intl_(new Intl), +LyXView::LyXView(int id) + : work_area_(0), + toolbars_(new Toolbars(*this)), autosave_timeout_(new Timeout(5000)), - lyxfunc_(new LyXFunc(this)), dialogs_(new Dialogs(*this)), - controlcommand_(new ControlCommandBuffer(*this)) + controlcommand_(new ControlCommandBuffer(*this)), id_(id) { - lyxerr[Debug::INIT] << "Initializing LyXFunc" << endl; + // Start autosave timer + if (lyxrc.autosave) { + autosave_timeout_->timeout.connect(boost::bind(&LyXView::autoSave, this)); + autosave_timeout_->setTimeout(lyxrc.autosave * 1000); + autosave_timeout_->start(); + } } LyXView::~LyXView() { + disconnectBuffer(); +} + + +// FIXME, there's only one WorkArea per LyXView possible for now. +void LyXView::setWorkArea(WorkArea * work_area) +{ + BOOST_ASSERT(work_area); + work_area_ = work_area; + work_area_ids_.clear(); + work_area_ids_.push_back(work_area_->id()); } -void LyXView::init() +// FIXME, there's only one WorkArea per LyXView possible for now. +WorkArea const * LyXView::currentWorkArea() const { + return work_area_; +} + + +// FIXME, there's only one WorkArea per LyXView possible for now. +WorkArea * LyXView::currentWorkArea() +{ + return work_area_; +} + + +Buffer * LyXView::buffer() const +{ + BOOST_ASSERT(work_area_); + return work_area_->bufferView().buffer(); +} + + +void LyXView::setBuffer(Buffer * b) +{ + busy(true); + + BOOST_ASSERT(work_area_); + if (work_area_->bufferView().buffer()) + disconnectBuffer(); + + if (!b) + getDialogs().hideBufferDependent(); + + work_area_->bufferView().setBuffer(b); + + if (work_area_->bufferView().buffer()) { + // Buffer-dependent dialogs should be updated or + // hidden. This should go here because some dialogs (eg ToC) + // require bv_->text. + getDialogs().updateBufferDependent(true); + connectBuffer(*work_area_->bufferView().buffer()); + } + + if (quitting) + return; + + updateMenubar(); + updateToolbars(); updateLayoutChoice(); + updateWindowTitle(); + updateStatusBar(); + updateTab(); + busy(false); + work_area_->redraw(); +} + + +bool LyXView::loadLyXFile(FileName const & filename, bool tolastfiles) +{ + busy(true); + + BOOST_ASSERT(work_area_); + if (work_area_->bufferView().buffer()) + disconnectBuffer(); + + bool loaded = work_area_->bufferView().loadLyXFile(filename, tolastfiles); + updateMenubar(); + updateToolbars(); + updateLayoutChoice(); + updateWindowTitle(); + updateTab(); + if (loaded) { + connectBuffer(*work_area_->bufferView().buffer()); + showErrorList("Parse"); + } + updateStatusBar(); + busy(false); + work_area_->redraw(); + return loaded; +} - // Start autosave timer - if (lyxrc.autosave) { - autosave_timeout_->timeout.connect(boost::bind(&LyXView::autoSave, this)); - autosave_timeout_->setTimeout(lyxrc.autosave * 1000); - autosave_timeout_->start(); + +void LyXView::connectBuffer(Buffer & buf) +{ + if (errorsConnection_.connected()) + disconnectBuffer(); + + BOOST_ASSERT(work_area_); + bufferChangedConnection_ = + buf.changed.connect( + boost::bind(&WorkArea::redraw, work_area_)); + + errorsConnection_ = + buf.errors.connect( + boost::bind(&LyXView::showErrorList, this, _1)); + + messageConnection_ = + buf.message.connect( + boost::bind(&LyXView::message, this, _1)); + + busyConnection_ = + buf.busy.connect( + boost::bind(&LyXView::busy, this, _1)); + + titleConnection_ = + buf.updateTitles.connect( + boost::bind(&LyXView::updateWindowTitle, this)); + + timerConnection_ = + buf.resetAutosaveTimers.connect( + boost::bind(&LyXView::resetAutosaveTimer, this)); + + readonlyConnection_ = + buf.readonly.connect( + boost::bind(&LyXView::showReadonly, this, _1)); + + closingConnection_ = + buf.closing.connect( + boost::bind(&LyXView::setBuffer, this, (Buffer *)0)); +} + + +void LyXView::disconnectBuffer() +{ + errorsConnection_.disconnect(); + bufferChangedConnection_.disconnect(); + messageConnection_.disconnect(); + busyConnection_.disconnect(); + titleConnection_.disconnect(); + timerConnection_.disconnect(); + readonlyConnection_.disconnect(); + closingConnection_.disconnect(); + layout_changed_connection_.disconnect(); +} + + +void LyXView::connectBufferView(BufferView & bv) +{ + show_dialog_connection_ = bv.showDialog.connect( + boost::bind(&LyXView::showDialog, this, _1)); + show_dialog_with_data_connection_ = bv.showDialogWithData.connect( + boost::bind(&LyXView::showDialogWithData, this, _1, _2)); + show_inset_dialog_connection_ = bv.showInsetDialog.connect( + boost::bind(&LyXView::showInsetDialog, this, _1, _2, _3)); + update_dialog_connection_ = bv.updateDialog.connect( + boost::bind(&LyXView::updateDialog, this, _1, _2)); + layout_changed_connection_ = bv.layoutChanged.connect( + boost::bind(&Toolbars::setLayout, toolbars_.get(), _1)); +} + + +void LyXView::disconnectBufferView() +{ + show_dialog_connection_.disconnect(); + show_dialog_with_data_connection_.disconnect(); + show_inset_dialog_connection_.disconnect(); + update_dialog_connection_.disconnect(); +} + + +void LyXView::showErrorList(string const & error_type) +{ + ErrorList & el = buffer()->errorList(error_type); + if (!el.empty()) { + getDialogs().show("errorlist", error_type); } +} + - intl_->InitKeyMapper(lyxrc.use_kbmap); +void LyXView::showDialog(string const & name) +{ + getDialogs().show(name); } -Buffer * LyXView::buffer() const +void LyXView::showDialogWithData(string const & name, string const & data) +{ + getDialogs().show(name, data); +} + + +void LyXView::showInsetDialog(string const & name, string const & data, + InsetBase * inset) { - return bufferview_->buffer(); + getDialogs().show(name, data, inset); } -boost::shared_ptr const & LyXView::view() const +void LyXView::updateDialog(string const & name, string const & data) { - return bufferview_; + if (getDialogs().visible(name)) + getDialogs().update(name, data); } -void LyXView::setLayout(string const & layout) +void LyXView::showReadonly(bool) { - toolbar_->setLayout(layout); + updateWindowTitle(); + getDialogs().updateBufferDependent(false); } -void LyXView::updateToolbar() +BufferView * LyXView::view() const { - bool const math = mathcursor; + BOOST_ASSERT(work_area_); + return &work_area_->bufferView(); +} + + +void LyXView::updateToolbars() +{ + BOOST_ASSERT(work_area_); + bool const math = + work_area_->bufferView().cursor().inMathed(); bool const table = - !getLyXFunc().getStatus(LFUN_LAYOUT_TABULAR).disabled(); - toolbar_->update(math, table); + lyx::getStatus(FuncRequest(LFUN_LAYOUT_TABULAR)).enabled(); + bool const review = + lyx::getStatus(FuncRequest(LFUN_CHANGES_TRACK)).enabled() && + lyx::getStatus(FuncRequest(LFUN_CHANGES_TRACK)).onoff(true); + + toolbars_->update(math, table, review); + // update redaonly status of open dialogs. This could also be in + // updateMenubar(), but since updateToolbars() and updateMenubar() + // are always called together it is only here. + getDialogs().checkStatus(); +} + + +ToolbarBackend::Flags LyXView::getToolbarState(string const & name) +{ + return toolbars_->getToolbarState(name); +} + + +void LyXView::toggleToolbarState(string const & name) +{ + // it is possible to get current toolbar status like this,... + // but I decide to obey the order of ToolbarBackend::flags + // and disregard real toolbar status. + // toolbars_->saveToolbarInfo(); + // + // toggle state on/off/auto + toolbars_->toggleToolbarState(name); + // update toolbar + updateToolbars(); } @@ -114,9 +358,8 @@ void LyXView::autoSave() { lyxerr[Debug::INFO] << "Running autoSave()" << endl; - if (view()->available()) { - ::AutoSave(view().get()); - } + if (view()->buffer()) + lyx::autoSave(view()); } @@ -129,22 +372,26 @@ void LyXView::resetAutosaveTimer() void LyXView::updateLayoutChoice() { - // don't show any layouts without a buffer + // Don't show any layouts without a buffer if (!view()->buffer()) { - toolbar_->clearLayoutList(); + toolbars_->clearLayoutList(); return; } - // update the layout display - if (toolbar_->updateLayoutList(buffer()->params.textclass)) { - current_layout = buffer()->params.getLyXTextClass().defaultLayoutName(); + // Update the layout display + if (toolbars_->updateLayoutList(buffer()->params().textclass)) { + current_layout = buffer()->params().getLyXTextClass().defaultLayoutName(); } + BOOST_ASSERT(work_area_); + if (work_area_->bufferView().cursor().inMathed()) + return; + string const & layout = - bufferview_->getLyXText()->cursor.par()->layout()->name(); + work_area_->bufferView().cursor().paragraph().layout()->name(); if (layout != current_layout) { - toolbar_->setLayout(layout); + toolbars_->setLayout(layout); current_layout = layout; } } @@ -152,35 +399,45 @@ void LyXView::updateLayoutChoice() void LyXView::updateWindowTitle() { - static string last_title = "LyX"; - string maximize_title = "LyX"; - string minimize_title = "LyX"; + docstring maximize_title = lyx::from_ascii("LyX"); + docstring minimize_title = lyx::from_ascii("LyX"); - if (view()->available()) { + if (view()->buffer()) { string const cur_title = buffer()->fileName(); if (!cur_title.empty()) { - maximize_title += ": " + MakeDisplayPath(cur_title, 30); - minimize_title = OnlyFilename(cur_title); + maximize_title += ": " + makeDisplayPath(cur_title, 30); + minimize_title = lyx::from_utf8(onlyFilename(cur_title)); if (!buffer()->isClean()) { maximize_title += _(" (changed)"); - minimize_title += '*'; + minimize_title += lyx::char_type('*'); } if (buffer()->isReadonly()) maximize_title += _(" (read only)"); } } - if (maximize_title != last_title) { - setWindowTitle(maximize_title, minimize_title); - last_title = maximize_title; - } + setWindowTitle(maximize_title, minimize_title); } -void LyXView::dispatch(FuncRequest const & req) +void LyXView::dispatch(FuncRequest const & cmd) { - // substitute the correct BufferView here - FuncRequest r = req; - r.setView(view().get()); - getLyXFunc().dispatch(r); + theLyXFunc().setLyXView(this); + lyx::dispatch(cmd); } + + +Buffer const * const LyXView::updateInset(InsetBase const * inset) const +{ + Buffer const * buffer_ptr = 0; + if (inset) { + BOOST_ASSERT(work_area_); + work_area_->scheduleRedraw(); + + buffer_ptr = work_area_->bufferView().buffer(); + } + return buffer_ptr; +} + + +} // namespace lyx