]> git.lyx.org Git - features.git/commitdiff
The 'Branches' mega-patch.
authorMartin Vermeer <martin.vermeer@hut.fi>
Sun, 17 Aug 2003 11:28:23 +0000 (11:28 +0000)
committerMartin Vermeer <martin.vermeer@hut.fi>
Sun, 17 Aug 2003 11:28:23 +0000 (11:28 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@7560 a592a061-630c-0410-9148-cb99ea01b6c8

42 files changed:
lib/ChangeLog
lib/ui/stdmenus.ui
po/POTFILES.in
src/BranchList.C [new file with mode: 0644]
src/BranchList.h [new file with mode: 0644]
src/ChangeLog
src/InsetList.C
src/InsetList.h
src/LColor.C
src/LColor.h
src/LyXAction.C
src/Makefile.am
src/MenuBackend.C
src/MenuBackend.h
src/bufferparams.C
src/bufferparams.h
src/factory.C
src/frontends/controllers/ChangeLog
src/frontends/controllers/ControlBranch.C [new file with mode: 0644]
src/frontends/controllers/ControlBranch.h [new file with mode: 0644]
src/frontends/controllers/ControlDocument.C
src/frontends/controllers/Makefile.am
src/frontends/xforms/ChangeLog
src/frontends/xforms/ColorHandler.C
src/frontends/xforms/ColorHandler.h
src/frontends/xforms/Dialogs.C
src/frontends/xforms/FormBranch.C [new file with mode: 0644]
src/frontends/xforms/FormBranch.h [new file with mode: 0644]
src/frontends/xforms/FormDocument.C
src/frontends/xforms/FormDocument.h
src/frontends/xforms/Makefile.am
src/frontends/xforms/forms/Makefile.am
src/frontends/xforms/forms/form_branch.fd [new file with mode: 0644]
src/frontends/xforms/forms/form_document.fd
src/insets/ChangeLog
src/insets/Makefile.am
src/insets/inset.h
src/insets/insetbranch.C [new file with mode: 0644]
src/insets/insetbranch.h [new file with mode: 0644]
src/lfuns.h
src/lyxfunc.C
src/text3.C

index f57384b5f40530448e8ad0f9975a5c800b390ae9..224b8896f3fa4482f931561d0ecdccd6218bfd1a 100644 (file)
@@ -1,3 +1,19 @@
+
+2003-08-17  Martin Vermeer  <martin.vermeer@hut.fi>    
+
+       * ui/stdmenus.ui: implements the 'branch inset'
+       idea. This allows the output of various versions of a document
+       from a single source version, selectively outputing or suppressing
+       output of parts of the text.
+       This implementation contains a 'branch list editor' in a separate
+       tab of the document settings dialog. Branches are user definable
+       and have a "display colour" to distinguish them on-screen.
+
+       ColorHandler was somewhat cleaned up.
+       (1) make possible a dynamically growing LColor list by allowing
+       the graphic context cache to grow along (vector);
+       (2) eliminate an IMHO unnecessary step in colour allocation.
+
 2003-08-14  John Levon  <levon@movementarian.org>
 
        * ui/stdmenus.ui: move Note up to the submenus section
index 83f5608d46a7c8d83725e78417e6ec4de540a172..091bb87a13f9d8cca92baf67174ffde9fa5f2240 100644 (file)
@@ -93,6 +93,7 @@ Menuset
                OptItem "Minipage Settings...|M" "inset-settings minipage"
                OptItem "Text Wrap Settings...|W" "inset-settings wrap"
                OptItem "Note Settings...|N" "inset-settings note"
+               OptItem "Branch Settings...|B" "inset-settings branch"
 # Hey, guess what's broken ? Surprise surprise, it's tabular stuff
 # This is in the Table submenu instead for now.
 #      OptItem "Table Settings...|a" "inset-settings tabular"
@@ -217,6 +218,8 @@ Menuset
                Submenu "Float|a" "insert_float"
                Submenu "Note|N" "insert_note"
 # YUCK
+               Submenu "Note|N" "insert_note"
+               Submenu "Branch|B" "branches"
                Submenu "File|e" "insert_file"
                Separator
                Item "Citation Reference...|C" "dialog-show-new-inset citation"
@@ -326,6 +329,10 @@ Menuset
                Item "Greyed Out|G" "note-insert Greyedout"
        End
 
+       Menu "branches"
+               Branches
+       End
+
 #
 # DOCUMENT MENU
 #
index ef8ddaab7f6e44a86ff34a8702e9eaa4768ef25d..8e758eff0c131c2d0abc379b2da3a2c086f6a9b2 100644 (file)
@@ -1,3 +1,4 @@
+src/BranchList.h
 src/BufferView.C
 src/BufferView_pimpl.C
 src/Chktex.C
@@ -90,6 +91,7 @@ src/frontends/xforms/FormAboutlyx.C
 src/frontends/xforms/FormBase.C
 src/frontends/xforms/FormBibitem.C
 src/frontends/xforms/FormBibtex.C
+src/frontends/xforms/FormBranch.C
 src/frontends/xforms/FormChanges.C
 src/frontends/xforms/FormCharacter.C
 src/frontends/xforms/FormCitation.C
@@ -138,6 +140,7 @@ src/gettext.h
 src/importer.C
 src/insets/inset.C
 src/insets/insetbibtex.C
+src/insets/insetbranch.C
 src/insets/insetcaption.C
 src/insets/insetenv.C
 src/insets/insetert.C
@@ -180,6 +183,7 @@ src/mathed/ref_inset.C
 src/paragraph.C
 src/paragraph_funcs.C
 src/rowpainter.C
+src/support/path_defines.C
 src/text.C
 src/text2.C
 src/text3.C
diff --git a/src/BranchList.C b/src/BranchList.C
new file mode 100644 (file)
index 0000000..050b1b0
--- /dev/null
@@ -0,0 +1,202 @@
+/**
+ * \file BranchList.C 
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ * \author Martin Vermeer
+ * 
+ * Full author contact details are available in file CREDITS
+ */
+
+#include "BranchList.h"
+#include "support/LAssert.h"
+
+#include <functional>
+
+using std::bind2nd;
+using std::remove_if;
+using std::binary_function;
+using namespace lyx::support;
+
+
+string const Branch::getBranch() const
+{
+       return branch_;
+}
+
+
+void Branch::setBranch(string const & s)
+{
+       branch_ = s;
+}
+
+
+bool Branch::getSelected() const
+{
+       return selected_;
+}
+
+
+void Branch::setSelected(bool b)
+{
+       selected_ = b;
+}
+
+
+string const Branch::getColor() const
+{
+       return color_;
+}
+
+
+void Branch::setColor(string const & c)
+{
+       color_ = c;
+}
+
+
+void BranchList::clear()
+{
+       list.clear();
+}
+
+
+string BranchList::getColor(string const & s) const
+{
+       List::const_iterator it = list.begin();
+       List::const_iterator end = list.end();
+       for (; it != end; ++it) {
+               if (s == it->getBranch()) {
+                       return it->getColor();
+               }
+       }
+       Assert(false); // Always
+       return string(); // never gets here
+}
+
+
+
+void BranchList::setColor(string const & s, string const & val)
+{
+       List::iterator it = list.begin();
+       List::iterator end = list.end();
+       for (; it != end; ++it) {
+               if (s.find(it->getBranch(), 0) != string::npos) {
+                       it->setColor(val);
+                       return;
+               }
+       }
+       Assert(false);
+}
+
+
+void BranchList::setSelected(string const & s, bool val)
+{
+       List::iterator it = list.begin();
+       List::iterator end = list.end();
+       for (; it != end; ++it) {
+               if (s.find(it->getBranch(), 0) != string::npos)
+                       it->setSelected(val);
+       }
+}
+
+
+void BranchList::add(string const & s)
+{
+       string::size_type i = 0;
+       while (true) {
+               string::size_type const j = s.find_first_of(separator(), i);
+               string name;
+               if (j == string::npos)
+                       name = s.substr(i);
+               else
+                       name = s.substr(i, j - i);
+               // Is this name already in the list?
+               List::const_iterator it = list.begin();
+               List::const_iterator end = list.end();
+               bool already = false;
+               for (; it != end; ++it) {
+                       if (it->getBranch() == name) {
+                               already = true;
+                               break;
+                       }
+               }
+               if (!already) {
+                       Branch br;
+                       br.setBranch(name);
+                       br.setSelected(false);
+                       br.setColor("none");
+                       list.push_back(br);
+               }
+               if (j == string::npos)
+                       break;
+               i = j + 1; 
+       }
+}
+
+
+namespace {
+
+struct match : public binary_function<Branch, string, bool> {
+       bool operator()(Branch const & br, string const & s) const {
+       return (br.getBranch() == s);
+       }                                                                       
+};
+
+} // namespace anon.
+
+
+void BranchList::remove(string const & s)
+{
+       list.remove_if(bind2nd(match(), s));
+}
+
+
+bool BranchList::selected(string const & s) const
+{
+       List::const_iterator it = list.begin();
+       List::const_iterator end = list.end();
+       for (; it != end; ++it) {
+               if (s == it->getBranch()) 
+                       return it->getSelected();
+       }
+       return false;
+}
+
+
+string BranchList::allBranches() const
+{
+       List::const_iterator it = list.begin();
+       List::const_iterator end = list.end();
+       string ret;
+       for (; it != end; ++it) {
+               ret += it->getBranch() + separator();
+       }
+       // remove final '|':
+       string::size_type i = ret.find_last_of(separator());
+       if (i != string::npos)
+               ret.erase(i);
+       return ret;
+}
+
+
+string BranchList::allSelected() const
+{      
+       List::const_iterator it = list.begin();
+       List::const_iterator end = list.end();
+       string ret;
+       for (; it != end; ++it) {
+               if (it->getSelected()) 
+                       ret += it->getBranch() + separator();
+       }
+       // remove final '|':
+       string::size_type i = ret.find_last_of(separator());
+       if (i != string::npos)
+               ret.erase(i);
+       return ret;
+}
+
+
+string const BranchList::separator() const
+{
+       return separator_;
+}
diff --git a/src/BranchList.h b/src/BranchList.h
new file mode 100644 (file)
index 0000000..1456e95
--- /dev/null
@@ -0,0 +1,106 @@
+// -*- C++ -*- 
+/**
+ * \file BranchList.h 
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ * \author Martin Vermeer
+ * 
+ * Full author contact details are available in file CREDITS
+ *
+ *
+ * \class Branch
+ *
+ * A class describing a 'branch', i.e., a named alternative for
+ * selectively outputting some parts of a document while suppressing
+ * other parts.
+ *
+ * A branch has a name, can either be selected or not, and uses a
+ * user-specifyable background colour. All these can be set and
+ * queried.
+ * 
+ * \class BranchList
+ *
+ * A class containing a vector of all defined branches within a
+ * document. Has methods for selecting or deselecting branches by
+ * name, for outputting a '|'-separated string of all elements or only
+ * the selected ones, and for adding and removing elements.
+ */
+
+
+#ifndef BRANCHES_H
+#define BRANCHES_H
+
+#include "LString.h"
+#include <list>
+
+class Branch {
+public:
+       ///
+       string const getBranch() const;
+       ///
+       void setBranch(string const &);
+       ///
+       bool getSelected() const;
+       ///
+       void setSelected(bool);
+       /// 
+       string const getColor() const;
+       ///
+       void setColor(string const &);
+
+
+private:
+       ///
+       string branch_;
+       ///
+       bool selected_;
+       ///
+       string color_;
+};
+
+
+class BranchList {
+public:
+       ///
+       BranchList():  separator_("|") {};
+       
+       ///
+       typedef std::list<Branch> List;
+
+       ///
+       void clear();
+       ///
+       bool empty() { return list.empty(); };
+       ///
+       bool size() const { return list.size(); };
+       ///
+       List::const_iterator begin() const { return list.begin(); };
+       ///
+       List::const_iterator end() const { return list.end(); };
+       ///
+       string getColor(string const &) const;
+       ///     
+       void setColor(string const &, string const &);
+       /// Select/deselect multiple branches given in '|'-separated string
+       void setSelected(string const &, bool);
+       /// Add multiple branches to list
+       void add(string const &);
+       /// remove a branch from list by name
+       void remove(string const &);
+       /// return whether this branch is selected
+       bool selected(string const &) const;
+       /// return, as a '|'-separated string, all branch names
+       string allBranches() const;
+       /// 
+       string allSelected() const;
+       ///
+       string const separator() const;
+       
+private:
+       ///
+       List list;
+       ///
+       string separator_;
+};
+
+#endif
index 4e78662d05daa4b398f4110dcc6db16b9ae651b0..4a7891cba1a6dba4e8a0e855b9ce6a0689047769 100644 (file)
@@ -1,4 +1,29 @@
 
+2003-08-17  Martin Vermeer  <martin.vermeer@hut.fi>    
+
+       * src/BranchList.[Ch]:
+       * src/InsetList.[Ch]:
+       * src/LColor.[Ch]:
+       * src/LyXAction.C:
+       * src/Makefile.am:
+       * src/MenuBackend.[Ch]:
+       * src/bufferparams.[Ch]:
+       * src/factory.C:
+       * src/lfuns.h:
+       * src/lyxfunc.C:
+       * src/text3.C: implements the 'branch inset'
+       idea. This allows the output of various versions of a document
+       from a single source version, selectively outputing or suppressing
+       output of parts of the text.
+       This implementation contains a 'branch list editor' in a separate
+       tab of the document settings dialog. Branches are user definable
+       and have a "display colour" to distinguish them on-screen.
+
+       ColorHandler was somewhat cleaned up.
+       (1) make possible a dynamically growing LColor list by allowing
+       the graphic context cache to grow along (vector);
+       (2) eliminate an IMHO unnecessary step in colour allocation.
+
 2003-08-15  Kayvan A. Sylvan <kayvan@sylvan.com>
 
        * BufferView_pimpl.C: compile fix
index 499ab1fea2492232040818cf84c8892d21c670e0..6aa4e023d55ea845176cb6a5380ca34ce80ea273 100644 (file)
@@ -1,9 +1,12 @@
 #include <config.h>
 
 #include "InsetList.h"
+#include "BufferView.h"
+#include "buffer.h"
 #include "debug.h"
 
 #include "insets/updatableinset.h"
+#include "insets/insetbranch.h"
 
 #include <algorithm>
 
@@ -176,3 +179,23 @@ void InsetList::deleteInsetsLyXText(BufferView * bv)
                }
        }
 }
