3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
6 * \author Angus Leeming
9 * Full author contact details are available in file CREDITS.
14 // Too hard to make concept checks work with this file
15 #ifdef _GLIBCXX_CONCEPT_CHECKS
16 #undef _GLIBCXX_CONCEPT_CHECKS
18 #ifdef _GLIBCPP_CONCEPT_CHECKS
19 #undef _GLIBCPP_CONCEPT_CHECKS
25 #include "funcrequest.h"
28 #include "support/filetools.h"
29 #include "support/package.h"
31 #include "gtkmm/icontheme.h"
41 // Get a GTK stockID from a lyx function id.
42 // Return Gtk::Stock::MISSING_IMAGE if no suitable stock found
43 Gtk::BuiltinStockID getGTKStockIcon(FuncRequest const & func)
45 switch (func.action) {
46 case LFUN_BUFFER_WRITE: return Gtk::Stock::SAVE;
47 case LFUN_BUFFER_NEW: return Gtk::Stock::NEW;
48 case LFUN_BUFFER_WRITE_AS: return Gtk::Stock::SAVE_AS;
49 case LFUN_BUFFER_RELOAD: return Gtk::Stock::REVERT_TO_SAVED;
50 case LFUN_SCREEN_RECENTER: return Gtk::Stock::JUSTIFY_CENTER;
51 case LFUN_TOC_VIEW: return Gtk::Stock::INDEX;
52 case LFUN_BUFFER_CLOSE: return Gtk::Stock::CLOSE;
53 case LFUN_LYX_QUIT: return Gtk::Stock::QUIT;
54 case LFUN_UNDO: return Gtk::Stock::UNDO;
55 case LFUN_REDO: return Gtk::Stock::REDO;
56 case LFUN_PASTE: return Gtk::Stock::PASTE;
57 case LFUN_PRIMARY_SELECTION_PASTE: return Gtk::Stock::PASTE;
58 case LFUN_CUT: return Gtk::Stock::CUT;
59 case LFUN_COPY: return Gtk::Stock::COPY;
60 case LFUN_FONT_BOLD: return Gtk::Stock::BOLD;
61 case LFUN_FONT_ITAL: return Gtk::Stock::ITALIC;
62 case LFUN_FILE_OPEN: return Gtk::Stock::OPEN;
63 case LFUN_RECONFIGURE: return Gtk::Stock::REFRESH;
65 case LFUN_BOOKMARK_GOTO: return Gtk::Stock::JUMP_TO;
66 case LFUN_NOTE_NEXT: return Gtk::Stock::GO_FORWARD;
67 case LFUN_ACCEPT_ALL_CHANGES: return Gtk::Stock::APPLY;
68 case LFUN_REJECT_ALL_CHANGES: return Gtk::Stock::CANCEL;
69 case LFUN_DIALOG_SHOW:
70 if (func.argument == "findreplace")
71 return Gtk::Stock::FIND_AND_REPLACE;
72 else if (func.argument == "print")
73 return Gtk::Stock::PRINT;
74 else if (func.argument == "spellchecker")
75 return Gtk::Stock::SPELL_CHECK;
76 else if (func.argument == "prefs")
77 return Gtk::Stock::PREFERENCES;
78 else if (func.argument == "document")
79 return Gtk::Stock::PROPERTIES;
80 else if (func.argument == "aboutlyx")
81 return Gtk::Stock::ABOUT;
83 return Gtk::Stock::MISSING_IMAGE;
85 default: return Gtk::Stock::MISSING_IMAGE;
90 Glib::ustring getGTKThemeIcon(FuncRequest const & func)
92 switch (func.action) {
93 case LFUN_TABULAR_INSERT: return "stock_insert-table";
94 case LFUN_MATH_MODE: return "stock_insert-math-object";
95 case LFUN_FONT_EMPH: return "stock_text_italic";
96 case LFUN_DIALOG_SHOW_NEW_INSET:
97 if (func.argument == "graphics")
98 return "stock_placeholder-picture";
99 if (func.argument == "include")
100 return "stock_insert-file";
102 case LFUN_DIALOG_SHOW:
103 if (func.argument == "spellchecker")
104 return "stock_spellcheck";
105 else if (func.argument == "character")
108 case LFUN_DEPTH_INCREMENT: return "format-indent-more";
109 case LFUN_DEPTH_DECREMENT: return "format-indent-less";
111 if (func.argument == "Enumerate")
112 return "stock_list_enum";
113 else if (func.argument == "Itemize")
114 return "stock_list_bullet";
116 case LFUN_FONT_FREE_APPLY: return "stock_font-formatting-toggle";
117 case LFUN_THESAURUS_ENTRY: return "stock_thesaurus";
118 case LFUN_URL_INSERT: return "stock_insert-url";
119 case LFUN_TABULAR_FEATURE:
120 if (func.argument == "append-row")
121 return "stock_insert-rows";
122 else if (func.argument == "append-column")
123 return "stock_insert-columns";
124 else if (func.argument == "delete-row")
125 return "stock_delete-row";
126 else if (func.argument == "delete-column")
127 return "stock_delete-column";
128 else if (func.argument == "valign-top")
129 return "stock_cell-align-top";
130 else if (func.argument == "valign-middle")
131 return "stock_cell-align-center";
132 else if (func.argument == "valign-bottom")
133 return "stock_cell-align-bottom";
134 else if (func.argument == "align-left")
135 return "gtk-justify-left";
136 else if (func.argument == "align-center")
137 return "gtk-justify-center";
138 else if (func.argument == "align-right")
139 return "gtk-justify-right";
142 case LFUN_BOOKMARK_SAVE: return "stock_add-bookmark";
143 case LFUN_NOTE_INSERT: return "stock_insert-note";
144 case LFUN_LAYOUT_PARAGRAPH: return "stock_format-paragraph";
145 case LFUN_BUFFER_NEWTMPLT: return "stock_new-template";
146 //case LFUN_ERT_INSERT: return "gnome-mime-application-x-tex";
152 Gtk::Image *getGTKIcon(FuncRequest const & func, Gtk::IconSize const & size)
154 static Glib::RefPtr<Gtk::IconTheme> theme;
156 theme = Gtk::IconTheme::get_default();
158 // TODO: cache these values somewhere else
161 Gtk::IconSize::lookup(size, iconwidth, iconheight);
163 // TODO: this stuff is called every menu view - needs
164 // caching somewhere, or maybe GTK does enough of that for us.
165 Gtk::Image *image = NULL;
166 Gtk::BuiltinStockID const stockID = getGTKStockIcon(func);
167 if (stockID != Gtk::Stock::MISSING_IMAGE) {
168 image = Gtk::manage(new Gtk::Image(stockID, size));
170 Glib::ustring iconname = getGTKThemeIcon (func);
171 if (iconname != "") {
172 if (theme->has_icon(iconname)) {
173 Glib::RefPtr<Gdk::Pixbuf> pbuf = theme->load_icon(iconname, iconwidth, Gtk::ICON_LOOKUP_FORCE_SVG);
175 image = Gtk::manage(new Gtk::Image(pbuf));
185 string const getDefaultUnit()
187 switch (lyxrc.default_papersize) {
188 case PAPER_DEFAULT: return "cm";
191 case PAPER_USEXECUTIVE: return "in"; break;
195 case PAPER_B5: return "cm"; break;
202 void unitsComboFromLength(Gtk::ComboBox * combo,
203 Gtk::TreeModelColumn<Glib::ustring> const & stringcol,
204 LyXLength const & len,
205 std::string const & defunit)
207 string unit = stringFromUnit(len.unit());
211 Gtk::TreeModel::iterator it = combo->get_model()->children().begin();
212 Gtk::TreeModel::iterator end = combo->get_model()->children().end();
213 for (; it != end ; ++it) {
214 if ((*it)[stringcol] == unit) {
215 combo->set_active(it);
220 // Fallen through, we didn't find the target length!
221 combo->set_active(0);
222 lyxerr << "unitsComboFromLength: couldn't find "
223 "target unit '" << unit << "'\n";
227 vector<string> const buildLengthUnitList(bool const userelative)
231 data = vector<string>(unit_name_gui, unit_name_gui + num_units);
233 for (int i = 0; i < num_units; ++i) {
234 string str(unit_name_gui[i]);
235 if (str.find("%") == string::npos)
236 data.push_back(unit_name_gui[i]);
243 string const findGladeFile(string const & name)
245 // First, search in the installation directories.
247 string filename = lyx::support::libFileSearch("glade", name, "glade");
249 if (!filename.empty())
252 // Second, search in the src tree.
254 lyx::support::addPath(lyx::support::package().top_srcdir(),
255 "src/frontends/gtk/glade");
257 filename = lyx::support::changeExtension(name, ".glade");
258 filename = lyx::support::addName(dir, filename);
260 if (!lyx::support::isFileReadable(filename)) {
261 lyxerr << "Unable to find glade file \"" << name
262 << "\". libglade is going to crash..." << std::endl;
268 } // namespace frontend