class CircuitEditor(EditorInterface, ElementMap):
    
    def __init__(self, parent, ID, uri):
        EditorInterface.__init__(self, parent, False, uri)
        ElementMap.__init__(self, parent, ID)

        self._controller = Controller()
        self._logger     = self._controller.getLogger()
        self._model      = Model()
        self._circtree   = ComponentManager().getComponent("circuit").getCircuitTree()
        self._importer   = edef.Importer()
        self._mainframe  = self._controller.getMainFrame()
        
        self.setTitle(uri)
       
        if not uri == "circ://":
            self._loadCircuit(uri)
            self.redraw()
            self.setModified(False)

        self._target = CircuitDropTarget(self)
        self.SetDropTarget( self._target )


    def _loadCircuit(self, uri):
        wire_list = []
        mod_table = {}
        self._logger.debug("Load %s"%uri)
        
        xml = self._model.openURI(uri)
        meta = CircuitMeta(xml)
        mods = meta.getModules()
        
        for (ID, (name, label, (x,y), params)) in mods.items():
            self._logger.debug("Load module %s as %s @ %s,%s"%(name, label, x,y))
            moduri = "mod://"+"/".join(name.split("."))
            mod_table[ID] = self.loadModule(moduri, x,y, params)
            mod_table[ID].setLabel(label)
            wire_list += meta.getWires(ID)
            
        for ( frm, to ) in wire_list:
            (frm_id, frm_pin) = frm
            (to_id,  to_pin)  = to
            frm = mod_table[frm_id].getPin(frm_pin)
            to  = mod_table[to_id].getPin(to_pin)
            self.connect(frm,to)
         

    def OnSelected(self, evt=None):
        self._updateMainFrame()


    def _updateMainFrame(self):
        self._mainframe.bindCopy()
        self._mainframe.bindCut()
        self._mainframe.bindPaste()
        self._mainframe.bindRedo()
        self._mainframe.bindUndo()
        
        self._mainframe.bindSaveAs(self.OnSaveAs)
        if self.isModified() and self.getURI() != "circ://":
            self._mainframe.bindSave(self.OnSave)
        else: self._mainframe.bindSave()


    def OnModified(self):
        self.setModified(True)
        self._updateMainFrame()
        

    def OnSave(self, evt):
        self._logger.debug("On save...")
        
        if self.getURI() == "circ://":
            self.OnSaveAs(evt)
            return
                    
        txt = self._to_xml().toprettyxml(" ")
        self._model.saveURI(self.getURI(), txt)
        self.setModified(False)
        self._updateMainFrame()


    def OnSaveAs(self, evt):
        dlg = SaveAsDialog(self, -1)
        if dlg.ShowModal()==wx.ID_CANCEL:
            dlg.Destroy()
            return
        uri = dlg.getSelection()
        dlg.Destroy()

        try:
            txt = self._to_xml().toprettyxml("  ")
            self._model.saveURI(uri, txt)
        except:
            showExceptionDialog(self, -1, "Unable to save file to %s"%uri)

        self.setURI(uri)
        self.setTitle(uri)
        self._circtree.addURI(uri)
        self.setModified(False)
        self._updateMainFrame()


    def _to_xml(self):
        dom_impl = getDOMImplementation()

        doc = dom_impl.createDocument(None, "Circuit", None)
        root = doc.documentElement

        mods = self.getObjects(gModule)
        for idx in range(len(mods)):
            mod = mods[idx]
            mod_node = mod._to_xml(doc, idx)
            cons = self.getConnectionsFrom(mod)
            for con in cons:
                to_pin = con.getTo().getName()
                frm_pin = con.getFrom().getName()
                to_idx = mods.index(con.getTo().getModule())
                wire = doc.createElement("Wire")
                frm = doc.createElement("From")
                frm.setAttribute("id", str(idx))
                frm.setAttribute("pin",frm_pin)
                wire.appendChild(frm)
                to = doc.createElement("To")
                to.setAttribute("id", str(to_idx))
                to.setAttribute("pin", to_pin)
                wire.appendChild(to)
                root.appendChild(wire)
            root.appendChild(mod_node)
        return doc
