]> git.lyx.org Git - features.git/commitdiff
Controller-view split of Graphics and Index popups.
authorAngus Leeming <leeming@lyx.org>
Wed, 28 Mar 2001 12:59:29 +0000 (12:59 +0000)
committerAngus Leeming <leeming@lyx.org>
Wed, 28 Mar 2001 12:59:29 +0000 (12:59 +0000)
Moved Citation and Character helper functions into their own namespaces.
Fixed bugs in Minipage controller.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@1843 a592a061-630c-0410-9148-cb99ea01b6c8

25 files changed:
src/frontends/controllers/ChangeLog
src/frontends/controllers/ControlBibitem.h
src/frontends/controllers/ControlBibtex.h
src/frontends/controllers/ControlCharacter.C
src/frontends/controllers/ControlCharacter.h
src/frontends/controllers/ControlCitation.C
src/frontends/controllers/ControlCitation.h
src/frontends/controllers/ControlError.h
src/frontends/controllers/ControlGraphics.C [new file with mode: 0644]
src/frontends/controllers/ControlGraphics.h [new file with mode: 0644]
src/frontends/controllers/ControlInclude.h
src/frontends/controllers/ControlIndex.C [new file with mode: 0644]
src/frontends/controllers/ControlIndex.h [new file with mode: 0644]
src/frontends/controllers/ControlInset.h
src/frontends/controllers/ControlMinipage.C
src/frontends/controllers/ControlMinipage.h
src/frontends/controllers/ControlRef.h
src/frontends/controllers/ControlSearch.h
src/frontends/controllers/ControlUrl.h
src/frontends/controllers/GUI.h
src/frontends/controllers/Makefile.am
src/frontends/controllers/biblio.C [new file with mode: 0644]
src/frontends/controllers/biblio.h [new file with mode: 0644]
src/frontends/controllers/character.C [new file with mode: 0644]
src/frontends/controllers/character.h [new file with mode: 0644]

index 25d23f559cd8716dc4340b12c9706058998d6980..317cd585ee930b7ca658dd4f9fce7bbc6ac8ac5c 100644 (file)
@@ -1,9 +1,46 @@
+2001-03-28  Angus Leeming  <a.leeming@ic.ac.uk>
+
+       * ControlInset.h (clearDaughterParams): is empty by default, not pure.
+       (setDaughterParams): a (by default empty) new method called in show().
+
+       * ControlBibitem.h:
+       * ControlBibtex.h:
+       * ControlError.h:
+       * ControlInclude.h:
+       * ControlMinipage.h:
+       * ControlRef.h:
+       * ControlSearch.h:
+       * ControlUrl.h (clearDaughterParams): removed
+
+       * ControlMinipage.C (applyParamsToInset): update the view.
+       Added namespace minipage containing a helper function getUnits.
+
+       * GUI.h: changed Minipage policy to NoRepeatedApplyReadOnlyPolicy.
+
+       * ControlCharacter.[Ch]: moved out all the helper functions and the
+       enum into their own file.
+       * character.[Ch]: new files; contain the character helper functions,
+       now inside namespace character.
+
+       * ControlCitation.[Ch]: moved out all the helper functions and the
+       enums into their own file. Simplified interface.
+       * biblio.[Ch]: new files; contain the citation helper functions,
+       now inside namespace biblio. Will be of use also to an improved
+       BibTeX popup.
+
+       * ControlGraphics.[Ch]:
+       * ControlIndex.[Ch]: new files; controllers for the Graphics and Index
+       popups, respectively.
+
+       * GUI.h:
+       * Makefile.am: associated changes.
+
 2001-03-27  Angus Leeming  <a.leeming@ic.ac.uk>
 
        * ControlMinipage.[Ch]:
        * ControlPreamble.[Ch]:
        * ControlPrint.[Ch]:
-       * ControlSplash.[Ch]: new files; controller for the Minipage, Preamble
+       * ControlSplash.[Ch]: new files; controllers for the Minipage, Preamble
        and Print popups and Splash screen, respectively.
 
        * ViewBase.h (ViewSplash): new base class for GUI-specific Splash
index ab4cffdffedffbcbf3e0fa2a5026c7a1dd2b3c1e..2d64b7da2e07f27245b8a6bd12affb6b67a6a55d 100644 (file)
@@ -23,8 +23,7 @@
 
 /** A controller for Bibitem dialogs.
  */
-class ControlBibitem : public ControlCommand
-{
+class ControlBibitem : public ControlCommand {
 public:
        ///
        ControlBibitem(LyXView &, Dialogs &);
@@ -34,8 +33,6 @@ private:
        virtual void applyParamsToInset();
        /// not needed.
        virtual void applyParamsNoInset() {}
-       /// not needed.
-       virtual void clearDaughterParams() {}
 };
 
 #endif // CONTROLBIBITEM_H
index 392540aaf023627171f48d9e62e4d10421e2ea08..d64fad5c55d54820ff6ddc2f1399b6f4bde371b3 100644 (file)
@@ -35,8 +35,6 @@ private:
        virtual void applyParamsToInset();
        /// 
        virtual void applyParamsNoInset();
-       /// not needed.
-       virtual void clearDaughterParams() {}
 };
 
 #endif // CONTROLBIBTEX_H
index 445c589de5d33a671e6bc821c5a87fd2d2e08efb..ce320474e6c66a3e50bc5c87fb0c4e0019e8cc7c 100644 (file)
 #include <config.h>
 
 #include "ControlCharacter.h"
-#include "bufferview_funcs.h"
+#include "buffer.h"
 #include "Dialogs.h"
 #include "Liason.h"
 #include "LyXView.h"
-#include "buffer.h"
-#include "lyxtext.h"
-#include "language.h"
+#include "bufferview_funcs.h" // ToggleAndShow
 
 using Liason::setMinibuffer;
 using SigC::slot;
@@ -86,33 +84,33 @@ void ControlCharacter::setSize(LyXFont::FONT_SIZE val)
        font_->setSize(val);
 }
 