+
+
+void InsetList::insetsOpenCloseBranch(BufferView * bv)
+{
+       BufferParams bp = bv->buffer()->params;
+       List::iterator it = list.begin();
+       List::iterator end = list.end();
+       for (; it != end; ++it) {
+               if (it->inset && it->inset->lyxCode() == InsetOld::BRANCH_CODE) {
+                       InsetBranch * inset = static_cast<InsetBranch *>(it->inset);
+                       if (bp.branchlist.selected(inset->params().branch)) {
+                               inset->open(bv);
+                       } else {
+                               inset->close(bv);
+                       }
+               }
+       }
+}
+
+
index 27b34b29cf616584b553d3819a00aa81326b85c5..f7fd23f4e2b27623d6518053c74f2e7f04d6540c 100644 (file)
@@ -54,6 +54,9 @@ public:
        void decreasePosAfterPos(lyx::pos_type pos);
        ///
        void deleteInsetsLyXText(BufferView * bv);
+       ///
+       void InsetList::insetsOpenCloseBranch(BufferView * bv);
+
 private:
        ///
        List list;
index a36d1a7d8328b82835e8f3b63366176957e4c722..6d88e4e7fbc26f6a613c5eb708a22e661f864825 100644 (file)
@@ -25,7 +25,7 @@ using std::endl;
 namespace {
 
 struct ColorEntry {
-       LColor::color lcolor;
+       int lcolor;
        char const * guiname;
        char const * latexname;
        char const * x11name;
@@ -34,6 +34,11 @@ struct ColorEntry {
 
 }
 
+struct TransformEntry {
+       char const * lyxname;
+       int ncolor;
+};
+
 
 struct LColor::Pimpl {
        ///
@@ -51,17 +56,24 @@ struct LColor::Pimpl {
        /// initialise a color entry
        void fill(ColorEntry const & entry)
        {
-               information & in = infotab[entry.lcolor];
-               in.guiname   = entry.guiname;
-               in.latexname = entry.latexname;
-               in.x11name   = entry.x11name;
-               in.lyxname   = entry.lyxname;
+               information in;
+               in.lyxname   = string(entry.lyxname);
+               in.latexname = string(entry.latexname);
+               in.x11name   = string(entry.x11name);
+               in.guiname   = string(entry.guiname);
+               infotab[entry.lcolor] = in;
+               transform[string(entry.lyxname)] = int(entry.lcolor);
        }
 
        ///
-       typedef std::map<LColor::color, information> InfoTab;
+       typedef std::map<int, information> InfoTab;
        /// the table of color information
        InfoTab infotab;
+
+       typedef std::map<string, int> Transform;
+       /// the transform between colour name string and integer code.
+       Transform transform;
+
 };
 
 
@@ -143,18 +155,31 @@ LColor::LColor(LColor const & c)
 
 
 LColor::~LColor()
-{
-       delete pimpl_;
-}
+{}
 
 
 void LColor::operator=(LColor const & c)
 {
        LColor tmp(c);
-       std::swap(pimpl_, tmp.pimpl_);
+       boost::swap(pimpl_, tmp.pimpl_);
 }
 
 
+void LColor::fill(LColor::color c, 
+                               string const & lyxname,
+                               string const & x11name, 
+                               string const & latexname, 
+                               string const & guiname) 
+{
+       ColorEntry ce;
+       ce.lcolor = c;
+       ce.guiname = guiname.c_str();   
+       ce.latexname = latexname.c_str();       
+       ce.x11name = x11name.c_str();   
+       ce.lyxname = lyxname.c_str();   
+       pimpl_->fill(ce);
+}
+
 
 string const LColor::getGUIName(LColor::color c) const
 {
@@ -165,6 +190,19 @@ string const LColor::getGUIName(LColor::color c) const
 }
 
 
+string const LColor::getGUIName(string const &  s) const
+{
+       Pimpl::Transform::const_iterator ici = pimpl_->transform.find(s);
+       if (ici != pimpl_->transform.end()) {
+               Pimpl::InfoTab::const_iterator 
+                       it = pimpl_->infotab.find(ici->second);
+               if (it != pimpl_->infotab.end()) 
+                       return it->second.guiname;      
+       }
+       return "none";
+}
+
+
 string const LColor::getX11Name(LColor::color c) const
 {
        Pimpl::InfoTab::const_iterator ici = pimpl_->infotab.find(c);
@@ -178,6 +216,22 @@ string const LColor::getX11Name(LColor::color c) const
 }
 
 
+string const LColor::getX11Name(string const & s) const
+{
+       Pimpl::Transform::const_iterator ici = pimpl_->transform.find(s);
+       if (ici != pimpl_->transform.end()) {
+               Pimpl::InfoTab::const_iterator 
+                       it = pimpl_->infotab.find(ici->second);
+               if (it != pimpl_->infotab.end()) 
+                       return it->second.x11name;
+       }
+       lyxerr << "LyX internal error: Missing color"
+               " entry in LColor.C for " << s << endl;
+       lyxerr << "Using black." << endl;
+       return "black";
+}
+
+
 string const LColor::getLaTeXName(LColor::color c) const
 {
        Pimpl::InfoTab::const_iterator ici = pimpl_->infotab.find(c);
@@ -187,6 +241,19 @@ string const LColor::getLaTeXName(LColor::color c) const
 }
 
 
+string const LColor::getLaTeXName(string const & s) const
+{
+       Pimpl::Transform::const_iterator ici = pimpl_->transform.find(s);
+       if (ici != pimpl_->transform.end()) {
+               Pimpl::InfoTab::const_iterator 
+                       it = pimpl_->infotab.find(ici->second);
+               if (it != pimpl_->infotab.end()) 
+                       return it->second.latexname;
+       }
+       return "black";
+}
+
+
 string const LColor::getLyXName(LColor::color c) const
 {
        Pimpl::InfoTab::const_iterator ici = pimpl_->infotab.find(c);
@@ -196,6 +263,12 @@ string const LColor::getLyXName(LColor::color c) const
 }
 
 
+size_t LColor::size() const
+{
+       return pimpl_->infotab.size();
+}
+
+
 void LColor::setColor(LColor::color col, string const & x11name)
 {
        Pimpl::InfoTab::iterator iti = pimpl_->infotab.find(col);
@@ -219,7 +292,7 @@ bool LColor::setColor(string const & lyxname, string const & x11name)
                        " redefined" << endl;
                return false;
        }
-       setColor (col, x11name);
+       setColor(col, x11name);
        return true;
 }
 
@@ -230,7 +303,7 @@ LColor::color LColor::getFromGUIName(string const & guiname) const
        Pimpl::InfoTab::const_iterator end = pimpl_->infotab.end();
        for (; ici != end; ++ici) {
                if (!compare_ascii_no_case(_(ici->second.guiname), guiname))
-                       return ici->first;
+                       return static_cast<LColor::color>(ici->first);
        }
        return LColor::inherit;
 }
@@ -238,13 +311,7 @@ LColor::color LColor::getFromGUIName(string const & guiname) const
 
 LColor::color LColor::getFromLyXName(string const & lyxname) const
 {
-       Pimpl::InfoTab::const_iterator ici = pimpl_->infotab.begin();
-       Pimpl::InfoTab::const_iterator end = pimpl_->infotab.end();
-       for (; ici != end; ++ici) {
-               if (!compare_ascii_no_case(ici->second.lyxname, lyxname))
-                       return ici->first;
-       }
-       return LColor::inherit;
+       return static_cast<LColor::color>(pimpl_->transform[lyxname]);
 }
 
 
index 8b7f669e1ee0fe9058585ba48f3fe830c65a9da9..6768a0615e7f442dfc47dc349d6d1ae1dc342f31 100644 (file)
@@ -12,6 +12,7 @@
 #define LCOLOR_H
 
 #include "LString.h"
+#include <boost/scoped_ptr.hpp>
 
 /**
   This is a stateless class.
@@ -174,6 +175,7 @@ public:
                ignore
        };
 
+       
        ///
        LColor();
        ///
@@ -182,6 +184,14 @@ public:
        ~LColor();
        ///
        void operator=(LColor const &);
+
+       ///
+       void LColor::fill(LColor::color c, 
+                       string const & lyxname,
+                       string const & x11name = string(),
+                       string const & latexname = string(), 
+                       string const & guiname = string()); 
+
        /// set the given LyX color to the color defined by the X11 name given
        void setColor(LColor::color col, string const & x11name);
        /// set the given LyX color to the color defined by the X11 name given
@@ -189,15 +199,25 @@ public:
 
        /// Get GUI name of color
        string const getGUIName(LColor::color c) const;
+       ///
+       string const getGUIName(string const & s) const;
 
        /// Get X11 name of color
        string const getX11Name(LColor::color c) const;
+       ///
+       string const getX11Name(string const & s) const;
 
        /// Get LaTeX name of color
        string const getLaTeXName(LColor::color c) const;
+       ///
+       string const getLaTeXName(string const & s) const;
 
        /// Get LyX name of color
        string const getLyXName(LColor::color c) const;
+       /// (string-to-string version not needed as it is identity)
+
+       ///
+       size_t size() const;
 
        /// get the color from the GUI name
        LColor::color getFromGUIName(string const & guiname) const;
@@ -207,7 +227,7 @@ private:
        ///
        struct Pimpl;
        ///
-       Pimpl * pimpl_;
+       boost::scoped_ptr<Pimpl> pimpl_;
 };
 
 /// the current color definitions
index aa98a48ba228b015594cbbccfa0c9fdae3d211c8..42a8a091345afdf912deae4083f3e84839e4353b 100644 (file)
@@ -222,6 +222,7 @@ void LyXAction::init()
                { LFUN_MENU_SEPARATOR, "menu-separator-insert", Noop },
                { LFUN_META_FAKE, "meta-prefix", NoBuffer },
                { LFUN_INSET_MINIPAGE, "minipage-insert", Noop },
+               { LFUN_INSERT_BRANCH, "branch-insert", Noop },
                { LFUN_INSERT_NOTE, "note-insert", Noop },
                { LFUN_GOTONOTE, "note-next", ReadOnly },
                { LFUN_INSET_TOGGLE, "inset-toggle", ReadOnly },
index 77e0be441714f5b2637e1b29ca0d092b10529bb9..4f328f92d1e69ffdf31850e960318270ceaad45d 100644 (file)
@@ -60,6 +60,8 @@ lyx_SOURCES = \
        BufferView_pimpl.h \
        Bullet.C \
        Bullet.h \
+       BranchList.C \
+       BranchList.h \
        Chktex.C \
        Chktex.h \
        CutAndPaste.C \
index 52e557a8ee90b6f9cade2600aae6a19ef1c9040e..34207b68fe114a09236e0123404c20cdc4d6bdcf 100644 (file)
@@ -69,6 +69,7 @@ MenuItem::MenuItem(Kind kind, string const & label,
        case FloatListInsert:
        case FloatInsert:
        case PasteRecent:
+       case Branches:
                break;
        case Command:
                action_ = lyxaction.LookupFunc(command);
@@ -189,6 +190,7 @@ Menu & Menu::read(LyXLex & lex)
 {
        enum Menutags {
                md_item = 1,
+               md_branches,
                md_documents,
                md_endmenu,
                md_exportformats,
@@ -208,6 +210,7 @@ Menu & Menu::read(LyXLex & lex)
        };
 
        struct keyword_item menutags[md_last - 1] = {
+               { "branches", md_branches },
                { "documents", md_documents },
                { "end", md_endmenu },
                { "exportformats", md_exportformats },
@@ -293,6 +296,10 @@ Menu & Menu::read(LyXLex & lex)
                        add(MenuItem(MenuItem::PasteRecent));
                        break;
 
+               case md_branches:
+                       add(MenuItem(MenuItem::Branches));
+                       break;
+
                case md_optsubmenu:
                        optional = true;
                        // fallback to md_submenu
@@ -635,6 +642,25 @@ void expandPasteRecent(Menu & tomenu, LyXView const * view)
 }
 
 
+void expandBranches(Menu & tomenu, LyXView const * view)
+{
+       BufferParams const & params = view->buffer()->params;
+
+       std::list<Branch>::const_iterator cit = params.branchlist.begin();
+       std::list<Branch>::const_iterator end = params.branchlist.end();
+       
+       for (int ii = 1; cit != end; ++cit, ++ii) {
+               string label = cit->getBranch();
+               int const action = lyxaction.
+                       getPseudoAction(LFUN_INSERT_BRANCH,
+                                       (cit->getBranch()));
+               if (ii < 10)
+                       label = tostr(ii) + ". " + label + "|" + tostr(ii);
+               tomenu.add(MenuItem(MenuItem::Command, label, action), view);
+       }
+}
+
+
 } // namespace anon
 
 
@@ -671,6 +697,10 @@ void MenuBackend::expand(Menu const & frommenu, Menu & tomenu,
                        expandPasteRecent(tomenu, view);
                        break;
 
+               case MenuItem::Branches:
+                       expandBranches(tomenu, view);
+                       break;
+
                case MenuItem::Toc:
                        expandToc(tomenu, view);
                        break;
index 5366515f2cb23f34c10bb31f4bc1fd09bf517a47..d47968d18eeec7b0a0d12c24eda1610d73d91fbd 100644 (file)
@@ -65,7 +65,9 @@ public:
                FloatInsert,
                /** This is the list of selections that can
                    be pasted. */
-               PasteRecent
+               PasteRecent,
+               /** Available branches in document */
+               Branches
        };
        /// Create a Command type MenuItem
        MenuItem(Kind kind,
@@ -196,7 +198,7 @@ public:
        /// Expands some special entries of the menu
        /** The entries with the following kind are expanded to a
            sequence of Command MenuItems: Lastfiles, Documents,
-           ViewFormats, ExportFormats, UpdateFormats
+           ViewFormats, ExportFormats, UpdateFormats, Branches
        */
        void expand(Menu const & frommenu, Menu & tomenu,
                    LyXView const *) const;
index 02b6b677edc319ff20ced88d3e661e2c09770215..837e481f29f489c57a32b6db32e0e477984c5280 100644 (file)
@@ -24,6 +24,8 @@
 #include "author.h"
 #include "gettext.h"
 
+#include "LColor.h"
+
 #include "support/lyxalgo.h" // for lyx::count
 #include "support/lyxlib.h"
 #include "support/lstrings.h"
@@ -192,6 +194,31 @@ string const BufferParams::readToken(LyXLex & lex, string const & token)
        } else if (token == "\\tracking_changes") {
                lex.nextToken();
                tracking_changes = lex.getInteger();
+       } else if (token == "\\branch") {
+               lex.nextToken();
+               string branch = lex.getString();
+               branchlist.add(branch);
+               while (true) {
+                       lex.nextToken();
+                       string const tok = lex.getString();
+                       if (tok == "\\end_branch")
+                               break;
+                       if (tok == "\\selected") {
+                               lex.nextToken();
+                               branchlist.setSelected(branch, lex.getInteger());
+                       }
+                       // not yet operational
+                       if (tok == "\\color") {
+                               lex.nextToken();
+                               string color = lex.getString();
+                               branchlist.setColor(branch, color);
+                               // Update also the LColor table:
+                               if (color == "none") 
+                                       color = lcolor.getX11Name(LColor::background);
+                               lcolor.fill(static_cast<LColor::color>(lcolor.size()), 
+                                               branch, color);
+                       }
+               }
        } else if (token == "\\author") {
                lex.nextToken();
                istringstream ss(STRCONV(lex.getString()));
@@ -380,6 +407,17 @@ void BufferParams::writeFile(ostream & os) const
           << "\n\\use_numerical_citations " << use_numerical_citations
           << "\n\\paperorientation " << string_orientation[orientation]
           << '\n';
+
+       std::list<Branch>::const_iterator it = branchlist.begin();
+       std::list<Branch>::const_iterator end = branchlist.end();
+       for (; it != end; ++it) {
+               os << "\\branch " << it->getBranch()
+                  << "\n\\selected " << it->getSelected()      
+                  << "\n\\color " << it->getColor()    
+                  << "\n\\end_branch" 
+                  << "\n";
+       }
+
        if (!paperwidth.empty())
                os << "\\paperwidth "
                   << VSpace(paperwidth).asLyXCommand() << '\n';
index 45bc0fc1600f2e25a416b2cb1f4bb8f8c941714a..e2ab54e75ff6ded0a10056aa06dbc05f317576ca 100644 (file)
@@ -21,6 +21,7 @@
 #include "texrow.h"
 #include "author.h"
 #include "paper.h"
+#include "BranchList.h"
 
 #include "insets/insetquotes.h"
 
@@ -134,6 +135,8 @@ public:
        int tocdepth;
        ///
        Language const * language;
+       /// BranchList:
+       BranchList branchlist;
        ///
        string inputenc;
        ///
index 4474eb1a5e4958be06ddb86c4ed75dd42ac3ab2d..d89d4aa86d5bb88ba2f1f9c85e1026b509e5e73c 100644 (file)
@@ -37,6 +37,7 @@
 #include "insets/insetmarginal.h"
 #include "insets/insetminipage.h"
 #include "insets/insetnote.h"
+#include "insets/insetbranch.h"
 #include "insets/insetoptarg.h"
 #include "insets/insetref.h"
 #include "insets/insetspace.h"
@@ -77,6 +78,14 @@ InsetOld * createInset(FuncRequest const & cmd)
                                arg = "Note";
                        return new InsetNote(params, arg);
                }
