+++ /dev/null
-/**
- * \file Alert.cpp
- * This file is part of LyX, the document processor.
- * Licence details can be found in the file COPYING.
- *
- * \author John Levon
- *
- * Full author contact details are available in file CREDITS.
- */
-
-#include <config.h>
-
-#include "Alert.h"
-#include "Alert_pimpl.h"
-
-#include "debug.h"
-#include "lyx_main.h" // for lyx::use_gui
-
-using std::endl;
-using std::make_pair;
-using std::pair;
-using std::string;
-
-
-namespace lyx {
-
-namespace frontend {
-
-int Alert::prompt(docstring const & title, docstring const & question,
- int default_button, int escape_button,
- docstring const & b1, docstring const & b2, docstring const & b3)
-{
- if (!use_gui || lyxerr.debugging()) {
- lyxerr << to_utf8(title) << '\n'
- << "----------------------------------------\n"
- << to_utf8(question) << endl;
-
- lyxerr << "Assuming answer is ";
- switch (default_button) {
- case 0: lyxerr << to_utf8(b1) << endl;
- case 1: lyxerr << to_utf8(b2) << endl;
- case 2: lyxerr << to_utf8(b3) << endl;
- }
- if (!use_gui)
- return default_button;
- }
-
- return prompt_pimpl(title, question,
- default_button, escape_button, b1, b2, b3);
-
-}
-
-
-void Alert::warning(docstring const & title, docstring const & message)
-{
- lyxerr << "Warning: " << to_utf8(title) << '\n'
- << "----------------------------------------\n"
- << to_utf8(message) << endl;
-
- if (use_gui)
- warning_pimpl(title, message);
-}
-
-
-void Alert::error(docstring const & title, docstring const & message)
-{
- lyxerr << "Error: " << to_utf8(title) << '\n'
- << "----------------------------------------\n"
- << to_utf8(message) << endl;
-
- if (use_gui)
- error_pimpl(title, message);
-}
-
-
-void Alert::information(docstring const & title, docstring const & message)
-{
- if (!use_gui || lyxerr.debugging())
- lyxerr << to_utf8(title) << '\n'
- << "----------------------------------------\n"
- << to_utf8(message) << endl;
-
- if (use_gui)
- information_pimpl(title, message);
-}
-
-
-pair<bool, docstring> const Alert::askForText(docstring const & msg,
- docstring const & dflt)
-{
- if (!use_gui || lyxerr.debugging()) {
- lyxerr << "----------------------------------------\n"
- << to_utf8(msg) << '\n'
- << "Assuming answer is " << to_utf8(dflt) << '\n'
- << "----------------------------------------" << endl;
- if (!use_gui)
- return make_pair<bool, docstring>(true, dflt);
- }
-
- return askForText_pimpl(msg, dflt);
-}
-
-} // namespace frontend
-} // namespace lyx
--- /dev/null
+/**
+ * \file Alert.cpp
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author John Levon
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#include <config.h>
+
+#include "Alert.h"
+#include "Alert_pimpl.h"
+
+#include "debug.h"
+#include "lyx_main.h" // for lyx::use_gui
+
+using std::endl;
+using std::make_pair;
+using std::pair;
+using std::string;
+
+
+namespace lyx {
+
+namespace frontend {
+
+int Alert::prompt(docstring const & title, docstring const & question,
+ int default_button, int escape_button,
+ docstring const & b1, docstring const & b2, docstring const & b3)
+{
+ if (!use_gui || lyxerr.debugging()) {
+ lyxerr << to_utf8(title) << '\n'
+ << "----------------------------------------\n"
+ << to_utf8(question) << endl;
+
+ lyxerr << "Assuming answer is ";
+ switch (default_button) {
+ case 0: lyxerr << to_utf8(b1) << endl;
+ case 1: lyxerr << to_utf8(b2) << endl;
+ case 2: lyxerr << to_utf8(b3) << endl;
+ }
+ if (!use_gui)
+ return default_button;
+ }
+
+ return prompt_pimpl(title, question,
+ default_button, escape_button, b1, b2, b3);
+
+}
+
+
+void Alert::warning(docstring const & title, docstring const & message)
+{
+ lyxerr << "Warning: " << to_utf8(title) << '\n'
+ << "----------------------------------------\n"
+ << to_utf8(message) << endl;
+
+ if (use_gui)
+ warning_pimpl(title, message);
+}
+
+
+void Alert::error(docstring const & title, docstring const & message)
+{
+ lyxerr << "Error: " << to_utf8(title) << '\n'
+ << "----------------------------------------\n"
+ << to_utf8(message) << endl;
+
+ if (use_gui)
+ error_pimpl(title, message);
+}
+
+
+void Alert::information(docstring const & title, docstring const & message)
+{
+ if (!use_gui || lyxerr.debugging())
+ lyxerr << to_utf8(title) << '\n'
+ << "----------------------------------------\n"
+ << to_utf8(message) << endl;
+
+ if (use_gui)
+ information_pimpl(title, message);
+}
+
+
+pair<bool, docstring> const Alert::askForText(docstring const & msg,
+ docstring const & dflt)
+{
+ if (!use_gui || lyxerr.debugging()) {
+ lyxerr << "----------------------------------------\n"
+ << to_utf8(msg) << '\n'
+ << "Assuming answer is " << to_utf8(dflt) << '\n'
+ << "----------------------------------------" << endl;
+ if (!use_gui)
+ return make_pair<bool, docstring>(true, dflt);
+ }
+
+ return askForText_pimpl(msg, dflt);
+}
+
+} // namespace frontend
+} // namespace lyx
+++ /dev/null
-/**
- * \file frontend/Application.cpp
- * This file is part of LyX, the document processor.
- * Licence details can be found in the file COPYING.
- *
- * \author Abdelrazak Younes
- *
- * Full author contact details are available in file CREDITS.
- */
-
-#include <config.h>
-
-#include "frontends/Application.h"
-
-#include "frontends/NoGuiFontLoader.h"
-#include "frontends/NoGuiFontMetrics.h"
-#include "frontends/FontLoader.h"
-#include "frontends/FontMetrics.h"
-#include "frontends/Gui.h"
-#include "frontends/LyXView.h"
-#include "frontends/WorkArea.h"
-
-#include "funcrequest.h"
-#include "FuncStatus.h"
-#include "lyx_main.h" // for lyx::use_gui
-#include "lyxfont.h"
-#include "lyxfunc.h"
-#include "lyxrc.h"
-
-#include "support/lstrings.h"
-#include "support/os.h"
-
-#include <boost/scoped_ptr.hpp>
-#include <boost/shared_ptr.hpp>
-
-
-namespace lyx {
-namespace frontend {
-
-
-Application::Application(int &, char **)
- : current_view_(0)
-{
-}
-
-
-LyXView & Application::createView(unsigned int width,
- unsigned int height,
- int posx, int posy,
- int maximized,
- unsigned int iconSizeXY,
- const std::string & geometryArg)
-{
- LyXView & view = gui().createRegisteredView();
- int view_id = view.id();
-
- theLyXFunc().setLyXView(&view);
-
- /*int workArea_id_ =*/ gui().newWorkArea(width, height, view_id);
-
- view.init();
- view.setGeometry(width, height, posx, posy, maximized, iconSizeXY, geometryArg);
- view.setFocus();
-
- setCurrentView(view);
-
- return view;
-}
-
-
-LyXView const * Application::currentView() const
-{
- return current_view_;
-}
-
-
-LyXView * Application::currentView()
-{
- return current_view_;
-}
-
-
-void Application::setCurrentView(LyXView & current_view)
-{
- current_view_ = ¤t_view;
-}
-
-} // namespace frontend
-
-
-
-frontend::FontLoader & theFontLoader()
-{
- static frontend::NoGuiFontLoader no_gui_font_loader;
-
- if (!use_gui)
- return no_gui_font_loader;
-
- BOOST_ASSERT(theApp());
- return theApp()->fontLoader();
-}
-
-
-frontend::FontMetrics const & theFontMetrics(LyXFont const & f)
-{
- static frontend::NoGuiFontMetrics no_gui_font_metrics;
-
- if (!use_gui)
- return no_gui_font_metrics;
-
- BOOST_ASSERT(theApp());
- return theApp()->fontLoader().metrics(f);
-}
-
-
-frontend::Clipboard & theClipboard()
-{
- BOOST_ASSERT(theApp());
- return theApp()->clipboard();
-}
-
-
-frontend::Selection & theSelection()
-{
- BOOST_ASSERT(theApp());
- return theApp()->selection();
-}
-
-
-} // namespace lyx
--- /dev/null
+/**
+ * \file frontend/Application.cpp
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Abdelrazak Younes
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#include <config.h>
+
+#include "frontends/Application.h"
+
+#include "frontends/NoGuiFontLoader.h"
+#include "frontends/NoGuiFontMetrics.h"
+#include "frontends/FontLoader.h"
+#include "frontends/FontMetrics.h"
+#include "frontends/Gui.h"
+#include "frontends/LyXView.h"
+#include "frontends/WorkArea.h"
+
+#include "funcrequest.h"
+#include "FuncStatus.h"
+#include "lyx_main.h" // for lyx::use_gui
+#include "lyxfont.h"
+#include "lyxfunc.h"
+#include "lyxrc.h"
+
+#include "support/lstrings.h"
+#include "support/os.h"
+
+#include <boost/scoped_ptr.hpp>
+#include <boost/shared_ptr.hpp>
+
+
+namespace lyx {
+namespace frontend {
+
+
+Application::Application(int &, char **)
+ : current_view_(0)
+{
+}
+
+
+LyXView & Application::createView(unsigned int width,
+ unsigned int height,
+ int posx, int posy,
+ int maximized,
+ unsigned int iconSizeXY,
+ const std::string & geometryArg)
+{
+ LyXView & view = gui().createRegisteredView();
+ int view_id = view.id();
+
+ theLyXFunc().setLyXView(&view);
+
+ /*int workArea_id_ =*/ gui().newWorkArea(width, height, view_id);
+
+ view.init();
+ view.setGeometry(width, height, posx, posy, maximized, iconSizeXY, geometryArg);
+ view.setFocus();
+
+ setCurrentView(view);
+
+ return view;
+}
+
+
+LyXView const * Application::currentView() const
+{
+ return current_view_;
+}
+
+
+LyXView * Application::currentView()
+{
+ return current_view_;
+}
+
+
+void Application::setCurrentView(LyXView & current_view)
+{
+ current_view_ = ¤t_view;
+}
+
+} // namespace frontend
+
+
+
+frontend::FontLoader & theFontLoader()
+{
+ static frontend::NoGuiFontLoader no_gui_font_loader;
+
+ if (!use_gui)
+ return no_gui_font_loader;
+
+ BOOST_ASSERT(theApp());
+ return theApp()->fontLoader();
+}
+
+
+frontend::FontMetrics const & theFontMetrics(LyXFont const & f)
+{
+ static frontend::NoGuiFontMetrics no_gui_font_metrics;
+
+ if (!use_gui)
+ return no_gui_font_metrics;
+
+ BOOST_ASSERT(theApp());
+ return theApp()->fontLoader().metrics(f);
+}
+
+
+frontend::Clipboard & theClipboard()
+{
+ BOOST_ASSERT(theApp());
+ return theApp()->clipboard();
+}
+
+
+frontend::Selection & theSelection()
+{
+ BOOST_ASSERT(theApp());
+ return theApp()->selection();
+}
+
+
+} // namespace lyx
+++ /dev/null
-/**
- * \file frontends/Dialogs.cpp
- * This file is part of LyX, the document processor.
- * Licence details can be found in the file COPYING.
- *
- * \author Angus Leeming
- *
- * Full author contact details are available in file CREDITS.
- *
- * Common to all frontends' Dialogs
- */
-
-#include <config.h>
-
-#include "Dialogs.h"
-
-#include "lyx_cb.h"
-
-#include "controllers/Dialog.h"
-
-#include <boost/signal.hpp>
-#include <boost/bind.hpp>
-
-
-namespace lyx {
-
-
-using std::string;
-using lyx::frontend::Dialog;
-
-
-// Note that static boost signals break some compilers, so this wrapper
-// initialises the signal dynamically when it is first invoked.
-template<typename Signal>
-class BugfixSignal {
-public:
- Signal & operator()() { return thesignal(); }
- Signal const & operator()() const { return thesignal(); }
-
-private:
- Signal & thesignal() const
- {
- if (!signal_.get())
- signal_.reset(new Signal);
- return *signal_;
- }
-
- mutable boost::scoped_ptr<Signal> signal_;
-};
-
-
-namespace {
-
-BugfixSignal<boost::signal<void(string const &, InsetBase*)> > hideSignal;
-
-}
-
-
-void Dialogs::hide(string const & name, InsetBase* inset)
-{
- // Don't send the signal if we are quitting, because on MSVC it is
- // destructed before the cut stack in CutAndPaste.C, and this method
- // is called from some inset destructor if the cut stack is not empty
- // on exit.
- if (!quitting)
- hideSignal()(name, inset);
-}
-
-
-Dialogs::Dialogs(LyXView & lyxview)
- : lyxview_(lyxview), in_show_(false)
-{
- // Connect signals
- hideSignal().connect(boost::bind(&Dialogs::hideSlot, this, _1, _2));
-}
-
-
-Dialog * Dialogs::find_or_build(string const & name)
-{
- if (!isValidName(name))
- return 0;
-
- std::map<string, DialogPtr>::iterator it =
- dialogs_.find(name);
-
- if (it != dialogs_.end())
- return it->second.get();
-
- dialogs_[name] = build(name);
- return dialogs_[name].get();
-}
-
-
-void Dialogs::show(string const & name, string const & data)
-{
- if (in_show_) {
- return;
- }
- in_show_ = true;
- Dialog * dialog = find_or_build(name);
- if (dialog) {
- // FIXME! Should check that the dialog is NOT an inset dialog.
- dialog->show(data);
- }
- in_show_ = false;
-}
-
-
-void Dialogs::show(string const & name, string const & data, InsetBase * inset)
-{
- if (in_show_) {
- return;
- }
- in_show_ = true;
- Dialog * dialog = find_or_build(name);
- if (dialog) {
- // FIXME! Should check that the dialog IS an inset dialog.
- dialog->show(data);
- open_insets_[name] = inset;
- }
- in_show_ = false;
-}
-
-
-bool Dialogs::visible(string const & name) const
-{
- std::map<string, DialogPtr>::const_iterator it =
- dialogs_.find(name);
- if (it == dialogs_.end())
- return false;
- return it->second.get()->isVisible();
-}
-
-
-void Dialogs::update(string const & name, string const & data)
-{
- std::map<string, DialogPtr>::const_iterator it =
- dialogs_.find(name);
- if (it == dialogs_.end())
- return;
-
- Dialog * const dialog = it->second.get();
- if (dialog->isVisible())
- dialog->update(data);
-}
-
-
-void Dialogs::hideSlot(string const & name, InsetBase * inset)
-{
- std::map<string, DialogPtr>::const_iterator it =
- dialogs_.find(name);
- if (it == dialogs_.end())
- return;
-
- if (inset && inset != getOpenInset(name))
- return;
-
- Dialog * const dialog = it->second.get();
- if (dialog->isVisible())
- dialog->hide();
- open_insets_[name] = 0;
-}
-
-
-void Dialogs::disconnect(string const & name)
-{
- if (!isValidName(name))
- return;
-
- if (open_insets_.find(name) != open_insets_.end())
- open_insets_[name] = 0;
-}
-
-
-InsetBase * Dialogs::getOpenInset(string const & name) const
-{
- if (!isValidName(name))
- return 0;
-
- std::map<string, InsetBase *>::const_iterator it =
- open_insets_.find(name);
- return it == open_insets_.end() ? 0 : it->second;
-}
-
-
-void Dialogs::hideAll() const
-{
- std::map<string, DialogPtr>::const_iterator it = dialogs_.begin();
- std::map<string, DialogPtr>::const_iterator end = dialogs_.end();
-
- for(; it != end; ++it) {
- it->second->hide();
- }
-}
-
-
-void Dialogs::hideBufferDependent() const
-{
- std::map<string, DialogPtr>::const_iterator it = dialogs_.begin();
- std::map<string, DialogPtr>::const_iterator end = dialogs_.end();
-
- for(; it != end; ++it) {
- Dialog * dialog = it->second.get();
- if (dialog->controller().isBufferDependent())
- dialog->hide();
- }
-}
-
-
-void Dialogs::updateBufferDependent(bool switched) const
-{
- std::map<string, DialogPtr>::const_iterator it = dialogs_.begin();
- std::map<string, DialogPtr>::const_iterator end = dialogs_.end();
-
- for(; it != end; ++it) {
- Dialog * dialog = it->second.get();
- if (switched && dialog->controller().isBufferDependent()) {
- if (dialog->isVisible() && dialog->controller().initialiseParams(""))
- dialog->view().update();
- else
- dialog->hide();
- } else {
- // A bit clunky, but the dialog will request
- // that the kernel provides it with the necessary
- // data.
- dialog->RestoreButton();
- }
- }
-}
-
-
-void Dialogs::redraw() const
-{
- std::map<string, DialogPtr>::const_iterator it = dialogs_.begin();
- std::map<string, DialogPtr>::const_iterator end = dialogs_.end();
-
- for(; it != end; ++it) {
- it->second->redraw();
- }
-}
-
-
-void Dialogs::checkStatus()
-{
- std::map<string, DialogPtr>::const_iterator it = dialogs_.begin();
- std::map<string, DialogPtr>::const_iterator end = dialogs_.end();
-
- for(; it != end; ++it) {
- Dialog * const dialog = it->second.get();
- if (dialog->isVisible())
- dialog->checkStatus();
- }
-}
-
-
-} // namespace lyx
--- /dev/null
+/**
+ * \file frontends/Dialogs.cpp
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Angus Leeming
+ *
+ * Full author contact details are available in file CREDITS.
+ *
+ * Common to all frontends' Dialogs
+ */
+
+#include <config.h>
+
+#include "Dialogs.h"
+
+#include "lyx_cb.h"
+
+#include "controllers/Dialog.h"
+
+#include <boost/signal.hpp>
+#include <boost/bind.hpp>
+
+
+namespace lyx {
+
+
+using std::string;
+using lyx::frontend::Dialog;
+
+
+// Note that static boost signals break some compilers, so this wrapper
+// initialises the signal dynamically when it is first invoked.
+template<typename Signal>
+class BugfixSignal {
+public:
+ Signal & operator()() { return thesignal(); }
+ Signal const & operator()() const { return thesignal(); }
+
+private:
+ Signal & thesignal() const
+ {
+ if (!signal_.get())
+ signal_.reset(new Signal);
+ return *signal_;
+ }
+
+ mutable boost::scoped_ptr<Signal> signal_;
+};
+
+
+namespace {
+
+BugfixSignal<boost::signal<void(string const &, InsetBase*)> > hideSignal;
+
+}
+
+
+void Dialogs::hide(string const & name, InsetBase* inset)
+{
+ // Don't send the signal if we are quitting, because on MSVC it is
+ // destructed before the cut stack in CutAndPaste.C, and this method
+ // is called from some inset destructor if the cut stack is not empty
+ // on exit.
+ if (!quitting)
+ hideSignal()(name, inset);
+}
+
+
+Dialogs::Dialogs(LyXView & lyxview)
+ : lyxview_(lyxview), in_show_(false)
+{
+ // Connect signals
+ hideSignal().connect(boost::bind(&Dialogs::hideSlot, this, _1, _2));
+}
+
+
+Dialog * Dialogs::find_or_build(string const & name)
+{
+ if (!isValidName(name))
+ return 0;
+
+ std::map<string, DialogPtr>::iterator it =
+ dialogs_.find(name);
+
+ if (it != dialogs_.end())
+ return it->second.get();
+
+ dialogs_[name] = build(name);
+ return dialogs_[name].get();
+}
+
+
+void Dialogs::show(string const & name, string const & data)
+{
+ if (in_show_) {
+ return;
+ }
+ in_show_ = true;
+ Dialog * dialog = find_or_build(name);
+ if (dialog) {
+ // FIXME! Should check that the dialog is NOT an inset dialog.
+ dialog->show(data);
+ }
+ in_show_ = false;
+}
+
+
+void Dialogs::show(string const & name, string const & data, InsetBase * inset)
+{
+ if (in_show_) {
+ return;
+ }
+ in_show_ = true;
+ Dialog * dialog = find_or_build(name);
+ if (dialog) {
+ // FIXME! Should check that the dialog IS an inset dialog.
+ dialog->show(data);
+ open_insets_[name] = inset;
+ }
+ in_show_ = false;
+}
+
+
+bool Dialogs::visible(string const & name) const
+{
+ std::map<string, DialogPtr>::const_iterator it =
+ dialogs_.find(name);
+ if (it == dialogs_.end())
+ return false;
+ return it->second.get()->isVisible();
+}
+
+
+void Dialogs::update(string const & name, string const & data)
+{
+ std::map<string, DialogPtr>::const_iterator it =
+ dialogs_.find(name);
+ if (it == dialogs_.end())
+ return;
+
+ Dialog * const dialog = it->second.get();
+ if (dialog->isVisible())
+ dialog->update(data);
+}
+
+
+void Dialogs::hideSlot(string const & name, InsetBase * inset)
+{
+ std::map<string, DialogPtr>::const_iterator it =
+ dialogs_.find(name);
+ if (it == dialogs_.end())
+ return;
+
+ if (inset && inset != getOpenInset(name))
+ return;
+
+ Dialog * const dialog = it->second.get();
+ if (dialog->isVisible())
+ dialog->hide();
+ open_insets_[name] = 0;
+}
+
+
+void Dialogs::disconnect(string const & name)
+{
+ if (!isValidName(name))
+ return;
+
+ if (open_insets_.find(name) != open_insets_.end())
+ open_insets_[name] = 0;
+}
+
+
+InsetBase * Dialogs::getOpenInset(string const & name) const
+{
+ if (!isValidName(name))
+ return 0;
+
+ std::map<string, InsetBase *>::const_iterator it =
+ open_insets_.find(name);
+ return it == open_insets_.end() ? 0 : it->second;
+}
+
+
+void Dialogs::hideAll() const
+{
+ std::map<string, DialogPtr>::const_iterator it = dialogs_.begin();
+ std::map<string, DialogPtr>::const_iterator end = dialogs_.end();
+
+ for(; it != end; ++it) {
+ it->second->hide();
+ }
+}
+
+
+void Dialogs::hideBufferDependent() const
+{
+ std::map<string, DialogPtr>::const_iterator it = dialogs_.begin();
+ std::map<string, DialogPtr>::const_iterator end = dialogs_.end();
+
+ for(; it != end; ++it) {
+ Dialog * dialog = it->second.get();
+ if (dialog->controller().isBufferDependent())
+ dialog->hide();
+ }
+}
+
+
+void Dialogs::updateBufferDependent(bool switched) const
+{
+ std::map<string, DialogPtr>::const_iterator it = dialogs_.begin();
+ std::map<string, DialogPtr>::const_iterator end = dialogs_.end();
+
+ for(; it != end; ++it) {
+ Dialog * dialog = it->second.get();
+ if (switched && dialog->controller().isBufferDependent()) {
+ if (dialog->isVisible() && dialog->controller().initialiseParams(""))
+ dialog->view().update();
+ else
+ dialog->hide();
+ } else {
+ // A bit clunky, but the dialog will request
+ // that the kernel provides it with the necessary
+ // data.
+ dialog->RestoreButton();
+ }
+ }
+}
+
+
+void Dialogs::redraw() const
+{
+ std::map<string, DialogPtr>::const_iterator it = dialogs_.begin();
+ std::map<string, DialogPtr>::const_iterator end = dialogs_.end();
+
+ for(; it != end; ++it) {
+ it->second->redraw();
+ }
+}
+
+
+void Dialogs::checkStatus()
+{
+ std::map<string, DialogPtr>::const_iterator it = dialogs_.begin();
+ std::map<string, DialogPtr>::const_iterator end = dialogs_.end();
+
+ for(; it != end; ++it) {
+ Dialog * const dialog = it->second.get();
+ if (dialog->isVisible())
+ dialog->checkStatus();
+ }
+}
+
+
+} // namespace lyx
+++ /dev/null
-/**
- * \file LyXView.cpp
- * This file is part of LyX, the document processor.
- * Licence details can be found in the file COPYING.
- *
- * \author Lars Gullik Bjønnes
- * \author John Levon
- *
- * Full author contact details are available in file CREDITS.
- */
-
-#include <config.h>
-
-#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 "MenuBackend.h"
-#include "paragraph.h"
-
-#include "controllers/ControlCommandBuffer.h"
-
-#include "support/lstrings.h"
-#include "support/filetools.h" // OnlyFilename()
-
-#include <boost/bind.hpp>
-
-
-namespace lyx {
-
-#ifdef HAVE_SYS_TIME_H
-# include <sys/time.h>
-#endif
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#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(int id)
- : work_area_(0),
- toolbars_(new Toolbars(*this)),
- autosave_timeout_(new Timeout(5000)),
- dialogs_(new Dialogs(*this)),
- controlcommand_(new ControlCommandBuffer(*this)), id_(id)
-{
- // 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());
-}
-
-
-// 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);
- // Make sure the TOC is updated before anything else.
- updateToc();
-
- 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);
-
- updateToc();
- updateMenubar();
- updateToolbars();
- updateLayoutChoice();
- updateWindowTitle();
- updateTab();
- if (loaded) {
- connectBuffer(*work_area_->bufferView().buffer());
- showErrorList("Parse");
- }
- updateStatusBar();
- busy(false);
- work_area_->redraw();
- return loaded;
-}
-
-
-void LyXView::connectBuffer(Buffer & buf)
-{
- if (errorsConnection_.connected())
- disconnectBuffer();
-
- BOOST_ASSERT(work_area_);
- bufferChangedConnection_ =
- buf.changed.connect(
- boost::bind(&WorkArea::redraw, work_area_));
-
- bufferStructureChangedConnection_ =
- buf.structureChanged.connect(
- boost::bind(&LyXView::updateToc, this));
-
- 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();
- bufferStructureChangedConnection_.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);
- }
-}
-
-
-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();
- getDialogs().updateBufferDependent(false);
-}
-
-
-BufferView * LyXView::view() const
-{
- BOOST_ASSERT(work_area_);
- return &work_area_->bufferView();
-}
-
-
-void LyXView::updateToc()
-{
- updateDialog("toc", "");
-}
-
-
-void LyXView::updateToolbars()
-{
- BOOST_ASSERT(work_area_);
- bool const math =
- work_area_->bufferView().cursor().inMathed();
- bool const 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();
-}
-
-
-ToolbarInfo::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();
-}
-
-
-void LyXView::autoSave()
-{
- LYXERR(Debug::INFO) << "Running autoSave()" << endl;
-
- if (view()->buffer())
- lyx::autoSave(view());
-}
-
-
-void LyXView::resetAutosaveTimer()
-{
- if (lyxrc.autosave)
- autosave_timeout_->restart();
-}
-
-
-void LyXView::updateLayoutChoice()
-{
- // Don't show any layouts without a buffer
- if (!view()->buffer()) {
- toolbars_->clearLayoutList();
- return;
- }
-
- // 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 =
- work_area_->bufferView().cursor().paragraph().layout()->name();
-
- if (layout != current_layout) {
- toolbars_->setLayout(layout);
- current_layout = layout;
- }
-}
-
-
-void LyXView::updateWindowTitle()
-{
- 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 += ": " + makeDisplayPath(cur_title, 30);
- minimize_title = lyx::from_utf8(onlyFilename(cur_title));
- if (!buffer()->isClean()) {
- maximize_title += _(" (changed)");
- minimize_title += lyx::char_type('*');
- }
- if (buffer()->isReadonly())
- maximize_title += _(" (read only)");
- }
- }
-
- setWindowTitle(maximize_title, minimize_title);
- updateTab();
-}
-
-
-void LyXView::dispatch(FuncRequest const & cmd)
-{
- 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
--- /dev/null
+/**
+ * \file LyXView.cpp
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Lars Gullik Bjønnes
+ * \author John Levon
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#include <config.h>
+
+#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 "MenuBackend.h"
+#include "paragraph.h"
+
+#include "controllers/ControlCommandBuffer.h"
+
+#include "support/lstrings.h"
+#include "support/filetools.h" // OnlyFilename()
+
+#include <boost/bind.hpp>
+
+
+namespace lyx {
+
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#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(int id)
+ : work_area_(0),
+ toolbars_(new Toolbars(*this)),
+ autosave_timeout_(new Timeout(5000)),
+ dialogs_(new Dialogs(*this)),
+ controlcommand_(new ControlCommandBuffer(*this)), id_(id)
+{
+ // 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());
+}
+
+
+// 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);
+ // Make sure the TOC is updated before anything else.
+ updateToc();
+
+ 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);
+
+ updateToc();
+ updateMenubar();
+ updateToolbars();
+ updateLayoutChoice();
+ updateWindowTitle();
+ updateTab();
+ if (loaded) {
+ connectBuffer(*work_area_->bufferView().buffer());
+ showErrorList("Parse");
+ }
+ updateStatusBar();
+ busy(false);
+ work_area_->redraw();
+ return loaded;
+}
+
+
+void LyXView::connectBuffer(Buffer & buf)
+{
+ if (errorsConnection_.connected())
+ disconnectBuffer();
+
+ BOOST_ASSERT(work_area_);
+ bufferChangedConnection_ =
+ buf.changed.connect(
+ boost::bind(&WorkArea::redraw, work_area_));
+
+ bufferStructureChangedConnection_ =
+ buf.structureChanged.connect(
+ boost::bind(&LyXView::updateToc, this));
+
+ 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();
+ bufferStructureChangedConnection_.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);
+ }
+}
+
+
+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();
+ getDialogs().updateBufferDependent(false);
+}
+
+
+BufferView * LyXView::view() const
+{
+ BOOST_ASSERT(work_area_);
+ return &work_area_->bufferView();
+}
+
+
+void LyXView::updateToc()
+{
+ updateDialog("toc", "");
+}
+
+
+void LyXView::updateToolbars()
+{
+ BOOST_ASSERT(work_area_);
+ bool const math =
+ work_area_->bufferView().cursor().inMathed();
+ bool const 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();
+}
+
+
+ToolbarInfo::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();
+}
+
+
+void LyXView::autoSave()
+{
+ LYXERR(Debug::INFO) << "Running autoSave()" << endl;
+
+ if (view()->buffer())
+ lyx::autoSave(view());
+}
+
+
+void LyXView::resetAutosaveTimer()
+{
+ if (lyxrc.autosave)
+ autosave_timeout_->restart();
+}
+
+
+void LyXView::updateLayoutChoice()
+{
+ // Don't show any layouts without a buffer
+ if (!view()->buffer()) {
+ toolbars_->clearLayoutList();
+ return;
+ }
+
+ // 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 =
+ work_area_->bufferView().cursor().paragraph().layout()->name();
+
+ if (layout != current_layout) {
+ toolbars_->setLayout(layout);
+ current_layout = layout;
+ }
+}
+
+
+void LyXView::updateWindowTitle()
+{
+ 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 += ": " + makeDisplayPath(cur_title, 30);
+ minimize_title = lyx::from_utf8(onlyFilename(cur_title));
+ if (!buffer()->isClean()) {
+ maximize_title += _(" (changed)");
+ minimize_title += lyx::char_type('*');
+ }
+ if (buffer()->isReadonly())
+ maximize_title += _(" (read only)");
+ }
+ }
+
+ setWindowTitle(maximize_title, minimize_title);
+ updateTab();
+}
+
+
+void LyXView::dispatch(FuncRequest const & cmd)
+{
+ 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
+++ /dev/null
-/**
- * \file Painter.cpp
- * This file is part of LyX, the document processor.
- * Licence details can be found in the file COPYING.
- *
- * \author unknown
- * \author John Levon
- *
- * Full author contact details are available in file CREDITS.
- */
-
-#include <config.h>
-
-#include "frontends/Painter.h"
-
-#include "frontends/FontMetrics.h"
-
-#include "LColor.h"
-#include "lyxfont.h"
-
-using lyx::docstring;
-
-using std::max;
-using std::string;
-
-namespace lyx {
-namespace frontend {
-
-void Painter::button(int x, int y, int w, int h, bool mouseHover)
-{
- if (mouseHover)
- fillRectangle(x, y, w, h, LColor::buttonhoverbg);
- else
- fillRectangle(x, y, w, h, LColor::buttonbg);
- buttonFrame(x, y, w, h);
-}
-
-
-void Painter::buttonFrame(int x, int y, int w, int h)
-{
- line(x, y, x, y + h - 1, LColor::buttonframe);
- line(x - 1 + w, y, x - 1 + w, y + h - 1, LColor::buttonframe);
- line(x, y - 1, x - 1 + w, y - 1, LColor::buttonframe);
- line(x, y + h - 1, x - 1 + w, y + h - 1, LColor::buttonframe);
-}
-
-
-void Painter::rectText(int x, int y,
- docstring const & str,
- LyXFont const & font,
- LColor_color back,
- LColor_color frame)
-{
- int width;
- int ascent;
- int descent;
-
- FontMetrics const & fm = theFontMetrics(font);
- fm.rectText(str, width, ascent, descent);
-
- if (back != LColor::none)
- fillRectangle(x + 1, y - ascent + 1, width - 1,
- ascent + descent - 1, back);
-
- if (frame != LColor::none)
- rectangle(x, y - ascent, width, ascent + descent, frame);
-
- text(x + 3, y, str, font);
-}
-
-
-void Painter::buttonText(int x, int y, docstring const & str,
- LyXFont const & font, bool mouseHover)
-{
- int width;
- int ascent;
- int descent;
-
- FontMetrics const & fm = theFontMetrics(font);
- fm.buttonText(str, width, ascent, descent);
-
- button(x, y - ascent, width, descent + ascent, mouseHover);
- text(x + 3, y - 1, str, font);
-}
-
-
-int Painter::preeditText(int x, int y, char_type c,
- LyXFont const & font, preedit_style style)
-{
- LyXFont temp_font = font;
- FontMetrics const & fm = theFontMetrics(font);
- int ascent = fm.maxAscent();
- int descent = fm.maxDescent();
- int height = ascent + descent;
- int width = fm.width(c);
-
- switch (style) {
- case preedit_default:
- // default unselecting mode.
- fillRectangle(x, y - height + 1, width, height, LColor::background);
- dashedUnderline(font, x, y - descent + 1, width);
- break;
- case preedit_selecting:
- // We are in selecting mode: white text on black background.
- fillRectangle(x, y - height + 1, width, height, LColor::black);
- temp_font.setColor(LColor::white);
- break;
- case preedit_cursor:
- // The character comes with a cursor.
- fillRectangle(x, y - height + 1, width, height, LColor::background);
- underline(font, x, y - descent + 1, width);
- break;
- }
- text(x, y - descent + 1, c, temp_font);
-
- return width;
-}
-
-
-void Painter::underline(LyXFont const & f, int x, int y, int width)
-{
- FontMetrics const & fm = theFontMetrics(f);
-
- int const below = max(fm.maxDescent() / 2, 2);
- int const height = max((fm.maxDescent() / 4) - 1, 1);
-
- if (height < 2)
- line(x, y + below, x + width, y + below, f.color());
- else
- fillRectangle(x, y + below, width, below + height, f.color());
-}
-
-
-void Painter::dashedUnderline(LyXFont const & f, int x, int y, int width)
-{
- FontMetrics const & fm = theFontMetrics(f);
-
- int const below = max(fm.maxDescent() / 2, 2);
- int height = max((fm.maxDescent() / 4) - 1, 1);
-
- if (height >= 2)
- height += below;
-
- for (int n = 0; n < height; ++n)
- line(x, y + below + n, x + width, y + below + n, f.color(), line_onoffdash);
-}
-
-} // namespace frontend
-} // namespace lyx
--- /dev/null
+/**
+ * \file Painter.cpp
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author unknown
+ * \author John Levon
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#include <config.h>
+
+#include "frontends/Painter.h"
+
+#include "frontends/FontMetrics.h"
+
+#include "LColor.h"
+#include "lyxfont.h"
+
+using lyx::docstring;
+
+using std::max;
+using std::string;
+
+namespace lyx {
+namespace frontend {
+
+void Painter::button(int x, int y, int w, int h, bool mouseHover)
+{
+ if (mouseHover)
+ fillRectangle(x, y, w, h, LColor::buttonhoverbg);
+ else
+ fillRectangle(x, y, w, h, LColor::buttonbg);
+ buttonFrame(x, y, w, h);
+}
+
+
+void Painter::buttonFrame(int x, int y, int w, int h)
+{
+ line(x, y, x, y + h - 1, LColor::buttonframe);
+ line(x - 1 + w, y, x - 1 + w, y + h - 1, LColor::buttonframe);
+ line(x, y - 1, x - 1 + w, y - 1, LColor::buttonframe);
+ line(x, y + h - 1, x - 1 + w, y + h - 1, LColor::buttonframe);
+}
+
+
+void Painter::rectText(int x, int y,
+ docstring const & str,
+ LyXFont const & font,
+ LColor_color back,
+ LColor_color frame)
+{
+ int width;
+ int ascent;
+ int descent;
+
+ FontMetrics const & fm = theFontMetrics(font);
+ fm.rectText(str, width, ascent, descent);
+
+ if (back != LColor::none)
+ fillRectangle(x + 1, y - ascent + 1, width - 1,
+ ascent + descent - 1, back);
+
+ if (frame != LColor::none)
+ rectangle(x, y - ascent, width, ascent + descent, frame);
+
+ text(x + 3, y, str, font);
+}
+
+
+void Painter::buttonText(int x, int y, docstring const & str,
+ LyXFont const & font, bool mouseHover)
+{
+ int width;
+ int ascent;
+ int descent;
+
+ FontMetrics const & fm = theFontMetrics(font);
+ fm.buttonText(str, width, ascent, descent);
+
+ button(x, y - ascent, width, descent + ascent, mouseHover);
+ text(x + 3, y - 1, str, font);
+}
+
+
+int Painter::preeditText(int x, int y, char_type c,
+ LyXFont const & font, preedit_style style)
+{
+ LyXFont temp_font = font;
+ FontMetrics const & fm = theFontMetrics(font);
+ int ascent = fm.maxAscent();
+ int descent = fm.maxDescent();
+ int height = ascent + descent;
+ int width = fm.width(c);
+
+ switch (style) {
+ case preedit_default:
+ // default unselecting mode.
+ fillRectangle(x, y - height + 1, width, height, LColor::background);
+ dashedUnderline(font, x, y - descent + 1, width);
+ break;
+ case preedit_selecting:
+ // We are in selecting mode: white text on black background.
+ fillRectangle(x, y - height + 1, width, height, LColor::black);
+ temp_font.setColor(LColor::white);
+ break;
+ case preedit_cursor:
+ // The character comes with a cursor.
+ fillRectangle(x, y - height + 1, width, height, LColor::background);
+ underline(font, x, y - descent + 1, width);
+ break;
+ }
+ text(x, y - descent + 1, c, temp_font);
+
+ return width;
+}
+
+
+void Painter::underline(LyXFont const & f, int x, int y, int width)
+{
+ FontMetrics const & fm = theFontMetrics(f);
+
+ int const below = max(fm.maxDescent() / 2, 2);
+ int const height = max((fm.maxDescent() / 4) - 1, 1);
+
+ if (height < 2)
+ line(x, y + below, x + width, y + below, f.color());
+ else
+ fillRectangle(x, y + below, width, below + height, f.color());
+}
+
+
+void Painter::dashedUnderline(LyXFont const & f, int x, int y, int width)
+{
+ FontMetrics const & fm = theFontMetrics(f);
+
+ int const below = max(fm.maxDescent() / 2, 2);
+ int height = max((fm.maxDescent() / 4) - 1, 1);
+
+ if (height >= 2)
+ height += below;
+
+ for (int n = 0; n < height; ++n)
+ line(x, y + below + n, x + width, y + below + n, f.color(), line_onoffdash);
+}
+
+} // namespace frontend
+} // namespace lyx
+++ /dev/null
-/**
- * \file Timeout.cpp
- * This file is part of LyX, the document processor.
- * Licence details can be found in the file COPYING.
- *
- * \author Lars Gullik Bjønnes
- * \author John Levon
- *
- * Full author contact details are available in file CREDITS.
- */
-
-#include <config.h>
-
-#include "Timeout.h"
-
-
-namespace lyx {
-
-
-Timeout::~Timeout()
-{
- pimpl_->stop();
-}
-
-
-bool Timeout::running() const
-{
- return pimpl_->running();
-}
-
-
-void Timeout::start()
-{
- pimpl_->start();
-}
-
-
-void Timeout::stop()
-{
- pimpl_->stop();
-}
-
-
-void Timeout::restart()
-{
- pimpl_->stop();
- pimpl_->start();
-}
-
-
-void Timeout::emit()
-{
- pimpl_->reset();
- timeout();
- if (type == CONTINUOUS)
- pimpl_->start();
-}
-
-
-Timeout & Timeout::setType(Type t)
-{
- type = t;
- return * this;
-}
-
-
-Timeout & Timeout::setTimeout(unsigned int msec)
-{
- // Can't have a timeout of zero!
- BOOST_ASSERT(msec);
-
- timeout_ms = msec;
- return * this;
-}
-
-
-} // namespace lyx
--- /dev/null
+/**
+ * \file Timeout.cpp
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Lars Gullik Bjønnes
+ * \author John Levon
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#include <config.h>
+
+#include "Timeout.h"
+
+
+namespace lyx {
+
+
+Timeout::~Timeout()
+{
+ pimpl_->stop();
+}
+
+
+bool Timeout::running() const
+{
+ return pimpl_->running();
+}
+
+
+void Timeout::start()
+{
+ pimpl_->start();
+}
+
+
+void Timeout::stop()
+{
+ pimpl_->stop();
+}
+
+
+void Timeout::restart()
+{
+ pimpl_->stop();
+ pimpl_->start();
+}
+
+
+void Timeout::emit()
+{
+ pimpl_->reset();
+ timeout();
+ if (type == CONTINUOUS)
+ pimpl_->start();
+}
+
+
+Timeout & Timeout::setType(Type t)
+{
+ type = t;
+ return * this;
+}
+
+
+Timeout & Timeout::setTimeout(unsigned int msec)
+{
+ // Can't have a timeout of zero!
+ BOOST_ASSERT(msec);
+
+ timeout_ms = msec;
+ return * this;
+}
+
+
+} // namespace lyx
+++ /dev/null
-/**
- * \file Toolbars.cpp
- * This file is part of LyX, the document processor.
- * Licence details can be found in the file COPYING.
- *
- * \author Lars Gullik Bjønnes
- * \author Angus Leeming
- *
- * Full author contact details are available in file CREDITS.
- */
-
-#include <config.h>
-
-#include "Toolbars.h"
-
-#include "buffer.h"
-#include "bufferparams.h"
-#include "debug.h"
-#include "funcrequest.h"
-#include "FuncStatus.h"
-#include "gettext.h"
-#include "lyxfunc.h"
-#include "lyxtextclass.h"
-#include "LyXView.h"
-#include "lyx_main.h"
-
-
-namespace lyx {
-
-using std::endl;
-using std::string;
-
-
-Toolbars::Toolbars(LyXView & owner)
- : owner_(owner),
- layout_(0),
- last_textclass_(-1)
-{}
-
-#define TurnOnFlag(x) flags |= ToolbarInfo::x
-#define TurnOffFlag(x) flags &= ~ToolbarInfo::x
-
-void Toolbars::initFlags(ToolbarInfo & tbinfo)
-{
- ToolbarSection::ToolbarInfo & info = LyX::ref().session().toolbars().load(tbinfo.name);
-
- unsigned int flags = static_cast<unsigned int>(tbinfo.flags);
-
- // Remove default.ui positions. Only when a valid postion is stored
- // in the session file the default.ui value will be overwritten
- unsigned int save = flags;
- TurnOffFlag(TOP);
- TurnOffFlag(BOTTOM);
- TurnOffFlag(RIGHT);
- TurnOffFlag(LEFT);
-
- bool valid_location = true;
- // init tbinfo.flags with saved location
- if (info.location == ToolbarSection::ToolbarInfo::TOP)
- TurnOnFlag(TOP);
- else if (info.location == ToolbarSection::ToolbarInfo::BOTTOM)
- TurnOnFlag(BOTTOM);
- else if (info.location == ToolbarSection::ToolbarInfo::RIGHT)
- TurnOnFlag(RIGHT);
- else if (info.location == ToolbarSection::ToolbarInfo::LEFT)
- TurnOnFlag(LEFT);
- else {
- // use setting from default.ui
- flags = save;
- valid_location = false;
- }
-
- // invalid location is for a new toolbar that has no saved information,
- // so info.visible is not used for this case.
- if (valid_location) {
- // init tbinfo.flags with saved visibility,
- TurnOffFlag(ON);
- TurnOffFlag(OFF);
- TurnOffFlag(AUTO);
- if (info.state == ToolbarSection::ToolbarInfo::ON)
- TurnOnFlag(ON);
- else if (info.state == ToolbarSection::ToolbarInfo::OFF)
- TurnOnFlag(OFF);
- else
- TurnOnFlag(AUTO);
- }
- /*
- std::cout << "State " << info.state << " FLAGS: " << flags
- << " ON:" << (flags & ToolbarBackend::ON)
- << " OFF:" << (flags & ToolbarBackend::OFF)
- << " L:" << (flags & ToolbarBackend::LEFT)
- << " R:" << (flags & ToolbarBackend::RIGHT)
- << " T:" << (flags & ToolbarBackend::TOP)
- << " B:" << (flags & ToolbarBackend::BOTTOM)
- << " MA:" << (flags & ToolbarBackend::MATH)
- << " RE:" << (flags & ToolbarBackend::REVIEW)
- << " TB:" << (flags & ToolbarBackend::TABLE)
- << " AU:" << (flags & ToolbarBackend::AUTO)
- << std::endl;
- */
- // now set the flags
- tbinfo.flags = static_cast<lyx::ToolbarInfo::Flags>(flags);
-}
-
-
-void Toolbars::init()
-{
- // extracts the toolbars from the backend
- ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
- ToolbarBackend::Toolbars::iterator end = toolbarbackend.end();
-
- // init flags will also add these toolbars to session if they
- // are not already there (e.g. first run of lyx).
- for (; cit != end; ++cit)
- initFlags(*cit);
-
- // add toolbars according the order in session
- ToolbarSection::ToolbarList::const_iterator tb = LyX::ref().session().toolbars().begin();
- ToolbarSection::ToolbarList::const_iterator te = LyX::ref().session().toolbars().end();
- ToolbarSection::ToolbarInfo::Location last_loc = ToolbarSection::ToolbarInfo::NOTSET;
- int last_posx = 0;
- int last_posy = 0;
- for (; tb != te; ++tb) {
- LYXERR(Debug::INIT) << "Adding " << tb->get<0>() << " at position " << tb->get<1>().posx << " " << tb->get<1>().posy << endl;
- // add toolbar break if posx or posy changes
- bool newline = tb->get<1>().location == last_loc && (
- // if two toolbars at the same location, assume uninitialized and add toolbar break
- (tb->get<1>().posx == last_posx && tb->get<1>().posy == last_posy) ||
- (last_loc == ToolbarSection::ToolbarInfo::TOP && tb->get<1>().posy != last_posy) ||
- (last_loc == ToolbarSection::ToolbarInfo::BOTTOM && tb->get<1>().posy != last_posy) ||
- (last_loc == ToolbarSection::ToolbarInfo::LEFT && tb->get<1>().posx != last_posx) ||
- (last_loc == ToolbarSection::ToolbarInfo::RIGHT && tb->get<1>().posx != last_posx) );
- // find the backend item and add
- for (cit = toolbarbackend.begin(); cit != end; ++cit)
- if (cit->name == tb->get<0>()) {
- add(*cit, newline);
- last_loc = tb->get<1>().location;
- last_posx = tb->get<1>().posx;
- last_posy = tb->get<1>().posy;
- break;
- }
- }
-}
-
-
-void Toolbars::display(string const & name, bool show)
-{
- ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
- ToolbarBackend::Toolbars::iterator end = toolbarbackend.end();
-
- for (; cit != end; ++cit) {
- if (cit->name == name) {
- unsigned int flags = cit->flags;
- TurnOffFlag(AUTO);
- if (show) {
- TurnOnFlag(ON);
- TurnOnFlag(OFF);
- } else {
- TurnOnFlag(OFF);
- TurnOnFlag(ON);
- }
- cit->flags = static_cast<lyx::ToolbarInfo::Flags>(flags);
- displayToolbar(*cit, show);
- return;
- }
- }
-
- LYXERR(Debug::GUI) << "Toolbar::display: no toolbar named "
- << name << endl;
-}
-
-
-ToolbarInfo::Flags Toolbars::getToolbarState(string const & name)
-{
- ToolbarBackend::Toolbars::const_iterator cit = toolbarbackend.begin();
- ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end();
-
- for (; cit != end; ++cit) {
- if (cit->name == name)
- return cit->flags;
- }
-
- LYXERR(Debug::GUI) << "Toolbar::display: no toolbar named "
- << name << endl;
-
- // return dummy for msvc
- return ToolbarInfo::OFF;
-}
-
-
-void Toolbars::toggleToolbarState(string const & name)
-{
- ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
- ToolbarBackend::Toolbars::iterator end = toolbarbackend.end();
-
- for (; cit != end; ++cit) {
- if (cit->name == name) {
- int flags = cit->flags;
- // off -> on
- if (flags & ToolbarInfo::OFF) {
- TurnOffFlag(OFF);
- TurnOnFlag(ON);
- // auto -> off
- } else if (flags & ToolbarInfo::AUTO) {
- TurnOffFlag(AUTO);
- TurnOnFlag(OFF);
- } else if ((flags & ToolbarInfo::MATH) || (flags & ToolbarInfo::TABLE)
- || (flags & ToolbarInfo::REVIEW)) {
- // for math etc, toggle from on -> auto
- TurnOffFlag(ON);
- TurnOnFlag(AUTO);
- } else {
- // for others, toggle from on -> off
- TurnOffFlag(ON);
- TurnOnFlag(OFF);
- }
- cit->flags = static_cast<lyx::ToolbarInfo::Flags>(flags);
- return;
- }
- }
- LYXERR(Debug::GUI) << "Toolbar::display: no toolbar named "
- << name << endl;
-}
-#undef TurnOnFlag
-#undef TurnOffFlag
-
-
-void Toolbars::update(bool in_math, bool in_table, bool review)
-{
- update();
-
- // extracts the toolbars from the backend
- ToolbarBackend::Toolbars::const_iterator cit = toolbarbackend.begin();
- ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end();
-
- for (; cit != end; ++cit) {
- if (cit->flags & ToolbarInfo::ON)
- displayToolbar(*cit, true);
- else if (cit->flags & ToolbarInfo::OFF)
- displayToolbar(*cit, false);
- else if ((cit->flags & ToolbarInfo::AUTO) && (cit->flags & ToolbarInfo::MATH))
- displayToolbar(*cit, in_math);
- else if ((cit->flags & ToolbarInfo::AUTO) && (cit->flags & ToolbarInfo::TABLE))
- displayToolbar(*cit, in_table);
- else if ((cit->flags & ToolbarInfo::AUTO) && (cit->flags & ToolbarInfo::REVIEW))
- displayToolbar(*cit, review);
- }
-}
-
-
-void Toolbars::saveToolbarInfo()
-{
- ToolbarSection & tb = LyX::ref().session().toolbars();
-
- for (ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
- cit != toolbarbackend.end(); ++cit) {
- ToolbarsMap::iterator it = toolbars_.find(cit->name);
- BOOST_ASSERT(it != toolbars_.end());
- // get toolbar info from session.
- ToolbarSection::ToolbarInfo & info = tb.load(cit->name);
- if (cit->flags & ToolbarInfo::ON)
- info.state = ToolbarSection::ToolbarInfo::ON;
- else if (cit->flags & ToolbarInfo::OFF)
- info.state = ToolbarSection::ToolbarInfo::OFF;
- else if (cit->flags & ToolbarInfo::AUTO)
- info.state = ToolbarSection::ToolbarInfo::AUTO;
- // save other information
- // if auto, frontend should *not* set on/off
- it->second->saveInfo(info);
- // maybe it is useful to update flags with real status. I do not know
- /*
- if (!(cit->flags & ToolbarInfo::AUTO)) {
- unsigned int flags = static_cast<unsigned int>(cit->flags);
- flags &= ~(info.state == ToolbarSection::ToolbarInfo::ON ? ToolbarInfo::OFF : ToolbarInfo::ON);
- flags |= (info.state == ToolbarSection::ToolbarInfo::ON ? ToolbarInfo::ON : ToolbarInfo::OFF);
- if (info.state == ToolbarSection::ToolbarInfo::ON)
- cit->flags = static_cast<lyx::ToolbarInfo::Flags>(flags);
- }
- */
- }
-}
-
-
-void Toolbars::setLayout(string const & layout)
-{
- if (layout_)
- layout_->set(layout);
-}
-
-
-bool Toolbars::updateLayoutList(int textclass)
-{
- // update the layout display
- if (last_textclass_ != textclass) {
- if (layout_)
- layout_->update();
- last_textclass_ = textclass;
- return true;
- } else
- return false;
-}
-
-
-void Toolbars::openLayoutList()
-{
- if (layout_)
- layout_->open();
-}
-
-
-void Toolbars::clearLayoutList()
-{
- last_textclass_ = -1;
- if (layout_)
- layout_->clear();
-}
-
-
-void Toolbars::add(ToolbarInfo const & tbinfo, bool newline)
-{
- ToolbarPtr tb_ptr = owner_.makeToolbar(tbinfo, newline);
- toolbars_[tbinfo.name] = tb_ptr;
-
- if (tbinfo.flags & ToolbarInfo::ON)
- tb_ptr->show(false);
- else
- tb_ptr->hide(false);
-
- if (tb_ptr->layout())
- layout_ = tb_ptr->layout();
-}
-
-
-void Toolbars::displayToolbar(ToolbarInfo const & tbinfo,
- bool show_it)
-{
- ToolbarsMap::iterator it = toolbars_.find(tbinfo.name);
- BOOST_ASSERT(it != toolbars_.end());
-
- if (show_it)
- it->second->show(true);
- else
- it->second->hide(true);
-}
-
-
-void Toolbars::update()
-{
- ToolbarsMap::const_iterator it = toolbars_.begin();
- ToolbarsMap::const_iterator const end = toolbars_.end();
- for (; it != end; ++it)
- it->second->update();
-
- bool const enable =
- lyx::getStatus(FuncRequest(LFUN_LAYOUT)).enabled();
-
- if (layout_)
- layout_->setEnabled(enable);
-}
-
-
-void layoutSelected(LyXView & lv, string const & name)
-{
- LyXTextClass const & tc = lv.buffer()->params().getLyXTextClass();
-
- LyXTextClass::const_iterator it = tc.begin();
- LyXTextClass::const_iterator const end = tc.end();
- for (; it != end; ++it) {
- string const & itname = (*it)->name();
- // Yes, the lyx::to_utf8(_()) is correct
- if (lyx::to_utf8(_(itname)) == name) {
- FuncRequest const func(LFUN_LAYOUT, itname,
- FuncRequest::TOOLBAR);
- lv.dispatch(func);
- return;
- }
- }
- lyxerr << "ERROR (layoutSelected): layout not found!"
- << endl;
-}
-
-
-} // namespace lyx
--- /dev/null
+/**
+ * \file Toolbars.cpp
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Lars Gullik Bjønnes
+ * \author Angus Leeming
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#include <config.h>
+
+#include "Toolbars.h"
+
+#include "buffer.h"
+#include "bufferparams.h"
+#include "debug.h"
+#include "funcrequest.h"
+#include "FuncStatus.h"
+#include "gettext.h"
+#include "lyxfunc.h"
+#include "lyxtextclass.h"
+#include "LyXView.h"
+#include "lyx_main.h"
+
+
+namespace lyx {
+
+using std::endl;
+using std::string;
+
+
+Toolbars::Toolbars(LyXView & owner)
+ : owner_(owner),
+ layout_(0),
+ last_textclass_(-1)
+{}
+
+#define TurnOnFlag(x) flags |= ToolbarInfo::x
+#define TurnOffFlag(x) flags &= ~ToolbarInfo::x
+
+void Toolbars::initFlags(ToolbarInfo & tbinfo)
+{
+ ToolbarSection::ToolbarInfo & info = LyX::ref().session().toolbars().load(tbinfo.name);
+
+ unsigned int flags = static_cast<unsigned int>(tbinfo.flags);
+
+ // Remove default.ui positions. Only when a valid postion is stored
+ // in the session file the default.ui value will be overwritten
+ unsigned int save = flags;
+ TurnOffFlag(TOP);
+ TurnOffFlag(BOTTOM);
+ TurnOffFlag(RIGHT);
+ TurnOffFlag(LEFT);
+
+ bool valid_location = true;
+ // init tbinfo.flags with saved location
+ if (info.location == ToolbarSection::ToolbarInfo::TOP)
+ TurnOnFlag(TOP);
+ else if (info.location == ToolbarSection::ToolbarInfo::BOTTOM)
+ TurnOnFlag(BOTTOM);
+ else if (info.location == ToolbarSection::ToolbarInfo::RIGHT)
+ TurnOnFlag(RIGHT);
+ else if (info.location == ToolbarSection::ToolbarInfo::LEFT)
+ TurnOnFlag(LEFT);
+ else {
+ // use setting from default.ui
+ flags = save;
+ valid_location = false;
+ }
+
+ // invalid location is for a new toolbar that has no saved information,
+ // so info.visible is not used for this case.
+ if (valid_location) {
+ // init tbinfo.flags with saved visibility,
+ TurnOffFlag(ON);
+ TurnOffFlag(OFF);
+ TurnOffFlag(AUTO);
+ if (info.state == ToolbarSection::ToolbarInfo::ON)
+ TurnOnFlag(ON);
+ else if (info.state == ToolbarSection::ToolbarInfo::OFF)
+ TurnOnFlag(OFF);
+ else
+ TurnOnFlag(AUTO);
+ }
+ /*
+ std::cout << "State " << info.state << " FLAGS: " << flags
+ << " ON:" << (flags & ToolbarBackend::ON)
+ << " OFF:" << (flags & ToolbarBackend::OFF)
+ << " L:" << (flags & ToolbarBackend::LEFT)
+ << " R:" << (flags & ToolbarBackend::RIGHT)
+ << " T:" << (flags & ToolbarBackend::TOP)
+ << " B:" << (flags & ToolbarBackend::BOTTOM)
+ << " MA:" << (flags & ToolbarBackend::MATH)
+ << " RE:" << (flags & ToolbarBackend::REVIEW)
+ << " TB:" << (flags & ToolbarBackend::TABLE)
+ << " AU:" << (flags & ToolbarBackend::AUTO)
+ << std::endl;
+ */
+ // now set the flags
+ tbinfo.flags = static_cast<lyx::ToolbarInfo::Flags>(flags);
+}
+
+
+void Toolbars::init()
+{
+ // extracts the toolbars from the backend
+ ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
+ ToolbarBackend::Toolbars::iterator end = toolbarbackend.end();
+
+ // init flags will also add these toolbars to session if they
+ // are not already there (e.g. first run of lyx).
+ for (; cit != end; ++cit)
+ initFlags(*cit);
+
+ // add toolbars according the order in session
+ ToolbarSection::ToolbarList::const_iterator tb = LyX::ref().session().toolbars().begin();
+ ToolbarSection::ToolbarList::const_iterator te = LyX::ref().session().toolbars().end();
+ ToolbarSection::ToolbarInfo::Location last_loc = ToolbarSection::ToolbarInfo::NOTSET;
+ int last_posx = 0;
+ int last_posy = 0;
+ for (; tb != te; ++tb) {
+ LYXERR(Debug::INIT) << "Adding " << tb->get<0>() << " at position " << tb->get<1>().posx << " " << tb->get<1>().posy << endl;
+ // add toolbar break if posx or posy changes
+ bool newline = tb->get<1>().location == last_loc && (
+ // if two toolbars at the same location, assume uninitialized and add toolbar break
+ (tb->get<1>().posx == last_posx && tb->get<1>().posy == last_posy) ||
+ (last_loc == ToolbarSection::ToolbarInfo::TOP && tb->get<1>().posy != last_posy) ||
+ (last_loc == ToolbarSection::ToolbarInfo::BOTTOM && tb->get<1>().posy != last_posy) ||
+ (last_loc == ToolbarSection::ToolbarInfo::LEFT && tb->get<1>().posx != last_posx) ||
+ (last_loc == ToolbarSection::ToolbarInfo::RIGHT && tb->get<1>().posx != last_posx) );
+ // find the backend item and add
+ for (cit = toolbarbackend.begin(); cit != end; ++cit)
+ if (cit->name == tb->get<0>()) {
+ add(*cit, newline);
+ last_loc = tb->get<1>().location;
+ last_posx = tb->get<1>().posx;
+ last_posy = tb->get<1>().posy;
+ break;
+ }
+ }
+}
+
+
+void Toolbars::display(string const & name, bool show)
+{
+ ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
+ ToolbarBackend::Toolbars::iterator end = toolbarbackend.end();
+
+ for (; cit != end; ++cit) {
+ if (cit->name == name) {
+ unsigned int flags = cit->flags;
+ TurnOffFlag(AUTO);
+ if (show) {
+ TurnOnFlag(ON);
+ TurnOnFlag(OFF);
+ } else {
+ TurnOnFlag(OFF);
+ TurnOnFlag(ON);
+ }
+ cit->flags = static_cast<lyx::ToolbarInfo::Flags>(flags);
+ displayToolbar(*cit, show);
+ return;
+ }
+ }
+
+ LYXERR(Debug::GUI) << "Toolbar::display: no toolbar named "
+ << name << endl;
+}
+
+
+ToolbarInfo::Flags Toolbars::getToolbarState(string const & name)
+{
+ ToolbarBackend::Toolbars::const_iterator cit = toolbarbackend.begin();
+ ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end();
+
+ for (; cit != end; ++cit) {
+ if (cit->name == name)
+ return cit->flags;
+ }
+
+ LYXERR(Debug::GUI) << "Toolbar::display: no toolbar named "
+ << name << endl;
+
+ // return dummy for msvc
+ return ToolbarInfo::OFF;
+}
+
+
+void Toolbars::toggleToolbarState(string const & name)
+{
+ ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
+ ToolbarBackend::Toolbars::iterator end = toolbarbackend.end();
+
+ for (; cit != end; ++cit) {
+ if (cit->name == name) {
+ int flags = cit->flags;
+ // off -> on
+ if (flags & ToolbarInfo::OFF) {
+ TurnOffFlag(OFF);
+ TurnOnFlag(ON);
+ // auto -> off
+ } else if (flags & ToolbarInfo::AUTO) {
+ TurnOffFlag(AUTO);
+ TurnOnFlag(OFF);
+ } else if ((flags & ToolbarInfo::MATH) || (flags & ToolbarInfo::TABLE)
+ || (flags & ToolbarInfo::REVIEW)) {
+ // for math etc, toggle from on -> auto
+ TurnOffFlag(ON);
+ TurnOnFlag(AUTO);
+ } else {
+ // for others, toggle from on -> off
+ TurnOffFlag(ON);
+ TurnOnFlag(OFF);
+ }
+ cit->flags = static_cast<lyx::ToolbarInfo::Flags>(flags);
+ return;
+ }
+ }
+ LYXERR(Debug::GUI) << "Toolbar::display: no toolbar named "
+ << name << endl;
+}
+#undef TurnOnFlag
+#undef TurnOffFlag
+
+
+void Toolbars::update(bool in_math, bool in_table, bool review)
+{
+ update();
+
+ // extracts the toolbars from the backend
+ ToolbarBackend::Toolbars::const_iterator cit = toolbarbackend.begin();
+ ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end();
+
+ for (; cit != end; ++cit) {
+ if (cit->flags & ToolbarInfo::ON)
+ displayToolbar(*cit, true);
+ else if (cit->flags & ToolbarInfo::OFF)
+ displayToolbar(*cit, false);
+ else if ((cit->flags & ToolbarInfo::AUTO) && (cit->flags & ToolbarInfo::MATH))
+ displayToolbar(*cit, in_math);
+ else if ((cit->flags & ToolbarInfo::AUTO) && (cit->flags & ToolbarInfo::TABLE))
+ displayToolbar(*cit, in_table);
+ else if ((cit->flags & ToolbarInfo::AUTO) && (cit->flags & ToolbarInfo::REVIEW))
+ displayToolbar(*cit, review);
+ }
+}
+
+
+void Toolbars::saveToolbarInfo()
+{
+ ToolbarSection & tb = LyX::ref().session().toolbars();
+
+ for (ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
+ cit != toolbarbackend.end(); ++cit) {
+ ToolbarsMap::iterator it = toolbars_.find(cit->name);
+ BOOST_ASSERT(it != toolbars_.end());
+ // get toolbar info from session.
+ ToolbarSection::ToolbarInfo & info = tb.load(cit->name);
+ if (cit->flags & ToolbarInfo::ON)
+ info.state = ToolbarSection::ToolbarInfo::ON;
+ else if (cit->flags & ToolbarInfo::OFF)
+ info.state = ToolbarSection::ToolbarInfo::OFF;
+ else if (cit->flags & ToolbarInfo::AUTO)
+ info.state = ToolbarSection::ToolbarInfo::AUTO;
+ // save other information
+ // if auto, frontend should *not* set on/off
+ it->second->saveInfo(info);
+ // maybe it is useful to update flags with real status. I do not know
+ /*
+ if (!(cit->flags & ToolbarInfo::AUTO)) {
+ unsigned int flags = static_cast<unsigned int>(cit->flags);
+ flags &= ~(info.state == ToolbarSection::ToolbarInfo::ON ? ToolbarInfo::OFF : ToolbarInfo::ON);
+ flags |= (info.state == ToolbarSection::ToolbarInfo::ON ? ToolbarInfo::ON : ToolbarInfo::OFF);
+ if (info.state == ToolbarSection::ToolbarInfo::ON)
+ cit->flags = static_cast<lyx::ToolbarInfo::Flags>(flags);
+ }
+ */
+ }
+}
+
+
+void Toolbars::setLayout(string const & layout)
+{
+ if (layout_)
+ layout_->set(layout);
+}
+
+
+bool Toolbars::updateLayoutList(int textclass)
+{
+ // update the layout display
+ if (last_textclass_ != textclass) {
+ if (layout_)
+ layout_->update();
+ last_textclass_ = textclass;
+ return true;
+ } else
+ return false;
+}
+
+
+void Toolbars::openLayoutList()
+{
+ if (layout_)
+ layout_->open();
+}
+
+
+void Toolbars::clearLayoutList()
+{
+ last_textclass_ = -1;
+ if (layout_)
+ layout_->clear();
+}
+
+
+void Toolbars::add(ToolbarInfo const & tbinfo, bool newline)
+{
+ ToolbarPtr tb_ptr = owner_.makeToolbar(tbinfo, newline);
+ toolbars_[tbinfo.name] = tb_ptr;
+
+ if (tbinfo.flags & ToolbarInfo::ON)
+ tb_ptr->show(false);
+ else
+ tb_ptr->hide(false);
+
+ if (tb_ptr->layout())
+ layout_ = tb_ptr->layout();
+}
+
+
+void Toolbars::displayToolbar(ToolbarInfo const & tbinfo,
+ bool show_it)
+{
+ ToolbarsMap::iterator it = toolbars_.find(tbinfo.name);
+ BOOST_ASSERT(it != toolbars_.end());
+
+ if (show_it)
+ it->second->show(true);
+ else
+ it->second->hide(true);
+}
+
+
+void Toolbars::update()
+{
+ ToolbarsMap::const_iterator it = toolbars_.begin();
+ ToolbarsMap::const_iterator const end = toolbars_.end();
+ for (; it != end; ++it)
+ it->second->update();
+
+ bool const enable =
+ lyx::getStatus(FuncRequest(LFUN_LAYOUT)).enabled();
+
+ if (layout_)
+ layout_->setEnabled(enable);
+}
+
+
+void layoutSelected(LyXView & lv, string const & name)
+{
+ LyXTextClass const & tc = lv.buffer()->params().getLyXTextClass();
+
+ LyXTextClass::const_iterator it = tc.begin();
+ LyXTextClass::const_iterator const end = tc.end();
+ for (; it != end; ++it) {
+ string const & itname = (*it)->name();
+ // Yes, the lyx::to_utf8(_()) is correct
+ if (lyx::to_utf8(_(itname)) == name) {
+ FuncRequest const func(LFUN_LAYOUT, itname,
+ FuncRequest::TOOLBAR);
+ lv.dispatch(func);
+ return;
+ }
+ }
+ lyxerr << "ERROR (layoutSelected): layout not found!"
+ << endl;
+}
+
+
+} // namespace lyx
+++ /dev/null
-/**
- * \file WorkArea.cpp
- * This file is part of LyX, the document processor.
- * Licence details can be found in the file COPYING.
- *
- * \author John Levon
- * \author Abdelrazak Younes
- *
- * Full author contact details are available in file CREDITS.
- *
- * Splash screen code added by Angus Leeming
- */
-
-#include <config.h>
-
-#include "frontends/WorkArea.h"
-
-#include "frontends/Application.h"
-#include "frontends/FontMetrics.h"
-
-#include "funcrequest.h"
-#include "lyxfunc.h"
-#include "Painter.h"
-
-#include "BufferView.h"
-#include "buffer.h"
-#include "bufferparams.h"
-#include "coordcache.h"
-#include "cursor.h"
-#include "debug.h"
-#include "language.h"
-#include "LColor.h"
-#include "lyxfont.h"
-#include "lyxrc.h"
-#include "lyxrow.h"
-#include "lyxtext.h"
-#include "LyXView.h"
-#include "metricsinfo.h"
-#include "paragraph.h"
-#include "rowpainter.h"
-
-#include "gettext.h"
-#include "support/forkedcontr.h"
-
-#include <boost/utility.hpp>
-#include <boost/bind.hpp>
-#include <boost/current_function.hpp>
-
-using lyx::support::ForkedcallsController;
-
-using std::endl;
-using std::min;
-using std::max;
-using std::string;
-
-
-namespace {
-
-// All the below connection objects are needed because of a bug in some
-// versions of GCC (<=2.96 are on the suspects list.) By having and assigning
-// to these connections we avoid a segfault upon startup, and also at exit.
-// (Lgb)
-
-boost::signals::connection timecon;
-
-} // anon namespace
-
-namespace lyx {
-namespace frontend {
-
-WorkArea::WorkArea(int id, LyXView & lyx_view)
- : buffer_view_(0), lyx_view_(lyx_view), greyed_out_(true),
- id_(id), cursor_visible_(false), cursor_timeout_(400)
-{
- // Start loading the pixmap as soon as possible
- //if (lyxrc.show_banner) {
- // showBanner();
- //}
-
- // Setup the signals
- timecon = cursor_timeout_.timeout
- .connect(boost::bind(&WorkArea::toggleCursor, this));
-
- cursor_timeout_.start();
-}
-
-
-void WorkArea::setBufferView(BufferView * buffer_view)
-{
- if (buffer_view_) {
- message_connection_.disconnect();
- lyx_view_.disconnectBufferView();
- }
-
- hideCursor();
- buffer_view_ = buffer_view;
- toggleCursor();
-
- message_connection_ = buffer_view_->message.connect(
- boost::bind(&WorkArea::displayMessage, this, _1));
-
- lyx_view_.connectBufferView(*buffer_view);
-}
-
-
-BufferView & WorkArea::bufferView()
-{
- return *buffer_view_;
-}
-
-
-BufferView const & WorkArea::bufferView() const
-{
- return *buffer_view_;
-}
-
-
-void WorkArea::stopBlinkingCursor()
-{
- cursor_timeout_.stop();
- hideCursor();
-}
-
-
-void WorkArea::startBlinkingCursor()
-{
- showCursor();
- cursor_timeout_.restart();
-}
-
-
-void WorkArea::redraw()
-{
- if (!buffer_view_ || !buffer_view_->buffer()) {
- greyed_out_ = true;
- // The argument here are meaningless.
- expose(1,1,1,1);
- return;
- }
-
- // No need to do anything if this is the current view. The BufferView
- // metrics are already up to date.
- if (&lyx_view_ != theApp()->currentView())
- // FIXME: it would be nice to optimize for the off-screen case.
- buffer_view_->updateMetrics(false);
-
- updateScrollbar();
-
- ViewMetricsInfo const & vi = buffer_view_->viewMetricsInfo();
- greyed_out_ = false;
-
- LYXERR(Debug::WORKAREA) << "WorkArea::redraw screen" << endl;
-
- int const ymin = std::max(vi.y1, 0);
- int const ymax = vi.p2 < vi.size - 1 ? vi.y2 : height();
-
- expose(0, ymin, width(), ymax - ymin);
-
- //LYXERR(Debug::WORKAREA)
- //<< " ymin = " << ymin << " width() = " << width()
-// << " ymax-ymin = " << ymax-ymin << std::endl;
-
- if (lyxerr.debugging(Debug::WORKAREA))
- buffer_view_->coordCache().dump();
-}
-
-
-void WorkArea::processKeySym(LyXKeySymPtr key, key_modifier::state state)
-{
- // In order to avoid bad surprise in the middle of an operation, we better stop
- // the blinking cursor.
- stopBlinkingCursor();
-
- theLyXFunc().setLyXView(&lyx_view_);
- theLyXFunc().processKeySym(key, state);
-
- /* When we move around, or type, it's nice to be able to see
- * the cursor immediately after the keypress.
- */
- startBlinkingCursor();
-}
-
-
-void WorkArea::dispatch(FuncRequest const & cmd0, key_modifier::state k)
-{
- // Handle drag&drop
- if (cmd0.action == LFUN_FILE_OPEN) {
- lyx_view_.dispatch(cmd0);
- return;
- }
-
- theLyXFunc().setLyXView(&lyx_view_);
-
- FuncRequest cmd;
-
- if (cmd0.action == LFUN_MOUSE_PRESS) {
- if (k == key_modifier::shift)
- cmd = FuncRequest(cmd0, "region-select");
- else if (k == key_modifier::ctrl)
- cmd = FuncRequest(cmd0, "paragraph-select");
- else
- cmd = cmd0;
- }
- else
- cmd = cmd0;
-
- // In order to avoid bad surprise in the middle of an operation, we better stop
- // the blinking cursor.
- if (!(cmd.action == LFUN_MOUSE_MOTION
- && cmd.button() == mouse_button::none))
- stopBlinkingCursor();
-
- bool const needRedraw = buffer_view_->workAreaDispatch(cmd);
-
- if (needRedraw)
- redraw();
-
- // Skip these when selecting
- if (cmd.action != LFUN_MOUSE_MOTION) {
- lyx_view_.updateLayoutChoice();
- lyx_view_.updateMenubar();
- lyx_view_.updateToolbars();
- }
-
- // GUI tweaks except with mouse motion with no button pressed.
- if (!(cmd.action == LFUN_MOUSE_MOTION
- && cmd.button() == mouse_button::none)) {
- // Slight hack: this is only called currently when we
- // clicked somewhere, so we force through the display
- // of the new status here.
- lyx_view_.clearMessage();
-
- // Show the cursor immediately after any operation.
- startBlinkingCursor();
- }
-}
-
-
-void WorkArea::resizeBufferView()
-{
- lyx_view_.busy(true);
- lyx_view_.message(_("Formatting document..."));
- buffer_view_->workAreaResize(width(), height());
- lyx_view_.updateLayoutChoice();
- lyx_view_.clearMessage();
- lyx_view_.busy(false);
-}
-
-
-void WorkArea::updateScrollbar()
-{
- buffer_view_->updateScrollbar();
- ScrollbarParameters const & scroll_ = buffer_view_->scrollbarParameters();
- setScrollbarParams(scroll_.height, scroll_.position,
- scroll_.lineScrollHeight);
-}
-
-
-void WorkArea::scrollBufferView(int position)
-{
- stopBlinkingCursor();
- buffer_view_->scrollDocView(position);
- redraw();
- if (lyxrc.cursor_follows_scrollbar) {
- buffer_view_->setCursorFromScrollbar();
- lyx_view_.updateLayoutChoice();
- }
- // Show the cursor immediately after any operation.
- startBlinkingCursor();
-}
-
-
-void WorkArea::showCursor()
-{
- if (cursor_visible_)
- return;
-
- if (!buffer_view_->buffer())
- return;
-
- CursorShape shape = BAR_SHAPE;
-
- LyXText const & text = *buffer_view_->cursor().innerText();
- LyXFont const & realfont = text.real_current_font;
- BufferParams const & bp = buffer_view_->buffer()->params();
- bool const samelang = realfont.language() == bp.language;
- bool const isrtl = realfont.isVisibleRightToLeft();
-
- if (!samelang || isrtl != bp.language->rightToLeft()) {
- shape = L_SHAPE;
- if (isrtl)
- shape = REVERSED_L_SHAPE;
- }
-
- // The ERT language hack needs fixing up
- if (realfont.language() == latex_language)
- shape = BAR_SHAPE;
-
- LyXFont const font = buffer_view_->cursor().getFont();
- FontMetrics const & fm = theFontMetrics(font);
- int const asc = fm.maxAscent();
- int const des = fm.maxDescent();
- int h = asc + des;
- int x = 0;
- int y = 0;
- buffer_view_->cursor().getPos(x, y);
- y -= asc;
-
- // if it doesn't touch the screen, don't try to show it
- if (y + h < 0 || y >= height())
- return;
-
- cursor_visible_ = true;
- showCursor(x, y, h, shape);
-}
-
-
-void WorkArea::hideCursor()
-{
- if (!cursor_visible_)
- return;
-
- cursor_visible_ = false;
- removeCursor();
-}
-
-
-void WorkArea::toggleCursor()
-{
- if (buffer_view_->buffer()) {
-
- if (cursor_visible_)
- hideCursor();
- else
- showCursor();
-
- // Use this opportunity to deal with any child processes that
- // have finished but are waiting to communicate this fact
- // to the rest of LyX.
- ForkedcallsController & fcc = ForkedcallsController::get();
- fcc.handleCompletedProcesses();
- }
-
- cursor_timeout_.restart();
-}
-
-
-void WorkArea::displayMessage(lyx::docstring const & message)
-{
- lyx_view_.message(message);
-}
-
-} // namespace frontend
-} // namespace lyx
--- /dev/null
+/**
+ * \file WorkArea.cpp
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author John Levon
+ * \author Abdelrazak Younes
+ *
+ * Full author contact details are available in file CREDITS.
+ *
+ * Splash screen code added by Angus Leeming
+ */
+
+#include <config.h>
+
+#include "frontends/WorkArea.h"
+
+#include "frontends/Application.h"
+#include "frontends/FontMetrics.h"
+
+#include "funcrequest.h"
+#include "lyxfunc.h"
+#include "Painter.h"
+
+#include "BufferView.h"
+#include "buffer.h"
+#include "bufferparams.h"
+#include "coordcache.h"
+#include "cursor.h"
+#include "debug.h"
+#include "language.h"
+#include "LColor.h"
+#include "lyxfont.h"
+#include "lyxrc.h"
+#include "lyxrow.h"
+#include "lyxtext.h"
+#include "LyXView.h"
+#include "metricsinfo.h"
+#include "paragraph.h"
+#include "rowpainter.h"
+
+#include "gettext.h"
+#include "support/forkedcontr.h"
+
+#include <boost/utility.hpp>
+#include <boost/bind.hpp>
+#include <boost/current_function.hpp>
+
+using lyx::support::ForkedcallsController;
+
+using std::endl;
+using std::min;
+using std::max;
+using std::string;
+
+
+namespace {
+
+// All the below connection objects are needed because of a bug in some
+// versions of GCC (<=2.96 are on the suspects list.) By having and assigning
+// to these connections we avoid a segfault upon startup, and also at exit.
+// (Lgb)
+
+boost::signals::connection timecon;
+
+} // anon namespace
+
+namespace lyx {
+namespace frontend {
+
+WorkArea::WorkArea(int id, LyXView & lyx_view)
+ : buffer_view_(0), lyx_view_(lyx_view), greyed_out_(true),
+ id_(id), cursor_visible_(false), cursor_timeout_(400)
+{
+ // Start loading the pixmap as soon as possible
+ //if (lyxrc.show_banner) {
+ // showBanner();
+ //}
+
+ // Setup the signals
+ timecon = cursor_timeout_.timeout
+ .connect(boost::bind(&WorkArea::toggleCursor, this));
+
+ cursor_timeout_.start();
+}
+
+
+void WorkArea::setBufferView(BufferView * buffer_view)
+{
+ if (buffer_view_) {
+ message_connection_.disconnect();
+ lyx_view_.disconnectBufferView();
+ }
+
+ hideCursor();
+ buffer_view_ = buffer_view;
+ toggleCursor();
+
+ message_connection_ = buffer_view_->message.connect(
+ boost::bind(&WorkArea::displayMessage, this, _1));
+
+ lyx_view_.connectBufferView(*buffer_view);
+}
+
+
+BufferView & WorkArea::bufferView()
+{
+ return *buffer_view_;
+}
+
+
+BufferView const & WorkArea::bufferView() const
+{
+ return *buffer_view_;
+}
+
+
+void WorkArea::stopBlinkingCursor()
+{
+ cursor_timeout_.stop();
+ hideCursor();
+}
+
+
+void WorkArea::startBlinkingCursor()
+{
+ showCursor();
+ cursor_timeout_.restart();
+}
+
+
+void WorkArea::redraw()
+{
+ if (!buffer_view_ || !buffer_view_->buffer()) {
+ greyed_out_ = true;
+ // The argument here are meaningless.
+ expose(1,1,1,1);
+ return;
+ }
+
+ // No need to do anything if this is the current view. The BufferView
+ // metrics are already up to date.
+ if (&lyx_view_ != theApp()->currentView())
+ // FIXME: it would be nice to optimize for the off-screen case.
+ buffer_view_->updateMetrics(false);
+
+ updateScrollbar();
+
+ ViewMetricsInfo const & vi = buffer_view_->viewMetricsInfo();
+ greyed_out_ = false;
+
+ LYXERR(Debug::WORKAREA) << "WorkArea::redraw screen" << endl;
+
+ int const ymin = std::max(vi.y1, 0);
+ int const ymax = vi.p2 < vi.size - 1 ? vi.y2 : height();
+
+ expose(0, ymin, width(), ymax - ymin);
+
+ //LYXERR(Debug::WORKAREA)
+ //<< " ymin = " << ymin << " width() = " << width()
+// << " ymax-ymin = " << ymax-ymin << std::endl;
+
+ if (lyxerr.debugging(Debug::WORKAREA))
+ buffer_view_->coordCache().dump();
+}
+
+
+void WorkArea::processKeySym(LyXKeySymPtr key, key_modifier::state state)
+{
+ // In order to avoid bad surprise in the middle of an operation, we better stop
+ // the blinking cursor.
+ stopBlinkingCursor();
+
+ theLyXFunc().setLyXView(&lyx_view_);
+ theLyXFunc().processKeySym(key, state);
+
+ /* When we move around, or type, it's nice to be able to see
+ * the cursor immediately after the keypress.
+ */
+ startBlinkingCursor();
+}
+
+
+void WorkArea::dispatch(FuncRequest const & cmd0, key_modifier::state k)
+{
+ // Handle drag&drop
+ if (cmd0.action == LFUN_FILE_OPEN) {
+ lyx_view_.dispatch(cmd0);
+ return;
+ }
+
+ theLyXFunc().setLyXView(&lyx_view_);
+
+ FuncRequest cmd;
+
+ if (cmd0.action == LFUN_MOUSE_PRESS) {
+ if (k == key_modifier::shift)
+ cmd = FuncRequest(cmd0, "region-select");
+ else if (k == key_modifier::ctrl)
+ cmd = FuncRequest(cmd0, "paragraph-select");
+ else
+ cmd = cmd0;
+ }
+ else
+ cmd = cmd0;
+
+ // In order to avoid bad surprise in the middle of an operation, we better stop
+ // the blinking cursor.
+ if (!(cmd.action == LFUN_MOUSE_MOTION
+ && cmd.button() == mouse_button::none))
+ stopBlinkingCursor();
+
+ bool const needRedraw = buffer_view_->workAreaDispatch(cmd);
+
+ if (needRedraw)
+ redraw();
+
+ // Skip these when selecting
+ if (cmd.action != LFUN_MOUSE_MOTION) {
+ lyx_view_.updateLayoutChoice();
+ lyx_view_.updateMenubar();
+ lyx_view_.updateToolbars();
+ }
+
+ // GUI tweaks except with mouse motion with no button pressed.
+ if (!(cmd.action == LFUN_MOUSE_MOTION
+ && cmd.button() == mouse_button::none)) {
+ // Slight hack: this is only called currently when we
+ // clicked somewhere, so we force through the display
+ // of the new status here.
+ lyx_view_.clearMessage();
+
+ // Show the cursor immediately after any operation.
+ startBlinkingCursor();
+ }
+}
+
+
+void WorkArea::resizeBufferView()
+{
+ lyx_view_.busy(true);
+ lyx_view_.message(_("Formatting document..."));
+ buffer_view_->workAreaResize(width(), height());
+ lyx_view_.updateLayoutChoice();
+ lyx_view_.clearMessage();
+ lyx_view_.busy(false);
+}
+
+
+void WorkArea::updateScrollbar()
+{
+ buffer_view_->updateScrollbar();
+ ScrollbarParameters const & scroll_ = buffer_view_->scrollbarParameters();
+ setScrollbarParams(scroll_.height, scroll_.position,
+ scroll_.lineScrollHeight);
+}
+
+
+void WorkArea::scrollBufferView(int position)
+{
+ stopBlinkingCursor();
+ buffer_view_->scrollDocView(position);
+ redraw();
+ if (lyxrc.cursor_follows_scrollbar) {
+ buffer_view_->setCursorFromScrollbar();
+ lyx_view_.updateLayoutChoice();
+ }
+ // Show the cursor immediately after any operation.
+ startBlinkingCursor();
+}
+
+
+void WorkArea::showCursor()
+{
+ if (cursor_visible_)
+ return;
+
+ if (!buffer_view_->buffer())
+ return;
+
+ CursorShape shape = BAR_SHAPE;
+
+ LyXText const & text = *buffer_view_->cursor().innerText();
+ LyXFont const & realfont = text.real_current_font;
+ BufferParams const & bp = buffer_view_->buffer()->params();
+ bool const samelang = realfont.language() == bp.language;
+ bool const isrtl = realfont.isVisibleRightToLeft();
+
+ if (!samelang || isrtl != bp.language->rightToLeft()) {
+ shape = L_SHAPE;
+ if (isrtl)
+ shape = REVERSED_L_SHAPE;
+ }
+
+ // The ERT language hack needs fixing up
+ if (realfont.language() == latex_language)
+ shape = BAR_SHAPE;
+
+ LyXFont const font = buffer_view_->cursor().getFont();
+ FontMetrics const & fm = theFontMetrics(font);
+ int const asc = fm.maxAscent();
+ int const des = fm.maxDescent();
+ int h = asc + des;
+ int x = 0;
+ int y = 0;
+ buffer_view_->cursor().getPos(x, y);
+ y -= asc;
+
+ // if it doesn't touch the screen, don't try to show it
+ if (y + h < 0 || y >= height())
+ return;
+
+ cursor_visible_ = true;
+ showCursor(x, y, h, shape);
+}
+
+
+void WorkArea::hideCursor()
+{
+ if (!cursor_visible_)
+ return;
+
+ cursor_visible_ = false;
+ removeCursor();
+}
+
+
+void WorkArea::toggleCursor()
+{
+ if (buffer_view_->buffer()) {
+
+ if (cursor_visible_)
+ hideCursor();
+ else
+ showCursor();
+
+ // Use this opportunity to deal with any child processes that
+ // have finished but are waiting to communicate this fact
+ // to the rest of LyX.
+ ForkedcallsController & fcc = ForkedcallsController::get();
+ fcc.handleCompletedProcesses();
+ }
+
+ cursor_timeout_.restart();
+}
+
+
+void WorkArea::displayMessage(lyx::docstring const & message)
+{
+ lyx_view_.message(message);
+}
+
+} // namespace frontend
+} // namespace lyx