Statistics
| Revision:

root / trunk / gummi / GummiGUI.py @ 300

History | View | Annotate | Download (24.7 KB)

1
#!/usr/bin/python
2
# -*- encoding: utf-8 -*-
3
4
# Copyright (c) 2009 Alexander van der Mey <alexvandermey@gmail.com>
5
6
# Permission is hereby granted, free of charge, to any person obtaining a copy
7
# of this software and associated documentation files (the "Software"), to deal
8
# in the Software without restriction, including without limitation the rights
9
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
# copies of the Software, and to permit persons to whom the Software is
11
# furnished to do so, subject to the following conditions:
12
#
13
# The above copyright notice and this permission notice shall be included in
14
# all copies or substantial portions of the Software.
15
#
16
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
# THE SOFTWARE.
23
24
import os
25
import sys
26
import glib
27
import gtk
28
import pango
29
import traceback
30
31
import Importer
32
import UpdateCheck
33
import Template
34
import Preferences
35
36
37
class MainGUI:
38
39
        def __init__(self, parent, config, iofunc, biblio):
40
                self.core = parent
41
                self.config = config
42
                self.editorpane = self.core.editorpane
43
                self.previewpane = self.core.previewpane
44
                self.iofunc = iofunc
45
                self.biblio = biblio
46
47
                self.path = self.core.path
48
                self.tempdir = self.core.tempdir
49
                self.builder = self.core.builder
50
                self.exitinterrupt = False
51
                
52
                self.mainwindow = self.builder.get_object("mainwindow")
53
                self.toolbar = self.builder.get_object("toolbar")
54
                self.mainnotebook = self.builder.get_object("main_notebook")
55
                self.editorscroll = self.builder.get_object("editor_scroll")
56
                self.drawarea = self.builder.get_object("preview_drawarea")
57
                self.preview_toolbar = self.builder.get_object("preview_toolbar")
58
                self.bibprogressbar = self.builder.get_object("bibprogressbar")
59
                self.bibprogressmon = self.builder.get_object("bibprogressmon")
60
                self.bibprogressval = 0
61
                self.list_biblios = self.builder.get_object("list_biblios")
62
63
                if self.config.get_value("view", "toolbar"):
64
                        menu_toolbar = self.builder.get_object("menu_toolbar")
65
                        menu_toolbar.set_active(True)
66
                        self.toolbar.show()
67
68
                if self.config.get_value("view", "statusbar"):
69
                        menu_statusbar = self.builder.get_object("menu_statusbar")
70
                        menu_statusbar.set_active(True)
71
                        self.iofunc.statusbar.show()
72
                
73
                self.hpaned = self.builder.get_object("hpaned")
74
                mainwidth = self.mainwindow.get_size()[0]
75
                self.hpaned.set_position(mainwidth/2)
76
77
                self.editorscroll.add(self.editorpane.editorviewer)
78
                self.importgui = ImportGUI(self.builder, self.editorpane)
79
                self.recentgui = RecentGUI(self.builder, self.config, self)
80
                self.searchgui = SearchGUI(self.builder, self.editorpane)
81
                self.builder.connect_signals(self) #split signals?
82
83
84
        def main(self):
85
                self.mainwindow.show_all()
86
                gtk.main()
87
88
        def set_window_title(self, filename):
89
                self.mainwindow.set_title \
90
                                        (os.path.basename(filename) + " - Gummi")
91
92
        def on_menu_new_activate(self, menuitem, data=None):
93
                if self.check_for_save(): self.on_menu_save_activate(None, None)
94
                self.editorpane.fill_buffer \
95
                        (self.config.get_value("default_text", "welcome"))
96
                self.editorpane.editorbuffer.set_modified(False)
97
                self.filename = None
98
                self.iofunc.make_environment(self.filename)
99
100
        def on_menu_template_activate(self, menuitem, data=None):
101
                self.template_doc = Template.Template(self.builder, self.path)
