]> git.lyx.org Git - lyx.git/commitdiff
Text encoding hack and removal of cited-keys searching
authorJohn Spray <spray@lyx.org>
Tue, 6 Jun 2006 17:47:28 +0000 (17:47 +0000)
committerJohn Spray <spray@lyx.org>
Tue, 6 Jun 2006 17:47:28 +0000 (17:47 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@14023 a592a061-630c-0410-9148-cb99ea01b6c8

src/frontends/gtk/ChangeLog
src/frontends/gtk/GCitation.C
src/frontends/gtk/GCitation.h
src/frontends/gtk/glade/citation.glade

index 30521acbfd8dd9bde767e6ca93d3cce7a96eadec..13cee8b3d90967543ab329fa899955c63f978a58 100644 (file)
@@ -1,6 +1,9 @@
 2006-06-06  John Spray <spray@lyx.org>
        * Alert_pimpl.C: escape special characters in strings before 
          passing them to Gtk::Dialog as markup
+       * GCitation.[Ch]: text encoding hack to avoid crashing with
+               special characters in bibtex database.  Simplify UI by removing
+               searching in cited keys.
 
 2006-04-19  Bernhard Reiter <ockham@gmx.net>
        * GExternal.[Ch], glade/external.glade: implement external dialog
index 292ef9e0bfd792f8df3bd3e0e3b8e706fc36502c..e49b33beb520d1a49ec97201b934ffbdaa3d99b1 100644 (file)
@@ -98,8 +98,6 @@ void GCitation::doBuild()
        xml_->get_widget("Info", infoview_);
        xml_->get_widget("CaseSensitive", casecheck_);
 
-       xml_->get_widget("SearchCite", citeradio_);
-       xml_->get_widget("SearchBib", bibradio_);
        xml_->get_widget("SearchString", findentry_);
        xml_->get_widget("CaseSensitive", casecheck_);
        xml_->get_widget("RegularExpression", regexpcheck_);
@@ -149,10 +147,6 @@ void GCitation::doBuild()
        forwardbutton_->signal_clicked().connect(
                sigc::mem_fun(*this, &GCitation::next));
 
-       bibradio_->signal_toggled().connect(
-               sigc::mem_fun(*this, &GCitation::set_search_buttons));
-       citeradio_->signal_toggled().connect(
-               sigc::mem_fun(*this, &GCitation::set_search_buttons));
        findentry_->signal_changed().connect(
                sigc::mem_fun(*this, &GCitation::set_search_buttons));
 
@@ -279,11 +273,13 @@ void GCitation::update_contents()
                cit != bibkeys.end(); ++cit) {
 
                Gtk::TreeModel::iterator iter = allListStore_->append();
-               (*iter)[bibColumns.name] = Glib::locale_to_utf8(*cit);
+               // ENCODING, FIXME: assuming ISO-8859 only for key name and info fields
+               // This is a hack to avoid a crash when populating the dialog from bibtex
+               // files containing non-ASCII characters.
+               (*iter)[bibColumns.name] = Glib::convert(*cit, "UTF-8", "ISO-8859-1");
                (*iter)[bibColumns.cite] = false; //reset state
                (*iter)[bibColumns.bib_order] = ++bib_order;
-               (*iter)[bibColumns.info] = Glib::locale_to_utf8(
-                       biblio::getInfo(theMap,*cit));
+               (*iter)[bibColumns.info] = Glib::convert(biblio::getInfo(theMap,*cit), "UTF-8", "ISO-8859-1");
        }
 
        // Now mark cite keys by setting their bibColumns.cite property to true
@@ -309,11 +305,11 @@ void GCitation::update_contents()
                        // working on a document away from the bibtex file
                        // we should keep it anyway.
                        Gtk::TreeModel::iterator iter = allListStore_->append();
-                       (*iter)[bibColumns.name] = Glib::locale_to_utf8(*ccit);
+                       (*iter)[bibColumns.name] = Glib::convert(*ccit, "UTF-8", "ISO-8859-1");
                        (*iter)[bibColumns.cite] = true;
                        (*iter)[bibColumns.bib_order] = ++bib_order;
-                       (*iter)[bibColumns.info] = Glib::locale_to_utf8(
-                               biblio::getInfo(theMap,*ccit));
+                       (*iter)[bibColumns.info] = Glib::convert(
+                               biblio::getInfo(theMap,*ccit), "UTF-8", "ISO-8859-1");
                }
        }
 }