-void ControlCharacter::setBar(ControlCharacter::FONT_STATE val)
+void ControlCharacter::setBar(character::FONT_STATE val)
 {
        switch (val) {
-       case IGNORE:
+       case character::IGNORE:
                font_->setEmph(LyXFont::IGNORE);
                font_->setUnderbar(LyXFont::IGNORE);
                font_->setNoun(LyXFont::IGNORE);
                font_->setLatex(LyXFont::IGNORE);
                break;
 
-       case EMPH_TOGGLE:
+       case character::EMPH_TOGGLE:
                font_->setEmph(LyXFont::TOGGLE);
                break;
 
-       case UNDERBAR_TOGGLE:
+       case character::UNDERBAR_TOGGLE:
                font_->setUnderbar(LyXFont::TOGGLE);
                break;
 
-       case NOUN_TOGGLE:
+       case character::NOUN_TOGGLE:
                font_->setNoun(LyXFont::TOGGLE);
                break;
 
-       case LATEX_TOGGLE:
+       case character::LATEX_TOGGLE:
                font_->setLatex(LyXFont::TOGGLE);
                break;
 
-       case INHERIT:
+       case character::INHERIT:
                font_->setEmph(LyXFont::INHERIT);
                font_->setUnderbar(LyXFont::INHERIT);
                font_->setNoun(LyXFont::INHERIT);
@@ -160,172 +158,3 @@ void ControlCharacter::setToggleAll(bool t)
 {
        toggleall_ = t;
 }
-
-
-vector<ControlCharacter::FamilyPair> const getFamilyData()
-{
-       vector<ControlCharacter::FamilyPair> family(5);
-
-       ControlCharacter::FamilyPair pr;
-       pr.first = _("No change");  pr.second = LyXFont::IGNORE_FAMILY;
-       family[0] = pr;
-       pr.first = _("Roman");      pr.second = LyXFont::ROMAN_FAMILY;
-       family[1] = pr;
-       pr.first = _("Sans Serif"); pr.second = LyXFont::SANS_FAMILY;
-       family[2] = pr;
-       pr.first = _("Typewriter"); pr.second = LyXFont::TYPEWRITER_FAMILY;
-       family[3] = pr;
-       pr.first = _("Reset");      pr.second = LyXFont::INHERIT_FAMILY;
-       family[4] = pr;
-
-       return family;
-}
-
-
-vector<ControlCharacter::SeriesPair> const getSeriesData()
-{
-       vector<ControlCharacter::SeriesPair> series(4);
-
-       ControlCharacter::SeriesPair pr;
-       pr.first = _("No change"); pr.second = LyXFont::IGNORE_SERIES;
-       series[0] = pr;
-       pr.first = _("Medium");    pr.second = LyXFont::MEDIUM_SERIES;
-       series[1] = pr;
-       pr.first = _("Bold");      pr.second = LyXFont::BOLD_SERIES;
-       series[2] = pr;
-       pr.first = _("Reset");     pr.second = LyXFont::INHERIT_SERIES;
-       series[3] = pr;
-       
-       return series;
-}
-
-
-vector<ControlCharacter::ShapePair> const getShapeData()
-{
-       vector<ControlCharacter::ShapePair> shape(6);
-
-       ControlCharacter::ShapePair pr;
-       pr.first = _("No change");  pr.second = LyXFont::IGNORE_SHAPE;
-       shape[0] = pr;
-       pr.first = _("Upright");    pr.second = LyXFont::UP_SHAPE;
-       shape[1] = pr;
-       pr.first = _("Italic");     pr.second = LyXFont::ITALIC_SHAPE;
-       shape[2] = pr;
-       pr.first = _("Slanted");    pr.second = LyXFont::SLANTED_SHAPE;
-       shape[3] = pr;
-       pr.first = _("Small Caps"); pr.second = LyXFont::SMALLCAPS_SHAPE;
-       shape[4] = pr;
-       pr.first = _("Reset");      pr.second = LyXFont::INHERIT_SHAPE;
-       shape[5] = pr;
-       
-       return shape;
-}
-
-
-vector<ControlCharacter::SizePair> const getSizeData()
-{
-       vector<ControlCharacter::SizePair> size(14);
-
-       ControlCharacter::SizePair pr;
-       pr.first = _("No change"); pr.second = LyXFont::IGNORE_SIZE;
-       size[0] = pr;
-       pr.first = _("Tiny");      pr.second = LyXFont::SIZE_TINY;
-       size[1] = pr;
-       pr.first = _("Smallest");  pr.second = LyXFont::SIZE_SCRIPT;
-       size[2] = pr;
-       pr.first = _("Smaller");   pr.second = LyXFont::SIZE_FOOTNOTE;
-       size[3] = pr;
-       pr.first = _("Small");     pr.second = LyXFont::SIZE_SMALL;
-       size[4] = pr;
-       pr.first = _("Normal");    pr.second = LyXFont::SIZE_NORMAL;
-       size[5] = pr;
-       pr.first = _("Large");     pr.second = LyXFont::SIZE_LARGE;
-       size[6] = pr;
-       pr.first = _("Larger");    pr.second = LyXFont::SIZE_LARGER;
-       size[7] = pr;
-       pr.first = _("Largest");   pr.second = LyXFont::SIZE_LARGEST;
-       size[8] = pr;
-       pr.first = _("Huge");      pr.second = LyXFont::SIZE_HUGE;
-       size[9] = pr;
-       pr.first = _("Huger");     pr.second = LyXFont::SIZE_HUGER;
-       size[10] = pr;
-       pr.first = _("Increase");  pr.second = LyXFont::INCREASE_SIZE;
-       size[11] = pr;
-       pr.first = _("Decrease");  pr.second = LyXFont::DECREASE_SIZE;
-       size[12] = pr;
-       pr.first = _("Reset");     pr.second = LyXFont::INHERIT_SIZE;
-       size[13] = pr;
-       
-       return size;
-}
-
-
-vector<ControlCharacter::BarPair> const getBarData()
-{
-       vector<ControlCharacter::BarPair> bar(6);
-
-       ControlCharacter::BarPair pr;
-       pr.first = _("No change");  pr.second = ControlCharacter::IGNORE;
-       bar[0] = pr;
-       pr.first = _("Emph");       pr.second = ControlCharacter::EMPH_TOGGLE;
-       bar[1] = pr;
-       pr.first = _("Underbar");   pr.second = ControlCharacter::UNDERBAR_TOGGLE;
-       bar[2] = pr;
-       pr.first = _("Noun");       pr.second = ControlCharacter::NOUN_TOGGLE;
-       bar[3] = pr;
-       pr.first = _("LaTeX mode"); pr.second = ControlCharacter::LATEX_TOGGLE;
-       bar[4] = pr;
-       pr.first = _("Reset");      pr.second = ControlCharacter::INHERIT;
-       bar[5] = pr;
-       
-       return bar;
-}
-
-
-vector<ControlCharacter::ColorPair> const getColorData()
-{
-       vector<ControlCharacter::ColorPair> color(11);
-
-       ControlCharacter::ColorPair pr;
-       pr.first = _("No change"); pr.second = LColor::ignore;
-       color[0] = pr;
-       pr.first = _("No color");  pr.second = LColor::none;
-       color[1] = pr;
-       pr.first = _("Black");     pr.second = LColor::black;
-       color[2] = pr;
-       pr.first = _("White");     pr.second = LColor::white;
-       color[3] = pr;
-       pr.first = _("Red");       pr.second = LColor::red;
-       color[4] = pr;
-       pr.first = _("Green");     pr.second = LColor::green;
-       color[5] = pr;
-       pr.first = _("Blue");      pr.second = LColor::blue;
-       color[6] = pr;
-       pr.first = _("Cyan");      pr.second = LColor::cyan;
-       color[7] = pr;
-       pr.first = _("Magenta");   pr.second = LColor::magenta;
-       color[8] = pr;
-       pr.first = _("Yellow");    pr.second = LColor::yellow;
-       color[9] = pr;
-       pr.first = _("Reset");     pr.second = LColor::inherit;
-       color[10] = pr;
-       
-       return color;
-}
-
-
-vector<string> const getLanguageData()
-{
-       vector<string> langs(languages.size() + 2);
-
-       langs[0] = _("No change");
-       langs[1] = _("Reset");
-
-       vector<string>::size_type i = 1;
-       for (Languages::const_iterator cit = languages.begin(); 
-            cit != languages.end(); ++cit) {
-               langs[++i] = cit->second.lang();
-       }
-
-       return langs;
-}
index b593c83c52643b6445e3f7aff5d3afcebdccb357..6266b10f38cbc252f38d276d34767263b93cfa04 100644 (file)
 #endif
 
 #include "ControlDialogs.h"
-#include "lyxfont.h"
-#include "LColor.h"
+#include "character.h"
 
 /** A controller for Character dialogs.
  */
 class ControlCharacter : public ControlDialog<ControlConnectBD>
 {
 public:
-       ///
-       enum FONT_STATE {
-               ///
-               IGNORE,
-               ///
-               EMPH_TOGGLE,
-               ///
-               UNDERBAR_TOGGLE,
-               ///
-               NOUN_TOGGLE,
-               ///
-               LATEX_TOGGLE,
-               ///
-               INHERIT
-       };
-       
-       ///
-       typedef std::pair<string, LyXFont::FONT_FAMILY> FamilyPair;
-       ///
-       typedef std::pair<string, LyXFont::FONT_SERIES> SeriesPair;
-       ///
-       typedef std::pair<string, LyXFont::FONT_SHAPE>  ShapePair;
-       ///
-       typedef std::pair<string, LyXFont::FONT_SIZE>   SizePair;
-       ///
-       typedef std::pair<string, FONT_STATE> BarPair;
-       ///
-       typedef std::pair<string, LColor::color> ColorPair;
-
        ///
        ControlCharacter(LyXView &, Dialogs &);
 
@@ -63,7 +33,7 @@ public:
        ///
        void setSize(LyXFont::FONT_SIZE);
        ///
-       void setBar(FONT_STATE);
+       void setBar(character::FONT_STATE);
        ///
        void setColor(LColor::color);
        ///
@@ -85,19 +55,4 @@ private:
        bool toggleall_;
 };
 
-/// Helper functions
-std::vector<ControlCharacter::FamilyPair> const getFamilyData();
-///
-std::vector<ControlCharacter::SeriesPair> const getSeriesData();
-///
-std::vector<ControlCharacter::ShapePair>  const getShapeData();
-///
-std::vector<ControlCharacter::SizePair>   const getSizeData();
-///
-std::vector<ControlCharacter::BarPair>    const getBarData();
-///
-std::vector<ControlCharacter::ColorPair>  const getColorData();
-///
-std::vector<string> const getLanguageData();
-
 #endif // CONTROLCHARACTER_H
index b4c711a9273982adf58715df422f2bc978cbe754..aa929d9410d0d47a637fe9823dbae2fa1220da6a 100644 (file)
@@ -1,4 +1,3 @@
-// -*- C++ -*-
 /* This file is part of
  * ====================================================== 
  *
 #include "buffer.h"
 #include "Dialogs.h"
 #include "LyXView.h"
-#include "helper_funcs.h"
-#include "support/lstrings.h"
-#include "support/LRegex.h"
 
-using std::find;
-using std::min;
 using std::pair;
 using std::vector;
-using std::sort;
 using SigC::slot;
 
 ControlCitation::ControlCitation(LyXView & lv, Dialogs & d)
@@ -51,291 +44,21 @@ void ControlCitation::clearDaughterParams()
 }
 
 
-// A functor for use with std::sort, leading to case insensitive sorting
-struct compareNoCase: public std::binary_function<string, string, bool> 
+void ControlCitation::setDaughterParams()
 {
-       bool operator()(string const & s1, string const & s2) const {
-               return compare_no_case(s1, s2) < 0;
-       }
-};
-
-
-vector<string> const ControlCitation::getBibkeys()
-{
-       vector<string> bibkeys;
-       bibkeysInfo_.clear();
-
        vector<pair<string,string> > blist = lv_.buffer()->getBibkeyList();
 
+       typedef std::map<string, string>::value_type InfoMapValue;
+
        for (vector<pair<string,string> >::size_type i=0; i<blist.size(); ++i) {
-               bibkeys.push_back(blist[i].first);
                bibkeysInfo_.insert(InfoMapValue(blist[i].first,
                                                 blist[i].second));
        }
-
-       sort(bibkeys.begin(), bibkeys.end(), compareNoCase());
-       return bibkeys;
 }
 
 
-string const ControlCitation::getBibkeyInfo(string const & key)
+biblio::InfoMap const & ControlCitation::bibkeysInfo() const
 {
        Assert(!bibkeysInfo_.empty());
-
-       string result;
-
-               InfoMap::const_iterator it = bibkeysInfo_.find(key);
-       if (it != bibkeysInfo_.end()) {
-               // Search for all possible "required" keys
-               string author = parseBibTeX(it->second, "author");
-               if (author.empty())
-                       author = parseBibTeX(it->second, "editor");
-
-               string year       = parseBibTeX(it->second, "year");
-               string title      = parseBibTeX(it->second, "title");
-               string booktitle  = parseBibTeX(it->second, "booktitle");
-               string chapter    = parseBibTeX(it->second, "chapter");
-               string pages      = parseBibTeX(it->second, "pages");
-
-               string media      = parseBibTeX(it->second, "journal");
-               if (media.empty())
-                       media = parseBibTeX(it->second, "publisher");
-               if (media.empty())
-                       media = parseBibTeX(it->second, "school");
-               if (media.empty())
-                       media = parseBibTeX(it->second, "institution");
-
-               result = author;
-               if (!year.empty())
-                       result += ", " + year;
-               if (!title.empty())
-                       result += ", " + title;
-               if (!booktitle.empty())
-                       result += ", in " + booktitle;
-               if (!chapter.empty())
-                       result += ", Ch. " + chapter;
-               if (!media.empty())
-                       result += ", " + media;
-               if (!pages.empty())
-                       result += ", pp. " + pages;
-
-               if (result.empty()) // not a BibTeX record
-                       result = it->second;
-       }
-
-       return result;
-}
-
-
-vector<string>::const_iterator
-searchKeys(ControlCitation const & controller,
-          vector<string> const & keys,
-          string const & expr,
-          vector<string>::const_iterator start,
-          ControlCitation::Search type,
-          ControlCitation::Direction dir,
-          bool caseSensitive)
-{
-       // Preliminary checks
-       if(start < keys.begin() || start >= keys.end())
-               return keys.end();
-       
-       string search_expr = frontStrip(strip(expr));
-       if (search_expr.empty())
-               return start;
-
-       if (type == ControlCitation::SIMPLE)
-               return simpleSearch(controller, keys, search_expr, start, dir,
-                                   caseSensitive);
-
-       return regexSearch(controller, keys, search_expr, start, dir);
-}
-
-
-vector<string>::const_iterator
-simpleSearch(ControlCitation const & controller,
-            vector<string> const & keys,
-            string const & expr,
-            vector<string>::const_iterator start,
-            ControlCitation::Direction dir,
-            bool caseSensitive)
-{
-       vector<string> searchwords = getVectorFromString(expr, " ");
-
-       // Loop over all keys from start...
-       for (vector<string>::const_iterator it = start;
-            // End condition is direction-dependent.
-            (dir == ControlCitation::FORWARD) ?
-                    (it<keys.end()) : (it>=keys.begin());
-            // increment is direction-dependent.
-            (dir == ControlCitation::FORWARD) ?
-                    (++it) : (--it)) {
-
-               string data = (*it);
-               ControlCitation::InfoMap::const_iterator info =
-                       controller.bibkeysInfo().find(*it);
-               if (info != controller.bibkeysInfo().end())
-                       data += " " + info->second;
-               if (!caseSensitive)
-                       data = lowercase(data);
-
-               bool found = true;
-
-               // Loop over all search words...
-               if (caseSensitive) {
-                       for (vector<string>::const_iterator sit=
-                                    searchwords.begin();
-                            sit<searchwords.end(); ++sit) {
-                               if (data.find(*sit) == string::npos) {
-                                       found = false;
-                                       break;
-                               }
-                       }
-               } else {
-                       for (vector<string>::const_iterator sit=
-                                    searchwords.begin();
-                            sit<searchwords.end(); ++sit) {
-                               if (data.find(lowercase(*sit)) ==
-                                   string::npos) {
-                                       found = false;
-                                       break;
-                               }
-                       }
-               }
-               
-               if (found) return it;
-       }
-
-       return keys.end();
-}
-
-
-vector<string>::const_iterator
-regexSearch(ControlCitation const & controller,
-           vector<string> const & keys,
-           string const & expr,
-           vector<string>::const_iterator start,
-           ControlCitation::Direction dir)
-{
-       LRegex reg(expr);
-
-       for (vector<string>::const_iterator it = start;
-            // End condition is direction-dependent.
-            (dir == ControlCitation::FORWARD) ?
-                    (it<keys.end()) : (it>=keys.begin());
-            // increment is direction-dependent.
-            (dir == ControlCitation::FORWARD) ?
-                    (++it) : (--it)) {
-
-               string data = (*it);
-               ControlCitation::InfoMap::const_iterator info =
-                       controller.bibkeysInfo().find(*it);
-               if (info != controller.bibkeysInfo().end())
-                       data += " " + info->second;
-
-               if (reg.exec(data).size() > 0)
-                       return it;
-       }
-
-       return keys.end();
-}
-
-string const parseBibTeX(string data, string const & findkey)
-{
-       string keyvalue;
-       
-       for (string::iterator it=data.begin(); it<data.end(); ++it) {
-               if ((*it) == '\n' || (*it) == '\t')
-                       (*it)= ' ';
-       }
-       
-       data = frontStrip(data);
-       while (!data.empty() && data[0] != '=' && 
-              (data.find(' ') != string::npos || data.find('=') != string::npos)) {
-
-               string::size_type keypos = min(data.find(' '), data.find('='));
-               string key = lowercase(data.substr(0, keypos));
-      
-               data = data.substr(keypos, data.length()-1);
-               data = frontStrip(strip(data));
-               if (data.length() > 1 && data[0]=='=') {
-                       data = frontStrip(data.substr(1, data.length()-1));
-                       if (!data.empty()) {
-                               keypos = 1;
-                               string value;
-                               char enclosing;
-
-                               if (data[0]=='{') {
-                                       enclosing = '}';
-                               } else if (data[0]=='"') {
-                                       enclosing = '"';
-                               } else {
-                                       keypos=0;
-                                       enclosing=' ';
-                               }
-
-                               if (keypos &&
-                                   data.find(enclosing)!=string::npos &&
-                                   data.length()>1) {
-                                       string tmp = data.substr(keypos,
-                                                                data.length()-1);
-                                       while (tmp.find('{') != string::npos &&
-                                              tmp.find('}') != string::npos &&
-                                              tmp.find('{') < tmp.find('}') &&
-                                              tmp.find('{') < tmp.find(enclosing)) {
-
-                                               keypos += tmp.find('{')+1;
-                                               tmp = data.substr(keypos,
-                                                                 data.length()-1);
-                                               keypos += tmp.find('}')+1;
-                                               tmp = data.substr(keypos,
-                                                                 data.length()-1);
-                                       }
-
-                                       if (tmp.find(enclosing)==string::npos)
-                                               return keyvalue;
-                                       else {
-                                               keypos += tmp.find(enclosing);
-                                               tmp = data.substr(keypos,
-                                                                 data.length()-1);
-                                       }
-
-                                       value = data.substr(1, keypos-1);
-
-                                       if (keypos+1<data.length()-1)
-                                               data = frontStrip(data.substr(keypos+1, data.length()-1));
-                                       else
-                                               data = "";
-
-                               } else if (!keypos &&
-                                          (data.find(' ') ||
-                                           data.find(','))) {
-                                       keypos = data.length()-1;
-                                       if (data.find(' ') != string::npos)
-                                               keypos = data.find(' ');
-                                       if (data.find(',') != string::npos &&
-                                           keypos > data.find(','))
-                                               keypos = data.find(',');
-
-                                       value = data.substr(0, keypos);
-                 
-                                       if (keypos+1<data.length()-1)
-                                               data = frontStrip(data.substr(keypos+1, data.length()-1));
-                                       else
-                                               data = "";
-                               }
-                               else
-                                       return keyvalue;
-
-                               if (findkey == key) {
-                                       keyvalue = value;
-                                       return keyvalue;
-                               } 
-
-                               data = frontStrip(frontStrip(data,','));
-                       }
-               }
-               else return keyvalue;
-       }
-       return keyvalue;
+       return bibkeysInfo_;
 }
index daa7aafad6cffb05dbb23f4d679ba73f8a53f4d5..18b0951ced1ad2d489d129b3f81c603bf5da3004 100644 (file)
@@ -1,4 +1,3 @@
-// -*- C++ -*-
 /* This file is part of
  * ====================================================== 
  *
@@ -20,6 +19,7 @@
 #endif
 
 #include "ControlCommand.h"
+#include "biblio.h" // biblio::InfoMap
 
 /** A controller for Citation dialogs. All citation-specific functionality
     should go in here.
 class ControlCitation : public ControlCommand
 {
 public:
-       ///
-       typedef std::map<string, string> InfoMap;
-       ///
-       typedef std::map<string, string>::value_type InfoMapValue;
-       ///
-       enum Search {
-               ///
-               SIMPLE,
-               ///
-               REGEX
-       };
-       ///
-       enum Direction {
-               ///
-               FORWARD,
-               ///
-               BACKWARD
-       };
        ///
        ControlCitation(LyXView &, Dialogs &);
-       /// A vector of bibliography keys
-       std::vector<string> const getBibkeys();
+
        /// Returns a reference to the map of stored keys
-       InfoMap const & bibkeysInfo() const { return bibkeysInfo_; }
-       /** Returns the BibTeX data associated with a given key.
-           Empty if no info exists. */
-       string const getBibkeyInfo(string const &);
+       biblio::InfoMap const & bibkeysInfo() const;
+
 private:
-       /// clean-up any daughter class-particular data on hide().
+       /// create the InfoMap of keys and data
+       virtual void setDaughterParams();
+       /// 
        virtual void clearDaughterParams();
+
        /// The info associated with each key
-       InfoMap bibkeysInfo_;
+       biblio::InfoMap bibkeysInfo_;
 };
 
-/** Helper functions, of possible use to all frontends
- */
-
-/** Search a BibTeX info field for the given key and return the
-    associated field. */
-string const parseBibTeX(string data, string const & findkey);
-
-/** Returns an iterator to the first key that meets the search criterion,
-    or end() if unsuccessful.
-
-    User supplies :
-    the controller with the map of bibkeys info,
-    the vector of keys to be searched,
-    the search criterion,
-    an iterator defining the starting point of the search,
-    an enum defining a Simple or Regex search,
-    an enum defining the search direction.
-*/
-
-std::vector<string>::const_iterator
-searchKeys(ControlCitation const & controller,
-          std::vector<string> const & keys_to_search,
-          string const & search_expression,
-          std::vector<string>::const_iterator start,
-          ControlCitation::Search,
-          ControlCitation::Direction,
-          bool caseSensitive=false);
-
-/// Do the dirty work for the search. Should use through the function above
-std::vector<string>::const_iterator
-simpleSearch(ControlCitation const & controller,
-            std::vector<string> const & keys_to_search,
-            string const & search_expression,
-            std::vector<string>::const_iterator start,
-            ControlCitation::Direction,
-            bool caseSensitive=false);
-
-/// Should use through the function above
-std::vector<string>::const_iterator
-regexSearch(ControlCitation const & controller,
-           std::vector<string> const & keys_to_search,
-           string const & search_expression,
-           std::vector<string>::const_iterator start,
-           ControlCitation::Direction);
 #endif // CONTROLCITATION_H
-
-
-
index e296b54a16828e09b5e127dc7f5e8207a194318a..dae63426c165631379a8b0ba6fc415a3e9a38cde 100644 (file)
@@ -36,8 +36,6 @@ private:
        virtual void applyParamsToInset() {}
        /// 
        virtual void applyParamsNoInset() {}
-       /// 
-       virtual void clearDaughterParams() {}
        /// get the parameters from the string passed to createInset.
        virtual string const getParams(string const &) { return string(); }
        /// get the parameters from the inset passed to showInset.
diff --git a/src/frontends/controllers/ControlGraphics.C b/src/frontends/controllers/ControlGraphics.C
new file mode 100644 (file)
index 0000000..41a60e9
--- /dev/null
@@ -0,0 +1,66 @@
+/* This file is part of
+ * ====================================================== 
+ *
+ *           LyX, The Document Processor
+ *
+ *           Copyright 2001 The LyX Team.
+ *
+ * ======================================================
+ *
+ * \file ControlGraphics.C
+ * \author Angus Leeming <a.leeming@ic.ac.uk>
+ */
+
+#include <config.h> 
+
+#ifdef __GNUG__
+#pragma implementation
+#endif 
+
+#include "ControlGraphics.h"
+#include "buffer.h"
+#include "Dialogs.h"
+#include "lyxfunc.h"
+#include "LyXView.h"
+
+#include "insets/insetgraphics.h"
+
+ControlGraphics::ControlGraphics(LyXView & lv, Dialogs & d)
+       : ControlInset<InsetGraphics, InsetGraphicsParams>(lv, d)
+{
+       d_.showGraphics.connect(SigC::slot(this, &ControlGraphics::showInset));
+}
+
+
+LyXView * ControlGraphics::lv() const
+{
+        return &lv_;
+}
+
+
+InsetGraphicsParams const ControlGraphics::getParams(string const &)
+{
+       return InsetGraphicsParams();
+}
+
+
+InsetGraphicsParams const
+ControlGraphics::getParams(InsetGraphics const & inset)
+{
+       return inset.getParams();
+}
+
+
+void ControlGraphics::applyParamsToInset()
+{
+       // Set the parameters in the inset, it also returns true if the new
+       // parameters are different from what was in the inset already.
+       bool changed = inset()->setParams(params());
+       // Tell LyX we've got a change, and mark the document dirty,
+       // if it changed.
+       lv_.view()->updateInset(inset(), changed);
+}
+
+
+void ControlGraphics::applyParamsNoInset()
+{}
diff --git a/src/frontends/controllers/ControlGraphics.h b/src/frontends/controllers/ControlGraphics.h
new file mode 100644 (file)
index 0000000..fac2f28
--- /dev/null
@@ -0,0 +1,49 @@
+/* This file is part of
+ * ====================================================== 
+ *
+ *           LyX, The Document Processor
+ *
+ *           Copyright 2001 The LyX Team.
+ *
+ * ======================================================
+ *
+ * \file ControlGraphics.h
+ * \author Angus Leeming <a.leeming@ic.ac.uk>
+ */
+
+#ifndef CONTROLGRAPHICS_H
+#define CONTROLGRAPHICS_H
+
+#ifdef __GNUG__
+#pragma interface
+#endif 
+
+#include "ControlInset.h"
+#include "insets/insetgraphicsParams.h" // need operator!=()
+
+class InsetGraphics;
+class LyXView;
+
+/** A controller for Graphics dialogs.
+ */
+class ControlGraphics
+       : public ControlInset<InsetGraphics, InsetGraphicsParams> {
+public:
+       ///
+       ControlGraphics(LyXView &, Dialogs &);
+
+       /// The file dialog popup requires a LyXView * ???
+       LyXView * lv() const;
+
+private:
+       /// Dispatch the changed parameters to the kernel.
+       virtual void applyParamsToInset();
+       /// 
+       virtual void applyParamsNoInset();
+       /// get the parameters from the string passed to createInset.
+       virtual InsetGraphicsParams const getParams(string const &);
+       /// get the parameters from the inset passed to showInset.
+       virtual InsetGraphicsParams const getParams(InsetGraphics const &);
+};
+
+#endif // CONTROLGRAPHICS_H
index 06bb86eb4282a1960ba756e66289a84c3f5368b5..137db0bb7a2dd0e1cae30b0eb8e200423bb6f3da 100644 (file)
@@ -35,8 +35,6 @@ private:
        virtual void applyParamsToInset();
        /// Should be used but currently isn't
        virtual void applyParamsNoInset() {}
-       /// not needed.
-       virtual void clearDaughterParams() {}
        /// get the parameters from the string passed to createInset.
        virtual InsetInclude::Params const getParams(string const &)
                { return InsetInclude::Params(); }
diff --git a/src/frontends/controllers/ControlIndex.C b/src/frontends/controllers/ControlIndex.C
new file mode 100644 (file)
index 0000000..176d0ca
--- /dev/null
@@ -0,0 +1,32 @@
+/* This file is part of
+ * ====================================================== 
+ *
+ *           LyX, The Document Processor
+ *
+ *           Copyright 2001 The LyX Team.
+ *
+ * ======================================================
+ *
+ * \file ControlIndex.C
+ * \author Angus Leeming <a.leeming@ic.ac.uk>
+ */
+
+#include <config.h>
+
+#ifdef __GNUG__
+#pragma implementation
+#endif
+
+#include "ControlIndex.h"
+#include "buffer.h"
+#include "Dialogs.h"
+#include "LyXView.h"
+
+using SigC::slot;
+
+ControlIndex::ControlIndex(LyXView & lv, Dialogs & d)
+       : ControlCommand(lv, d, LFUN_INDEX_INSERT)
+{
+       d_.showIndex.connect(slot(this, &ControlIndex::showInset));
+       d_.createIndex.connect(slot(this, &ControlIndex::createInset));
+}
diff --git a/src/frontends/controllers/ControlIndex.h b/src/frontends/controllers/ControlIndex.h
new file mode 100644 (file)
index 0000000..5484536
--- /dev/null
@@ -0,0 +1,31 @@
+/* This file is part of
+ * ====================================================== 
+ *
+ *           LyX, The Document Processor
+ *
+ *           Copyright 2001 The LyX Team.
+ *
+ * ======================================================
+ *
+ * \file ControlIndex.h
+ * \author Angus Leeming <a.leeming@ic.ac.uk>
+ */
+
+#ifndef CONTROLINDEX_H
+#define CONTROLINDEX_H
+
+#ifdef __GNUG__
+#pragma interface
+#endif
+
+#include "ControlCommand.h"
+
+/** A controller for Index dialogs.
+ */
+class ControlIndex : public ControlCommand {
+public:
+       ///
+       ControlIndex(LyXView &, Dialogs &);
+};
+
+#endif // CONTROLINDEX_H
index a8859839e2f34881f1d656b2f7d64e446a953b6b..d7798e4d48e0c765b4d86a74919936fa255aa421 100644 (file)
@@ -36,25 +36,35 @@ protected:
        /// Slot launching dialog to (possibly) create a new inset.
        void createInset(string const &);
        /// Slot launching dialog to an existing inset.
-       void showInset(Inset * inset);
+       void showInset(Inset *);
        /// Allow the daughter methods to access the inset.
        Inset * inset() const;
 
 private:
-       /** These methods are all that the individual daughter classes
+       /** These methods are all that the individual daughter classes
            should need to instantiate. */
 
        /// if the inset exists then do this...
        virtual void applyParamsToInset() = 0;
        /// else this...
        virtual void applyParamsNoInset() = 0;
+
        /// get the parameters from the string passed to createInset.
        virtual Params const getParams(string const &) = 0;
        /// get the parameters from the inset passed to showInset.
        virtual Params const getParams(Inset const &) = 0;
+
+       /** Most derived classes won't need these two, so they default to empty.
+        */
+
+       /// set any daughter class-particular data on show().
+       virtual void setDaughterParams() {}
        /// clean-up any daughter class-particular data on hide().
-       virtual void clearDaughterParams() = 0;
+       virtual void clearDaughterParams() {}
 
+
+
+       
        /// Instantiation of ControlBase virtual methods.
 
        /// Get changed parameters and Dispatch them to the kernel.
@@ -124,6 +134,8 @@ void ControlInset<Inset, Params>::show(Params const & params)
        if (params_) delete params_;
        params_ = new Params(params);
 
+       setDaughterParams();
+
        bc().readOnly(isReadonly());
        view().show();
 }
