]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/Toolbars.C
Document pasteParagraphList as hinted by Jean-Marc
[lyx.git] / src / frontends / Toolbars.C
index a5b7273739b77def1a1001599b0c40a20eca6189..71cd21489196e01e3884b5b80980c346fa4c1c5c 100644 (file)
@@ -22,6 +22,7 @@
 #include "lyxfunc.h"
 #include "lyxtextclass.h"
 #include "LyXView.h"
+#include "lyx_main.h"
 
 
 namespace lyx {
@@ -36,15 +37,82 @@ Toolbars::Toolbars(LyXView & owner)
          last_textclass_(-1)
 {}
 
+#define TurnOnFlag(x)   flags |= ToolbarBackend::x
+#define TurnOffFlag(x)  flags &= ~ToolbarBackend::x
+
+void Toolbars::initFlags(ToolbarBackend::Toolbar & tbb)
+{
+       ToolbarSection::ToolbarInfo & info = LyX::ref().session().toolbars().load(tbb.name);
+
+       unsigned int flags = static_cast<unsigned int>(tbb.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 tbb.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 tbb.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
+       tbb.flags = static_cast<lyx::ToolbarBackend::Flags>(flags);
+}
+
 
 void Toolbars::init()
 {
        // extracts the toolbars from the backend
-       ToolbarBackend::Toolbars::const_iterator cit = toolbarbackend.begin();
-       ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end();
+       ToolbarBackend::Toolbars::iterator cit = toolbarbackend.begin();
+       ToolbarBackend::Toolbars::iterator end = toolbarbackend.end();
 
-       for (; cit != end; ++cit)
+       for (; cit != end; ++cit) {
+               initFlags(*cit);
                add(*cit);
+       }
 }
 
 
@@ -65,6 +133,61 @@ void Toolbars::display(string const & name, bool show)
 }
 
 
+ToolbarBackend::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 ToolbarBackend::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 & ToolbarBackend::OFF) {
+                               TurnOffFlag(OFF);
+                               TurnOnFlag(ON);
+                       // auto -> off
+                       } else if (flags & ToolbarBackend::AUTO) {
+                               TurnOffFlag(AUTO);
+                               TurnOnFlag(OFF);
+                       } else if ((flags & ToolbarBackend::MATH) || (flags & ToolbarBackend::TABLE)
+                               || (flags & ToolbarBackend::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::ToolbarBackend::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();
@@ -74,16 +197,53 @@ void Toolbars::update(bool in_math, bool in_table, bool review)
        ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end();
 
        for (; cit != end; ++cit) {
-               if (cit->flags & ToolbarBackend::MATH)
+               if (cit->flags & ToolbarBackend::ON)
+                       displayToolbar(*cit, true);
+               else if (cit->flags & ToolbarBackend::OFF)
+                       displayToolbar(*cit, false);
+               else if ((cit->flags & ToolbarBackend::AUTO) && (cit->flags & ToolbarBackend::MATH))
                        displayToolbar(*cit, in_math);
-               else if (cit->flags & ToolbarBackend::TABLE)
+               else if ((cit->flags & ToolbarBackend::AUTO) && (cit->flags & ToolbarBackend::TABLE))
                        displayToolbar(*cit, in_table);
-               else if (cit->flags & ToolbarBackend::REVIEW)
+               else if ((cit->flags & ToolbarBackend::AUTO) && (cit->flags & ToolbarBackend::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 & ToolbarBackend::ON)
+                       info.state = ToolbarSection::ToolbarInfo::ON;
+               else if (cit->flags & ToolbarBackend::OFF)
+                       info.state = ToolbarSection::ToolbarInfo::OFF;
+               else if (cit->flags & ToolbarBackend::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 & ToolbarBackend::AUTO)) {
+                       unsigned int flags = static_cast<unsigned int>(cit->flags);
+                       flags &= ~(info.state == ToolbarSection::ToolbarInfo::ON ? ToolbarBackend::OFF : ToolbarBackend::ON);
+                       flags |= (info.state == ToolbarSection::ToolbarInfo::ON ? ToolbarBackend::ON : ToolbarBackend::OFF);
+                       if (info.state == ToolbarSection::ToolbarInfo::ON)
+                       cit->flags = static_cast<lyx::ToolbarBackend::Flags>(flags);
+               }
+               */
+       }
+}
+
+
 void Toolbars::setLayout(string const & layout)
 {
        if (layout_)
@@ -173,7 +333,7 @@ void layoutSelected(LyXView & lv, string const & name)
                // Yes, the lyx::to_utf8(_()) is correct
                if (lyx::to_utf8(_(itname)) == name) {
                        FuncRequest const func(LFUN_LAYOUT, itname,
-                                              FuncRequest::UI);
+                                              FuncRequest::TOOLBAR);
                        lv.dispatch(func);
                        return;
                }