← Back to team overview

mlhim-specs-dev team mailing list archive

[Branch ~cdd-dev/cdd/trunk] Rev 304: Enabled open, save and save_as in menu.

 

------------------------------------------------------------
revno: 304
committer: Eduardo Ribeiro <xcesar@xxxxxxxxx>
branch nick: devel
timestamp: Thu 2013-01-31 17:11:59 -0200
message:
  Enabled open, save and save_as in menu.
modified:
  src/2.0/aux_gui.py
  src/2.0/cdd.py
  src/2.0/container.py
  src/2.0/metadata.py


--
lp:cdd
https://code.launchpad.net/~cdd-dev/cdd/trunk

Your team MLHIM Specifications Developers is subscribed to branch lp:cdd.
To unsubscribe from this branch go to https://code.launchpad.net/~cdd-dev/cdd/trunk/+edit-subscription
=== modified file 'src/2.0/aux_gui.py'
--- src/2.0/aux_gui.py	2013-01-30 14:24:46 +0000
+++ src/2.0/aux_gui.py	2013-01-31 19:11:59 +0000
@@ -9,6 +9,13 @@
 
 from container import container
 
+# Debug purposes !
+import gettext
+gettext.bindtextdomain('CDD','locale/en')
+gettext.textdomain('CDD')
+_ = gettext.gettext
+# Debug purposes !
+
 class EditableListControl(wx.ListCtrl,
                    listmix.ListCtrlAutoWidthMixin,
                    listmix.TextEditMixin):
@@ -37,6 +44,11 @@
     
     def get_pydata(self, item):
         return self.GetItemPyData(item)
+    
+    def set_pydata(self, item, number):
+        data = wx.TreeItemData()
+        data.SetData(number)
+        self.SetItemData(item, data)
 
     def setup_tree(self):
         self.DeleteAllItems()
@@ -50,8 +62,21 @@
         container.insert_node(1, ['definition', None, None, set()])
         
         self.ExpandAll()
+        #self.SelectItem(metadata)
         return [root, metadata, definition]
+   
+    def construct_tree(self, cs):
+        r, m, definition = self.setup_tree()
+        
+        self._construct_tree(cs, definition, 1)
+        self.ExpandAll()
+        return [r, m, definition]
 
+    def _construct_tree(self, cs, item, key):
+        self.set_pydata(item, key)
+        for child in cs[key][3]: # for each child
+            result = self.AppendItem(item, cs[child][0])
+            self._construct_tree(cs, result, child)
 
 ###########################################################################
 ## Misc functions - Maybe put them inside a class in the future
@@ -81,6 +106,38 @@
 
     return l2
 
+def save_file_diag(self, filename, dir):
+    dlg = wx.FileDialog(
+            self, message="Save as...",
+            defaultDir=dir, 
+            defaultFile=filename,
+            style=wx.SAVE
+            )
+    
+    if dlg.ShowModal() == wx.ID_OK:
+        path = dlg.GetPath()
+    else:
+        return None
+
+    dlg.Destroy()
+    return path
+
+def open_file_diag(self, dir, wildcard='All files (*.*)|*.*'):
+    dlg = wx.FileDialog(
+            self, message="Choose a file",
+            defaultDir=dir, 
+            defaultFile='',
+            wildcard=wildcard,
+            style=wx.OPEN | wx.MULTIPLE | wx.CHANGE_DIR
+            )
+    
+    if dlg.ShowModal() == wx.ID_OK:
+        path = dlg.GetPath()
+    else:
+        return None
+
+    dlg.Destroy()
+    return path
 
 def get_path(self):
     #wildcard = "CDD files (*.cdd)|*.cdd|"     \

=== modified file 'src/2.0/cdd.py'
--- src/2.0/cdd.py	2013-01-30 14:24:46 +0000
+++ src/2.0/cdd.py	2013-01-31 19:11:59 +0000
@@ -42,7 +42,7 @@
     def init_things(self):
 
         # Setup the tree
-        self.root, self.metadata, self.definition = self.tree_ctrl_ccd.setup_tree()
+        self.root, self.metadata_item, self.definition_item = self.tree_ctrl_ccd.setup_tree()
 
         # Setup the metadata
         self.setup_config()
@@ -59,8 +59,10 @@
         # except:
         #     pass
 
+        self.tree_ctrl_ccd.SelectItem(self.metadata_item)
+
     def get_definition_child(self):
-        child, cookie = self.tree.GetFirstChild(self.definition)
+        child, cookie = self.tree.GetFirstChild(self.definition_item)
         txt = self.tree.GetItemText(child)
         return txt
 
@@ -78,11 +80,13 @@
         # Hack to make the metadata panel before it is called
         # We need to make it before to be able to get the info from it
         # at the program start