102
103
        def on_menu_open_activate(self, menuitem, data=None):
104
                if os.getcwd() == self.tempdir:
105
                        os.chdir(os.environ['HOME'])
106
                if self.check_for_save(): self.on_menu_save_activate(None, None)
107
                filename = self.get_open_filename()
108
                if filename: self.load_document(filename)
109
110
        def on_menu_save_activate(self, menuitem, data=None):
111
                if os.getcwd() == self.tempdir:
112
                        os.chdir(os.environ['HOME'])
113
                if self.iofunc.filename is None:
114
                        filename = self.get_save_filename()
115
                        if filename: self.save_document(filename)
116
                else: self.save_document(None)
117
118
        def on_menu_saveas_activate(self, menuitem, data=None):
119
                if os.getcwd() == self.tempdir:
120
                        os.chdir(os.environ['HOME'])
121
                self.filename = self.get_save_filename()
122
                if self.filename: self.save_document(self.filename)
123
124
        def on_menu_recent_activate(self, widget, data=None):
125
                self.recentgui.activate_recentfile(widget)
126
127
        def on_menu_undo_activate(self, menuitem, data=None):
128
                self.editorpane.undo_change()
129
130
        def on_menu_redo_activate(self, menuitem, data=None):
131
                self.editorpane.redo_change()
132
133
        def on_menu_cut_activate(self, menuitem, data=None):
134
                buff = self.editorpane.editorviewer.get_buffer()
135
                buff.cut_clipboard (gtk.clipboard_get(), True)
136
                self.editorpane.set_buffer_changed()
137
138
        def on_menu_copy_activate(self, menuitem, data=None):
139
                buff = self.editorpane.editorviewer.get_buffer()
140
                buff.copy_clipboard (gtk.clipboard_get())
141
142
        def on_menu_paste_activate(self, menuitem, data=None):
143
                buff = self.editorpane.editorviewer.get_buffer()
144
                buff.paste_clipboard (gtk.clipboard_get(), None, True)
145
                self.editorpane.set_buffer_changed()
146
147
        def on_menu_delete_activate(self, menuitem, data=None):
148
                buff = self.editorpane.editorviewer.get_buffer()
149
                buff.delete_selection (False, True)
150
151
        def on_menu_selectall_activate(self, menuitem, data=None):
152
                buff = self.editorpane.editorviewer.get_buffer()
153
                buff.select_range(buff.get_start_iter(),buff.get_end_iter())
154
155
        def on_menu_find_activate(self, menuitem, data=None):
156
                self.searchgui.show_searchwindow()
157
158
        def on_menu_findnext_activate(self, menuitem, data=None):
159
                self.editorpane.jumpto_searchresult(1)
160
161
        def on_menu_findprev_activate(self, menuitem, data=None):
162
                self.editorpane.jumpto_searchresult(-1)
163
164
        def on_menu_fullscreen_toggled(self, menuitem, data=None):
165
                if menuitem.get_active():
166
                        self.mainwindow.fullscreen()
167
                else:
168
                        self.mainwindow.unfullscreen()
169
170
        def on_menu_toolbar_toggled(self, menuitem, data=None):
171
                if menuitem.get_active():
172
                        self.toolbar.show()
173
                        self.config.set_value("view", "toolbar", True)
174
                else:
175
                        self.toolbar.hide()
176
                        self.config.set_value("view", "toolbar", False)
177
178
        def on_menu_statusbar_toggled(self, menuitem, data=None):
179
                if menuitem.get_active():
180
                        self.iofunc.statusbar.show()
181
                        self.config.set_value("view", "statusbar", True)
182
                else:
183
                        self.iofunc.statusbar.hide()
184
                        self.config.set_value("view", "statusbar", False)
185
186
        def on_button_searchwindow_close_clicked(self, button, data=None):
187
                self.searchgui.close_searchwindow()
188
                return True
