X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2FLyXView.C;h=8c6059bf75b9419b0055af0382edd4d3247ec4a4;hb=25079a83c2c4efd877a735e6571f149f703d4a16;hp=62d41ff69fa6352b2f9158572ee35941eaa62686;hpb=1a0f5eaf8d473bef131b45c70d803c210e90e192;p=lyx.git diff --git a/src/frontends/LyXView.C b/src/frontends/LyXView.C index 62d41ff69f..8c6059bf75 100644 --- a/src/frontends/LyXView.C +++ b/src/frontends/LyXView.C @@ -12,12 +12,12 @@ #include #include "LyXView.h" -#include "Gui.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" @@ -43,6 +43,9 @@ #include + +namespace lyx { + #ifdef HAVE_SYS_TIME_H # include #endif @@ -50,13 +53,12 @@ # include #endif -using lyx::frontend::Gui; -using lyx::frontend::WorkArea; +using frontend::WorkArea; -using lyx::docstring; -using lyx::support::bformat; -using lyx::support::makeDisplayPath; -using lyx::support::onlyFilename; +using support::bformat; +using support::FileName; +using support::makeDisplayPath; +using support::onlyFilename; using std::endl; using std::string; @@ -65,73 +67,65 @@ using lyx::frontend::ControlCommandBuffer; string current_layout; -Gui & LyXView::gui() -{ - return owner_; -} - -LyXView::LyXView(Gui & owner) +LyXView::LyXView(int id) : work_area_(0), - owner_(owner), toolbars_(new Toolbars(*this)), - intl_(new Intl), 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::redrawWorkArea() -{ - work_area_->redraw(); - updateStatusBar(); -} - - -WorkArea * LyXView::workArea() +// FIXME, there's only one WorkArea per LyXView possible for now. +WorkArea const * LyXView::currentWorkArea() const { return work_area_; } -void LyXView::init() +// FIXME, there's only one WorkArea per LyXView possible for now. +WorkArea * LyXView::currentWorkArea() { - updateLayoutChoice(); - updateMenubar(); - - // Start autosave timer - if (lyxrc.autosave) { - autosave_timeout_->timeout.connect(boost::bind(&LyXView::autoSave, this)); - autosave_timeout_->setTimeout(lyxrc.autosave * 1000); - autosave_timeout_->start(); - } - - intl_->initKeyMapper(lyxrc.use_kbmap); + 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(); @@ -148,16 +142,25 @@ void LyXView::setBuffer(Buffer * b) connectBuffer(*work_area_->bufferView().buffer()); } + if (quitting) + return; + updateMenubar(); updateToolbars(); updateLayoutChoice(); updateWindowTitle(); - redrawWorkArea(); + updateStatusBar(); + updateTab(); + busy(false); + work_area_->redraw(); } -bool LyXView::loadLyXFile(string const & filename, bool tolastfiles) +bool LyXView::loadLyXFile(FileName const & filename, bool tolastfiles) { + busy(true); + + BOOST_ASSERT(work_area_); if (work_area_->bufferView().buffer()) disconnectBuffer(); @@ -167,11 +170,14 @@ bool LyXView::loadLyXFile(string const & filename, bool tolastfiles) updateToolbars(); updateLayoutChoice(); updateWindowTitle(); + updateTab(); if (loaded) { connectBuffer(*work_area_->bufferView().buffer()); showErrorList("Parse"); } - redrawWorkArea(); + updateStatusBar(); + busy(false); + work_area_->redraw(); return loaded; } @@ -181,6 +187,11 @@ 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)); @@ -213,12 +224,39 @@ void LyXView::connectBuffer(Buffer & buf) 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(); } @@ -231,6 +269,32 @@ void LyXView::showErrorList(string const & error_type) } +void LyXView::showDialog(string const & name) +{ + getDialogs().show(name); +} + + +void LyXView::showDialogWithData(string const & name, string const & data) +{ + getDialogs().show(name, data); +} + + +void LyXView::showInsetDialog(string const & name, string const & data, + InsetBase * inset) +{ + getDialogs().show(name, data, inset); +} + + +void LyXView::updateDialog(string const & name, string const & data) +{ + if (getDialogs().visible(name)) + getDialogs().update(name, data); +} + + void LyXView::showReadonly(bool) { updateWindowTitle(); @@ -240,22 +304,23 @@ void LyXView::showReadonly(bool) BufferView * LyXView::view() const { + BOOST_ASSERT(work_area_); return &work_area_->bufferView(); } -void LyXView::setLayout(string const & layout) -{ - toolbars_->setLayout(layout); -} - - void LyXView::updateToolbars() { - bool const math = work_area_->bufferView().cursor().inMathed(); + BOOST_ASSERT(work_area_); + bool const math = + work_area_->bufferView().cursor().inMathed(); bool const table = - getLyXFunc().getStatus(FuncRequest(LFUN_LAYOUT_TABULAR)).enabled(); - toolbars_->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. @@ -263,6 +328,26 @@ void LyXView::updateToolbars() } +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(); +} + + void LyXView::updateMenubar() { menubar_->update(); @@ -273,9 +358,8 @@ void LyXView::autoSave() { lyxerr[Debug::INFO] << "Running autoSave()" << endl; - if (view()->buffer()) { - ::autoSave(view()); - } + if (view()->buffer()) + lyx::autoSave(view()); } @@ -299,6 +383,7 @@ void LyXView::updateLayoutChoice() current_layout = buffer()->params().getLyXTextClass().defaultLayoutName(); } + BOOST_ASSERT(work_area_); if (work_area_->bufferView().cursor().inMathed()) return; @@ -314,14 +399,13 @@ void LyXView::updateLayoutChoice() void LyXView::updateWindowTitle() { - static docstring last_title = lyx::from_ascii("LyX"); docstring maximize_title = lyx::from_ascii("LyX"); docstring minimize_title = lyx::from_ascii("LyX"); if (view()->buffer()) { string const cur_title = buffer()->fileName(); if (!cur_title.empty()) { - maximize_title += lyx::from_ascii(": ") + makeDisplayPath(cur_title, 30); + maximize_title += ": " + makeDisplayPath(cur_title, 30); minimize_title = lyx::from_utf8(onlyFilename(cur_title)); if (!buffer()->isClean()) { maximize_title += _(" (changed)"); @@ -332,16 +416,14 @@ void LyXView::updateWindowTitle() } } - if (maximize_title != last_title) { - setWindowTitle(maximize_title, minimize_title); - last_title = maximize_title; - } + setWindowTitle(maximize_title, minimize_title); } void LyXView::dispatch(FuncRequest const & cmd) { - getLyXFunc().dispatch(cmd); + theLyXFunc().setLyXView(this); + lyx::dispatch(cmd); } @@ -349,9 +431,13 @@ 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(); - // No FitCursor: - work_area_->bufferView().update(Update::Force); } return buffer_ptr; } + + +} // namespace lyx