-        self.dummy_panel = wx.Panel(self.panel_top_right, -1)
+        self.dummy_panel = wx.Panel(self, -1)
         self.dummy_panel.Hide()
         self.metadata = MetadataPanel(self.dummy_panel)
         self.metadata.info = info
         self.metadata.set_meta_info()
+        #self.metadata.Destroy()
+        #self.dummy_panel.Destroy()
     
     def evt_button_remove(self, event):  # wxGlade: MainFrame.<event_handler>
         try:
@@ -127,9 +131,14 @@
         c = self.panel_top_right.GetChildren()
         if c:
             for i in c:
-                i.Destroy()
+                # HACK to not destroy metadata panel
+                # I should really change this on the next version
+                if i.__str__().startswith("<metadata.MetadataPanel"): 
+                    self.metadata.Reparent(self.dummy_panel)
+                else:
+                    i.Destroy()
 
-        item =  event.GetItem()
+        item = event.GetItem()
         selTextRaw = self.tree_ctrl_ccd.GetItemText(item)
 
         selText = selTextRaw.split(' ')[0].strip()
@@ -152,10 +161,13 @@
             self.button_ok.Hide()
             self.button_remove.Hide()
             self.Layout()
-            choice = MetadataPanel(self.panel_top_right)
+            self.metadata.Reparent(self.panel_top_right)
+            self.metadata.SetClientSize(self.metadata.GetParent().GetSize())
+            #choice = MetadataPanel(self.panel_top_right)
 
             # Necessary for exporting the metadata
-            choice.info = info
+            self.metadata.info = info
+            #choice.info = info
 
 
         elif selText == "definition":
@@ -285,13 +297,43 @@
         not_implemented_diag(self)
 
     def file_open(self, event):  # wxGlade: MainFrame.<event_handler>
-        not_implemented_diag(self)
+        wildcard = \
+            "Pickle files (*.pickle)|*.pickle|" \
+            "All files (*.*)|*.*"
 
-    def file_save(self, event):  # wxGlade: MainFrame.<event_handler>
-        not_implemented_diag(self)
+        path = self.config_dialog.config.get('DEFAULT', 'workspace')
+        
+        filename = open_file_diag(self, path, wildcard=wildcard)
+        if not filename: return
+        arq = open(filename, 'rb')
+        structure = container.load_structure(arq)
+        self.root, self.metadata_item, self.definition_item = self.tree_ctrl_ccd.construct_tree(structure)
+        container.set(structure)
+        md = container.get_metadata()
+        self.metadata.set_from_dict(md)
+        self.tree_ctrl_ccd.SelectItem(self.metadata_item)
+        
+    def file_save(self, event, ask=False):  # wxGlade: MainFrame.<event_handler>
+        path = self.config_dialog.config.get('DEFAULT', 'workspace')
+        try:
+            self.first_save
+            if ask or not self.pickle_name:
+                self.pickle_name = save_file_diag(self, 'CDD.pickle', path)
+        except AttributeError, e:
+            self.pickle_name = save_file_diag(self, 'CDD.pickle', path)
+        
+        if self.pickle_name:
+            self.first_save = False
+        else:
+            return
+        
+        arq = open(self.pickle_name, 'wb')
+        md = self.metadata.get_as_dict()
+        container.set_metadata(md)
+        container.save_structure(arq)
 
     def file_save_as(self, event):  # wxGlade: MainFrame.<event_handler>
-        not_implemented_diag(self)
+        self.file_save(None, ask=True)
 
     def file_validate(self, event):  # wxGlade: MainFrame.<event_handler>
         not_implemented_diag(self)

=== modified file 'src/2.0/container.py'
--- src/2.0/container.py	2013-01-30 14:24:46 +0000
+++ src/2.0/container.py	2013-01-31 19:11:59 +0000
@@ -1,5 +1,6 @@
 # -*- coding: utf-8 -*-
 
+import pickle
 from collections import OrderedDict
 
 class Container(object):
@@ -9,6 +10,9 @@
     def reset(self):
         self.structure = OrderedDict()
         
+    def set(self, structure):
+        self.structure = structure
+        
     def exists(self, key):
         return self.structure.has_key(key)
     
@@ -44,4 +48,17 @@
             
         self.structure.pop(key)
 
+    def save_structure(self, fd):
+        pickle.dump(self.structure, fd)
+
+    @classmethod
+    def load_structure(self, fd):
+        return pickle.load(fd)
+    
+    def set_metadata(self, md):
+        self.structure['metadata'] = md
+        
+    def get_metadata(self):
+        return self.structure.get('metadata')
+    
 container = Container()

=== modified file 'src/2.0/metadata.py'
--- src/2.0/metadata.py	2013-01-30 14:24:46 +0000
+++ src/2.0/metadata.py	2013-01-31 19:11:59 +0000
@@ -7,6 +7,19 @@
 class MetadataPanel(cdd_gui.MetadataPanel):
     def __init__(self, *args, **kwds):
         cdd_gui.MetadataPanel.__init__(self, *args, **kwds)