189
190
        def on_button_searchwindow_find_clicked(self, button, data=None):
191
                self.searchgui.start_search()
192
193
        def on_import_tabs_switch_page(self, notebook, page, page_num):
194
                self.importgui.show_importpane(notebook, page_num)
195
196
        def on_button_template_ok_clicked(self, button, data=None):
197
                template = self.template_doc.get_template()
198
                if template is not None:
199
                        self.editorpane.fill_buffer(template)
200
                        self.filename = None
201
                        self.iofunc.make_environment(self.filename)
202
                        self.template_doc.templatewindow.hide()
203
                else: pass
204
205
        def on_button_template_cancel_clicked(self, button, data=None):
206
                self.template_doc.templatewindow.hide()
207
                return True
208
209
        def on_menu_bibupdate_activate(self, menuitem, data=None):
210
                self.biblio.compile_bibliography()
211
212
        def on_bibprogressbar_update(self):
213
                self.bibprogressmon.set_value(self.bibprogressval)
214
                self.bibprogressval = self.bibprogressval + 1
215
                if self.bibprogressval > 60:
216
                        return False
217
                else:
218
                        return True
219
                
220
        def on_bibrefresh_clicked(self, button, data=None):
221
                self.bibprogressval = 0
222
                glib.timeout_add(2, self.on_bibprogressbar_update)
223
                self.list_biblios.clear()
224
                bibfilenm = self.builder.get_object("bibfilenm")
225
                bibrefnr = self.builder.get_object("bibrefnr")
226
                if self.biblio.detect_bibliography():
227
                        filenm, number = self.biblio.setup_bibliography()
228
                        number = self.biblio.parse_entries(self.list_biblios)
229
                        bibfilenm.set_text(filenm)
230
                        bibrefnr.set_text(str(number))
231
                        self.bibprogressbar.set_text(filenm + " loaded")
232
                else:
233
                        self.bibprogressbar.set_text("no bibliography file detected")
234
                        bibfilenm.set_text("None")
235
                        bibrefnr.set_text("N/A")
236
237
        def on_bibcompile_clicked(self, button, data=None):
238
                self.bibprogressval = 0
239
                glib.timeout_add(10, self.on_bibprogressbar_update)
240
                if self.biblio.compile_bibliography(self.bibprogressbar):
241
                        self.iofunc.set_status("Compiling bibliography file..")
242
                        self.bibprogressbar.set_text("bibliography compiled without errors")
243
                else:
244
                        self.iofunc.set_status("Error compiling bibliography file or none detected..")
245
                        self.bibprogressbar.set_text("error compiling bibliography file")
246
247
248
249
        def on_menu_bibload_activate(self, menuitem, data=None):
250
                bibfile = None
251
                chooser = gtk.FileChooserDialog("Open File...", self.mainwindow,
252
                                                                gtk.FILE_CHOOSER_ACTION_OPEN,
253
                                                                (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
254
                                                                gtk.STOCK_OPEN, gtk.RESPONSE_OK))
255
                bibfilter = gtk.FileFilter()
256
                bibfilter.set_name('Bibtex files')
257
                bibfilter.add_pattern("*.bib")
258
                chooser.add_filter(bibfilter)
259
                response = chooser.run()
260
                if response == gtk.RESPONSE_CANCEL: return
261
                if response == gtk.RESPONSE_OK: 
262
                        bibfile = chooser.get_filename()
263
                        if self.biblio.check_valid_file(bibfile):
264
                                filenm, number = self.biblio.setup_bibliography()
265
                                bibfilenm = self.builder.get_object("bibfilenm")
266
                                bibfilenm.set_text(filenm)
267
                        chooser.destroy()
268
269
        def on_bibcolumn_clicked(self, item, data=None):
270
                sortid = item.get_sort_column_id()
271
                item.set_sort_column_id(sortid)
272
273
        def on_bibreference_clicked(self, item, event, data=None):