index 14f1741b685c74c828e6868e5ee3686580b608f2..a7d04285428a132e97ad331ea28c63fb31fc62ea 100644 (file)
 #include "LyXView.h"
 #include "buffer.h"
 
+using std::vector;
 using SigC::slot;
 
 ControlMinipage::ControlMinipage(LyXView & lv, Dialogs & d)
        : ControlInset<InsetMinipage, MinipageParams>(lv, d)
 {
        d_.showMinipage.connect(slot(this, &ControlMinipage::showInset));
+
+       // We could have an extra method updateInset that calls
+       // view().update() rather than view().show(), but I don't see why
+       // it is really needed.
        d_.updateMinipage.connect(slot(this, &ControlMinipage::showInset));
 }
 
@@ -37,6 +42,8 @@ void ControlMinipage::applyParamsToInset()
        inset()->width(params().width);
        inset()->widthp(params().widthp);
        inset()->pos(params().pos);
+
+       lv_.view()->updateInset(inset(), true);
 }
 
 
@@ -68,3 +75,22 @@ bool MinipageParams::operator!=(MinipageParams const & o) const
 {
        return !(*this == o);
 }
+
+namespace minipage {
+
+vector<string> const getUnits()
+{
+       vector<string> units;
+       units.push_back("mm");
+       units.push_back("in");
+       units.push_back("em");
+       units.push_back("\%");
+       units.push_back("\%c");
+       units.push_back("\%l");
+       units.push_back("\%p");
+
+       return units;
+}
+} // namespace minipage
+
index bc7222734d906306d6ac8dedc0ba0bc7ea8408f6..b5ef4fdca509a72a14b5a7a54ccf92209ba0537e 100644 (file)
@@ -15,6 +15,8 @@
 #ifndef CONTROLMINIPAGE_H
 #define CONTROLMINIPAGE_H
 