+        
+        self.title = ''
+        self.description = ''
+        self.creator = ''
+        self.creator_email = ''
+        self.contributor = ''
+        self.publisher = ''
+        self.subject = ''
+        self.source = ''
+        self.rights = ''
+        self.relation = ''
+        self.coverage = ''
+        self.language = ''
 
         self.info = None
         self.init_config()
@@ -29,7 +42,7 @@
                 'description' : '',
                 'creator' : '',
                 'creator_email' : '',
-                'contributor' : '',
+                'contributors' : '',
                 'publisher' : '',
                 'subject' : '',
                 'source' : '',
@@ -49,10 +62,13 @@
 
     def read_config(self):
         self.config.read(self.configname)
+        self.load_fields()
         self.set_panel_configs()
 
     def save_config(self, event=None):   # wxGlade: MetadataPanel.<event_handler>
         self.get_panel_configs()
+
+        self.store_fields()
         try:
             with open(self.configname, 'wb') as configfile:
                 configfile.write('# Concept Definition Designer Configuration\n# Do not edit the text to the left of the equal symbol (=)\n\n')
@@ -70,7 +86,7 @@
             description = self.text_ctrl_description.GetValue().encode('utf8')
             creator = self.text_ctrl_creator.GetValue().encode('utf8')
             creator_email = self.text_ctrl_creator_email.GetValue().encode('utf8')
-            contributor = self.text_ctrl_contributors.GetValue().encode('utf8')
+            contributors = self.text_ctrl_contributors.GetValue().encode('utf8')
 
             publisher = self.text_ctrl_publisher.GetValue().encode('utf8')
             subject = self.text_ctrl_subject.GetValue().encode('utf8')
@@ -84,42 +100,109 @@
             tempo = self.datepicker_ctrl_date.GetValue()
             date = '{Y}-{M:02}-{D:02}'.format(Y=tempo.GetYear(), M=tempo.GetMonth()+1, D=tempo.GetDay())
 
-            self.info.get_metadata_info(title, description, date, creator, creator_email, contributor, language, publisher, subject, source, rights, relation, coverage)
+            self.info.get_metadata_info(title, description, date, creator, creator_email, contributors, language, publisher, subject, source, rights, relation, coverage)
 
 
     def get_panel_configs(self):
-        self.config.set('DEFAULT', 'title', self.text_ctrl_title.GetValue().encode('utf8'))
-        self.config.set('DEFAULT', 'description', self.text_ctrl_description.GetValue().encode('utf8'))
-        self.config.set('DEFAULT', 'creator', self.text_ctrl_creator.GetValue().encode('utf8'))
-        self.config.set('DEFAULT', 'creator_email', self.text_ctrl_creator_email.GetValue().encode('utf8'))
-        self.config.set('DEFAULT', 'contributor', self.text_ctrl_contributors.GetValue().encode('utf8'))
-
-        self.config.set('DEFAULT', 'publisher', self.text_ctrl_publisher.GetValue().encode('utf8'))
-        self.config.set('DEFAULT', 'subject', self.text_ctrl_subject.GetValue().encode('utf8'))
-        self.config.set('DEFAULT', 'source', self.text_ctrl_source.GetValue().encode('utf8'))
-        self.config.set('DEFAULT', 'rights', self.text_ctrl_rights.GetValue().encode('utf8'))
-        self.config.set('DEFAULT', 'relation', self.text_ctrl_relation.GetValue().encode('utf8'))
-        self.config.set('DEFAULT', 'coverage', self.text_ctrl_coverage.GetValue().encode('utf8'))
-
-        self.config.set('DEFAULT', 'language', str(self.choice_lang.GetSelection()))
+        self.title = self.text_ctrl_title.GetValue().encode('utf8')
+        self.description = self.text_ctrl_description.GetValue().encode('utf8')
+        self.creator = self.text_ctrl_creator.GetValue().encode('utf8')
+        self.creator_email = self.text_ctrl_creator_email.GetValue().encode('utf8')
+        self.contributors = self.text_ctrl_contributors.GetValue().encode('utf8')
+
+        self.publisher = self.text_ctrl_publisher.GetValue().encode('utf8')
+        self.subject = self.text_ctrl_subject.GetValue().encode('utf8')
+        self.source = self.text_ctrl_source.GetValue().encode('utf8')
+        self.rights = self.text_ctrl_rights.GetValue().encode('utf8')
+        self.relation = self.text_ctrl_relation.GetValue().encode('utf8')
+        self.coverage = self.text_ctrl_coverage.GetValue().encode('utf8')
+
+        self.language = str(self.choice_lang.GetSelection())
 
     def set_panel_configs(self):