274
                selection = item.get_selection()
275
                myiter = selection.get_selected()[1]
276
                value = self.list_biblios.get_value(myiter, 0)
277
                self.editorpane.editorbuffer.insert_at_cursor("\cite{" + value + "}")
278
                self.editorpane.set_buffer_changed()
279
280
        def on_menu_preferences_activate(self, menuitem, data=None):
281
                prefsgui = PrefsGUI(self.config, self.editorpane, self.path, self.mainwindow, self.iofunc)
282
283
        def on_menu_update_activate(self, menuitem, data=None):
284
                update = UpdateCheck.UpdateCheck()
285
286
        def on_menu_about_activate(self, menuitem, data=None):
287
                authors = ["Alexander van der Mey\n<alexvandermey@gmail.com>\n\n"
288
                                        "Contributors:\n"
289
                                        "Thomas van der Burgt <thomas@thvdburgt.nl>\n"
290
                                        "Cameron Grout <camerongrout@gmail.com>\n"]                                
291
                artwork = ["Template icon set from:\nhttp://www.fatcow.com/free-icons/"]
292
                about_dialog = gtk.AboutDialog()
293
                about_dialog.set_transient_for(self.mainwindow)
294
                about_dialog.set_destroy_with_parent(True)
295
                about_dialog.set_name("Gummi")
296
                about_dialog.set_license(Preferences.LICENSE)
297
                about_dialog.set_version(Preferences.VERSION)
298
                about_dialog.set_copyright("Copyright \xc2\xa9 2009 Alexander van der Mey")
299
                about_dialog.set_website("http://gummi.midnightcoding.org")
300
                about_dialog.set_comments("Simple LaTeX Editor for GTK+ users")
301
                about_dialog.set_authors(authors)
302
                about_dialog.set_artists(artwork)
303
                about_dialog.set_logo_icon_name         (gtk.STOCK_EDIT)
304
                # callbacks for destroying the dialog
305
                def close(dialog, response, editor):
306
                        editor.about_dialog = None
307
                        dialog.destroy()
308
                def delete_event(dialog, event, editor):
309
                        editor.about_dialog = None
310
                        return True
311
                about_dialog.connect("response", close, self)
312
                about_dialog.connect("delete-event", delete_event, self)
313
                self.about_dialog = about_dialog
314
                about_dialog.show()
315
316
        def on_tool_textstyle_activate(self, button, data=None):
317
                self.editorpane.set_selection_textstyle(button)
318
319
        def on_button_import_apply_clicked(self, button, data=None):
320
                self.importgui.insert_object(button)
321
322
        def on_image_file_activate(self, button, event, data=None):
323
                self.importgui.choose_imagefile()
324
325
        def on_button_pageback_clicked(self, button, data=None):
326
                self.previewpane.jump_to_prevpage()
327
328
        def on_button_pageforward_clicked(self, button, data=None):
329
                self.previewpane.jump_to_nextpage()
330
331
        def on_button_zoomin_clicked(self, button, data=None):
332
                self.previewpane.zoom_in_pane()
333
334
        def on_button_zoomout_clicked(self, button, data=None):
335
                self.previewpane.zoom_out_pane()
336
337
        def on_button_bestfit_toggled(self, button, data=None):
338
                if button.get_active() == False:
339
                        self.previewpane.set_bestfitmode(False)
340
                else:
341
                        self.previewpane.set_bestfitmode(True)
342
343
        def on_button_bibadd_clicked(self, button, data=None):
344
                self.biblio.add_bibliography()
345
346
        def on_button_bibdel_clicked(self, button, data=None):
347
                self.biblio.del_bibliography()
348
349
        def on_button_bibapply_clicked(self, button, data=None):
350
                self.biblio.setup_bibliography()
351
                self.mainnotebook.set_current_page(0)
352
353
        def set_file_filters(self, dialog):
354
                plainfilter = gtk.FileFilter()