+#include <vector>
+
 #ifdef __GNUG__
 #pragma interface
 #endif
@@ -59,8 +61,6 @@ private:
        virtual void applyParamsToInset();
        /// 
        virtual void applyParamsNoInset();
-       /// 
-       virtual void clearDaughterParams() {}
        /// get the parameters from the string passed to createInset.
        virtual MinipageParams const getParams(string const &)
                { return MinipageParams(); }
@@ -68,4 +68,11 @@ private:
        virtual MinipageParams const getParams(InsetMinipage const &);
 };
 
+/// Helper functions
+namespace minipage {
+
+       std::vector<string> const getUnits();
+
+} //  namespace minipage
+
 #endif
index 0a125fbe8dfc1047e74558e7fb2ca119dddbe18d..23e5cb1899c3d234897ba7a8e71c8eca4dc1928a 100644 (file)
@@ -33,10 +33,6 @@ public:
        void gotoRef(string const &) const;
        ///
        void gotoBookmark() const;
-
-private:
-       /// not needed.
-       virtual void clearDaughterParams() {}
 };
 
 #endif // CONTROLREF_H
index 194f9535534dd1fc65b5d0446ed657c4065d668e..3b625187a0e73e0e201032f7adf33e7f5c548573 100644 (file)
@@ -38,8 +38,6 @@ public:
 private:
        /// not needed.
        virtual void apply() {}
