Attached patch does two things: * Hack to make assumptions about text encoding to avoid a crash when keys or descriptions contain non-ASCII characters. * Rationale: as well as letting me use lyx-gtk with my bibtex file, putting these encoding hacks in is useful because I mark places I do it with the string "ENCODING", which I will later grep for when fixing encoding in general. * Remove option to search cited or available keys: now only available keys are searched. * Rationale - we wouldn't expect the user to ever cite so many keys at once that they need a search functionality amongst cited keys (this is how it is in the qt frontend too).
I have applied it. John
Index: GCitation.C =================================================================== --- GCitation.C (revision 14021) +++ GCitation.C (working copy) @@ -98,8 +98,6 @@ 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 @@ 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 @@ 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 @@ // 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 @@ 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 @@ 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) { + for (iter = (bibFilter_->children()).begin(); + iter != (bibFilter_->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])); - } - - 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: GCitation.h =================================================================== --- GCitation.h (revision 14021) +++ GCitation.h (working copy) @@ -108,8 +108,6 @@ Gtk::TextView * infoview_; Gtk::Entry * findentry_; - Gtk::CheckButton * citeradio_; - Gtk::CheckButton * bibradio_; Gtk::CheckButton * casecheck_; Gtk::CheckButton * regexpcheck_; Index: ChangeLog =================================================================== --- ChangeLog (revision 14022) +++ ChangeLog (working copy) @@ -1,6 +1,9 @@ 2006-06-06 John Spray <[EMAIL PROTECTED]> * 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 <[EMAIL PROTECTED]> * GExternal.[Ch], glade/external.glade: implement external dialog Index: glade/citation.glade =================================================================== --- glade/citation.glade (revision 14021) +++ glade/citation.glade (working copy) @@ -36,11 +36,73 @@ <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> @@ -453,45 +515,6 @@ <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> <property name="can_focus">True</property> @@ -533,7 +556,7 @@ </widget> <packing> <property name="padding">0</property> - <property name="expand">True</property> + <property name="expand">False</property> <property name="fill">True</property> </packing> </child>