355
                plainfilter.set_name('Text files')
356
                plainfilter.add_mime_type("text/plain")
357
                dialog.add_filter(plainfilter)
358
359
                latexfilter = gtk.FileFilter()
360
                latexfilter.set_name('LaTeX files')
361
                latexfilter.add_pattern('*.tex')
362
                dialog.add_filter(latexfilter)
363
                dialog.set_filter(plainfilter)
364
365
        def get_open_filename(self):
366
                filename = None
367
                chooser = gtk.FileChooserDialog("Open File...", self.mainwindow,
368
                                                                                gtk.FILE_CHOOSER_ACTION_OPEN,
369
                                                                                (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
370
                                                                                gtk.STOCK_OPEN, gtk.RESPONSE_OK))
371
                self.set_file_filters(chooser)
372
373
                response = chooser.run()
374
                if response == gtk.RESPONSE_OK: filename = chooser.get_filename()
375
                chooser.destroy()
376
                return filename
377
378
        def get_save_filename(self):
379
                filename = None
380
                chooser = gtk.FileChooserDialog("Save File...", self.mainwindow,
381
                                                                                gtk.FILE_CHOOSER_ACTION_SAVE,
382
                                                                                (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
383
                                                                                gtk.STOCK_SAVE, gtk.RESPONSE_OK))
384
                self.set_file_filters(chooser)
385
                response = chooser.run()
386
                if response == gtk.RESPONSE_CANCEL:
387
                        self.exitinterrupt = True
388
                        return 
389
                if response == gtk.RESPONSE_OK:
390
                        filename = chooser.get_filename()
391
                        if not ".tex" in filename[-4:]:
392
                                filename = filename + ".tex"
393
                        chooser.destroy()
394
                        self.iofunc.make_environment(filename)
395
                chooser.destroy()
396
                return filename
397
398
        def check_for_save(self):
399
                ret = False
400
                if self.editorpane.editorbuffer.get_modified():
401
                        # we need to prompt for save
402
                        message = "Do you want to save the changes you have made?"
403
                        dialog = gtk.MessageDialog(self.mainwindow,
404
                                                        gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
405
                                                        gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO,
406
                                                        message)
407
                        dialog.set_title("Save?")
408
                        if dialog.run() == gtk.RESPONSE_NO: ret = False
409
                        else: ret = True
410
                        dialog.destroy()
411
                return ret
412
413
414
        def load_document(self, filename):
415
                while gtk.events_pending(): gtk.main_iteration()
416
                try:
417
                        self.iofunc.load_file(filename)
418
                        self.filename = filename
419
                        self.recentgui.add_recentfile(self.filename)
420
                        self.set_window_title(self.filename)
421
                except:
422
                        print traceback.print_exc()
423
424
425
        def save_document(self, filename):
426
                try:
427
                        self.iofunc.save_file(filename)
428
                        if filename: self.filename = filename
429
                        self.iofunc.set_status("Saving file " + self.filename)
430
                        self.iofunc.export_pdffile()
431
                        self.set_window_title(self.filename)
432
                except:
433
                        print traceback.print_exc()
434
435
436
        def gtk_main_quit(self, menuitem, data=None):
437
                if self.check_for_save(): self.on_menu_save_activate(None, None)
438
                if self.exitinterrupt is False:
439
                        print "   ___ "
440
                        print "  {o,o}          Thanks for using Gummi!"
441
                        print "  |)__)          I welcome your feedback at:"
442
                        print '  -"-"-          http://gummi.midnightcoding.org\n'
443
                        quit()
444
                else: self.exitinterrupt = False; return True
445
446
447
448
class PrefsGUI:
449
450
        def __init__(self, config, editorpane, path, mainwindow, iofunc):
451
                self.config = config
452
                self.editorpane = editorpane
453
                self.iofunc = iofunc
454
                builder = gtk.Builder()
455
                builder.add_from_file(path + "/gui/prefs.glade")