-       /// 
-       virtual void clearDaughterParams() {}
 };
 
 #endif // CONTROLSEARCH_H
index 6041f021dec3b1d2fbff3688341003fb689fda33..d730e7e9da72227631d3b023da5efad406f81b4c 100644 (file)
@@ -27,10 +27,6 @@ class ControlUrl : public ControlCommand
 public:
        ///
        ControlUrl(LyXView &, Dialogs &);
-
-private:
-       /// not needed.
-       virtual void clearDaughterParams() {}
 };
 
 #endif // CONTROLURL_H
index 3881ec756426e8ac5001aa8d4eeac7520124249e..5cc09a24c6d832f1434dadcdf8e28b59fab8f19a 100644 (file)
@@ -140,6 +140,20 @@ public:
 };
 
 
+/** Specialization for Graphics dialog
+ */
+class ControlGraphics;
+
+template <class GUIview, class GUIbc>
+class GUIGraphics :
+       public GUI<ControlGraphics, GUIview, NoRepeatedApplyReadOnlyPolicy, GUIbc> {
+public:
+       ///
+       GUIGraphics(LyXView & lv, Dialogs & d)
+               : GUI<ControlGraphics, GUIview, NoRepeatedApplyReadOnlyPolicy, GUIbc>(lv, d) {}
+};
+
+
 /** Specialization for Include dialog
  */
 class ControlInclude;
