]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiToolbars.cpp
Complete the removal of the embedding stuff. Maybe. It's hard to be sure we got every...
[lyx.git] / src / frontends / qt4 / GuiToolbars.cpp
index 0f8653d8ba684c72fb1de42a10455fb52251597a..13544e458c947e7f3d0472d79e56a4b20b145386 100644 (file)
 
 #include "GuiToolbars.h"
 
+#include "GuiCommandBuffer.h"
 #include "GuiToolbar.h"
 #include "GuiView.h"
 
 #include "Buffer.h"
 #include "BufferParams.h"
-#include "debug.h"
 #include "FuncRequest.h"
 #include "FuncStatus.h"
-#include "gettext.h"
 #include "Layout.h"
 #include "LyX.h"
 #include "LyXFunc.h"
 #include "TextClass.h"
+#include "ToolbarBackend.h"
 
+#include "support/debug.h"
+#include "support/gettext.h"
 
-using std::endl;
-using std::string;
+#include "support/assert.h"
+
+
+using namespace std;
 
 namespace lyx {
 namespace frontend {
 
-GuiToolbars::GuiToolbars(GuiViewBase & owner)
-       : owner_(owner),
-         layout_(0),
-         last_textclass_(TextClassPtr())
-{}
+#define TurnOnFlag(x)   flags |= ToolbarInfo::x
+#define TurnOffFlag(x)  flags &= ~ToolbarInfo::x
+
+GuiToolbars::GuiToolbars(GuiView & owner)
+       : owner_(owner)
+{
+       init();
+}
+
+
+void GuiToolbars::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);
+       }
+       /*
+       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)
+               << endl;
+       */
+       // now set the flags
+       tbinfo.flags = static_cast<lyx::ToolbarInfo::Flags>(flags);
+}
+
+
+void GuiToolbars::init()
+{
+       ToolbarsMap::const_iterator it = toolbars_.begin();
+       for (; it != toolbars_.end(); ++it)
+               delete it->second;
+       toolbars_.clear();
+
+       // 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->key << " at position "
+                       << tb->info.posx << " " << tb->info.posy);
+               // add toolbar break if posx or posy changes
+               bool newline = tb->info.location == last_loc && (
+                       // if two toolbars at the same location, assume uninitialized and add toolbar break
+                       (tb->info.posx == last_posx && tb->info.posy == last_posy) ||
+                       (last_loc == ToolbarSection::ToolbarInfo::TOP && tb->info.posy != last_posy) ||
+                       (last_loc == ToolbarSection::ToolbarInfo::BOTTOM && tb->info.posy != last_posy) ||
+                       (last_loc == ToolbarSection::ToolbarInfo::LEFT && tb->info.posx != last_posx) ||
+                       (last_loc == ToolbarSection::ToolbarInfo::RIGHT && tb->info.posx != last_posx) );
+               // find the backend item and add
+               for (cit = toolbarbackend.begin(); cit != end; ++cit)
+                       if (cit->name == tb->key) {
+                               add(*cit, newline);
+                               last_loc = tb->info.location;
+                               last_posx = tb->info.posx;
+                               last_posy = tb->info.posy;
+                               break;
+                       }
+       }
+}
+
+
+void GuiToolbars::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(ON);
+                       TurnOffFlag(OFF);
+                       TurnOffFlag(AUTO);
+                       if (show)
+                               TurnOnFlag(ON);
+                       else
+                               TurnOnFlag(OFF);
+                       cit->flags = static_cast<lyx::ToolbarInfo::Flags>(flags);
+                       displayToolbar(*cit, show);
+               }
+       }
+
+       LYXERR(Debug::GUI, "Toolbar::display: no toolbar named " << name);
+}
+
+
+ToolbarInfo * GuiToolbars::getToolbarInfo(string const & name)
+{
+       return toolbarbackend.getUsedToolbarInfo(name);
+}
+
+
+void GuiToolbars::toggleToolbarState(string const & name, bool allowauto)
+{
+       ToolbarInfo * tbi = toolbarbackend.getUsedToolbarInfo(name);
+
+       if (!tbi) {
+               LYXERR(Debug::GUI, "Toolbar::display: no toolbar named " << name);
+               return;
+       }
+
+       int flags = tbi->flags;
+       // off -> on
+       if (flags & ToolbarInfo::OFF) {
+               TurnOffFlag(OFF);
+               TurnOnFlag(ON);
+       // auto -> off
+       } else if (flags & ToolbarInfo::AUTO) {
+               TurnOffFlag(AUTO);
+               TurnOnFlag(OFF);
+       } else if (allowauto 
+                  && ((flags & ToolbarInfo::MATH) 
+                      || (flags & ToolbarInfo::TABLE)
+                      || (flags & ToolbarInfo::REVIEW)
+                      || (flags & ToolbarInfo::MATHMACROTEMPLATE))) {
+               // for math etc, toggle from on -> auto
+               TurnOffFlag(ON);
+               TurnOnFlag(AUTO);
+       } else {
+               // for others, toggle from on -> off
+               TurnOffFlag(ON);
+               TurnOnFlag(OFF);
+       }
+       tbi->flags = static_cast<ToolbarInfo::Flags>(flags);
+}
+
+
+void GuiToolbars::toggleFullScreen(bool start_full_screen)
+{
+       // we need to know number of fullscreens until every
+       // LyXView has its own toolbar configuration
+       toolbarbackend.fullScreenWindows += start_full_screen ? 1 : -1;
+
+       // extracts the toolbars from the backend
+       ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
+       ToolbarBackend::Toolbars::iterator end = toolbarbackend.end();
+       int flags = 0;
+
+       for (; cit != end; ++cit) {
+
+               if (start_full_screen) {
+                       if (toolbarbackend.fullScreenWindows == 1)
+                               flags = cit->before_fullscreen = cit->flags;
+                       TurnOffFlag(ON);
+                       TurnOffFlag(AUTO);
+                       TurnOnFlag(OFF);
+               } else
+                       flags = cit->before_fullscreen;
+
+               cit->flags = static_cast<ToolbarInfo::Flags>(flags);
+       }
+}
+#undef TurnOnFlag
+#undef TurnOffFlag
+
+
+void GuiToolbars::update(bool in_math, bool in_table, bool review, 
+       bool in_mathmacrotemplate)
+{
+       updateIcons();
+
+       // 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);   
+               else if ((cit->flags & ToolbarInfo::AUTO) && (cit->flags & ToolbarInfo::MATHMACROTEMPLATE))
+                       displayToolbar(*cit, in_mathmacrotemplate);
+       }
+}
 
 
 bool GuiToolbars::visible(string const & name) const
 {
-       std::map<string, GuiToolbar *>::const_iterator it =
+       map<string, GuiToolbar *>::const_iterator it =
                toolbars_.find(name);
        if (it == toolbars_.end())
                return false;
@@ -59,7 +298,7 @@ void GuiToolbars::saveToolbarInfo()
        for (ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
                cit != toolbarbackend.end(); ++cit) {
                ToolbarsMap::iterator it = toolbars_.find(cit->name);
-               BOOST_ASSERT(it != toolbars_.end());
+               LASSERT(it != toolbars_.end(), /**/);
                // get toolbar info from session.
                ToolbarSection::ToolbarInfo & info = tb.load(cit->name);
                if (cit->flags & ToolbarInfo::ON)
@@ -85,41 +324,6 @@ void GuiToolbars::saveToolbarInfo()
 }
 
 
-void GuiToolbars::setLayout(docstring const & layout)
-{
-       if (layout_)
-               layout_->set(layout);
-}
-
-
-bool GuiToolbars::updateLayoutList(TextClassPtr textclass)
-{
-       // update the layout display
-       if (last_textclass_ != textclass) {
-               if (layout_)
-                       layout_->updateContents();
-               last_textclass_ = textclass;
-               return true;
-       } else
-               return false;
-}
-
-
-void GuiToolbars::openLayoutList()
-{
-       if (layout_)
-               layout_->showPopup();
-}
-
-
-void GuiToolbars::clearLayoutList()
-{
-       last_textclass_ = TextClassPtr();
-       if (layout_)
-               layout_->clear();
-}
-
-
 void GuiToolbars::add(ToolbarInfo const & tbinfo, bool newline)
 {
        GuiToolbar * tb_ptr = owner_.makeToolbar(tbinfo, newline);
@@ -129,9 +333,6 @@ void GuiToolbars::add(ToolbarInfo const & tbinfo, bool newline)
                tb_ptr->show();
        else
                tb_ptr->hide();
-
-       if (tb_ptr->layout())
-               layout_ = tb_ptr->layout();
 }
 
 
@@ -139,7 +340,7 @@ void GuiToolbars::displayToolbar(ToolbarInfo const & tbinfo,
                              bool show_it)
 {
        ToolbarsMap::iterator it = toolbars_.find(tbinfo.name);
-       BOOST_ASSERT(it != toolbars_.end());
+       LASSERT(it != toolbars_.end(), /**/);
 
        if (show_it) {
                if (it->second->isVisible())
@@ -157,12 +358,28 @@ void GuiToolbars::updateIcons()
        ToolbarsMap::const_iterator const end = toolbars_.end();
        for (; it != end; ++it)
                it->second->updateContents();
+}
 
-       bool const enable =
-               lyx::getStatus(FuncRequest(LFUN_LAYOUT)).enabled();
 
-       if (layout_)
-               layout_->setEnabled(enable);
+void GuiToolbars::showCommandBuffer(bool show_it)
+{
+       ToolbarsMap::const_iterator it = toolbars_.begin();
+       ToolbarsMap::const_iterator const end = toolbars_.end();
+       for (; it != end; ++it) {
+               GuiCommandBuffer * cb = it->second->commandBuffer();
+               if (!cb)
+                       continue;
+               if (!show_it) {
+                       // FIXME: this is a hack, "minibuffer" should not be
+                       // hardcoded.
+                       display("minibuffer", false);
+                       return;
+               }
+               if (!it->second->isVisible())
+                       display("minibuffer", true);
+               cb->setFocus();
+               return;
+       }
 }
 
 } // namespace frontend