456
457
                self.prefwindow = builder.get_object("prefwindow")
458
                self.notebook = builder.get_object("notebook1")
459
                self.prefwindow.set_transient_for(mainwindow)
460
                self.textwrap_button = builder.get_object("textwrapping")
461
                self.wordwrap_button = builder.get_object("wordwrapping")
462
                self.autosave_timer = builder.get_object("autosave_timer")
463
                self.default_text = builder.get_object("default_text")
464
                self.default_text.modify_font(pango.FontDescription("monospace 10"))
465
                self.default_buffer = self.default_text.get_buffer()
466
                self.typesetter = builder.get_object("combo_typesetter")
467
                self.editor_font = builder.get_object("editor_font")
468
469
                self.view_box = builder.get_object("view_box")
470
                self.set_checkbox_status(self.view_box, 'view')
471
                self.editor_box = builder.get_object("editor_box")                
472
                self.set_checkbox_status(self.editor_box, 'editor')
473
                self.autosave_timer.set_value \
474
                        (int(self.config.get_value("editor", "autosave_timer"))/60)
475
                self.editor_font.set_font_name(self.config.get_value("editor", "font"))
476
                self.default_buffer.set_text \
477
                        (self.config.get_value("default_text", "welcome"))
478
                if self.config.get_value("compile", "typesetter") == "xelatex":
479
                        self.typesetter.set_active(1)
480
481
                builder.connect_signals(self)
482
                self.prefwindow.show_all()
483
484
485
        def set_checkbox_status(self, box, page):
486
                listmy = box.get_children()
487
                for item in listmy:
488
                        if type(item) == gtk.CheckButton:
489
                                result = self.config.get_value(page, item.get_name())
490
                                item.set_active(result)
491
492
        def toggle_linenumbers(self, widget, data=None):
493
                value = widget.get_active()
494
                self.config.set_value('view', widget.get_name(), value)
495
                self.editorpane.editorviewer.set_show_line_numbers(value)
496
497
        def toggle_highlighting(self, widget, data=None):
498
                value = widget.get_active()
499
                self.config.set_value('view', widget.get_name(), value)
500
                self.editorpane.editorviewer.set_highlight_current_line(value)
501
502
        def toggle_textwrapping(self, widget, data=None):
503
                value = widget.get_active()
504
                self.config.set_value('view', widget.get_name(), value)
505
                if widget.get_active():
506
                        self.editorpane.editorviewer.set_wrap_mode(gtk.WRAP_CHAR)
507
                        self.wordwrap_button.set_sensitive(True)
508
                else:
509
                        self.editorpane.editorviewer.set_wrap_mode(gtk.WRAP_NONE)
510
                        self.config.set_value("view", "wordwrapping", False)
511
                        self.wordwrap_button.set_active(False)
512
                        self.wordwrap_button.set_sensitive(False)
513
514
        def toggle_wordwrapping(self, widget, data=None):
515
                value = widget.get_active()
516
                self.config.set_value('view', widget.get_name(), value)
517
                if widget.get_active():
518
                        self.editorpane.editorviewer.set_wrap_mode(gtk.WRAP_WORD)
519
                else:
520
                        self.editorpane.editorviewer.set_wrap_mode(gtk.WRAP_CHAR)
521
522
        def toggle_autosaving(self, widget, data=None):
523
                value = widget.get_active()
524
                self.config.set_value('editor', widget.get_name(), value)
525
                if widget.get_active():
526
                        self.autosave_timer.set_sensitive(True)
527
                        time = int(self.config.get_value("editor", "autosave_timer"))
528
                        self.autosave_timer.set_value(time/60)
529
                        self.iofunc.start_autosave(time)
530
                else:
531
                        self.autosave_timer.set_sensitive(False)
532
                        self.iofunc.stop_autosave()                
533
534
        def on_autosave_value_changed(self, event):
535
                newvalue = int(event.get_value()) * 60