@@ -540,7 +536,9 @@ void GCitation::apply()
        for (Gtk::TreeModel::const_iterator cit=children.begin();
                cit!=children.end(); ++cit) {
 
-               string item(support::trim(Glib::locale_from_utf8((*cit)[bibColumns.name])));
+               string item(support::trim(Glib::convert(
+                       static_cast<Glib::ustring>((*cit)[bibColumns.name]),
+                       "ISO-8859-1", "UTF-8")));
                if (item.empty())
                        continue;
                if (i++ > 0)
@@ -567,106 +565,75 @@ void GCitation::find(biblio::Direction dir)
 
        vector<string>::const_iterator start;
 
-       bool search_cite = citeradio_->get_active();
        bool const casesens = casecheck_->get_active();
        string const str = Glib::locale_from_utf8(findentry_->get_text());
 
        Gtk::TreeModel::iterator iter;
        Gtk::TreeModel::Children::difference_type sel = 0;
 
-       if (search_cite) {
-               for (iter = (citeFilter_->children()).begin();
-                       iter != (citeFilter_->children()).end(); ++iter) {
-
-                       bibkeys.push_back(Glib::locale_from_utf8(
-                               (*iter)[bibColumns.name]));
-               }
-
-               iter = citeselection_->get_selected();
-               if (iter)
-                       sel = std::distance((citeFilter_->children()).begin(), iter);
-       } else {
-               for (iter = (bibFilter_->children()).begin();
-                       iter != (bibFilter_->children()).end(); ++iter) {
-
-                       bibkeys.push_back(Glib::locale_from_utf8(
-                               (*iter)[bibColumns.name]));
-               }
+       for (iter = (bibFilter_->children()).begin();
+               iter != (bibFilter_->children()).end(); ++iter) {
 
-               iter = bibselection_->get_selected();
-               if (iter)
-                       sel = std::distance(
-                               (bibFilter_->children()).begin(), iter);
+               bibkeys.push_back(Glib::locale_from_utf8(
+                       (*iter)[bibColumns.name]));
        }
 
+       iter = bibselection_->get_selected();
+       if (iter)
+               sel = std::distance(
+                       (bibFilter_->children()).begin(), iter);
+
        start = bibkeys.begin();
 
        if (sel >= 0 &&
                Gtk::TreeModel::Children::size_type(sel) < bibkeys.size())
                        std::advance(start, sel);
 
-       bool is_cite = !search_cite;
-       while(is_cite != search_cite) {
+       // Find the NEXT instance...
+       if (dir == biblio::FORWARD)
+               ++start;
 
-               // Find the NEXT instance...
-               if (dir == biblio::FORWARD)
-                       ++start;
+       vector<string>::const_iterator cit =
+               biblio::searchKeys(theMap, bibkeys, str,
+                          start, type, dir, casesens);
 
-               vector<string>::const_iterator cit =
-                       biblio::searchKeys(theMap, bibkeys, str,
-                                  start, type, dir, casesens);
-
-               if (cit == bibkeys.end()) {
-                       if (dir == biblio::FORWARD) {
-                               start = bibkeys.begin();
-                       }
-                       else {
-                               start = bibkeys.end();
-                               --start;
-                       }
+       if (cit == bibkeys.end()) {
+               if (dir == biblio::FORWARD) {
+                       start = bibkeys.begin();
+               }
+               else {
+                       start = bibkeys.end();
+                       --start;
+               }
 
-                       cit = biblio::searchKeys(theMap, bibkeys, str,
-                                start, type, dir, casesens);
+               cit = biblio::searchKeys(theMap, bibkeys, str,
+                        start, type, dir, casesens);
 
-                       if (cit == bibkeys.end()) {
-                               return;
-                       }
-               }
-               vector<string>::const_iterator bibstart = bibkeys.begin();
-               vector<string>::difference_type const found =
-                       std::distance(bibstart, cit);
-               if (found == sel)
+               if (cit == bibkeys.end()) {
                        return;
-
-               start = cit;
-               if (search_cite)
-                       iter = (citeFilter_->children()).begin();
-               else
-                       iter = (bibFilter_->children()).begin();
-               std::advance(iter, found);
-               is_cite = (*iter)[bibColumns.cite];
+               }
        }
+       vector<string>::const_iterator bibstart = bibkeys.begin();
+       vector<string>::difference_type const found =
+               std::distance(bibstart, cit);
+       if (found == sel)
+               return;
+
+       start = cit;
+       iter = (bibFilter_->children()).begin();
+       std::advance(iter, found);
 
        // Highlight and scroll to the key that was found
-       if (search_cite) {
-               citeselection_->select(iter);
-               citekeysview_->set_cursor(Gtk::TreePath(iter));
-               citekeysview_->scroll_to_row(Gtk::TreePath(iter));
-               cite_selected();
-       } else {
-               bibselection_->select(iter);
-               bibkeysview_->set_cursor(Gtk::TreePath(iter));
-               bibkeysview_->scroll_to_row(Gtk::TreePath(iter));
-               bib_selected();
-       }
+       bibselection_->select(iter);
+       bibkeysview_->set_cursor(Gtk::TreePath(iter));
+       bibkeysview_->scroll_to_row(Gtk::TreePath(iter));
+       bib_selected();
 }
 
 void GCitation::set_search_buttons()
 {
-       bool val = findentry_->get_text_length() && (
-               (citeradio_->get_active() && !(citeFilter_->children()).empty())
-               || (bibradio_->get_active() && !(bibFilter_->children()).empty())
-               );
+       bool val = findentry_->get_text_length()
+               && !(bibFilter_->children()).empty();
        backbutton_->set_sensitive(val);
        forwardbutton_->set_sensitive(val);
 }
index 5b71b8993eea42096b89638e0850f5d25fd1fb9e..6c5615159d0072bd5989b0d8e3b91fd546750d57 100644 (file)
@@ -108,8 +108,6 @@ private:
        Gtk::TextView * infoview_;
 
        Gtk::Entry * findentry_;
-       Gtk::CheckButton * citeradio_;
-       Gtk::CheckButton * bibradio_;
        Gtk::CheckButton * casecheck_;
        Gtk::CheckButton * regexpcheck_;
 
index 2608b4d8babbb53faaa3a7d705317f4bd1e1a384..b192261e2ebaf25196fff62f60786c361d30713e 100644 (file)
              <property name="visible">True</property>
              <property name="can_default">True</property>
              <property name="can_focus">True</property>
-             <property name="label">gtk-undo</property>
-             <property name="use_stock">True</property>
              <property name="relief">GTK_RELIEF_NORMAL</property>
              <property name="focus_on_click">True</property>
              <property name="response_id">0</property>
+
+             <child>
+               <widget class="GtkAlignment" id="alignment19">
+                 <property name="visible">True</property>
+                 <property name="xalign">0.5</property>
+                 <property name="yalign">0.5</property>
+                 <property name="xscale">0</property>
+                 <property name="yscale">0</property>
+                 <property name="top_padding">0</property>
+                 <property name="bottom_padding">0</property>
+                 <property name="left_padding">0</property>
+                 <property name="right_padding">0</property>
+
+                 <child>
+                   <widget class="GtkHBox" id="hbox10">
+                     <property name="visible">True</property>
+                     <property name="homogeneous">False</property>
+                     <property name="spacing">2</property>
+
+                     <child>
+                       <widget class="GtkImage" id="image1">
+                         <property name="visible">True</property>
+                         <property name="stock">gtk-undo</property>
+                         <property name="icon_size">4</property>
+                         <property name="xalign">0.5</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">0</property>
+                         <property name="ypad">0</property>
+                       </widget>
+                       <packing>
+                         <property name="padding">0</property>
+                         <property name="expand">False</property>
+                         <property name="fill">False</property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkLabel" id="label25">
+                         <property name="visible">True</property>
+                         <property name="label">R_evert</property>
+                         <property name="use_underline">True</property>
+                         <property name="use_markup">False</property>
+                         <property name="justify">GTK_JUSTIFY_LEFT</property>
+                         <property name="wrap">False</property>
+                         <property name="selectable">False</property>
+                         <property name="xalign">0.5</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">0</property>
+                         <property name="ypad">0</property>
+                         <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+                         <property name="width_chars">-1</property>
+                         <property name="single_line_mode">False</property>
+                         <property name="angle">0</property>
+                       </widget>
+                       <packing>
+                         <property name="padding">0</property>
+                         <property name="expand">False</property>
+                         <property name="fill">False</property>
+                       </packing>
+                     </child>
+                   </widget>
+                 </child>
+               </widget>
+             </child>
            </widget>
          </child>
 
                          <property name="homogeneous">False</property>
                          <property name="spacing">0</property>
 
-                         <child>
-                           <widget class="GtkRadioButton" id="SearchCite">
-                             <property name="visible">True</property>
-                             <property name="can_focus">True</property>
-                             <property name="label" translatable="yes">S_elected keys</property>
-                             <property name="use_underline">True</property>
-                             <property name="relief">GTK_RELIEF_NORMAL</property>
-                             <property name="focus_on_click">True</property>
-                             <property name="active">False</property>
-                             <property name="inconsistent">False</property>
-                             <property name="draw_indicator">True</property>
-                           </widget>
-                           <packing>
-                             <property name="padding">0</property>
-                             <property name="expand">False</property>
-                             <property name="fill">False</property>
-                           </packing>
-                         </child>
-
-                         <child>
-                           <widget class="GtkRadioButton" id="SearchBib">
-                             <property name="visible">True</property>
-                             <property name="can_focus">True</property>
-                             <property name="label" translatable="yes">A_vailable keys</property>
-                             <property name="use_underline">True</property>
-                             <property name="relief">GTK_RELIEF_NORMAL</property>
-                             <property name="focus_on_click">True</property>
-                             <property name="active">False</property>
-                             <property name="inconsistent">False</property>
-                             <property name="draw_indicator">True</property>
-                             <property name="group">SearchCite</property>
-                           </widget>
-                           <packing>
-                             <property name="padding">0</property>
-                             <property name="expand">False</property>
-                             <property name="fill">False</property>
-                           </packing>
-                         </child>
-
                          <child>
                            <widget class="GtkCheckButton" id="CaseSensitive">
                              <property name="visible">True</property>
                    </widget>
                    <packing>
                      <property name="padding">0</property>
-                     <property name="expand">True</property>
+                     <property name="expand">False</property>
                      <property name="fill">True</property>
                    </packing>
                  </child>