Changeset 1269

Show
Ignore:
Timestamp:
05/11/07 05:57:00 (1 year ago)
Author:
arj..@yirdis.nl
Message:

Implemented Open and Save (as)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • gaphor/trunk/gaphor/services/actionmanager.py

    r1268 r1269  
    5757             
    5858            assert action_provider.action_group 
     59            self.ui_manager.insert_action_group(action_provider.action_group, -1) 
    5960            if action_provider.menu_xml: 
    6061                action_provider.__ui_merge_id = \ 
    6162                        self.ui_manager.add_ui_from_string(action_provider.menu_xml) 
    6263                log.debug('Added menu xml %d' % action_provider.__ui_merge_id) 
    63             self.ui_manager.insert_action_group(action_provider.action_group, -1) 
    6464            self.update_actions() 
    6565 
  • gaphor/trunk/gaphor/services/filemanager.py

    r1268 r1269  
    44 
    55import gc 
     6import gobject, gtk 
    67from zope import interface, component 
    78from gaphor.interfaces import IService, IActionProvider 
    89from gaphor.core import _, inject, action, build_action_group 
    910from gaphor import UML 
    10  
     11from gaphor.misc.gidlethread import GIdleThread, Queue, QueueEmpty 
     12from gaphor.misc.xmlwriter import XMLWriter 
     13from gaphor.misc.errorhandler import error_handler, ErrorHandlerAspect, weave_method 
     14 
     15DEFAULT_EXT='.gaphor' 
    1116 
    1217class FileManager(object): 
     
    4348 
    4449    def init(self, app): 
     50        self._app = app 
    4551        self.action_group = build_action_group(self) 
    4652 
     
    7783    @action(name='file-open', stock_id='gtk-open') 
    7884    def open(self): 
    79         pass 
     85        filesel = gtk.FileChooserDialog(title='Open Gaphor model', 
     86                                        action=gtk.FILE_CHOOSER_ACTION_OPEN, 
     87                                        buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)) 
     88 
     89        filter = gtk.FileFilter() 
     90        filter.set_name("Gaphor models") 
     91        filter.add_pattern("*.gaphor") 
     92        filesel.add_filter(filter) 
     93 
     94        filter = gtk.FileFilter() 
     95        filter.set_name("All files") 
     96        filter.add_pattern("*") 
     97        filesel.add_filter(filter) 
     98 
     99        if self.filename: 
     100            filesel.set_current_name(self.filename) 
     101 
     102        response = filesel.run() 
     103        filename = filesel.get_filename() 
     104        filesel.destroy() 
     105        if not filename or response != gtk.RESPONSE_OK: 
     106            return 
     107 
     108        try: 
     109            from gaphor import storage 
     110            log.debug('Loading from: %s' % filename) 
     111            main_window = self.gui_manager.main_window 
     112            queue = Queue() 
     113            win = show_status_window(_('Loading...'), _('Loading model from %s') % filename, main_window.window, queue) 
     114            self.filename = filename 
     115            gc.collect() 
     116            worker = GIdleThread(storage.load_generator(filename, self.element_factory), queue) 
     117            #self._window.action_pool.insensivate_actions() 
     118            #undo_manager.clear_undo_stack() 
     119            #get_undo_manager().clear_redo_stack() 
     120            worker.start() 
     121            worker.wait() 
     122            if worker.error: 
     123                log.error('Error while loading model from file %s: %s' % (filename, worker.error)) 
     124                error_handler(message='Error while loading model from file %s' % filename, exc_info=worker.exc_info) 
     125 
     126            # Let this be handled by the main window itself: 
     127            #self._window.set_message('Model loaded successfully') 
     128            model = main_window.get_model() 
     129            view = main_window.get_tree_view() 
     130 
     131            main_window.set_filename(filename) 
     132 
     133            # Expand all root elements: 
     134            for node in model.root[1]: 
     135                view.expand_row(model.path_from_element(node[0]), False) 
     136 
     137        finally: 
     138            try: 
     139                win.destroy() 
     140            except: 
     141                pass 
     142 
     143 
     144    def _save(self, filename): 
     145        if filename and len(filename) > 0: 
     146            from gaphor import storage 
     147            if not filename.endswith(DEFAULT_EXT): 
     148                filename = filename + DEFAULT_EXT 
     149 
     150            queue = Queue() 
     151            log.debug('Saving to: %s' % filename) 
     152            win = show_status_window('Saving...', 'Saving model to %s' % filename, self.gui_manager.main_window.window, queue) 
     153            try: 
     154                out = open(filename, 'w') 
     155 
     156                worker = GIdleThread(storage.save_generator(XMLWriter(out), self.element_factory), queue) 
     157                #action_states = self._window.action_pool.get_action_states() 
     158                #self._window.action_pool.insensivate_actions() 
     159                worker.start() 
     160                worker.wait() 
     161                if worker.error: 
     162                    log.error('Error while saving model to file %s: %s' % (filename, worker.error)) 
     163                    error_handler(message='Error while saving model to file %s' % filename, exc_info=worker.exc_info) 
     164                out.close() 
     165 
     166                self.gui_manager.main_window.set_filename(filename) 
     167 
     168                # Restore states of actions 
     169                #self._window.action_pool.set_action_states(action_states) 
     170            finally: 
     171                win.destroy() 
    80172 
    81173    @action(name='file-save', stock_id='gtk-save') 
    82174    def save(self): 
    83         pass 
     175        filename = self.gui_manager.main_window.get_filename() 
     176        if filename: 
     177            self._save(filename) 
     178        else: 
     179            self.save_as() 
    84180 
    85181    @action(name='file-save-as', stock_id='gtk-save-as') 
    86182    def save_as(self): 
    87         pass 
     183        filename = self.gui_manager.main_window.get_filename() 
     184        filesel = gtk.FileChooserDialog(title=_('Save Gaphor model as'), 
     185                                        action=gtk.FILE_CHOOSER_ACTION_SAVE, 
     186                                        buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_SAVE,gtk.RESPONSE_OK)) 
     187        if filename: 
     188            filesel.set_current_name(filename) 
     189        response = filesel.run() 
     190        filename = None 
     191        if response == gtk.RESPONSE_OK: 
     192            filename = filesel.get_filename() 
     193        filesel.destroy() 
     194        self._save(filename) 
    88195 
    89196    @action(name='file-recent-files', label=_('Recent files'), stock_id='gtk-recent') 
     
    92199 
    93200 
     201def show_status_window(title, message, parent=None, queue=None): 
     202    win = gtk.Window(gtk.WINDOW_TOPLEVEL) 
     203    win.set_title(title) 
     204    win.set_position(gtk.WIN_POS_CENTER_ON_PARENT) 
     205    win.set_transient_for(parent) 
     206    win.set_modal(True) 
     207    win.set_resizable(False) 
     208    win.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG) 
     209    #win.set_skip_taskbar_hint(True) 
     210    #win.set_skip_pager_hint(True) 
     211    win.set_border_width(24) 
     212    vbox = gtk.VBox(spacing=24) 
     213    win.add(vbox) 
     214    label = gtk.Label(message) 
     215    label.set_padding(8,8) 
     216    vbox.pack_start(label) 
     217    progress_bar = gtk.ProgressBar() 
     218    vbox.pack_start(progress_bar, expand=False, fill=False, padding=0) 
     219 
     220    def progress_idle_handler(progress_bar, queue): 
     221        #print '.', 
     222        percentage = 0 
     223        try: 
     224            while True: 
     225                percentage = queue.get() 
     226        except QueueEmpty: 
     227            pass 
     228        if percentage: 
     229            progress_bar.set_fraction(min(percentage / 100.0, 100.0)) 
     230        return True 
     231 
     232    if queue: 
     233        idle_id = gobject.idle_add(progress_idle_handler, progress_bar, queue, 
     234                                   priority=gobject.PRIORITY_LOW) 
     235        # Make sure the idle fucntion is removed as soon as the window 
     236        # is destroyed. 
     237        def remove_progress_idle_handler(window, idle_id): 
     238            #print 'remove_progress_idle_handler', idle_id 
     239            gobject.source_remove(idle_id) 
     240        win.connect('destroy', remove_progress_idle_handler, idle_id) 
     241 
     242    win.show_all() 
     243    return win 
     244 
    94245#vim:sw=4:et:ai 
  • gaphor/trunk/gaphor/ui/mainwindow.py

    r1268 r1269  
    429429        super(MainWindow, self).construct() 
    430430 
     431        # Add accelerators from ui manager: 
     432 
     433        # Does not work: 
     434        # ./gaphor/ui/mainwindow.py:437: GtkWarning: _gtk_accel_group_attach: assertion `g_slist_find (accel_group->acceleratables, object) == NULL' failed 
     435        #  self.window.add_accel_group(self.ui_manager.get_accel_group()) 
     436 
     437        self.window.add_accel_group(self.ui_manager.get_accel_group()) 
     438 
    431439        self.window.connect('delete-event', self._on_window_delete) 
    432440 
  • gaphor/trunk/setup.py

    r1267 r1269  
    8282            'undo_manager = gaphor.services.undomanager:UndoManager', 
    8383#            'plugin_manager = gaphor.services.pluginmanager:PluginManager', 
    84             'action_manager = gaphor.services.actionmanager:ActionManager', 
    8584            'element_factory = gaphor.UML.elementfactory:ElementFactory', 
    8685            'file_manager = gaphor.services.filemanager:FileManager', 
    8786            'gui_manager = gaphor.services.guimanager:GUIManager', 
     87            'action_manager = gaphor.services.actionmanager:ActionManager', 
    8888        ], 
    8989        'gaphor.uicomponents': [