536
                self.config.set_value('editor', 'autosave_timer', newvalue)
537
                self.iofunc.reset_autosave()
538
539
        def on_editor_font_set(self, widget):
540
                selected = widget.get_font_name()
541
                self.editorpane.editorviewer.modify_font(pango.FontDescription(selected))
542
                self.config.set_value("editor", "font", selected)
543
544
        def on_combo_typesetter_changed(self, widget, data=None):
545
                model = widget.get_model()
546
                newvalue = model[widget.get_active()][0]
547
                self.config.set_value('compile', 'typesetter', newvalue)
548
549
        def on_prefs_close_clicked(self, widget, data=None):
550
                if self.notebook.get_current_page() == 2:
551
                        start_iter = self.default_buffer.get_start_iter()
552
                        end_iter = self.default_buffer.get_end_iter()
553
                        newvalue = self.default_buffer.get_text(start_iter, end_iter)
554
                        self.config.set_value("default_text", "welcome", newvalue)
555
                self.prefwindow.destroy()
556
557
        def on_prefs_reset_clicked(self, widget, data=None):
558
                if self.notebook.get_current_page() == 0:
559
                        self.config.reset_section("view")
560
                        self.set_checkbox_status(self.view_box, "view")
561
                elif self.notebook.get_current_page() == 1:
562
                        self.config.reset_section("editor")
563
                        self.set_checkbox_status(self.editor_box, "editor")
564
                        deffont = self.config.get_value("editor", "font")
565
                        self.editor_font.set_font_name(deffont)
566
                        self.editorpane.editorviewer.modify_font(pango.FontDescription(deffont))
567
                elif self.notebook.get_current_page() == 2:
568
                        self.config.reset_section("default_text")
569
                        self.default_buffer.set_text \
570
                                (self.config.get_value("default_text", "welcome"))
571
                elif self.notebook.get_current_page() == 3:
572
                        self.config.reset_section("compile")
573
                        self.typesetter.set_active(0)
574
575
576
577
class SearchGUI:
578
579
        def __init__(self, builder, editorpane):
580
                self.builder = builder
581
                self.editorpane = editorpane
582
                self.setup_searchwindow()
583
584
        def setup_searchwindow(self):
585
                self.searchwindow = self.builder.get_object("searchwindow")
586
                self.searchentry = self.builder.get_object("searchentry")
587
                self.backwards = self.builder.get_object("toggle_backwards")
588
                self.matchcase = self.builder.get_object("toggle_matchcase")
589
                self.wholeword = self.builder.get_object("toggle_wholeword")
590
591
        def show_searchwindow(self):
592
                self.searchentry.set_text("")
593
                self.searchentry.grab_focus()
594
                self.searchwindow.show()
595
596
        def close_searchwindow(self):
597
                self.searchwindow.hide()
598
                return True
599
600
        def start_search(self):
601
                term = self.searchentry.get_text()
602
                backwards = self.backwards.get_active()
603
                matchcase = self.matchcase.get_active()
604
                wholeword = self.wholeword.get_active()
605
                self.editorpane.start_search(term, backwards, wholeword, matchcase)
606
607
608
class ImportGUI:
609
610
        def __init__(self, builder, editorpane):
611
                self.builder = builder
612
                self.editorpane = editorpane
613
                self.setup_importpanes()
614
615
        def setup_importpanes(self):
616
                self.box_image = self.builder.get_object("box_image")
617
                self.box_table = self.builder.get_object("box_table")
618
                self.box_matrix = self.builder.get_object("box_matrix")
619
                self.image_pane = self.builder.get_object("image_pane")
620
                self.table_pane = self.builder.get_object("table_pane")
621
                self.matrix_pane = self.builder.get_object("matrix_pane")
622
                self.importer = Importer.Importer(self.editorpane, self.builder)
623
624
        def show_importpane(self, notebook, page_num):