+       case LFUN_INSERT_BRANCH:
+               {
+                       string arg = cmd.getArg(0);
+                       if (arg.empty())
+                               arg = "none";
+                       return new InsetBranch(params, arg);
+               }
+
        case LFUN_INSET_ERT:
                return new InsetERT(params);
 
@@ -357,6 +366,8 @@ InsetOld * readInset(LyXLex & lex, Buffer const & buf)
                } else if (tmptok == "Note"     || tmptok == "Comment"
                                || tmptok == "Greyedout") {
                        inset = new InsetNote(buf.params, tmptok);
+               } else if (tmptok == "Branch") {
+                       inset = new InsetBranch(buf.params, tmptok); 
                } else if (tmptok == "Include") {
                        InsetCommandParams p("Include");
                        inset = new InsetInclude(p, buf);
index 08157861f47e2a3089e45d3cae8fd27bbdcd4d7a..fe38f3ed82ac850e19bfbd4510d125459105e7c9 100644 (file)
@@ -1,4 +1,21 @@
 
+2003-08-16  Martin Vermeer  <martin.vermeer@hut.fi>    
+
+       * ControlBranch.[Ch]:
+       * ControlDocument.C:
+       * Makefile.am: implements the 'branch
+       inset' idea. This allows the output of various versions of a 
+       document from a single source version, selectively outputing or 
+       suppressing output of parts of the text.
+       This implementation contains a 'branch list editor' in a separate
+       tab of the document settings dialog. Branches are user definable
+       and have a "display colour" to distinguish them on-screen.
+
+       ColorHandler was somewhat cleaned up.
+       (1) make possible a dynamically growing LColor list by allowing
+       the graphic context cache to grow along (vector);
+       (2) eliminate an IMHO unnecessary step in colour allocation.
+
 2003-08-15  André Pönitz  <poenitz@gmx.net>
 
        * ControlErrorList.C:
diff --git a/src/frontends/controllers/ControlBranch.C b/src/frontends/controllers/ControlBranch.C
new file mode 100644 (file)
index 0000000..137203b
--- /dev/null
@@ -0,0 +1,44 @@
+/**
+ * \file ControlBranch.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Angus Leeming
+ * \author Martin Vermeer
+ *
+ * Full author contact details are available in file CREDITS
+ */
+
+#include <config.h>
+
+#include "ControlBranch.h"
+#include "funcrequest.h"
+#include "insets/insetbranch.h"
+#include "debug.h"
+
+ControlBranch::ControlBranch(Dialog & parent)
+       : Dialog::Controller(parent)
+{}
+
+
+bool ControlBranch::initialiseParams(string const & data)
+{
+       InsetBranchParams params;
+       InsetBranchMailer::string2params(data, params);
+       params_.reset(new InsetBranchParams(params));
+       
+       return true;
+}
+
+
+void ControlBranch::clearParams()
+{
+       params_.reset();
+}
+
+void ControlBranch::dispatchParams()
+{
+       string const lfun = InsetBranchMailer::params2string(string("branch"), params());
+       kernel().dispatch(FuncRequest(LFUN_INSET_APPLY, lfun));
+}
+
diff --git a/src/frontends/controllers/ControlBranch.h b/src/frontends/controllers/ControlBranch.h
new file mode 100644 (file)
index 0000000..1c192f4
--- /dev/null
@@ -0,0 +1,44 @@
+// -*- C++ -*-
+/**
+ * \file ControlBranch.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Angus Leeming
+ * \author Martin Vermeer
+ *
+ * Full author contact details are available in file CREDITS
+ */
+
+#ifndef CONTROLBRANCH_H
+#define CONTROLBRANCH_H
+
+
+#include "Dialog.h"
+#include "debug.h"
+
+class InsetBranchParams;
+
+class ControlBranch : public Dialog::Controller {
+public:
+       ///
+       ControlBranch(Dialog &);
+       ///
+       virtual bool initialiseParams(string const & data);
+       ///
+       virtual void clearParams();
+       ///
+       virtual void dispatchParams();
+       ///
+       virtual bool isBufferDependent() const { return true; }
+       ///
+       InsetBranchParams & params() { return *params_.get(); }
+       ///
+       InsetBranchParams const & params() const { return *params_.get(); }
+       ///
+private:
+       ///
+       boost::scoped_ptr<InsetBranchParams> params_;
+};
+
+#endif // CONTROLBRANCH_H
index 8e5ae244e17da37269cd7107a7fdc516d253016d..ca6e3afc4d3c5eacbbeef70f939f7d11f7ac90e6 100644 (file)
@@ -82,6 +82,14 @@ void ControlDocument::apply()
        buffer()->markDirty();
 
        lv_.message(_("Document settings applied"));
+
+       // Open insets of selected branches, close deselected ones
+       // Currently only top-level insets in buffer handled (bug).
+       ParIterator pit = buffer()->par_iterator_begin();
+       ParIterator pend = buffer()->par_iterator_end();
+       for (; pit != pend; ++pit) {
+               pit->insetlist.insetsOpenCloseBranch(bufferview());
+       }
 }
 
 
index c34df9e61c7c4a6ca5fa5c3d120effa7019a761c..89fea1c2d903ed4b72afe52799a11217ff352278 100644 (file)
@@ -31,6 +31,8 @@ libcontrollers_la_SOURCES= \
        ControlBibtex.h \
        ControlButtons.C \
        ControlButtons.h \
+       ControlBranch.C \
+       ControlBranch.h \
        ControlCharacter.C \
        ControlCharacter.h \
        ControlChanges.C \
index 3c42fd35d989aaf07b784e0a1eb0950cc528a32e..09591b944d476cd0c15dc1169d383cecbeba3290 100644 (file)
@@ -1,3 +1,25 @@
+2003-08-17  Martin Vermeer  <martin.vermeer@hut.fi>    
+
+       * ColorHandler.[Ch]:
+       * Dialogs.C:
+       * FormBranch.[Ch]:
+       * FormDocument.[Ch]:
+       * Makefile.am:
+       * forms/Makefile.am:
+       * forms/form_branch.fd:
+       * forms/form_document.fd: implements the
+       'branch inset' idea. This allows the output of various versions of
+       a document from a single source version, selectively outputing or
+       suppressing output of parts of the text.
+       This implementation contains a 'branch list editor' in a separate
+       tab of the document settings dialog. Branches are user definable
+       and have a "display colour" to distinguish them on-screen.
+
+       ColorHandler was somewhat cleaned up. 
+       (1) make possible a dynamically growing LColor list by allowing
+       the graphic context cache to grow along (vector); 
+       (2) eliminate an IMHO unnecessary step in colour allocation.
+
 2003-08-12  Michael Schmitt  <michael.schmitt@teststep.org>
 
        * FormMathsMatrix.C: rename "Center" to "Middle"