-        self.text_ctrl_title.SetValue(self.config.get('DEFAULT', 'title'))
-        self.text_ctrl_description.SetValue(self.config.get('DEFAULT', 'description'))
-        self.text_ctrl_creator.SetValue(self.config.get('DEFAULT', 'creator'))
-        self.text_ctrl_creator_email.SetValue(self.config.get('DEFAULT', 'creator_email'))
-        self.text_ctrl_contributors.SetValue(self.config.get('DEFAULT', 'contributor'))
-
-        self.text_ctrl_publisher.SetValue(self.config.get('DEFAULT', 'publisher'))
-        self.text_ctrl_subject.SetValue(self.config.get('DEFAULT', 'subject'))
-        self.text_ctrl_source.SetValue(self.config.get('DEFAULT', 'source'))
-        self.text_ctrl_rights.SetValue(self.config.get('DEFAULT', 'rights'))
-        self.text_ctrl_relation.SetValue(self.config.get('DEFAULT', 'relation'))
-        self.text_ctrl_coverage.SetValue(self.config.get('DEFAULT', 'coverage'))
-
-        self.choice_lang.SetSelection(int(self.config.get('DEFAULT', 'language')))
-
+        self.text_ctrl_title.SetValue(self.title)
+        self.text_ctrl_description.SetValue(self.description)
+        self.text_ctrl_creator.SetValue(self.creator)
+        self.text_ctrl_creator_email.SetValue(self.creator_email)
+        self.text_ctrl_contributors.SetValue(self.contributors)
+
+        self.text_ctrl_publisher.SetValue(self.publisher)
+        self.text_ctrl_subject.SetValue(self.subject)
+        self.text_ctrl_source.SetValue(self.source)
+        self.text_ctrl_rights.SetValue(self.rights)
+        self.text_ctrl_relation.SetValue(self.relation)
+        self.text_ctrl_coverage.SetValue(self.coverage)
+
+        self.choice_lang.SetSelection(int(self.language))
+
+    def load_fields(self):
+        self.title = self.config.get('DEFAULT', 'title')
+        self.description = self.config.get('DEFAULT', 'description')
+        self.creator = self.config.get('DEFAULT', 'creator')
+        self.creator_email = self.config.get('DEFAULT', 'creator_email')
+        self.contributors = self.config.get('DEFAULT', 'contributors')
+
+        self.publisher = self.config.get('DEFAULT', 'publisher')
+        self.subject = self.config.get('DEFAULT', 'subject')
+        self.source = self.config.get('DEFAULT', 'source')
+        self.rights = self.config.get('DEFAULT', 'rights')
+        self.relation = self.config.get('DEFAULT', 'relation')
+        self.coverage = self.config.get('DEFAULT', 'coverage')
+
+        self.language = self.config.get('DEFAULT', 'language')
+        
+    def store_fields(self):
+        self.config.set('DEFAULT', 'title', self.title)
+        self.config.set('DEFAULT', 'description', self.description)
+        self.config.set('DEFAULT', 'creator', self.creator)
+        self.config.set('DEFAULT', 'creator_email', self.creator_email)
+        self.config.set('DEFAULT', 'contributors', self.contributors)
+
+        self.config.set('DEFAULT', 'publisher', self.publisher)
+        self.config.set('DEFAULT', 'subject', self.subject)
+        self.config.set('DEFAULT', 'source', self.source)
+        self.config.set('DEFAULT', 'rights', self.rights)
+        self.config.set('DEFAULT', 'relation', self.relation)
+        self.config.set('DEFAULT', 'coverage', self.coverage)
+
+        self.config.set('DEFAULT', 'language', str(self.language))
+        
+
+    def get_as_dict(self):
+        md = dict(
+            title = self.title,
+            description = self.description,
+            creator = self.creator,
+            creator_email = self.creator_email,
+            contributor = self.contributor,
+            publisher = self.publisher,
+            subject = self.subject,
+            source = self.source,
+            rights = self.rights,
+            relation = self.relation,
+            coverage = self.coverage,
+            language = self.language,
+            )
+        return md
+
+    def set_from_dict(self, dicto):
+        self.title = dicto['title']
+        self.description = dicto['description']
+        self.creator = dicto['creator']
+        self.creator_email = dicto['creator_email']
+        self.contributor = dicto['contributor']
+        self.publisher = dicto['publisher']
+        self.subject = dicto['subject']
+        self.source = dicto['source']
+        self.rights = dicto['rights']
+        self.relation = dicto['relation']
+        self.coverage = dicto['coverage']
+        self.language = dicto['language']
+        
+        self.set_panel_configs()
+        
     def enable_ok(self, event):  # wxGlade: MetadataPanel.<event_handler>
         self.button_ok.Enable()
+        
 
 # end of class MetadataPanel