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_CLIPBOARD_PASTE: return Gtk::Stock::PASTE;
58 case LFUN_PRIMARY_SELECTION_PASTE: return Gtk::Stock::PASTE;
59 case LFUN_CUT: return Gtk::Stock::CUT;
60 case LFUN_COPY: return Gtk::Stock::COPY;
61 case LFUN_FONT_BOLD: return Gtk::Stock::BOLD;
62 case LFUN_FONT_ITAL: return Gtk::Stock::ITALIC;
63 case LFUN_FILE_OPEN: return Gtk::Stock::OPEN;
64 case LFUN_RECONFIGURE: return Gtk::Stock::REFRESH;
66 case LFUN_BOOKMARK_GOTO: return Gtk::Stock::JUMP_TO;
67 case LFUN_NOTE_NEXT: return Gtk::Stock::GO_FORWARD;
68 case LFUN_ALL_CHANGES_ACCEPT: return Gtk::Stock::APPLY;
69 case LFUN_ALL_CHANGES_REJECT: return Gtk::Stock::CANCEL;
70 case LFUN_DIALOG_SHOW:
71 if (func.argument() == "findreplace")
72 return Gtk::Stock::FIND_AND_REPLACE;
73 else if (func.argument() == "print")
74 return Gtk::Stock::PRINT;
75 else if (func.argument() == "spellchecker")
76 return Gtk::Stock::SPELL_CHECK;
77 else if (func.argument() == "prefs")
78 return Gtk::Stock::PREFERENCES;
79 else if (func.argument() == "document")
80 return Gtk::Stock::PROPERTIES;
81 else if (func.argument() == "aboutlyx")
82 return Gtk::Stock::ABOUT;
84 return Gtk::Stock::MISSING_IMAGE;
86 default: return Gtk::Stock::MISSING_IMAGE;
91 Glib::ustring getGTKThemeIcon(FuncRequest const & func)
93 switch (func.action) {
94 case LFUN_TABULAR_INSERT: return "stock_insert-table";
95 case LFUN_MATH_MODE: return "stock_insert-math-object";
96 case LFUN_FONT_EMPH: return "stock_text_italic";
97 case LFUN_DIALOG_SHOW_NEW_INSET:
98 if (func.argument() == "graphics")
99 return "stock_placeholder-picture";
100 if (func.argument() == "include")
101 return "stock_insert-file";
103 case LFUN_DIALOG_SHOW:
104 if (func.argument() == "spellchecker")
105 return "stock_spellcheck";
106 else if (func.argument() == "character")
109 case LFUN_DEPTH_INCREMENT: return "format-indent-more";
110 case LFUN_DEPTH_DECREMENT: return "format-indent-less";
112 if (func.argument() == "Enumerate")
113 return "stock_list_enum";
114 else if (func.argument() == "Itemize")
115 return "stock_list_bullet";
117 case LFUN_FONT_FREE_APPLY: return "stock_font-formatting-toggle";
118 case LFUN_THESAURUS_ENTRY: return "stock_thesaurus";
119 case LFUN_URL_INSERT: return "stock_insert-url";
120 case LFUN_TABULAR_FEATURE:
121 if (func.argument() == "append-row")
122 return "stock_insert-rows";
123 else if (func.argument() == "append-column")
124 return "stock_insert-columns";
125 else if (func.argument() == "delete-row")
126 return "stock_delete-row";
127 else if (func.argument() == "delete-column")
128 return "stock_delete-column";
129 else if (func.argument() == "valign-top")
130 return "stock_cell-align-top";
131 else if (func.argument() == "valign-middle")
132 return "stock_cell-align-center";
133 else if (func.argument() == "valign-bottom")
134 return "stock_cell-align-bottom";
135 else if (func.argument() == "align-left")
136 return "gtk-justify-left";
137 else if (func.argument() == "align-center")
138 return "gtk-justify-center";
139 else if (func.argument() == "align-right")
140 return "gtk-justify-right";
143 case LFUN_BOOKMARK_SAVE: return "stock_add-bookmark";
144 case LFUN_NOTE_INSERT: return "stock_insert-note";
145 case LFUN_LAYOUT_PARAGRAPH: return "stock_format-paragraph";
146 case LFUN_BUFFER_NEW_TEMPLATE: return "stock_new-template";
147 //case LFUN_ERT_INSERT: return "gnome-mime-application-x-tex";
153 Gtk::Image *getGTKIcon(FuncRequest const & func, Gtk::IconSize const & size)
155 static Glib::RefPtr<Gtk::IconTheme> theme;
157 theme = Gtk::IconTheme::get_default();
159 // TODO: cache these values somewhere else
162 Gtk::IconSize::lookup(size, iconwidth, iconheight);
164 // TODO: this stuff is called every menu view - needs
165 // caching somewhere, or maybe GTK does enough of that for us.
166 Gtk::Image *image = NULL;
167 Gtk::BuiltinStockID const stockID = getGTKStockIcon(func);
168 if (stockID != Gtk::Stock::MISSING_IMAGE) {
169 image = Gtk::manage(new Gtk::Image(stockID, size));
171 Glib::ustring iconname = getGTKThemeIcon (func);
172 if (iconname != "") {
173 if (theme->has_icon(iconname)) {
174 Glib::RefPtr<Gdk::Pixbuf> pbuf = theme->load_icon(iconname, iconwidth, Gtk::ICON_LOOKUP_FORCE_SVG);
176 image = Gtk::manage(new Gtk::Image(pbuf));
186 string const getDefaultUnit()
188 switch (lyxrc.default_papersize) {
189 case PAPER_DEFAULT: return "cm";
192 case PAPER_USEXECUTIVE: return "in"; break;
196 case PAPER_B5: return "cm"; break;
203 void unitsComboFromLength(Gtk::ComboBox * combo,
204 Gtk::TreeModelColumn<Glib::ustring> const & stringcol,
205 LyXLength const & len,
206 std::string const & defunit)
208 string unit = stringFromUnit(len.unit());
212 Gtk::TreeModel::iterator it = combo->get_model()->children().begin();
213 Gtk::TreeModel::iterator end = combo->get_model()->children().end();
214 for (; it != end ; ++it) {
215 if ((*it)[stringcol] == unit) {
216 combo->set_active(it);
221 // Fallen through, we didn't find the target length!
222 combo->set_active(0);
223 lyxerr << "unitsComboFromLength: couldn't find "
224 "target unit '" << unit << "'\n";
228 vector<string> const buildLengthUnitList(bool const userelative)
232 data = vector<string>(unit_name_gui, unit_name_gui + num_units);
234 for (int i = 0; i < num_units; ++i) {
235 string str(unit_name_gui[i]);
236 if (str.find("%") == string::npos)
237 data.push_back(unit_name_gui[i]);
244 string const findGladeFile(string const & name)
246 // First, search in the installation directories.
248 string filename = lyx::support::libFileSearch("glade", name, "glade");
250 if (!filename.empty())
253 // Second, search in the src tree.
255 lyx::support::addPath(lyx::support::package().top_srcdir(),
256 "src/frontends/gtk/glade");
258 filename = lyx::support::changeExtension(name, ".glade");
259 filename = lyx::support::addName(dir, filename);
261 if (!lyx::support::isFileReadable(filename)) {
262 lyxerr << "Unable to find glade file \"" << name
263 << "\". libglade is going to crash..." << std::endl;
269 } // namespace frontend