class GEximonWindow(gtk.Window): """The main geximon window.""" def __init__(self): gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL) self.set_title('gEximon') self.connect('delete-event', self.quit) self.prefs = prefs = Preferences() prefs.load() prefs.subscribe(self.apply_prefs) self.logwatcher = LogWatcher(prefs.log_dir, prefs.mainlog_name, prefs.bin_dir, prefs.use_sudo, prefs.use_ssh, prefs.hostname) # callback is None, it will be specified by QueueWidget self.queue_mgr = QueueManager(None, prefs.bin_dir, prefs.exim_binary, prefs.use_sudo, prefs.use_ssh, prefs.hostname) self._setUpIcons() # create menu bar self._setUpMenu() # create status bar self.statusbar = gtk.Statusbar() self.statusbar.push(0, '') # set up widgets self.plotter = Plotter(self.logwatcher, self.queue_mgr, prefs) self.log_widget = LogWidget(self.logwatcher, prefs) self.queue_widget = QueueWidget(self, self.logwatcher, self.queue_mgr, prefs) self.process_window = ProcessWindow(prefs) def processWindowClosed(*ignored_arguments): self.prefs.show_process_list = False self.prefs.notify() return True # prevent the window from getting destroyed self.process_window.connect('delete-event', processWindowClosed) self._layOutWidgets() prefs.notify() def _setUpIcons(self): try: icon16x16 = gtk.gdk.pixbuf_new_from_file( '/usr/share/pixmaps/geximon-16x16.xpm') icon32x32 = gtk.gdk.pixbuf_new_from_file( '/usr/share/pixmaps/geximon-32x32.xpm') except gobject.GError: pass else: gtk.window_set_default_icon_list(icon32x32, icon16x16) def _setUpMenu(self): """Set up the main menubar.""" def runQueue(*ignored_arguments): self.queue_mgr.runQueue() if self.prefs.report_success: AlertDialog(self, _("A queue runner has been started."), _("A new exim instance has been started in the background." " It will process the queue and then terminate.")) def runExigrep(*ignored_arguments): dialog = ExigrepDialog(self) dialog.go(self.logwatcher) def runEximstats(*ignored_arguments): dialog = EximstatsDialog(self) dialog.go(self.logwatcher) def getRejectlog(*ignored_arguments): text = self.logwatcher.getRejectlog() PopupWindow(_("Reject log"), text).show_all() def getPaniclog(*ignored_arguments): text = self.logwatcher.getPaniclog() PopupWindow(_("Panic log"), text).show_all() def getConfig(*ignored_arguments): text = self.queue_mgr.getConfiguration() PopupWindow(_("Exim configuration"), text).show_all() def scrollLogToggled(menuitem): """Automatically scroll the log on new data.""" self.prefs.track_log = menuitem.get_active() self.prefs.notify() def processDisplayToggled(menuitem): """Show or hide the process list window.""" self.prefs.show_process_list = menuitem.get_active() self.prefs.notify() def plotDisplayToggled(menuitem): """Show or hide the plot area.""" self.prefs.show_plotter = menuitem.get_active() self.prefs.notify() def statusbarDisplayToggled(menuitem): """Show or hide the statusbar.""" self.prefs.show_statusbar = menuitem.get_active() self.prefs.notify() def helpContents(menuitem): """Show the help contents.""" show_help() ui_string = """<ui> <menubar name='menubar'> <menu action='GeximonMenu'> <menuitem action='Preferences'/> <separator/> <menuitem action='Quit'/> </menu> <menu action='EximMenu'> <menuitem action='Spawn Queue Runner'/> <separator/> <menuitem action='Exigrep'/> <menuitem action='Eximstats'/> <separator/> <menuitem action='Rejectlog'/> <menuitem action='Paniclog'/> <separator/> <menuitem action='Get_Configuration'/> </menu> <menu action='ViewMenu'> <menuitem action='Plots'/> <menuitem action='Statusbar'/> <separator/> <menuitem action='ProcessList'/> <separator/> <menuitem action='Scroll'/> </menu> <menu action='HelpMenu'> <menuitem action='Contents'/> <menuitem action='About'/> </menu> </menubar> </ui>""" ag = gtk.ActionGroup('WindowActions') actions = [ ('GeximonMenu', None, '_Geximon'), ('Preferences', gtk.STOCK_PREFERENCES, '_Preferences', '<control>P', 'Open the preferences dialog', self.editPreferences), ('Quit', gtk.STOCK_QUIT, '_Quit', '<control>Q', 'Quit application', self.quit), ('EximMenu', None, '_Exim'), ('Spawn Queue Runner', None, 'Spawn _Queue Runner', '<control>R', 'Spawn Queue Runner', runQueue), ('Exigrep', None, 'Exi_grep', None, 'Run Exigrep', runExigrep), ('Eximstats', None, 'Exim_stats', None, 'Run Eximstats', runEximstats), ('Rejectlog', None, 'See _Rejectlog', None, 'See Rejectlog', getRejectlog), ('Paniclog', None, 'See _Paniclog', None, 'See Paniclog', getPaniclog), ('Get_Configuration', None, 'Get _Configuration', None, 'Get Configuration', getConfig), ('ViewMenu', None, '_View'), ('HelpMenu', None, '_Help'), ('Contents', None, '_Contents', None, 'Show help contents', helpContents), ('About', None, '_About', None, 'Show about dialog', self.about), ] actionstoggle = [ ('Plots', None, '_Plots', '<control>G', 'Toggle plot view', plotDisplayToggled), ('Statusbar', None, '_Statusbar', None, 'Toggle statusbar view', statusbarDisplayToggled), ('ProcessList', None, 'P_rocess List', '<control>L', 'Toggle process list view', processDisplayToggled), ('Scroll', None, 'Scroll _log on new data', '<control>S', 'Toggle scroll log', scrollLogToggled), ] ag.add_actions(actions) ag.add_toggle_actions(actionstoggle) self.ui = gtk.UIManager() self.ui.insert_action_group(ag, 0) self.ui.add_ui_from_string(ui_string) self.add_accel_group(self.ui.get_accel_group()) self.show_plotter_menu_item = ag.get_action('Plots') self.show_statusbar_menu_item = ag.get_action('Statusbar') self.process_list_menu_item = ag.get_action('ProcessList') self.track_log_menu_item = ag.get_action('Scroll') def _layOutWidgets(self): self.pane = gtk.VPaned() self.pane.pack1(framed(scrolled(self.log_widget)), resize=True) self.pane.pack2(framed(scrolled(self.queue_widget)), resize=True) self.vbox = gtk.VBox() self.vbox.set_border_width(2) self.vbox.pack_start(framed(self.plotter), expand=False) self.vbox.pack_end(self.pane) self.vbox2 = gtk.VBox() self.vbox2.pack_start(self.ui.get_widget('/menubar'), expand=False) self.vbox2.pack_start(self.vbox, expand=True) self.vbox2.pack_end(self.statusbar, expand=False) self.add(self.vbox2) if self.prefs.remember_sizes: self.set_default_size( self.prefs.window_width, self.prefs.window_height) self.pane.set_position(self.prefs.divider_position) else: self.set_default_size(550, 600) def quit(self, *ignored_arguments): self.save_preferences() # it would be nice if the following were called automatically self.process_window.process_widget.cleanup() gtk.main_quit() return False def save_preferences(self): self.prefs.window_width, self.prefs.window_height = self.get_size() self.prefs.divider_position = self.pane.get_position() self.prefs.wrap_log = self.log_widget.get_wrap_mode() self.prefs.save() def about(self, *ignored_arguments): """Show the about dialog.""" about_dialog = AboutDialog(self) about_dialog.go() def editPreferences(self, *ignored_arguments): """Show the preferences dialog.""" pref_dialog = PreferencesDialog(self, self.prefs) pref_dialog.show_all() response = pref_dialog.run() if response == gtk.RESPONSE_OK: pref_dialog.apply(self.prefs) pref_dialog.hide() def apply_prefs(self, prefs): self.process_list_menu_item.set_active(prefs.show_process_list) self.show_plotter_menu_item.set_active(prefs.show_plotter) self.show_statusbar_menu_item.set_active(prefs.show_statusbar) if prefs.show_statusbar: self.statusbar.show_all() else: self.statusbar.hide() self.track_log_menu_item.set_active(prefs.track_log)