index 3b5ba5d3f23be6a44d7026b7a9e3661d36313ee3..4c1865b2d15bdcc95e245d21e7d41b595b0ce6ed 100644 (file)
@@ -44,6 +44,7 @@ namespace {
 
 
 LyXColorHandler::LyXColorHandler()
+               : colorGCcache(LColor::ignore + 1)
 {
        display = fl_get_display();
        drawable = XCreatePixmap(display,
@@ -52,7 +53,7 @@ LyXColorHandler::LyXColorHandler()
 
        colormap = fl_state[fl_get_vclass()].colormap;
        // Clear the GC cache
-       for (int i = 0; i <= LColor::ignore; ++i) {
+       for (int i = 0; i < colorGCcache.size(); ++i) {
                colorGCcache[i] = 0;
        }
 }
@@ -61,7 +62,7 @@ LyXColorHandler::LyXColorHandler()
 LyXColorHandler::~LyXColorHandler()
 {
        // Release all the registered GCs
-       for (int i = 0; i <= LColor::ignore; ++i) {
+       for (unsigned i = 0; i < colorGCcache.size(); ++i) {
                if (colorGCcache[i] != 0) {
                        XFreeGC(display, colorGCcache[i]);
                }
@@ -82,40 +83,28 @@ unsigned long LyXColorHandler::colorPixel(LColor::color c)
 }
 
 
-// Gets GC according to color
-// Uses caching
-GC LyXColorHandler::getGCForeground(LColor::color c)
+GC LyXColorHandler::getGCForeground(string const & s)
 {
-       if (colorGCcache[c] != 0)
-               return colorGCcache[c];
-
        XColor xcol;
        XColor ccol;
-       string const s = lcolor.getX11Name(c);
        XGCValues val;
-
        // Look up the RGB values for the color, and an approximate
        // color that we can hope to get on this display.
        if (XLookupColor(display, colormap, s.c_str(), &xcol, &ccol) == 0) {
                lyxerr << bformat(
-                       _("LyX: Unknown X11 color %1$s for %2$s\n"
+                       _("LyX: Unknown X11 color %1$s\n"
                          "     Using black instead, sorry!"),
-                       s, lcolor.getGUIName(c)) << endl;
+                       s) << endl;
                unsigned long bla = BlackPixel(display,
                                               DefaultScreen(display));
                val.foreground = bla;
        // Try the exact RGB values first, then the approximate.
        } else if (XAllocColor(display, colormap, &xcol) != 0) {
                if (lyxerr.debugging(Debug::GUI)) {
-                       lyxerr << bformat(_("LyX: X11 color %1$s allocated for %2$s"),
-                               s, lcolor.getGUIName(c)) << endl;
+                       lyxerr << bformat(_("LyX: X11 color %1$s allocated"),
+                               s) << endl;
                }
                val.foreground = xcol.pixel;
-       } else if (XAllocColor(display, colormap, &ccol)) {
-               lyxerr << bformat(
-                       _("LyX: Using approximated X11 color %1$s allocated for %2$s"),
-                       s, lcolor.getGUIName(c)) << endl;
-               val.foreground = xcol.pixel;
        } else {
                // Here we are traversing the current colormap to find
                // the color closest to the one we want.
@@ -155,8 +144,8 @@ GC LyXColorHandler::getGCForeground(LColor::color c)
                }
 
                lyxerr << bformat(
-                       _("LyX: Couldn't allocate '%1$s' for %2$s with (r,g,b)=%3$s.\n"),
-                       s, lcolor.getGUIName(c), tostr(xcol));
+                       _("LyX: Couldn't allocate '%1$s' with (r,g,b)=%3$s.\n"),
+                       s, tostr(xcol));
 
                lyxerr << bformat(
                                _("     Using closest allocated color with (r,g,b)=%1$s instead.\n"
@@ -165,11 +154,34 @@ GC LyXColorHandler::getGCForeground(LColor::color c)
 
                val.foreground = cmap[closest_pixel].pixel;
        }
-
        val.function = GXcopy;
-       return colorGCcache[c] = XCreateGC(display, drawable,
+       return XCreateGC(display, drawable,
                                           GCForeground | GCFunction, &val);
 }
+               
+// Gets GC according to color
+// Uses caching
+GC LyXColorHandler::getGCForeground(LColor::color c)
+{
+       if (static_cast<unsigned>(c) >= colorGCcache.size()) {
+               colorGCcache.resize(c + 1, 0);
+       }
+
+       if (colorGCcache[c] != 0) {
+               return colorGCcache[c];
+       }
+       XColor xcol;
+       XColor ccol;
+       string const s = lcolor.getX11Name(c);
+       // Look up the RGB values for the color, and an approximate
+       // color that we can hope to get on this display.
+       if (XLookupColor(display, colormap, s.c_str(), &xcol, &ccol) == 0) {
+               lyxerr << bformat(
+                       _("LyX: Unknown X11 color %1$s for %2$s\n"),
+                       s, lcolor.getGUIName(c)) << endl;
+       }
+       return colorGCcache[c] = getGCForeground(s);
+}
 
 
 // Gets GC for line
index a402f22f3e0853b62ff5c7a345699be9a4120a5a..7f6ccf2e53681963328fca882f9b37780055ae23 100644 (file)
@@ -16,6 +16,7 @@
 #include "frontends/Painter.h"
 
 #include <map>
+#include <vector>
 #include <boost/scoped_ptr.hpp>
 
 // This is only included to provide stuff for the non-public sections
@@ -48,8 +49,10 @@ private:
        Display * display;
        ///
        Colormap colormap;
+       /// 
+       std::vector<GC> colorGCcache;
        ///
-       GC colorGCcache[LColor::ignore + 1];
+       GC getGCForeground(string const & s);
        ///
        typedef std::map<int, GC> LineGCCache;
        ///
index 0e9ee0c52f1efa0513852d9058dc1f9966929895..4193ab234bb935bf20064593fd8b11ed46581625 100644 (file)
@@ -17,6 +17,7 @@
 
 #include "ControlAboutlyx.h"
 #include "ControlBibtex.h"
+#include "ControlBranch.h"
 #include "ControlChanges.h"
 #include "ControlCharacter.h"
 #include "ControlCitation.h"
@@ -44,6 +45,7 @@
 #include "FormAboutlyx.h"
 #include "FormBibitem.h"
 #include "FormBibtex.h"
+#include "FormBranch.h"
 #include "FormChanges.h"
 #include "FormCharacter.h"
 #include "FormCitation.h"
@@ -110,7 +112,7 @@ FormMathsBitmap * createFormBitmap(Dialog & parent, string const & title,
 }
 
 
-char const * const dialognames[] = { "aboutlyx", "bibitem", "bibtex", "changes",
+char const * const dialognames[] = { "aboutlyx", "bibitem", "bibtex", "branch", "changes",
 "character", "citation", "error", "errorlist" , "ert", "external", "file",
 "float", "graphics", "include", "index", "label", "latexlog", "mathpanel",
 "mathaccents", "matharrows", "mathoperators", "mathrelations", "mathgreek",
@@ -411,6 +413,10 @@ Dialog * Dialogs::build(string const & name)
                dialog->setController(new ControlNote(*dialog));
                dialog->setView(new FormNote(*dialog));
                dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
+       } else if (name == "branch") {
+               dialog->setController(new ControlBranch(*dialog));
+               dialog->setView(new FormBranch(*dialog));
+               dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
        } else if (name == "paragraph") {
                dialog->setController(new ControlParagraph(*dialog));
                dialog->setView(new FormParagraph(*dialog));
diff --git a/src/frontends/xforms/FormBranch.C b/src/frontends/xforms/FormBranch.C
new file mode 100644 (file)
index 0000000..3ef6f98
--- /dev/null
@@ -0,0 +1,63 @@
+/**
+ * \file FormBranch.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Martin Vermeer
+ *
+ * Full author contact details are available in file CREDITS
+ */
+
+
+#include <config.h>
+
+#include "xformsBC.h"
+#include "ControlBranch.h"
+#include "FormBranch.h"
+#include "forms/form_branch.h"
+#include "xforms_helpers.h" // formatted
+#include "lyx_forms.h"
+#include "insets/insetbranch.h"
+#include "debug.h"
+
+typedef FormController<ControlBranch, FormView<FD_branch> > base_class;
+
+FormBranch::FormBranch(Dialog & parent)
+       : base_class(parent, _("Branch"))
+{}
+
+
+void FormBranch::build()
+{
+       string all_branches(controller().params().branchlist.allBranches());
+
+       dialog_.reset(build_branch(this));
+
+       fl_addto_choice(dialog_->choice_branch, all_branches.c_str());
+       
+       bcview().setOK(dialog_->button_ok);
+       bcview().setApply(dialog_->button_apply);
+       bcview().setCancel(dialog_->button_cancel);
+}
+
+
+void FormBranch::update()
+{
+       // Make changes in all_branches propagate within session:
+       string all_branches(controller().params().branchlist.allBranches());
+       fl_clear_choice(dialog_->choice_branch);
+       fl_addto_choice(dialog_->choice_branch, all_branches.c_str());
+
+       string branch(controller().params().branch);
+       if (all_branches.find(branch) != string::npos && branch != "none")
+               fl_set_choice_text(dialog_->choice_branch, branch.c_str());
+}
+
+
+void FormBranch::apply()
+{
+       string const type = fl_get_choice_text(dialog_->choice_branch);
+
+       controller().params().branch = type;
+}
+
diff --git a/src/frontends/xforms/FormBranch.h b/src/frontends/xforms/FormBranch.h
new file mode 100644 (file)
index 0000000..c1aea79
--- /dev/null
@@ -0,0 +1,37 @@
+// -*- C++ -*-
+/**
+ * \file FormBranch.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Martin Vermeer
+ *
+ * Full author contact details are available in file CREDITS
+ */
+
+#ifndef FORMBRANCH_H
+#define FORMBRANCH_H
+
+
+#include "FormDialogView.h"
+
+
+class ControlBranch;
+struct FD_branch;
+
+/** This class provides an XForms implementation of the Branch Dialog.
+ */
+class FormBranch : public FormController<ControlBranch, FormView<FD_branch> > {
+public:
+       /// Constructor
+       FormBranch(Dialog &);
+private:
+       /// 
+       virtual void apply();
+       /// Build the dialog
+       virtual void build();
+       /// Update dialog before showing it
+       virtual void update();
+};
+
+#endif // FORMBRANCH_H
index 5d0cf46793c7b1895ceb89febf9e9c5d82b565c2..1f3d0a4fb3bc3b7f4051541aacf2f7a825095564 100644 (file)
@@ -5,6 +5,8 @@
  *
  * \author Jürgen Vigna
  * \author Rob Lahaye
+ * \author Martin Vermeer
+ * \author Juergen Spitzmueller
  *
  * Full author contact details are available in file CREDITS
  */
 #include "xformsBC.h"
 #include "ButtonController.h"
 
+#include "FormColorpicker.h"
+#include "LColor.h"
+#include "Lsstream.h"
 #include "bmtable.h"
 #include "checkedwidgets.h"
+#include "Tooltips.h"
 #include "input_validators.h" // fl_unsigned_float_filter
 #include "xforms_helpers.h"
 
+#include "bufferparams.h"
 #include "CutAndPaste.h"
 #include "debug.h"
 #include "language.h"
 #include "lyxrc.h"
 #include "lyxtextclasslist.h"
 #include "tex-strings.h"
+#include "ColorHandler.h"
 
 #include "controllers/frnt_lang.h"
 #include "controllers/helper_funcs.h"
 #include <boost/bind.hpp>
 
 #include <functional>
+#include <iomanip>
 
 using namespace lyx::support;
 
 using std::bind2nd;
 using std::vector;
 using std::endl;
+using std::setw;
+using std::setfill;
 
 
 namespace {
@@ -59,6 +70,7 @@ bool const scalableTabfolders = false;
 bool const scalableTabfolders = true;
 #endif
 
+
 } // namespace anon
 
 
@@ -343,6 +355,46 @@ void FormDocument::build()
        fl_set_bmtable_pixmap_file(bullets_->bmtable_panel, 6, 6,
                                   bmtablefile.c_str());
 
+       picker_.reset(new FormColorpicker);
+       
+       // the document branches form
+       branch_.reset(build_document_branch(this));
+
+       fl_set_object_color(branch_->button_color,
+               GUI_COLOR_CHOICE, GUI_COLOR_CHOICE);
+       
+       bcview().addReadOnly(branch_->input_all_branches);
+       bcview().addReadOnly(branch_->button_add_branch);
+       bcview().addReadOnly(branch_->button_remove_branch);
+       bcview().addReadOnly(branch_->button_select);
+       bcview().addReadOnly(branch_->button_deselect);
+       bcview().addReadOnly(branch_->button_modify);
+       bcview().addReadOnly(branch_->browser_all_branches);
+
+       // set up the tooltips for branches form
+       string str = _("Enter the name of a new branch.");
+       tooltips().init(branch_->input_all_branches, str);
+       str = _("Add a new branch to the document.");
+       tooltips().init(branch_->button_add_branch, str);
+       str = _("Remove the selected branch from the document.");
+       tooltips().init(branch_->button_remove_branch, str);
+       str = _("Activate the selected branch for output.");
+       tooltips().init(branch_->button_select, str);
+       str = _("Deactivate the selected activated branch.");
+       tooltips().init(branch_->button_deselect, str);
+       str = _("Available branches for this document.");
+       tooltips().init(branch_->browser_all_branches, str);
+       str = _("Activated branches. Content will occur in the document\'s output");
+       tooltips().init(branch_->browser_selection, str);
+       str = _("Modify background color of branch inset");
+       tooltips().init(branch_->button_modify, str);
+       str = _("Background color of branch inset");
+       tooltips().init(branch_->button_color, str);
+
+       // Handle middle mouse paint:
+       setPrehandler(branch_->input_all_branches);
+       fl_set_input_return(branch_->input_all_branches, FL_RETURN_CHANGED);
+
        // Enable the tabfolder to be rescaled correctly.
        if (scalableTabfolders)
                fl_set_tabfolder_autofit(dialog_->tabfolder, FL_FIT);
@@ -366,6 +418,9 @@ void FormDocument::build()
                fl_deactivate_object(fbullet);
                fl_set_object_lcol(fbullet, FL_INACTIVE);
        }
+
+       fl_addto_tabfolder(dialog_->tabfolder,_("Branches").c_str(),
+                                    branch_->form);
 }
 
 
@@ -378,6 +433,7 @@ void FormDocument::apply()
        language_apply(params);
        options_apply(params);
        bullets_apply(params);
+       branch_apply(params);
 }
 
 
@@ -395,6 +451,7 @@ void FormDocument::update()
        language_update(params);
        options_update(params);
        bullets_update(params);
+       branch_update(params);
 }
 
 
@@ -456,6 +513,15 @@ ButtonPolicy::SMInput FormDocument::input(FL_OBJECT * ob, long)
                setEnabled(options_->choice_citation_format,
                           fl_get_button(options_->check_use_natbib));
 
+       } else if (ob == branch_->browser_all_branches ||
+                       ob == branch_->browser_selection ||
+                       ob == branch_->button_add_branch ||
+                       ob == branch_->button_remove_branch ||
+                       ob == branch_->button_modify ||
+                       ob == branch_->button_select ||
+                       ob == branch_->button_deselect ||
+                       ob == branch_->button_deselect) {
+               branch_input(ob);
        } else if (ob == dialog_->button_save_defaults) {
                apply();
                controller().saveAsDefault();
@@ -606,6 +672,139 @@ ButtonPolicy::SMInput FormDocument::input(FL_OBJECT * ob, long)
 }
 
 
+void FormDocument::branch_input(FL_OBJECT * ob)
+{
+       BufferParams & params = controller().params();
+       std::vector<string> vec;
+
+       if (ob == branch_->button_add_branch) {
+               string new_branch = fl_get_input(branch_->input_all_branches);
+               if (!new_branch.empty()) {
+                       params.branchlist.add(new_branch);
+                       fl_set_input(branch_->input_all_branches, "");
+                       // Update branch list
+                       string const all_branches = params.branchlist.allBranches();
+                       fl_clear_browser(branch_->browser_all_branches);
+                       vec = getVectorFromString(all_branches, "|");
+                       for (unsigned i = 0; i < vec.size(); ++i) {
+                               fl_addto_browser(branch_->browser_all_branches,
+                                                               vec[i].c_str());
+                       }
+                       LColor::color c = static_cast<LColor::color>(lcolor.size());
+                       lcolor.fill(c, new_branch, lcolor.getX11Name(LColor::background));
+               }
+
+       } else if (ob == branch_->button_remove_branch) {
+               unsigned i = fl_get_browser(branch_->browser_all_branches);
+               string const current_branch =
+                       fl_get_browser_line(branch_->browser_all_branches, i);
+               if (!current_branch.empty()) {
+                       params.branchlist.remove(current_branch);
+                       // Update branch list
+                       string const all_branches = params.branchlist.allBranches();
+                       fl_clear_browser(branch_->browser_all_branches);
+                       vec = getVectorFromString(all_branches, "|");
+                       for (unsigned i = 0; i < vec.size(); ++i) {
+                               fl_addto_browser(branch_->browser_all_branches,
+                                                               vec[i].c_str());
+                       }
+                       // Update selected-list...
+                       string const all_selected = params.branchlist.allSelected();
+                       fl_clear_browser(branch_->browser_selection);
+                       vec = getVectorFromString(all_selected, "|");
+                       for (unsigned i = 0; i < vec.size(); ++i) {
+                               fl_addto_browser(branch_->browser_selection, vec[i].c_str());
+                       }
+               }
+       } else if (ob == branch_->button_select) {
+               unsigned i = fl_get_browser(branch_->browser_all_branches);
+               string const current_branch =
+                       fl_get_browser_line(branch_->browser_all_branches, i);
+               if (!current_branch.empty()) {
+                       fl_clear_browser(branch_->browser_selection);
+                       params.branchlist.setSelected(current_branch, true);
+                       string const all_selected = params.branchlist.allSelected();
+                       vec = getVectorFromString(all_selected, "|");
+                       for (unsigned i = 0; i < vec.size(); ++i) {
+                               fl_addto_browser(branch_->browser_selection,
+                                                       vec[i].c_str());
+                       }
+               }
+       } else if (ob == branch_->button_deselect) {
+               unsigned i = fl_get_browser(branch_->browser_selection);
+               string const current_sel =
+                       fl_get_browser_line(branch_->browser_selection, i);
+               if (!current_sel.empty()) {
+                       fl_clear_browser(branch_->browser_selection);
+                       params.branchlist.setSelected(current_sel, false);
+                       string const all_selected = params.branchlist.allSelected();
+                       vec = getVectorFromString(all_selected, "|");
+                       for (unsigned i = 0; i < vec.size(); ++i) {
+                               fl_addto_browser(branch_->browser_selection,
+                                                       vec[i].c_str());
+                       }
+               }
+       } else if (ob == branch_->button_modify) {
+               unsigned i = fl_get_browser(branch_->browser_all_branches);
+               string const current_branch =
+                       fl_get_browser_line(branch_->browser_all_branches, i);
+               
+               RGBColor before;
+               string x11hexname = params.branchlist.getColor(current_branch);
+               if (x11hexname[0] == '#') {
+                       before = RGBColor(x11hexname);
+               } else{
+                       fl_getmcolor(FL_COL1, &before.r, &before.g, &before.b);
+               }
+
+               RGBColor col = picker_->requestColor(before);
+               if (before != col) {
+                       fl_mapcolor(GUI_COLOR_CHOICE, col.r, col.g, col.b);
+                       fl_redraw_object(branch_->button_color);
+                       // Figure out here how to stash the new colour into the
+                       // LyX colour database.
+
+                       x11hexname = X11hexname(col);
+
+                       // current_branch already in database
+                       LColor::color c = lcolor.getFromLyXName(current_branch);
+                       lcolor.setColor(current_branch, x11hexname);
+                       // Make sure that new colour is also displayed ;-)
+                       lyxColorHandler->getGCForeground(c);
+                       lyxColorHandler->updateColor(c);
+                       // what about system_lcolor?
+                       // Here set colour in BranchList:
+                       params.branchlist.setColor(current_branch, x11hexname);
+               }
+       } else if (ob == branch_->browser_all_branches) {
+               unsigned i = fl_get_browser(branch_->browser_all_branches);
+               string const current_branch =
+                       fl_get_browser_line(branch_->browser_all_branches, i);
+               // make button_color track selected branch:
+
+               RGBColor rgb;
+               string x11hexname = params.branchlist.getColor(current_branch);
+               if (x11hexname[0] == '#') {
+                       rgb = RGBColor(x11hexname);
+               } else {
+                       fl_getmcolor(FL_COL1, &rgb.r, &rgb.g, &rgb.b);
+               }
+               fl_mapcolor(GUI_COLOR_CHOICE, rgb.r, rgb.g, rgb.b);
+               fl_redraw_object(branch_->button_color);
+       }
+       setEnabled(branch_->button_select,
+               (fl_get_browser(branch_->browser_all_branches) > 0));
+       setEnabled(branch_->button_deselect,
+               (fl_get_browser(branch_->browser_selection) > 0));
+       setEnabled(branch_->button_remove_branch,
+               (fl_get_browser(branch_->browser_all_branches) > 0));
+       setEnabled(branch_->button_modify,
+               (fl_get_browser(branch_->browser_all_branches) > 0));
+
+       branchlist_ = params.branchlist;
+}
+
+
 bool FormDocument::class_apply(BufferParams &params)
 {
        bool redo = false;
@@ -830,6 +1029,16 @@ void FormDocument::bullets_apply(BufferParams & params)
 }
 
 
+void FormDocument::branch_apply(BufferParams & params)
+{
+       BufferParams & prms = controller().params();
+       if (branchlist_.empty())
+               branchlist_ = prms.branchlist;
+       params.branchlist = branchlist_;
+       branchlist_.clear();
+}
+
+               
 void FormDocument::UpdateClassParams(BufferParams const & params)
 {
        // These are the params that have to be updated on any class change
@@ -1094,6 +1303,56 @@ void FormDocument::bullets_update(BufferParams const & params)
 }
 
 
+void FormDocument::branch_update(BufferParams const & params)
+{
+       if (!branch_.get())
+               return;
+       
+       string const all_branches = params.branchlist.allBranches();
+       fl_clear_browser(branch_->browser_all_branches);
+       string current_branch("none");
+       
+       if (!all_branches.empty()) {
+               std::vector<string> vec = getVectorFromString(all_branches, "|");
+               for (unsigned i = 0; i < vec.size(); ++i) {
+                       fl_addto_browser(branch_->browser_all_branches, vec[i].c_str());
+               }
+               fl_select_browser_line(branch_->browser_all_branches, 1);
+               current_branch =
+                       fl_get_browser_line(branch_->browser_all_branches, 1);
+       }
+
+       // display proper selection...
+       string const all_selected = params.branchlist.allSelected();
+       fl_clear_browser(branch_->browser_selection);
+       if (!all_selected.empty()) {
+               std::vector<string> vec = getVectorFromString(all_selected, "|");
+               for (unsigned i = 0; i < vec.size(); ++i) {
+                       fl_addto_browser(branch_->browser_selection, vec[i].c_str());
+                       }
+       }
+       // display proper colour...
+       RGBColor rgb;
+       string x11hexname = params.branchlist.getColor(current_branch);
+       if (x11hexname[0] == '#') {
+               rgb = RGBColor(x11hexname);
+       } else {
+               fl_getmcolor(FL_COL1, &rgb.r, &rgb.g, &rgb.b);
+       }
+       fl_mapcolor(GUI_COLOR_CHOICE, rgb.r, rgb.g, rgb.b);
+       fl_redraw_object(branch_->button_color);
+
+       setEnabled(branch_->button_select,
+               (fl_get_browser(branch_->browser_all_branches) > 0));
+       setEnabled(branch_->button_deselect,
+               (fl_get_browser(branch_->browser_selection) > 0));
+       setEnabled(branch_->button_remove_branch,
+               (fl_get_browser(branch_->browser_all_branches) > 0));
+       setEnabled(branch_->button_modify,
+               (fl_get_browser(branch_->browser_all_branches) > 0));
+}
+
+
 void FormDocument::checkReadOnly()
 {
        if (bc().readOnly(controller().bufferIsReadonly())) {
index 41d5686e2435145f1aa2b37181e4582279c14d2c..370b6cb328b4d0896390d748b16a15e25e812db4 100644 (file)
 
 #include <boost/scoped_ptr.hpp>
 
+#include "lyx_forms.h"
 #include <vector>
 
 class ControlDocument;
 
 class BufferParams;
 
+class FormColorpicker;
+
 struct FD_document;
 struct FD_document_paper;
 struct FD_document_class;
 struct FD_document_language;
 struct FD_document_options;
 struct FD_document_bullet;
+struct FD_document_branch;
+
+namespace {
+
+enum GuiColors {
+       GUI_COLOR_CHOICE   = FL_FREE_COL15
+};
+
+               
+}
+
 
 /** This class provides an XForms implementation of the FormDocument dialog.
  *  The table-layout-form here changes values for latex-tabulars
@@ -49,6 +63,8 @@ private:
        /// Apply from dialog
        virtual void apply();
 
+       ///
+       void branch_input(FL_OBJECT *);
        ///
        void ChoiceBulletSize(FL_OBJECT * ob, long);
        ///
@@ -78,6 +94,8 @@ private:
        void options_update(BufferParams const &);
        ///
        void bullets_update(BufferParams const &);
+       ///
+       void branch_update(BufferParams const &);
 
        ///
        void paper_apply(BufferParams &);
@@ -89,6 +107,8 @@ private:
        bool options_apply(BufferParams &);
        ///
        void bullets_apply(BufferParams &);
+       ///
+       void branch_apply(BufferParams &);
 
        /// Real GUI implementation.
        boost::scoped_ptr<FD_document_paper>    paper_;
@@ -101,6 +121,10 @@ private:
        ///
        boost::scoped_ptr<FD_document_bullet>   bullets_;
        ///
+       boost::scoped_ptr<FD_document_branch>   branch_;
+       ///
+       boost::scoped_ptr<FormColorpicker> picker_;     
+       ///
        int ActCell;
        ///
        int Confirmed;
@@ -112,6 +136,8 @@ private:
        FL_OBJECT * fbullet;
        ///
        std::vector<string> lang_;
+       /// Contains all legal branches for this doc
+       BranchList branchlist_;
 };
 
 #endif
index b23269f6b8f6697d213afd40bdca14b326c02d66..c6dafe8f1b46ddd5b2e09c7885b6712e2a09cdb3 100644 (file)
@@ -74,6 +74,8 @@ libxforms_la_SOURCES = \
        FormBibtex.h \
        FormBrowser.C \
        FormBrowser.h \
+       FormBranch.C \
+       FormBranch.h \
        FormChanges.C \
        FormChanges.h \
        FormCharacter.C \
index cfffa65b98bcfdf3e04f41b5a79b7d1bb09d0f4f..1d3ea7aab6b52a1bfba2fef6d5581b5da95ef807 100644 (file)
@@ -13,6 +13,7 @@ SRCS =  form_aboutlyx.fd \
        form_bibitem.fd \
        form_bibtex.fd \
        form_browser.fd \
+       form_branch.fd \
        form_changes.fd \
        form_character.fd \
        form_citation.fd \
diff --git a/src/frontends/xforms/forms/form_branch.fd b/src/frontends/xforms/forms/form_branch.fd
new file mode 100644 (file)
index 0000000..02bc2a5
--- /dev/null
@@ -0,0 +1,107 @@
+Magic: 13000
+
+Internal Form Definition File
+    (do not change)
+
+Number of forms: 1
+Unit of measure: FL_COORD_PIXEL
+SnapGrid: 7
+
+=============== FORM ===============
+Name: form_branch
+Width: 407
+Height: 113
+Number of Objects: 5
+
+--------------------
+class: FL_BOX
+type: UP_BOX
+box: 0 0 407 113
+boxtype: FL_UP_BOX
+colors: FL_COL1 FL_COL1
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: 
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: 
+callback: 
+argument: 
+
+--------------------
+class: FL_CHOICE
+type: NORMAL_CHOICE
+box: 154 21 217 28
+boxtype: FL_FRAME_BOX
+colors: FL_COL1 FL_BLACK
+alignment: FL_ALIGN_LEFT
+style: FL_NORMAL_STYLE
+size: FL_NORMAL_SIZE
+lcol: FL_BLACK
+label: Branch:|#B
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: choice_branch
+callback: C_FormDialogView_InputCB
+argument: 0
+
+--------------------
+class: FL_BUTTON
+type: RETURN_BUTTON
+box: 49 70 84 28
+boxtype: FL_UP_BOX
+colors: FL_COL1 FL_COL1
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_NORMAL_SIZE
+lcol: FL_BLACK
+label: OK
+shortcut: ^M
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: button_ok
+callback: C_FormDialogView_OKCB
+argument: 0
+
+--------------------
+class: FL_BUTTON
+type: RETURN_BUTTON
+box: 154 70 98 28
+boxtype: FL_UP_BOX
+colors: FL_COL1 FL_COL1
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_NORMAL_SIZE
+lcol: FL_BLACK
+label: Apply|#A
+shortcut: ^M
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: button_apply
+callback: C_FormDialogView_ApplyCB
+argument: 0
+
+--------------------
+class: FL_BUTTON
+type: RETURN_BUTTON
+box: 266 70 105 28
+boxtype: FL_UP_BOX
+colors: FL_COL1 FL_COL1
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_NORMAL_SIZE
+lcol: FL_BLACK
+label: Cancel|^[
+shortcut: ^M
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: button_cancel
+callback: C_FormDialogView_CancelCB
+argument: 0
+
+==============================
+create_the_forms
index 2c38baaed563069a171bf0da973cac43b9636a79..25a8c36cfc5e095150a1d6ff67cc3f916b92762f 100644 (file)
@@ -3,7 +3,7 @@ Magic: 13000
 Internal Form Definition File
     (do not change)
 
-Number of forms: 6
+Number of forms: 7
 Unit of measure: FL_COORD_PIXEL
 SnapGrid: 5
 
@@ -178,13 +178,13 @@ argument: 0
 =============== FORM ===============
 Name: form_document_paper
 Width: 395
-Height: 310
+Height: 320
 Number of Objects: 29
 
 --------------------
 class: FL_BOX
 type: FLAT_BOX
-box: 0 0 395 310
+box: 0 0 395 320
 boxtype: FL_FLAT_BOX
 colors: FL_COL1 FL_COL1
 alignment: FL_ALIGN_CENTER
@@ -247,7 +247,7 @@ size: FL_NORMAL_SIZE
 lcol: FL_BLACK
 label: Width:|#W
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: input_custom_width
 callback: C_FormBaseInputCB
@@ -265,7 +265,7 @@ size: FL_DEFAULT_SIZE
 lcol: FL_BLACK
 label: 
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: choice_custom_width_units
 callback: C_FormBaseInputCB
@@ -283,7 +283,7 @@ size: FL_NORMAL_SIZE
 lcol: FL_BLACK
 label: Height:|#H
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: input_custom_height
 callback: C_FormBaseInputCB
@@ -301,7 +301,7 @@ size: FL_DEFAULT_SIZE
 lcol: FL_BLACK
 label: 
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: choice_custom_height_units
 callback: C_FormBaseInputCB
@@ -328,7 +328,7 @@ argument:
 --------------------
 class: FL_BEGIN_GROUP
 type: 0
-box: 0 10 10 0
+box: 0 0 0
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_MCOL
 alignment: FL_ALIGN_CENTER
@@ -400,7 +400,7 @@ argument:
 --------------------
 class: FL_LABELFRAME
 type: ENGRAVED_FRAME
-box: 5 130 385 175
+box: 5 130 385 185
 boxtype: FL_NO_BOX
 colors: FL_BLACK FL_COL1
 alignment: FL_ALIGN_TOP_LEFT
@@ -463,7 +463,7 @@ size: FL_NORMAL_SIZE
 lcol: FL_BLACK
 label: Top:|#T
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: input_top_margin
 callback: C_FormBaseInputCB
@@ -481,7 +481,7 @@ size: FL_DEFAULT_SIZE
 lcol: FL_BLACK
 label: 
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: choice_top_margin_units
 callback: C_FormBaseInputCB
@@ -499,7 +499,7 @@ size: FL_NORMAL_SIZE
 lcol: FL_BLACK
 label: Bottom:|#B
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: input_bottom_margin
 callback: C_FormBaseInputCB
@@ -517,7 +517,7 @@ size: FL_DEFAULT_SIZE
 lcol: FL_BLACK
 label: 
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: choice_bottom_margin_units
 callback: C_FormBaseInputCB
@@ -526,7 +526,7 @@ argument: 0
 --------------------
 class: FL_INPUT
 type: NORMAL_INPUT
-box: 75 240 50 25
+box: 75 250 50 25
 boxtype: FL_DOWN_BOX
 colors: FL_COL1 FL_MCOL
 alignment: FL_ALIGN_LEFT
@@ -535,7 +535,7 @@ size: FL_NORMAL_SIZE
 lcol: FL_BLACK
 label: Inner:|#I
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: input_inner_margin
 callback: C_FormBaseInputCB
@@ -544,7 +544,7 @@ argument: 0
 --------------------
 class: FL_CHOICE
 type: NORMAL_CHOICE
-box: 125 240 50 25
+box: 125 250 50 25
 boxtype: FL_FRAME_BOX
 colors: FL_COL1 FL_BLACK
 alignment: FL_ALIGN_LEFT
@@ -553,7 +553,7 @@ size: FL_DEFAULT_SIZE
 lcol: FL_BLACK
 label: 
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: choice_inner_margin_units
 callback: C_FormBaseInputCB
@@ -562,7 +562,7 @@ argument: 0
 --------------------
 class: FL_INPUT
 type: NORMAL_INPUT
-box: 75 270 50 25
+box: 75 280 50 25
 boxtype: FL_DOWN_BOX
 colors: FL_COL1 FL_MCOL
 alignment: FL_ALIGN_LEFT
@@ -571,7 +571,7 @@ size: FL_NORMAL_SIZE
 lcol: FL_BLACK
 label: Outer:|#u
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: input_outer_margin
 callback: C_FormBaseInputCB
@@ -580,7 +580,7 @@ argument: 0
 --------------------
 class: FL_CHOICE
 type: NORMAL_CHOICE
-box: 125 270 50 25
+box: 125 280 50 25
 boxtype: FL_FRAME_BOX
 colors: FL_COL1 FL_BLACK
 alignment: FL_ALIGN_LEFT
@@ -589,7 +589,7 @@ size: FL_DEFAULT_SIZE
 lcol: FL_BLACK
 label: 
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: choice_outer_margin_units
 callback: C_FormBaseInputCB
@@ -607,7 +607,7 @@ size: FL_NORMAL_SIZE
 lcol: FL_BLACK
 label: Headheight:|#H
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: input_head_height
 callback: C_FormBaseInputCB
@@ -625,7 +625,7 @@ size: FL_DEFAULT_SIZE
 lcol: FL_BLACK
 label: 
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: choice_head_height_units
 callback: C_FormBaseInputCB
@@ -643,7 +643,7 @@ size: FL_NORMAL_SIZE
 lcol: FL_BLACK
 label: Headsep:|#d
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: input_head_sep
 callback: C_FormBaseInputCB
@@ -661,7 +661,7 @@ size: FL_DEFAULT_SIZE
 lcol: FL_BLACK
 label: 
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: choice_head_sep_units
 callback: C_FormBaseInputCB
@@ -679,7 +679,7 @@ size: FL_NORMAL_SIZE
 lcol: FL_BLACK
 label: Footskip:|#F
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: input_foot_skip
 callback: C_FormBaseInputCB
@@ -697,7 +697,7 @@ size: FL_DEFAULT_SIZE
 lcol: FL_BLACK
 label: 
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: choice_foot_skip_units
 callback: C_FormBaseInputCB
@@ -865,7 +865,7 @@ size: FL_NORMAL_SIZE
 lcol: FL_BLACK
 label: Spacing:|#g
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: choice_spacing
 callback: C_FormBaseInputCB
@@ -883,7 +883,7 @@ size: FL_NORMAL_SIZE
 lcol: FL_BLACK
 label: Extra Options:|#X
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: input_extra
 callback: C_FormBaseInputCB
@@ -901,7 +901,7 @@ size: FL_NORMAL_SIZE
 lcol: FL_BLACK
 label: 
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: input_skip
 callback: C_FormBaseInputCB
@@ -919,7 +919,7 @@ size: FL_NORMAL_SIZE
 lcol: FL_BLACK
 label: Default Skip:|#u
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: choice_skip
 callback: C_FormBaseInputCB
@@ -928,7 +928,7 @@ argument: 0
 --------------------
 class: FL_BEGIN_GROUP
 type: 0
-box: 0 10 10 0
+box: 0 0 0
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_MCOL
 alignment: FL_ALIGN_CENTER
@@ -1000,7 +1000,7 @@ argument:
 --------------------
 class: FL_BEGIN_GROUP
 type: 0
-box: 0 10 10 0
+box: 0 0 0
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_MCOL
 alignment: FL_ALIGN_CENTER
@@ -1072,7 +1072,7 @@ argument:
 --------------------
 class: FL_BEGIN_GROUP
 type: 0
-box: 0 10 10 0
+box: 0 0 0
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_MCOL
 alignment: FL_ALIGN_CENTER
@@ -1154,7 +1154,7 @@ size: FL_NORMAL_SIZE
 lcol: FL_BLACK
 label: 
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: input_spacing
 callback: C_FormBaseInputCB
@@ -1172,7 +1172,7 @@ size: FL_DEFAULT_SIZE
 lcol: FL_BLACK
 label: 
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: choice_skip_units
 callback: C_FormBaseInputCB
@@ -1259,7 +1259,7 @@ argument: 0
 --------------------
 class: FL_BEGIN_GROUP
 type: 0
-box: 0 10 10 0
+box: 0 0 0
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_MCOL
 alignment: FL_ALIGN_CENTER
@@ -1349,13 +1349,13 @@ argument: 0
 =============== FORM ===============
 Name: form_document_options
 Width: 395
-Height: 310
+Height: 325
 Number of Objects: 8
 
 --------------------
 class: FL_BOX
 type: FLAT_BOX
-box: 0 0 395 310
+box: 0 0 395 325
 boxtype: FL_FLAT_BOX
 colors: FL_COL1 FL_COL1
 alignment: FL_ALIGN_CENTER
@@ -1373,7 +1373,7 @@ argument:
 --------------------
 class: FL_INPUT
 type: NORMAL_INPUT
-box: 185 20 120 25
+box: 185 15 120 25
 boxtype: FL_DOWN_BOX
 colors: FL_COL1 FL_MCOL
 alignment: FL_ALIGN_LEFT
@@ -1382,7 +1382,7 @@ size: FL_NORMAL_SIZE
 lcol: FL_BLACK
 label: Float Placement:|#L
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: input_float_placement
 callback: C_FormBaseInputCB
@@ -1391,7 +1391,7 @@ argument: 0
 --------------------
 class: FL_COUNTER
 type: SIMPLE_COUNTER
-box: 185 60 80 25
+box: 185 55 80 25
 boxtype: FL_UP_BOX
 colors: FL_COL1 FL_BLUE
 alignment: FL_ALIGN_LEFT
@@ -1413,7 +1413,7 @@ argument: 0
 --------------------
 class: FL_COUNTER
 type: SIMPLE_COUNTER
-box: 185 100 80 25
+box: 185 90 80 25
 boxtype: FL_UP_BOX
 colors: FL_COL1 FL_BLUE
 alignment: FL_ALIGN_LEFT
@@ -1435,7 +1435,7 @@ argument: 0
 --------------------
 class: FL_CHOICE
 type: NORMAL_CHOICE
-box: 185 140 140 25
+box: 185 130 140 25
 boxtype: FL_FRAME_BOX
 colors: FL_COL1 FL_BLACK
 alignment: FL_ALIGN_LEFT
@@ -1453,10 +1453,10 @@ argument: 0
 --------------------
 class: FL_CHECKBUTTON
 type: PUSH_BUTTON
-box: 185 225 25 25
+box: 185 220 140 25
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_YELLOW
-alignment: FL_ALIGN_LEFT
+alignment: FL_ALIGN_CENTER
 style: FL_NORMAL_STYLE
 size: FL_NORMAL_SIZE
 lcol: FL_BLACK
@@ -1471,7 +1471,7 @@ argument: 0
 --------------------
 class: FL_CHOICE
 type: NORMAL_CHOICE
-box: 185 265 140 25
+box: 185 260 140 25
 boxtype: FL_FRAME_BOX
 colors: FL_COL1 FL_BLACK
 alignment: FL_ALIGN_LEFT
@@ -1489,7 +1489,7 @@ argument: 0
 --------------------
 class: FL_CHOICE
 type: NORMAL_CHOICE
-box: 185 185 140 25
+box: 185 170 140 25
 boxtype: FL_FRAME_BOX
 colors: FL_COL1 FL_BLACK
 alignment: FL_ALIGN_LEFT
@@ -1594,7 +1594,7 @@ size: FL_NORMAL_SIZE
 lcol: FL_BLACK
 label: LaTeX:|#L
 shortcut: 
-resize: FL_RESIZE_ALL
+resize: FL_RESIZE_X
 gravity: FL_NoGravity FL_NoGravity
 name: input_latex
 callback: C_FormBaseInputCB
@@ -1603,7 +1603,7 @@ argument: 0
 --------------------
 class: FL_BEGIN_GROUP
 type: 0
-box: 0 10 10 0
+box: 0 0 0
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_MCOL
 alignment: FL_ALIGN_CENTER
@@ -1712,7 +1712,7 @@ argument:
 --------------------
 class: FL_BEGIN_GROUP
 type: 0
-box: 0 10 10 0
+box: 0 0 0
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_MCOL
 alignment: FL_ALIGN_CENTER
@@ -1854,5 +1854,191 @@ name:
 callback: 
 argument: 
 
+=============== FORM ===============
+Name: form_document_branch
+Width: 395
+Height: 325
+Number of Objects: 10
+
+--------------------
+class: FL_BOX
+type: UP_BOX
+box: 0 0 395 325
+boxtype: FL_UP_BOX
+colors: FL_COL1 FL_COL1
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: 
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: 
+callback: 
+argument: 
+
+--------------------
+class: FL_INPUT
+type: NORMAL_INPUT
+box: 15 30 150 30
+boxtype: FL_DOWN_BOX
+colors: FL_COL1 FL_MCOL
+alignment: FL_ALIGN_TOP_LEFT
+style: FL_NORMAL_STYLE
+size: FL_NORMAL_SIZE
+lcol: FL_BLACK
+label: New Branch:|#N
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: input_all_branches
+callback: C_FormBaseInputCB
+argument: 0
+
+--------------------
+class: FL_BUTTON
+type: NORMAL_BUTTON
+box: 175 30 100 30
+boxtype: FL_UP_BOX
+colors: FL_COL1 FL_COL1
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_NORMAL_SIZE
+lcol: FL_BLACK
+label: Add|#d
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: button_add_branch
+callback: C_FormBaseInputCB
+argument: 0
+
+--------------------
+class: FL_BUTTON
+type: NORMAL_BUTTON
+box: 15 230 100 30
+boxtype: FL_UP_BOX
+colors: FL_COL1 FL_COL1
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_NORMAL_SIZE
+lcol: FL_BLACK
+label: Remove|#e
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: button_remove_branch
+callback: C_FormBaseInputCB
+argument: 0
+
+--------------------
+class: FL_BROWSER
+type: HOLD_BROWSER
+box: 15 90 150 125
+boxtype: FL_DOWN_BOX
+colors: FL_COL1 FL_YELLOW
+alignment: FL_ALIGN_TOP_LEFT
+style: FL_NORMAL_STYLE
+size: FL_NORMAL_SIZE
+lcol: FL_BLACK
+label: Available Branches:
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: browser_all_branches
+callback: C_FormBaseInputCB
+argument: 0
+
+--------------------
+class: FL_BROWSER
+type: HOLD_BROWSER
+box: 220 90 155 125
+boxtype: FL_DOWN_BOX
+colors: FL_COL1 FL_YELLOW
+alignment: FL_ALIGN_TOP_LEFT
+style: FL_NORMAL_STYLE
+size: FL_NORMAL_SIZE
+lcol: FL_BLACK
+label: Activated Branches:
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: browser_selection
+callback: C_FormBaseInputCB
+argument: 0
+
+--------------------
+class: FL_BUTTON
+type: NORMAL_BUTTON
+box: 175 95 35 35
+boxtype: FL_UP_BOX
+colors: FL_COL1 FL_COL1
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_NORMAL_SIZE
+lcol: FL_BLACK
+label: @5->
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: button_select
+callback: C_FormBaseInputCB
+argument: 0
+
+--------------------
+class: FL_BUTTON
+type: NORMAL_BUTTON
+box: 175 135 35 35
+boxtype: FL_UP_BOX
+colors: FL_COL1 FL_COL1
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_NORMAL_SIZE
+lcol: FL_BLACK
+label: @9+
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: button_deselect
+callback: C_FormBaseInputCB
+argument: 0
+
+--------------------
+class: FL_BUTTON
+type: NORMAL_BUTTON
+box: 165 275 55 30
+boxtype: FL_FLAT_BOX
+colors: FL_WHITE FL_COL1
+alignment: FL_ALIGN_LEFT
+style: FL_NORMAL_STYLE
+size: FL_NORMAL_SIZE
+lcol: FL_BLACK
+label: Display Background:
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: button_color
+callback: 
+argument: 
+
+--------------------
+class: FL_BUTTON
+type: NORMAL_BUTTON
+box: 230 275 85 30
+boxtype: FL_UP_BOX
+colors: FL_COL1 FL_COL1
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_NORMAL_SIZE
+lcol: FL_BLACK
+label: Modify
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: button_modify
+callback: C_FormBaseInputCB
+argument: 0
+
 ==============================
 create_the_forms
index 9e516334c21eb73f8dc90e71796f2ee3a5a0f975..685fbfd2a08f3e06fe95422923710d2d07ffc06b 100644 (file)
@@ -1,3 +1,21 @@
+
+2003-08-17  Martin Vermeer  <martin.vermeer@hut.fi>    
+
+       * Makefile.am:
+       * inset.h:
+       * insetbranch.[Ch]: implements the 'branch inset'
+       idea. This allows the output of various versions of a document
+       from a single source version, selectively outputing or suppressing
+       output of parts of the text.
+       This implementation contains a 'branch list editor' in a separate
+       tab of the document settings dialog. Branches are user definable
+       and have a "display colour" to distinguish them on-screen.
+
+       ColorHandler was somewhat cleaned up.
+       (1) make possible a dynamically growing LColor list by allowing
+       the graphic context cache to grow along (vector);
+       (2) eliminate an IMHO unnecessary step in colour allocation.
+
 2003-08-15  André Pönitz  <poenitz@gmx.net>
 
        * insettext.[Ch]: adjust after rowlist split
index 0b6a5ef79c10ac94b9174049390af85b54f388e0..9b29c5ed9f1521b0ed2fb48a235ead3a56c6a32b 100644 (file)
@@ -25,6 +25,8 @@ libinsets_la_SOURCES = \
        insetbibitem.h \
        insetbibtex.C \
        insetbibtex.h \
+       insetbranch.C \
+       insetbranch.h \
        insetcaption.C \
        insetcaption.h \
        insetcite.C \
index 780f5ea6d873e7740103cb96af96dde2bb5729ac..9f60c8ab0c4fd533e9f1a0a88812ebdfb9c43f92 100644 (file)
@@ -51,7 +51,7 @@ public:
            in a cleaner way. */
        enum Code {
                ///
-               NO_CODE,
+               NO_CODE, // 0
                ///
                TOC_CODE,  // do these insets really need a code? (ale)
                ///
@@ -59,9 +59,9 @@ public:
                ///
                MARK_CODE,
                ///
-               REF_CODE, // 5
+               REF_CODE,
                ///
-               URL_CODE,
+               URL_CODE, // 5
                ///
                HTMLURL_CODE,
                ///
@@ -69,9 +69,9 @@ public:
                ///
                ENDING_CODE,
                ///
-               LABEL_CODE, // 10
+               LABEL_CODE,
                ///
-               NOTE_CODE,
+               NOTE_CODE, // 10
                ///
                ACCENT_CODE,
                ///
@@ -79,9 +79,9 @@ public:
                ///
                INDEX_CODE,
                ///
-               INCLUDE_CODE, // 15
+               INCLUDE_CODE,
                ///
-               GRAPHICS_CODE,
+               GRAPHICS_CODE, // 15
                ///
                BIBITEM_CODE,
                ///
@@ -89,9 +89,9 @@ public:
                ///
                TEXT_CODE,
                ///
-               ERT_CODE, // 20
+               ERT_CODE,
                ///
-               FOOT_CODE,
+               FOOT_CODE, // 20
                ///
                MARGIN_CODE,
                ///
@@ -101,9 +101,9 @@ public:
                ///
                MINIPAGE_CODE,
                ///
-               SPACE_CODE,
+               SPACE_CODE, // 25
                ///
-               SPECIALCHAR_CODE, // 25
+               SPECIALCHAR_CODE,
                ///
                TABULAR_CODE,
                ///
@@ -125,13 +125,15 @@ public:
                ///
                INDEX_PRINT_CODE,
                ///
-               OPTARG_CODE,
+               OPTARG_CODE, // 35
                ///
                ENVIRONMENT_CODE,
                ///
                HFILL_CODE,
                ///
-               NEWLINE_CODE
+               NEWLINE_CODE,
+               ///
+               BRANCH_CODE
        };
 
        ///
diff --git a/src/insets/insetbranch.C b/src/insets/insetbranch.C
new file mode 100644 (file)
index 0000000..b511542
--- /dev/null
@@ -0,0 +1,277 @@
+/**
+ * \file insetbranch.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Martin Vermeer
+ *
+ * Full author contact details are available in file CREDITS
+ */
+
+#include <config.h>
+
+#include "Lsstream.h"
+
+#include "insetbranch.h"
+#include "gettext.h"
+#include "lyxfont.h"
+#include "language.h"
+#include "buffer.h"
+#include "BufferView.h"
+#include "LaTeXFeatures.h"
+#include "latexrunparams.h"
+#include "lyxlex.h"
+#include "lyxtext.h"
+#include "insets/insettext.h"
+#include "support/LOstream.h"
+#include "support/lstrings.h"
+#include "debug.h"
+
+using std::ostream;
+using std::auto_ptr;
+
+void InsetBranch::init()
+{
+       setInsetName("Branch");
+       setButtonLabel();
+}
+
+
+InsetBranch::InsetBranch(BufferParams const & bp, string const & label)
+       : InsetCollapsable(bp)
+{
+       params_.branch = label;
+       // Hack: stash the list of all allowable branch labels from this
+       // buffer into inset's parm list as a "stowaway":
+       params_.branchlist = bp.branchlist;
+       init();
+}
+
+
+InsetBranch::InsetBranch(InsetBranch const & in)
+       : InsetCollapsable(in), params_(in.params_)
+{
+       init();
+}
+
+
+InsetBranch::~InsetBranch()
+{
+       InsetBranchMailer mailer("branch", *this);
+       mailer.hideDialog();
+}
+
+
+auto_ptr<InsetBase> InsetBranch::clone() const
+{
+       return auto_ptr<InsetBase>(new InsetBranch(*this));
+}
+
+
+string const InsetBranch::editMessage() const
+{
+       return _("Opened Branch Inset");
+}
+
+
+void InsetBranch::write(Buffer const * buf, ostream & os) const
+{
+       params_.write(os);
+       InsetCollapsable::write(buf, os);
+}
+
+
+void InsetBranch::read(Buffer const * buf, LyXLex & lex)
+{
+       if (lex.isOK()) {
+               lex.next();
+               params_.branch = lex.getString();
+       }
+       InsetCollapsable::read(buf, lex);
+       setButtonLabel();
+}
+
+
+void InsetBranch::setButtonLabel()
+{
+       LyXFont font(LyXFont::ALL_SANE);
+       font.decSize();
+       font.decSize();
+
+       setLabel(params_.branch);
+       font.setColor(LColor::foreground);
+       string const color = params_.branchlist.getColor(params_.branch);
+       if (!color.empty()) {
+               setBackgroundColor(lcolor.getFromLyXName(params_.branch));
+       } else
+               setBackgroundColor(LColor::background);
+       setLabelFont(font);
+}
+
+
+void InsetBranch::metrics(MetricsInfo & mi, Dimension & dim) const
+{
+       InsetCollapsable::metrics(mi, dim);
+       dim_ = dim;
+}
+
+
+void InsetBranch::draw(PainterInfo & pi, int x, int y) const
+{
+       InsetCollapsable::draw(pi, x, y);
+}
+
+
+bool InsetBranch::showInsetDialog(BufferView * bv) const
+{
+       InsetBranchMailer("branch", const_cast<InsetBranch &>(*this)).showDialog(bv);
+       return true;
+}
+
+
+dispatch_result InsetBranch::localDispatch(FuncRequest const & cmd)
+{
+       BufferView * bv = cmd.view();
+       switch (cmd.action) {
+       case LFUN_INSET_MODIFY:
+               {
+               InsetBranchParams params;
+               InsetBranchMailer::string2params(cmd.argument, params);
+               params_.branch = params.branch;
+               setButtonLabel();
+               bv->updateInset();
+               return DISPATCHED;
+               }
+       case LFUN_INSET_EDIT:
+               if (cmd.button() != mouse_button::button3) 
+                       return InsetCollapsable::localDispatch(cmd);
+               return UNDISPATCHED;
+       case LFUN_INSET_DIALOG_UPDATE:
+               InsetBranchMailer("branch", *this).updateDialog(bv);
+               return DISPATCHED;
+       case LFUN_MOUSE_RELEASE:
+               if (cmd.button() == mouse_button::button3 && hitButton(cmd)) {
+                   InsetBranchMailer("branch", *this).showDialog(bv);
+                       return DISPATCHED;
+               }
+               // fallthrough:
+       default:
+               return InsetCollapsable::localDispatch(cmd);
+       }
+}
+
+
+
+int InsetBranch::latex(Buffer const * buf, ostream & os,
+       LatexRunParams const & runparams) const
+{
+       string const branch_sel = buf->params.branchlist.allSelected();
+       if (branch_sel.find(params_.branch, 0) != string::npos)
+               return inset.latex(buf, os, runparams);
+       return 0;
+}
+
+
+int InsetBranch::linuxdoc(Buffer const *, std::ostream &) const
+{ 
+       return 0; 
+}
+
+
+int InsetBranch::docbook(Buffer const * buf, std::ostream & os, bool mixcont) const
+{
+       // untested - MV
+       string const branch_sel = buf->params.branchlist.allSelected();
+       if (branch_sel.find(params_.branch, 0) != string::npos) 
+               return inset.docbook(buf, os, mixcont);
+       return 0;
+}
+
+
+int InsetBranch::ascii(Buffer const * buf, std::ostream & os, int ll) const
+{
+       string const branch_sel = buf->params.branchlist.allSelected();
+       if (branch_sel.find(params_.branch, 0) != string::npos) {
+               return inset.ascii(buf, os, ll);
+       }
+       return 0;
+}
+
+
+void InsetBranch::validate(LaTeXFeatures & features) const
+{
+       inset.validate(features);
+}
+
+
+
+InsetBranchMailer::InsetBranchMailer(string const & name,
+                                               InsetBranch & inset)
+       : name_(name), inset_(inset)
+{
+}
+
+
+string const InsetBranchMailer::inset2string(Buffer const & buf) const
+{
+       InsetBranchParams params = inset_.params();
+       params.branchlist = buf.params.branchlist;
+       inset_.setParams(params);
+       return params2string(name_, params);
+}
+
+
+string const InsetBranchMailer::params2string(string const & name,
+                               InsetBranchParams const & params)
+{
+       ostringstream data;
+       data << name << ' ';
+       params.write(data);
+       // Add all_branches parameter to data:
+       data << params.branchlist.allBranches() << "\n";
+       return STRCONV(data.str());
+}
+
+
+void InsetBranchMailer::string2params(string const & in,
+                                    InsetBranchParams & params)
+{
+       params = InsetBranchParams();
+
+       if (in.empty())
+               return;
+
+       istringstream data(STRCONV(in));
+       LyXLex lex(0,0);
+       lex.setStream(data);
+       params.read(lex);
+       // Process all_branches here:
+       if (lex.isOK()) {
+               lex.next();
+               params.branchlist.add(lex.getString());
+       }
+}
+
+
+void InsetBranchParams::write(ostream & os) const
+{
+       os << "Branch" << " " << branch << "\n";
+}
+
+
+void InsetBranchParams::read(LyXLex & lex)
+{
+       if (lex.isOK()) {
+               lex.next();
+               string token = lex.getString();
+       }
+       if (lex.isOK()) {
+               lex.next();
+               string token = lex.getString();
+       }
+       if (lex.isOK()) {
+               lex.next();
+               branch = lex.getString();
+       }
+}
+
diff --git a/src/insets/insetbranch.h b/src/insets/insetbranch.h
new file mode 100644 (file)
index 0000000..d4e043b
--- /dev/null
@@ -0,0 +1,115 @@
+// -*- C++ -*-
+/**
+ * \file insetbranch.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Martin Vermeer
+ *
+ * Full author contact details are available in file CREDITS
+ */
+
+#ifndef INSETBRANCH_H
+#define INSETBRANCH_H
+
+
+#include "insetcollapsable.h"
+#include "BranchList.h"
+
+ struct InsetBranchParams {
+       ///
+       void write(std::ostream & os) const;
+       ///
+       void read(LyXLex & lex);
+       ///
+       string branch;
+       /// Hack -- MV
+       BranchList branchlist;
+ };
+/** The Branch inset for alternative, conditional output.
+
+*/
+class InsetBranch : public InsetCollapsable {
+public:
+       ///
+
+       
+       InsetBranch(BufferParams const &, string const &);
+       /// Copy constructor
+       InsetBranch(InsetBranch const &);
+       ///
+       ~InsetBranch();
+       ///
+       virtual std::auto_ptr<InsetBase> clone() const;
+       ///
+       string const editMessage() const;
+       ///
+       InsetOld::Code lyxCode() const { return InsetOld::BRANCH_CODE; }
+       ///
+       void write(Buffer const *, std::ostream &) const;
+       ///
+       void read(Buffer const * buf, LyXLex & lex);
+       ///
+       void setButtonLabel();
+       ///
+       void metrics(MetricsInfo & mi, Dimension & dim) const;
+       ///
+       void draw(PainterInfo & pi, int x, int y) const;
+       ///
+       bool showInsetDialog(BufferView *) const;
+       ///
+       dispatch_result localDispatch(FuncRequest const &);
+       ///
+       int latex(Buffer const *, std::ostream &,
+                       LatexRunParams const &) const;
+       ///
+       int linuxdoc(Buffer const *, std::ostream &) const;
+       ///
+       int docbook(Buffer const *, std::ostream &, bool) const;
+       ///
+       int ascii(Buffer const *, std::ostream &, int) const;
+       ///
+       void validate(LaTeXFeatures &) const;
+       ///
+       InsetBranchParams const & params() const { return params_; }
+       ///
+       void setParams(InsetBranchParams const & params) { params_ = params; }
+       
+private:
+       friend class InsetBranchParams;
+
+       /// used by the constructors
+       void init();
+       ///
+       InsetBranchParams params_;
+};
+
+#include "mailinset.h"
+
+class InsetBranchMailer : public MailInset {
+public:
+       ///
+       InsetBranchMailer(string const & name, InsetBranch & inset);
+       ///
+       virtual InsetBase & inset() const { return inset_; }
+       ///
+       virtual string const & name() const { return name_; }
+       ///
+       virtual string const inset2string(Buffer const &) const;
+       ///
+       static string const params2string(string const &, InsetBranchParams const &);
+       ///
+       static void string2params(string const &, InsetBranchParams &);
+
+private:
+       ///
+       string const name_;
+       ///
+       InsetBranch & inset_;
+};
+
+
+
+#endif
index f9a979e64a605dab566d77e6485b5222a9fa3941..8e443f6c9fdb8febc43e589171a57dad589f1941 100644 (file)
@@ -321,7 +321,8 @@ enum kb_action {
        LFUN_PARAGRAPH_UPDATE,
        LFUN_EXTERNAL_EDIT,
        // 245
-
+       LFUN_INSERT_BRANCH,
+       
        LFUN_LASTACTION                  // end of the table
 };
 
index 8c6840a28818075090b045361c6467b3e9fafb84..185600625a79d090b775b5bc73c2155570ddbbc7 100644 (file)
@@ -505,6 +505,9 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const
                        case InsetOld::NOTE_CODE:
                                disable = ev.argument != "note";
                                break;
+                       case InsetOld::BRANCH_CODE:
+                               disable = ev.argument != "branch";
+                               break;
                        default:
                                break;
                }
@@ -633,6 +636,11 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & ev) const
        case LFUN_INSERT_NOTE:
                code = InsetOld::NOTE_CODE;
                break;
+       case LFUN_INSERT_BRANCH:
+               code = InsetOld::BRANCH_CODE;
+               if (buf->params.branchlist.empty())
+                       disable = true;
+               break;
        case LFUN_INSERT_LABEL:
                code = InsetOld::LABEL_CODE;
                break;
index ca471a16f724177dd19eb6181f578dc4bafb7e76..f0786b73799f318faef9feb154c5bb1a9c6b18d7 100644 (file)
@@ -1494,6 +1494,7 @@ InsetOld::RESULT LyXText::dispatch(FuncRequest const & cmd)
        case LFUN_INSET_CAPTION:
 #endif
        case LFUN_INSERT_NOTE:
+       case LFUN_INSERT_BRANCH:
        case LFUN_INSERT_BIBITEM:
        case LFUN_INSET_ERT:
        case LFUN_INSET_FLOAT: