]> git.lyx.org Git - lyx.git/blob - src/frontends/gtk/ghelpers.C
fdf5e2fbbeab6efab747de873268298b4217cb82
[lyx.git] / src / frontends / gtk / ghelpers.C
1 /**
2  * \file ghelpers.C
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Angus Leeming
7  * \author John Spray
8  *
9  * Full author contact details are available in file CREDITS.
10  */
11
12 #include <config.h>
13
14 // Too hard to make concept checks work with this file
15 #ifdef _GLIBCXX_CONCEPT_CHECKS
16 #undef _GLIBCXX_CONCEPT_CHECKS
17 #endif
18 #ifdef _GLIBCPP_CONCEPT_CHECKS
19 #undef _GLIBCPP_CONCEPT_CHECKS
20 #endif
21
22 #include "ghelpers.h"
23
24 #include "lyxrc.h"
25 #include "funcrequest.h"
26 #include "debug.h"
27
28 #include "support/filetools.h"
29 #include "support/package.h"
30
31 #include "gtkmm/icontheme.h"
32
33 #include <sstream>
34
35 using std::string;
36 using std::vector;
37
38 namespace lyx {
39 namespace frontend {
40
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)
44 {
45         switch (func.action) {
46                 case LFUN_MENUWRITE: return Gtk::Stock::SAVE;
47                 case LFUN_MENUNEW: return Gtk::Stock::NEW;
48                 case LFUN_WRITEAS: return Gtk::Stock::SAVE_AS;
49                 case LFUN_MENURELOAD: return Gtk::Stock::REVERT_TO_SAVED;
50                 case LFUN_CENTER: return Gtk::Stock::JUSTIFY_CENTER;
51                 case LFUN_TOCVIEW: return Gtk::Stock::INDEX;
52                 case LFUN_CLOSEBUFFER: return Gtk::Stock::CLOSE;
53                 case LFUN_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_PASTESELECTION: return Gtk::Stock::PASTE;
58                 case LFUN_CUT: return Gtk::Stock::CUT;
59                 case LFUN_COPY: return Gtk::Stock::COPY;
60                 case LFUN_BOLD: return Gtk::Stock::BOLD;
61                 case LFUN_ITAL: return Gtk::Stock::ITALIC;
62                 case LFUN_FILE_OPEN: return Gtk::Stock::OPEN;
63                 case LFUN_RECONFIGURE: return Gtk::Stock::REFRESH;
64                 case LFUN_LABEL_GOTO:
65                 case LFUN_BOOKMARK_GOTO: return Gtk::Stock::JUMP_TO;
66                 case LFUN_GOTONOTE: 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;
82                         else
83                                 return Gtk::Stock::MISSING_IMAGE;
84                         break;
85                 default: return Gtk::Stock::MISSING_IMAGE;
86         }
87 }
88
89
90 Glib::ustring getGTKThemeIcon(FuncRequest const & func)
91 {
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_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";
101                         break;
102                 case LFUN_DIALOG_SHOW:
103                         if (func.argument == "spellchecker")
104                                 return "stock_spellcheck";
105                         else if (func.argument == "character")
106                                 return "stock_font";
107                         break;
108                 case LFUN_DEPTH_PLUS: return "format-indent-more";
109                 case LFUN_DEPTH_MIN: return "format-indent-less";
110                 case LFUN_LAYOUT:
111                         if (func.argument == "Enumerate")
112                                 return "stock_list_enum";
113                         else if (func.argument == "Itemize")
114                                 return "stock_list_bullet";
115                         break;
116                 case LFUN_FREEFONT_APPLY: return "stock_font-formatting-toggle";
117                 case LFUN_THESAURUS_ENTRY: return "stock_thesaurus";
118                 case LFUN_URL: 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";
140                         break;
141
142                         case LFUN_BOOKMARK_SAVE: return "stock_add-bookmark";
143                         case LFUN_INSERT_NOTE: return "stock_insert-note";
144                         case LFUN_LAYOUT_PARAGRAPH: return "stock_format-paragraph";
145                         case LFUN_MENUNEWTMPLT: return "stock_new-template";
146                         //case LFUN_INSET_ERT: return "gnome-mime-application-x-tex";
147         }
148         return "";
149 }
150
151
152 Gtk::Image *getGTKIcon(FuncRequest const & func, Gtk::IconSize const & size)
153 {
154                 static Glib::RefPtr<Gtk::IconTheme> theme;
155                 if (!theme)
156                         theme = Gtk::IconTheme::get_default();
157
158                 // TODO: cache these values somewhere else
159                 int iconwidth = 16;
160                 int iconheight = 16;
161                 Gtk::IconSize::lookup(size, iconwidth, iconheight);
162
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));
169                 } else {
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);
174                                         if (pbuf) {
175                                                 image = Gtk::manage(new Gtk::Image(pbuf));
176                                         }
177                                 }
178                         }
179                 }
180
181                 return image;
182 }
183
184
185 string const getDefaultUnit()
186 {
187         switch (lyxrc.default_papersize) {
188                 case PAPER_DEFAULT: return "cm";
189                 case PAPER_USLETTER:
190                 case PAPER_USLEGAL:
191                 case PAPER_USEXECUTIVE: return "in"; break;
192                 case PAPER_A3:
193                 case PAPER_A4:
194                 case PAPER_A5:
195                 case PAPER_B5: return "cm"; break;
196         }
197         // shut up compiler
198         return "cm";
199 }
200
201
202 void unitsComboFromLength(Gtk::ComboBox * combo,
203                            Gtk::TreeModelColumn<Glib::ustring> const & stringcol,
204                            LyXLength const & len,
205                            std::string const & defunit)
206 {
207         string unit = stringFromUnit(len.unit());
208         if (unit.empty())
209                 unit = defunit;
210
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);
216                         return;
217                 }
218         }
219
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";
224 }
225
226
227 vector<string> const buildLengthUnitList(bool const userelative)
228 {
229         vector<string> data;
230         if (userelative) {
231                 data = vector<string>(unit_name_gui, unit_name_gui + num_units);
232         } else {
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]);
237                 }
238         }
239         return data;
240 }
241
242
243 string const findGladeFile(string const & name)
244 {
245         // First, search in the installation directories.
246
247         string filename = lyx::support::libFileSearch("glade", name, "glade");
248
249         if (!filename.empty())
250                 return filename;
251
252         // Second, search in the src tree.
253         string const dir =
254                 lyx::support::addPath(lyx::support::package().top_srcdir(),
255                                       "src/frontends/gtk/glade");
256
257         filename = lyx::support::changeExtension(name, ".glade");
258         filename = lyx::support::addName(dir, filename);
259
260         if (!lyx::support::isFileReadable(filename)) {
261                 lyxerr << "Unable to find glade file \"" << name
262                        << "\". libglade is going to crash..." << std::endl;
263         }
264
265         return filename;
266 }
267
268 } // namespace frontend
269 } // namespace lyx