Example #2
0
class ArchiveTree(wx.TreeCtrl):
    def __init__(self, parent, ID):
        wx.TreeCtrl.__init__(self, parent, ID, size=wx.Size(-1,-1),
                             style=wx.TR_HAS_BUTTONS|wx.TR_HIDE_ROOT|wx.TR_NO_LINES|wx.TR_FULL_ROW_HIGHLIGHT)
        
        self._d_imgs = wx.ImageList(16,16)
        self._bmp_class = self._d_imgs.Add( getArchiveBitmap() )
        self._bmp_class_open = self._d_imgs.Add( getArchiveBitmap() )
        self._bmp_module = self._d_imgs.Add( getPythonBitmap() )
        self.SetImageList(self._d_imgs)

        self._d_model = Model()
        self._d_controller = Controller()
        self._d_mainframe = self._d_controller.getMainFrame()

        self._d_root = self.AddRoot("root")
        self.SetPyData(self._d_root, (None,None))
        self._logger = self._d_controller.getLogger()


        #Add all archives:
        archives = self._d_model.openURI("zip://")
        for archive_uri in archives:
            uri_list = self._d_model.openURI(archive_uri)
            archive_name = getArchive(archive_uri)
            arch_item = self.AppendItem(self._d_root, archive_name)
            self.SetPyData(arch_item, ("Archive", archive_uri) )
            self.SetItemImage(arch_item, self._bmp_class, wx.TreeItemIcon_Normal)
            self.SetItemImage(arch_item, self._bmp_class_open, wx.TreeItemIcon_Expanded)

            for file_uri in uri_list:
                file_name = getPyFile(file_uri)
                file_item = self.AppendItem(arch_item, file_name)
                self.SetPyData(file_item, ("File", file_uri))
                self.SetItemImage(file_item, self._bmp_module, wx.TreeItemIcon_Normal)
                self.SetItemImage(file_item, self._bmp_module, wx.TreeItemIcon_Expanded)
        
        # FIXME self._d_mainframe.bindNewArch(self.NewArchive)

        # Events:
        self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelection)
        self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnActivate)
        self.Bind(wx.EVT_SET_FOCUS, self.OnFocus)



    def removeURI(self, uri):
        item = self.getItemByURI(uri,self._d_root)
        if not item: raise Exception("Item %s not found"%uri)
        self.Delete(item)

    def addURI(self, uri):
        if self.getItemByURI(uri, self._d_root): return

        if isPyFileURI(uri):
            (ar, py) = splitPyFile(uri)
            item = self.getItemByURI("zip://"+ar, self._d_root)
            fitem = self.AppendItem(item, py)
            self.SetPyData(fitem, ("File", uri))
            self.SetItemImage(fitem, self._bmp_module, wx.TreeItemIcon_Normal)
            self.SetItemImage(fitem, self._bmp_module, wx.TreeItemIcon_Expanded)
        elif isArchiveURI(uri):
            path = getArchive(uri)
            item = self.AppendItem(self._d_root, path)
            self.SetPyData(item, ("Archive",uri))
            self.SetItemImage(item, self._bmp_class, wx.TreeItemIcon_Normal)
            self.SetItemImage(item, self._bmp_class_open, wx.TreeItemIcon_Expanded)
        else: raise Exception("Unkonw URI %s"%uri)
        

    def getItemByURI(self, uri, item):
        (typ, iuri) = self.GetPyData(item)
        if iuri==uri: return item
        (citem, cookie) = self.GetFirstChild(item)
        
        while citem:
            ret = self.getItemByURI(uri, citem)
            if ret != None: return ret
            (citem, cookie) = self.GetNextChild(item,cookie)
 

    
    #
    # CONTROLLER PART
    #
    def OnFocus(self, evt):
       self._updateMainFrame()
       evt.Skip()


    def OnSelection(self, event):
        item = event.GetItem()
        self._updateMainFrame(item)
        event.Skip()


    def _updateMainFrame(self, item=None):
        if not item: item = self.GetSelection()
        self._d_mainframe.bindNew()
        self._d_mainframe.bindOpen()
        self._d_mainframe.bindDelete()
        
        if not item: return
        (typ, uri) = self.GetPyData(item)

        if typ is "File":
            self._d_mainframe.bindOpen(self.OpenFile, "&Open file")
            self._d_mainframe.bindDelete(self.DeleteFile, "&Delete file")
        elif typ is "Archive":
            self._d_mainframe.bindNew(self.NewFile, "&New file")
            self._d_mainframe.bindOpen(self.OpenArchive, "&Open archive")
            self._d_mainframe.bindDelete(self.DeleteArchive, "&Delete archive")
  

    def OnActivate(self, event):
        item = event.GetItem()
        (typ, uri) = self.GetPyData(item)
        if typ == "File":
            self._d_controller.DocumentOpen(uri)
        event.Skip()


    def OpenFile(self, evt=None):
        item = self.GetSelection()
        if not item: return
        (typ, uri) = self.GetPyData(item)
        if not typ == "File": return
        self._d_controller.DocumentOpen(uri)

    def DeleteFile(self, evt=None):
        item = self.GetSelection()
        if not item:
            self._logger.warning("No item selected to delete")
            return
        (typ, uri) = self.GetPyData(item)
        if not typ == "File": return
        try:
            self._d_controller.DocumentDelete(uri)
            self.removeURI(uri)
        except:
            self._logger.exception("Unable to remove file %s"%uri)


    def NewFile(self, evt=None):
        self._d_controller.DocumentOpen("zip://")
    
    def OpenArchive(self, evt=None):
        item = self.GetSelection()
        if not item: return
        (typ, uri) = self.GetPyData(item)
        if not typ=="Archive": return
        self.Expand(item)
   
    def NewArchive(self, evt=None):
        selected = False
        while not selected:
            dlg = Dialogs.eDevNewArchiveDialog(self, -1)
            if dlg.ShowModal() == wx.ID_CANCEL: return
            uri = dlg.getSelection()
            dlg.Destroy()

            if self._d_model.checkURI(uri):
                # FIXME ask for overwrite
                continue
            selected = True
        self._d_model.saveURI(uri,"")
        self.addURI(uri)

    def DeleteArchive(self, evt=None):
        item = self.GetSelection()
        (typ, uri) = self.GetPyData(item)

        py_list = self._d_model.openURI(uri)
        for py in py_list:
           self._d_controller.DocumentDelete(py)
        self._d_model.deleteURI(uri)
        self.Delete(item)