]> git.lyx.org Git - lyx.git/blob - src/frontends/gtk/ghelpers.C
enable Font cache only for MacOSX and inline width() for other platform.
[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_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;
65                 case LFUN_LABEL_GOTO:
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;
83                         else
84                                 return Gtk::Stock::MISSING_IMAGE;
85                         break;
86                 default: return Gtk::Stock::MISSING_IMAGE;
87         }
88 }
89
90
91 Glib::ustring getGTKThemeIcon(FuncRequest const & func)
92 {
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";
102                         break;
103                 case LFUN_DIALOG_SHOW:
104                         if (func.argument() == "spellchecker")
105                                 return "stock_spellcheck";
106                         else if (func.argument() == "character")
107                                 return "stock_font";
108                         break;
109                 case LFUN_DEPTH_INCREMENT: return "format-indent-more";
110                 case LFUN_DEPTH_DECREMENT: return "format-indent-less";
111                 case LFUN_LAYOUT:
112                         if (func.argument() == "Enumerate")
113                                 return "stock_list_enum";
114                         else if (func.argument() == "Itemize")
115                                 return "stock_list_bullet";
116                         break;
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";
141                         break;
142
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";
148         }
149         return "";
150 }
151
152
153 Gtk::Image *getGTKIcon(FuncRequest const & func, Gtk::IconSize const & size)
154 {
155                 static Glib::RefPtr<Gtk::IconTheme> theme;
156                 if (!theme)
157                         theme = Gtk::IconTheme::get_default();
158
159                 // TODO: cache these values somewhere else
160                 int iconwidth = 16;
161                 int iconheight = 16;
162                 Gtk::IconSize::lookup(size, iconwidth, iconheight);
163
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));
170                 } else {
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);
175                                         if (pbuf) {
176                                                 image = Gtk::manage(new Gtk::Image(pbuf));
177                                         }
178                                 }
179                         }
180                 }
181
182                 return image;
183 }
184
185
186 string const getDefaultUnit()
187 {
188         switch (lyxrc.default_papersize) {
189                 case PAPER_DEFAULT: return "cm";
190                 case PAPER_USLETTER:
191                 case PAPER_USLEGAL:
192                 case PAPER_USEXECUTIVE: return "in"; break;
193                 case PAPER_A3:
194                 case PAPER_A4:
195                 case PAPER_A5:
196                 case PAPER_B5: return "cm"; break;
197         }
198         // shut up compiler
199         return "cm";
200 }
201
202
203 void unitsComboFromLength(Gtk::ComboBox * combo,
204                            Gtk::TreeModelColumn<Glib::ustring> const & stringcol,
205                            LyXLength const & len,
206                            std::string const & defunit)
207 {
208         string unit = stringFromUnit(len.unit());
209         if (unit.empty())
210                 unit = defunit;
211
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);
217                         return;
218                 }
219         }
220
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";
225 }
226
227
228 vector<string> const buildLengthUnitList(bool const userelative)
229 {
230         vector<string> data;
231         if (userelative) {
232                 data = vector<string>(unit_name_gui, unit_name_gui + num_units);
233         } else {
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]);
238                 }
239         }
240         return data;
241 }
242
243
244 string const findGladeFile(string const & name)
245 {
246         // First, search in the installation directories.
247
248         string filename = lyx::support::libFileSearch("glade", name, "glade");
249
250         if (!filename.empty())
251                 return filename;
252
253         // Second, search in the src tree.
254         string const dir =
255                 lyx::support::addPath(lyx::support::package().top_srcdir(),
256                                       "src/frontends/gtk/glade");
257
258         filename = lyx::support::changeExtension(name, ".glade");
259         filename = lyx::support::addName(dir, filename);
260
261         if (!lyx::support::isFileReadable(filename)) {
262                 lyxerr << "Unable to find glade file \"" << name
263                        << "\". libglade is going to crash..." << std::endl;
264         }
265
266         return filename;
267 }
268
269 } // namespace frontend
270 } // namespace lyx