625
                newactive = notebook.get_nth_page(page_num).get_name()
626
                self.box_image.foreach(lambda x:self.box_image.remove(x))
627
                self.box_table.foreach(lambda x:self.box_table.remove(x))
628
                self.box_matrix.foreach(lambda x:self.box_matrix.remove(x))
629
                if newactive == "box_image":
630
                        self.box_image.add(self.image_pane)
631
                elif newactive == "box_table":
632
                        self.box_table.add(self.table_pane)
633
                elif newactive == "box_matrix":
634
                        self.box_matrix.add(self.matrix_pane)
635
636
        def insert_object(self, widget):
637
                caller = widget.get_name()
638
                if caller == "table_apply":
639
                        self.importer.insert_table()
640
                elif caller == "image_apply":
641
                        self.importer.insert_image()
642
                elif caller == "matrix_apply":
643
                        self.importer.insert_matrix()
644
645
        def choose_imagefile(self):
646
                self.importer.prepare_image()        
647
648
649
650
651
class RecentGUI:
652
653
        def __init__(self, builder, config, parent):        
654
                self.builder = builder
655
                self.config = config
656
                self.parent = parent
657
                self.iofunc = self.parent.iofunc
658
659
                self.recentlist = []
660
                self.setup_recentfiles()
661
662
                
663
        def setup_recentfiles(self):
664
                self.recent1 = self.builder.get_object("menu_recent1")
665
                self.recent2 = self.builder.get_object("menu_recent2")
666
                self.recent3 = self.builder.get_object("menu_recent3")
667
                recent1 = self.config.get_value("recent_files", "recent1")
668
                recent2 = self.config.get_value("recent_files", "recent2")
669
                recent3 = self.config.get_value("recent_files", "recent3")
670
                self.recentlist.append(recent1)        
671
                self.recentlist.append(recent2)        
672
                self.recentlist.append(recent3)
673
                self.display_recentfile(0, self.recent1)
674
                self.display_recentfile(1, self.recent2)
675
                self.display_recentfile(2, self.recent3)
676
677
        def display_recentfile(self, i, widget):
678
                try:
679
                        if not self.recentlist[i] == "":
680
                                entry = os.path.basename(self.recentlist[i])
681
                                widget.get_children()[0].set_label(str(i+1) + ". " + entry)
682
                                widget.show()
683
                except IndexError: widget.hide()
684
685
        def activate_recentfile(self, widget):
686
                indexstr = widget.get_name()[11:] # dirty hack
687
                indexnr = int(indexstr)-1 # to get index number
688
                if os.path.exists(self.recentlist[indexnr]):
689
                        self.load_recentfile(self.recentlist[indexnr])
690
                else:
691
                        self.remove_recentfile(indexnr)
692
693
        def add_recentfile(self, filename):
694
                if filename not in self.recentlist:
695
                        self.recentlist.insert(0, filename)
696
                        if len(self.recentlist) > 3:
697
                                del self.recentlist[3]
698
                        for index,value in enumerate(self.recentlist):
699
                                position = str(index+1)
700
                                self.config.set_value \
701
                                        ("recent_files", "recent" + position, value)
702
                self.display_recentfile(0, self.recent1)
703
                self.display_recentfile(1, self.recent2)
704
                self.display_recentfile(2, self.recent3)
705
706
707
        def remove_recentfile(self, position):
708
                self.iofunc.set_status("Error loading recent file: " + str(self.recentlist[position]))
709
                self.recentlist.pop(position)
710
                for index,value in enumerate(self.recentlist):
711
                        position = str(index+1)
712
                        self.config.set_value("recent_files", "recent" + position, value)
713
                self.display_recentfile(0, self.recent1)
714
                self.display_recentfile(1, self.recent2)
715
                self.display_recentfile(2, self.recent3)
716
                
717
718
        def load_recentfile(self, filename):
719
                self.parent.check_for_save()
720
                self.parent.load_document(filename)
721