@@ -154,6 +168,20 @@ public:
 };
 
 
+/** Specialization for Index dialog
+ */
+class ControlIndex;
+
+template <class GUIview, class GUIbc>
+class GUIIndex :
+       public GUI<ControlIndex, GUIview, NoRepeatedApplyReadOnlyPolicy, GUIbc> {
+public:
+       ///
+       GUIIndex(LyXView & lv, Dialogs & d)
+               : GUI<ControlIndex, GUIview, NoRepeatedApplyReadOnlyPolicy, GUIbc>(lv, d) {}
+};
+
+
 /** Specialization for Log dialog
  */
 class ControlLog;
@@ -174,11 +202,11 @@ class ControlMinipage;
 
 template <class GUIview, class GUIbc>
 class GUIMinipage :
-       public GUI<ControlMinipage, GUIview, OkApplyCancelReadOnlyPolicy, GUIbc> {
+       public GUI<ControlMinipage, GUIview, NoRepeatedApplyReadOnlyPolicy, GUIbc> {
 public:
        ///
        GUIMinipage(LyXView & lv, Dialogs & d)
-               : GUI<ControlMinipage, GUIview, OkApplyCancelReadOnlyPolicy, GUIbc>(lv, d) {}
+               : GUI<ControlMinipage, GUIview, NoRepeatedApplyReadOnlyPolicy, GUIbc>(lv, d) {}
 };
 
 
index 7a6784312d7b6111bb65303626795c6708da1349..31fcca7986f0ea5ffed54b4f6803ef9fa3fad2b7 100644 (file)
@@ -10,6 +10,10 @@ LIBS =
 SUBDIRS = 
 ETAGS_ARGS = --lang=c++
 libcontrollers_la_SOURCES=\
+       biblio.C \
+       biblio.h \
+       character.C \
+       character.h \
        ButtonController.C \
        ButtonController.h \
        ButtonPolicies.C \
@@ -35,8 +39,12 @@ libcontrollers_la_SOURCES=\
        ControlDialogs.h \
        ControlError.h \
        ControlError.C \
+       ControlGraphics.h \
+       ControlGraphics.C \
        ControlInclude.C \
        ControlInclude.h \
+       ControlIndex.C \
+       ControlIndex.h \
        ControlInset.h \
        ControlLog.C \
        ControlLog.h \
diff --git a/src/frontends/controllers/biblio.C b/src/frontends/controllers/biblio.C
new file mode 100644 (file)
index 0000000..984bccf
--- /dev/null
@@ -0,0 +1,327 @@
+/* This file is part of
+ * ====================================================== 
+ *
+ *           LyX, The Document Processor
+ *
+ *           Copyright 2001 The LyX Team.
+ *
+ * ======================================================
+ *
+ * \file biblio.C
+ * \author Angus Leeming <a.leeming@ic.ac.uk>
+ */
+
+#include <vector>
+#include <algorithm>
+
+#ifdef __GNUG__
+#pragma implementation
+#endif
+
+#include <config.h>
+
+/*
+#include "buffer.h"
+#include "Dialogs.h"
+#include "LyXView.h"
+*/
+#include "LString.h"
+#include "biblio.h"
+#include "helper_funcs.h"
+#include "support/lstrings.h"
+#include "support/LAssert.h"
+#include "support/LRegex.h"
+
+using std::find;
+using std::min;
+using std::pair;
+using std::vector;
+using std::sort;
+
+namespace biblio 
+{
+
+
+// A functor for use with std::sort, leading to case insensitive sorting
+struct compareNoCase: public std::binary_function<string, string, bool> 
+{
+       bool operator()(string const & s1, string const & s2) const {
+               return compare_no_case(s1, s2) < 0;
+       }
+};
+
+vector<string> const getKeys(InfoMap const & map)
+{
+       vector<string> bibkeys;
+
+
+       typedef std::map<string, string>::value_type InfoMapValue;
+
+       for (InfoMap::const_iterator it = map.begin(); it != map.end(); ++it) {
+               bibkeys.push_back(it->first);
+       }
+
+       sort(bibkeys.begin(), bibkeys.end(), compareNoCase());
+       return bibkeys;
+}
+
+
+string const getInfo(InfoMap const & map, string const & key)
+{
+       Assert(!map.empty());
+
+       string result;
+
+               InfoMap::const_iterator it = map.find(key);
+       if (it != map.end()) {
+               // Search for all possible "required" keys
+               string author = parseBibTeX(it->second, "author");
+               if (author.empty())
+                       author = parseBibTeX(it->second, "editor");
+
+               string year       = parseBibTeX(it->second, "year");
+               string title      = parseBibTeX(it->second, "title");
+               string booktitle  = parseBibTeX(it->second, "booktitle");
+               string chapter    = parseBibTeX(it->second, "chapter");
+               string pages      = parseBibTeX(it->second, "pages");
+
+               string media      = parseBibTeX(it->second, "journal");
+               if (media.empty())
+                       media = parseBibTeX(it->second, "publisher");
+               if (media.empty())
+                       media = parseBibTeX(it->second, "school");
+               if (media.empty())
+                       media = parseBibTeX(it->second, "institution");
+
+               result = author;
+               if (!year.empty())
+                       result += ", " + year;
+               if (!title.empty())
+                       result += ", " + title;
+               if (!booktitle.empty())
+                       result += ", in " + booktitle;
+               if (!chapter.empty())
+                       result += ", Ch. " + chapter;
+               if (!media.empty())
+                       result += ", " + media;
+               if (!pages.empty())
+                       result += ", pp. " + pages;
+
+               if (result.empty()) // not a BibTeX record
+                       result = it->second;
+       }
+
+       return result;
+}
+
+vector<string>::const_iterator
+searchKeys(InfoMap const & theMap,
+          vector<string> const & keys,
+          string const & expr,
+          vector<string>::const_iterator start,
+          Search type,
+          Direction dir,
+          bool caseSensitive)
+{
+       // Preliminary checks
+       if(start < keys.begin() || start >= keys.end())
+               return keys.end();
+       
+       string search_expr = frontStrip(strip(expr));
+       if (search_expr.empty())
+               return start;
+
+       if (type == SIMPLE)
+               return simpleSearch(theMap, keys, search_expr, start, dir,
+                                   caseSensitive);
+
+       return regexSearch(theMap, keys, search_expr, start, dir);
+}
+
+
+vector<string>::const_iterator
+simpleSearch(InfoMap const & theMap,
+            vector<string> const & keys,
+            string const & expr,
+            vector<string>::const_iterator start,
+            Direction dir,
+            bool caseSensitive)
+{
+       vector<string> searchwords = getVectorFromString(expr, " ");
+
+       // Loop over all keys from start...
+       for (vector<string>::const_iterator it = start;
+            // End condition is direction-dependent.
+            (dir == FORWARD) ? (it<keys.end()) : (it>=keys.begin());
+            // increment is direction-dependent.
+            (dir == FORWARD) ? (++it) : (--it)) {
+
+               string data = (*it);
+               biblio::InfoMap::const_iterator info = theMap.find(*it);
+               if (info != theMap.end())
+                       data += " " + info->second;
+               if (!caseSensitive)
+                       data = lowercase(data);
+
+               bool found = true;
+
+               // Loop over all search words...
+               if (caseSensitive) {
+                       for (vector<string>::const_iterator sit=
+                                    searchwords.begin();
+                            sit<searchwords.end(); ++sit) {
+                               if (data.find(*sit) == string::npos) {
+                                       found = false;
+                                       break;
+                               }
+                       }
+               } else {
+                       for (vector<string>::const_iterator sit=
+                                    searchwords.begin();
+                            sit<searchwords.end(); ++sit) {
+                               if (data.find(lowercase(*sit)) ==
+                                   string::npos) {
+                                       found = false;
+                                       break;
+                               }
+                       }
+               }
+               
+               if (found) return it;
+       }
+
+       return keys.end();
+}
+
+
+vector<string>::const_iterator
+regexSearch(InfoMap const & theMap,
+           vector<string> const & keys,
+           string const & expr,
+           vector<string>::const_iterator start,
+           Direction dir)
+{
+       LRegex reg(expr);
+
+       for (vector<string>::const_iterator it = start;
+            // End condition is direction-dependent.
+            (dir == FORWARD) ? (it<keys.end()) : (it>=keys.begin());
+            // increment is direction-dependent.
+            (dir == FORWARD) ? (++it) : (--it)) {
+
+               string data = (*it);
+               biblio::InfoMap::const_iterator info = theMap.find(*it);
+               if (info != theMap.end())
+                       data += " " + info->second;
+
+               if (reg.exec(data).size() > 0)
+                       return it;
+       }
+
+       return keys.end();
+}
+
+string const parseBibTeX(string data, string const & findkey)
+{
+       string keyvalue;
+       
+       for (string::iterator it=data.begin(); it<data.end(); ++it) {
+               if ((*it) == '\n' || (*it) == '\t')
+                       (*it)= ' ';
+       }
+       
+       data = frontStrip(data);
+       while (!data.empty() && data[0] != '=' && 
+              (data.find(' ') != string::npos || data.find('=') != string::npos)) {
+
+               string::size_type keypos = min(data.find(' '), data.find('='));
+               string key = lowercase(data.substr(0, keypos));
+      
+               data = data.substr(keypos, data.length()-1);
+               data = frontStrip(strip(data));
+               if (data.length() > 1 && data[0]=='=') {
+                       data = frontStrip(data.substr(1, data.length()-1));
+                       if (!data.empty()) {
+                               keypos = 1;
+                               string value;
+                               char enclosing;
+
+                               if (data[0]=='{') {
+                                       enclosing = '}';
+                               } else if (data[0]=='"') {
+                                       enclosing = '"';
+                               } else {
+                                       keypos=0;
+                                       enclosing=' ';
+                               }
+
+                               if (keypos &&
+                                   data.find(enclosing)!=string::npos &&
+                                   data.length()>1) {
+                                       string tmp = data.substr(keypos,
+                                                                data.length()-1);
+                                       while (tmp.find('{') != string::npos &&
+                                              tmp.find('}') != string::npos &&
+                                              tmp.find('{') < tmp.find('}') &&
+                                              tmp.find('{') < tmp.find(enclosing)) {
+
+                                               keypos += tmp.find('{')+1;
+                                               tmp = data.substr(keypos,
+                                                                 data.length()-1);
+                                               keypos += tmp.find('}')+1;
+                                               tmp = data.substr(keypos,
+                                                                 data.length()-1);
+                                       }
+
+                                       if (tmp.find(enclosing)==string::npos)
+                                               return keyvalue;
+                                       else {
+                                               keypos += tmp.find(enclosing);
+                                               tmp = data.substr(keypos,
+                                                                 data.length()-1);
+                                       }
+
+                                       value = data.substr(1, keypos-1);
+
+                                       if (keypos+1<data.length()-1)
+                                               data = frontStrip(data.substr(keypos+1, data.length()-1));
+                                       else
+                                               data = "";
+
+                               } else if (!keypos &&
+                                          (data.find(' ') ||
+                                           data.find(','))) {
+                                       keypos = data.length()-1;
+                                       if (data.find(' ') != string::npos)
+                                               keypos = data.find(' ');
+                                       if (data.find(',') != string::npos &&
+                                           keypos > data.find(','))
+                                               keypos = data.find(',');
+
+                                       value = data.substr(0, keypos);
+                 
+                                       if (keypos+1<data.length()-1)
+                                               data = frontStrip(data.substr(keypos+1, data.length()-1));
+                                       else
+                                               data = "";
+                               }
+                               else
+                                       return keyvalue;
+
+                               if (findkey == key) {
+                                       keyvalue = value;
+                                       return keyvalue;
+                               } 
+
+                               data = frontStrip(frontStrip(data,','));
+                       }
+               }
+               else return keyvalue;
+       }
+       return keyvalue;
+}
+
+
+} // namespace biblio 
+
diff --git a/src/frontends/controllers/biblio.h b/src/frontends/controllers/biblio.h
new file mode 100644 (file)
index 0000000..4b163ee
--- /dev/null
@@ -0,0 +1,96 @@
+/* This file is part of
+ * ====================================================== 
+ *
+ *           LyX, The Document Processor
+ *
+ *           Copyright 2001 The LyX Team.
+ *
+ * ======================================================
+ *
+ * \file biblio.h
+ * \author Angus Leeming <a.leeming@ic.ac.uk>
+ */
+
+#ifndef BIBLIOHELPERS_H
+#define BIBLIOHELPERS_H
+
+#include <map>
+
+#ifdef __GNUG__
+#pragma interface
+#endif
+
+/** Functions of use to citation and bibtex GUI controllers and views */
+namespace biblio 
+{
+       ///
+       enum Search {
+               ///
+               SIMPLE,
+               ///
+               REGEX
+       };
+       ///
+       enum Direction {
+               ///
+               FORWARD,
+               ///
+               BACKWARD
+       };
+
+       /// First entry is the bibliography key, second the data
+       typedef std::map<string, string> InfoMap;
+
+       /// Returns a vector of bibliography keys
+       std::vector<string> const getKeys(InfoMap const &);
+
+       /** Returns the BibTeX data associated with a given key.
+           Empty if no info exists. */
+       string const getInfo(InfoMap const &, string const &);
+
+       /** Search a BibTeX info field for the given key and return the
+           associated field. */
+       string const parseBibTeX(string data, string const & findkey);
+
+       /** Returns an iterator to the first key that meets the search
+           criterion, or end() if unsuccessful.
+
+           User supplies :
+           the InfoMap of bibkeys info,
+           the vector of keys to be searched,
+           the search criterion,
+           an iterator defining the starting point of the search,
+           an enum defining a Simple or Regex search,
+           an enum defining the search direction.
+       */
+
+       std::vector<string>::const_iterator
+           searchKeys(InfoMap const & map,
+                      std::vector<string> const & keys_to_search,
+                      string const & search_expression,
+                      std::vector<string>::const_iterator start,
+                      Search,
+                      Direction,
+                      bool caseSensitive=false);
+
+       /** Do the dirty work for the search.
+           Should use through the function above */
+       std::vector<string>::const_iterator
+           simpleSearch(InfoMap const & map,
+                        std::vector<string> const & keys_to_search,
+                        string const & search_expression,
+                        std::vector<string>::const_iterator start,
+                        Direction,
+                        bool caseSensitive=false);
+
+       /// Should use through the function above
+       std::vector<string>::const_iterator
+           regexSearch(InfoMap const & map,
+                       std::vector<string> const & keys_to_search,
+                       string const & search_expression,
+                       std::vector<string>::const_iterator start,
+                       Direction);
+
+} // namespace biblio 
+
+#endif // BIBLIOHELPERS_H
diff --git a/src/frontends/controllers/character.C b/src/frontends/controllers/character.C
new file mode 100644 (file)
index 0000000..750f210
--- /dev/null
@@ -0,0 +1,195 @@
+/* This file is part of
+ * ====================================================== 
+ *
+ *           LyX, The Document Processor
+ *
+ *           Copyright 2001 The LyX Team.
+ *
+ * ======================================================
+ *
+ * \file character.h
+ * \author Angus Leeming <a.leeming@ic.ac.uk>
+ */
+
+#include <config.h>
+#include <vector>
+
+#ifdef __GNUG__
+#pragma implementation
+#endif
+
+#include "character.h"
+
+using std::vector;
+
+namespace character {
+
+vector<FamilyPair> const getFamilyData()
+{
+       vector<FamilyPair> family(5);
+
+       FamilyPair pr;
+       pr.first = _("No change");  pr.second = LyXFont::IGNORE_FAMILY;
+       family[0] = pr;
+       pr.first = _("Roman");      pr.second = LyXFont::ROMAN_FAMILY;
+       family[1] = pr;
+       pr.first = _("Sans Serif"); pr.second = LyXFont::SANS_FAMILY;
+       family[2] = pr;
+       pr.first = _("Typewriter"); pr.second = LyXFont::TYPEWRITER_FAMILY;
+       family[3] = pr;
+       pr.first = _("Reset");      pr.second = LyXFont::INHERIT_FAMILY;
+       family[4] = pr;
+
+       return family;
+}
+
+
+vector<SeriesPair> const getSeriesData()
+{
+       vector<SeriesPair> series(4);
+
+       SeriesPair pr;
+       pr.first = _("No change"); pr.second = LyXFont::IGNORE_SERIES;
+       series[0] = pr;
+       pr.first = _("Medium");    pr.second = LyXFont::MEDIUM_SERIES;
+       series[1] = pr;
+       pr.first = _("Bold");      pr.second = LyXFont::BOLD_SERIES;
+       series[2] = pr;
+       pr.first = _("Reset");     pr.second = LyXFont::INHERIT_SERIES;
+       series[3] = pr;
+       
+       return series;
+}
+
+
+vector<ShapePair> const getShapeData()
+{
+       vector<ShapePair> shape(6);
+
+       ShapePair pr;
+       pr.first = _("No change");  pr.second = LyXFont::IGNORE_SHAPE;
+       shape[0] = pr;
+       pr.first = _("Upright");    pr.second = LyXFont::UP_SHAPE;
+       shape[1] = pr;
+       pr.first = _("Italic");     pr.second = LyXFont::ITALIC_SHAPE;
+       shape[2] = pr;
+       pr.first = _("Slanted");    pr.second = LyXFont::SLANTED_SHAPE;
+       shape[3] = pr;
+       pr.first = _("Small Caps"); pr.second = LyXFont::SMALLCAPS_SHAPE;
+       shape[4] = pr;
+       pr.first = _("Reset");      pr.second = LyXFont::INHERIT_SHAPE;
+       shape[5] = pr;
+       
+       return shape;
+}
+
+
+vector<SizePair> const getSizeData()
+{
+       vector<SizePair> size(14);
+
+       SizePair pr;
+       pr.first = _("No change"); pr.second = LyXFont::IGNORE_SIZE;
+       size[0] = pr;
+       pr.first = _("Tiny");      pr.second = LyXFont::SIZE_TINY;
+       size[1] = pr;
+       pr.first = _("Smallest");  pr.second = LyXFont::SIZE_SCRIPT;
+       size[2] = pr;
+       pr.first = _("Smaller");   pr.second = LyXFont::SIZE_FOOTNOTE;
+       size[3] = pr;
+       pr.first = _("Small");     pr.second = LyXFont::SIZE_SMALL;
+       size[4] = pr;
+       pr.first = _("Normal");    pr.second = LyXFont::SIZE_NORMAL;
+       size[5] = pr;
+       pr.first = _("Large");     pr.second = LyXFont::SIZE_LARGE;
+       size[6] = pr;
+       pr.first = _("Larger");    pr.second = LyXFont::SIZE_LARGER;
+       size[7] = pr;
+       pr.first = _("Largest");   pr.second = LyXFont::SIZE_LARGEST;
+       size[8] = pr;
+       pr.first = _("Huge");      pr.second = LyXFont::SIZE_HUGE;
+       size[9] = pr;
+       pr.first = _("Huger");     pr.second = LyXFont::SIZE_HUGER;
+       size[10] = pr;
+       pr.first = _("Increase");  pr.second = LyXFont::INCREASE_SIZE;
+       size[11] = pr;
+       pr.first = _("Decrease");  pr.second = LyXFont::DECREASE_SIZE;
+       size[12] = pr;
+       pr.first = _("Reset");     pr.second = LyXFont::INHERIT_SIZE;
+       size[13] = pr;
+       
+       return size;
+}
+
+
+vector<BarPair> const getBarData()
+{
+       vector<BarPair> bar(6);
+
+       BarPair pr;
+       pr.first = _("No change");  pr.second = IGNORE;
+       bar[0] = pr;
+       pr.first = _("Emph");       pr.second = EMPH_TOGGLE;
+       bar[1] = pr;
+       pr.first = _("Underbar");   pr.second = UNDERBAR_TOGGLE;
+       bar[2] = pr;
+       pr.first = _("Noun");       pr.second = NOUN_TOGGLE;
+       bar[3] = pr;
+       pr.first = _("LaTeX mode"); pr.second = LATEX_TOGGLE;
+       bar[4] = pr;
+       pr.first = _("Reset");      pr.second = INHERIT;
+       bar[5] = pr;
+       
+       return bar;
+}
+
+
+vector<ColorPair> const getColorData()
+{
+       vector<ColorPair> color(11);
+
+       ColorPair pr;
+       pr.first = _("No change"); pr.second = LColor::ignore;
+       color[0] = pr;
+       pr.first = _("No color");  pr.second = LColor::none;
+       color[1] = pr;
+       pr.first = _("Black");     pr.second = LColor::black;
+       color[2] = pr;
+       pr.first = _("White");     pr.second = LColor::white;
+       color[3] = pr;
+       pr.first = _("Red");       pr.second = LColor::red;
+       color[4] = pr;
+       pr.first = _("Green");     pr.second = LColor::green;
+       color[5] = pr;
+       pr.first = _("Blue");      pr.second = LColor::blue;
+       color[6] = pr;
+       pr.first = _("Cyan");      pr.second = LColor::cyan;
+       color[7] = pr;
+       pr.first = _("Magenta");   pr.second = LColor::magenta;
+       color[8] = pr;
+       pr.first = _("Yellow");    pr.second = LColor::yellow;
+       color[9] = pr;
+       pr.first = _("Reset");     pr.second = LColor::inherit;
+       color[10] = pr;
+       
+       return color;
+}
+
+
+vector<string> const getLanguageData()
+{
+       vector<string> langs(languages.size() + 2);
+
+       langs[0] = _("No change");
+       langs[1] = _("Reset");
+
+       vector<string>::size_type i = 1;
+       for (Languages::const_iterator cit = languages.begin(); 
+            cit != languages.end(); ++cit) {
+               langs[++i] = cit->second.lang();
+       }
+
+       return langs;
+}
+} // namespace character
diff --git a/src/frontends/controllers/character.h b/src/frontends/controllers/character.h
new file mode 100644 (file)
index 0000000..04f2e7b
--- /dev/null
@@ -0,0 +1,73 @@
+/* This file is part of
+ * ====================================================== 
+ *
+ *           LyX, The Document Processor
+ *
+ *           Copyright 2001 The LyX Team.
+ *
+ * ======================================================
+ *
+ * \file character.h
+ * \author Angus Leeming <a.leeming@ic.ac.uk>
+ */
+
+#ifndef CHARACTERHELPERS_H
+#define CHARACTERHELPERS_H
+
+#ifdef __GNUG__
+#pragma interface
+#endif
+
+#include "lyxfont.h"
+#include "LColor.h"
+#include "character.h"
+
+/** Functions of use to the character GUI controller and view */
+namespace character {
+       ///
+       enum FONT_STATE {
+               ///
+               IGNORE,
+               ///
+               EMPH_TOGGLE,
+               ///
+               UNDERBAR_TOGGLE,
+               ///
+               NOUN_TOGGLE,
+               ///
+               LATEX_TOGGLE,
+               ///
+               INHERIT
+       };
+
+       ///
+       typedef std::pair<string, LyXFont::FONT_FAMILY> FamilyPair;
+       ///
+       typedef std::pair<string, LyXFont::FONT_SERIES> SeriesPair;
+       ///
+       typedef std::pair<string, LyXFont::FONT_SHAPE>  ShapePair;
+       ///
+       typedef std::pair<string, LyXFont::FONT_SIZE>   SizePair;
+       ///
+       typedef std::pair<string, FONT_STATE> BarPair;
+       ///
+       typedef std::pair<string, LColor::color> ColorPair;
+
+       ///
+       std::vector<FamilyPair> const getFamilyData();
+       ///
+       std::vector<SeriesPair> const getSeriesData();
+       ///
+       std::vector<ShapePair>  const getShapeData();
+       ///
+       std::vector<SizePair>   const getSizeData();
+       ///
+       std::vector<BarPair>    const getBarData();
+       ///
+       std::vector<ColorPair>  const getColorData();
+       ///
+       std::vector<string> const getLanguageData();
+
+} // namespace character
+
+#endif // CHARACTERHELPERS