controls/UriLocationEditor.py
changeset 2329 e5703dc8848e
parent 2182 eeca1aff0691
--- a/controls/UriLocationEditor.py	Tue Oct 30 14:08:28 2018 +0100
+++ b/controls/UriLocationEditor.py	Thu Nov 08 09:39:06 2018 +0100
@@ -1,42 +1,27 @@
 from __future__ import absolute_import
 
 import wx
-from zope.interface import Interface, Attribute
-from zope.interface.verify import verifyObject
-from connectors import connectors_dialog, ConnectorDialog, GetConnectorFromURI
+from connectors import ConnectorSchemes, EditorClassFromScheme
 
 
 [ID_URIWIZARDDIALOG, ID_URITYPECHOICE] = [wx.NewId() for _init_ctrls in range(2)]
 
-
-class IConnectorPanel(Interface):
-    """This is interface for panel of seperate connector type"""
-    uri = Attribute("""uri of connections""")
-    type = Attribute("""type of connector""")
-
-    def SetURI(uri):     # pylint: disable=no-self-argument
-        """methode for set uri"""
-
-    def GetURI():        # pylint: disable=no-self-argument
-        """metohde for get uri"""
-
-
 class UriLocationEditor(wx.Dialog):
     def _init_ctrls(self, parent):
         self.UriTypeChoice = wx.Choice(parent=self, id=ID_URIWIZARDDIALOG, choices=self.URITYPES)
         self.UriTypeChoice.SetSelection(0)
         self.Bind(wx.EVT_CHOICE, self.OnTypeChoice, self.UriTypeChoice)
-        self.PanelSizer = wx.BoxSizer(wx.HORIZONTAL)
+        self.editor_sizer = wx.BoxSizer(wx.HORIZONTAL)
         self.ButtonSizer = self.CreateButtonSizer(wx.OK | wx.CANCEL)
 
     def _init_sizers(self):
         self.mainSizer = wx.BoxSizer(wx.VERTICAL)
         typeSizer = wx.BoxSizer(wx.HORIZONTAL)
-        typeSizer.Add(wx.StaticText(self, wx.ID_ANY, _("URI type:")), border=5, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
+        typeSizer.Add(wx.StaticText(self, wx.ID_ANY, _("Scheme :")), border=5, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
         typeSizer.Add(self.UriTypeChoice, border=5, flag=wx.ALL)
         self.mainSizer.Add(typeSizer)
 
-        self.mainSizer.Add(self.PanelSizer, border=5, flag=wx.ALL)
+        self.mainSizer.Add(self.editor_sizer, border=5, flag=wx.ALL)
         self.mainSizer.Add(self.ButtonSizer, border=5, flag=wx.BOTTOM | wx.ALIGN_CENTER_HORIZONTAL)
         self.SetSizer(self.mainSizer)
         self.Layout()
@@ -45,71 +30,50 @@
     def __init__(self, parent, uri):
         wx.Dialog.__init__(self, id=ID_URIWIZARDDIALOG,
                            name='UriLocationEditor', parent=parent,
-                           title='Uri location')
-        self.URITYPES = [_("- Select URI type -")]
-        for connector_type, connector_function in connectors_dialog.iteritems():
-            try:
-                connector_function['function']()
-                self.URITYPES.append(connector_type)
-            except Exception:
-                pass
-
-        self.selected = None
-        self.parrent = parent
-        self.logger = self.parrent.CTR.logger
+                           title=_('URI Editor'))
+        self.URITYPES = [_("- Select URI Scheme -")] + ConnectorSchemes()
         self._init_ctrls(parent)
         self._init_sizers()
+        self.scheme = None
+        self.scheme_editor = None
         self.SetURI(uri)
         self.CenterOnParent()
 
     def OnTypeChoice(self, event):
-        self._removePanelType()
         index = event.GetSelection()
-        if index > 0:
-            self.selected = event.GetString()
-            self.panelType = self._getConnectorDialog(self.selected)
-            if self.panelType:
-                self.PanelSizer.Add(self.panelType)
-                self.mainSizer.Layout()
-                self.Fit()
-                self.panelType.Refresh()
+        self._replaceSchemeEditor(event.GetString() if index > 0 else None)
 
     def SetURI(self, uri):
-        self._removePanelType()
-        uri_list = uri.strip().split(":")
-        if uri_list:
-            uri_type = uri_list[0].upper()
-            type = GetConnectorFromURI(uri_type)
-            if type:
-                self.selected = type
-                self.UriTypeChoice.SetStringSelection(self.selected)
-                self.panelType = self._getConnectorDialog(self.selected)
-                if self.panelType:
-                    self.panelType.SetURI(uri)
-                    self.PanelSizer.Add(self.panelType)
-                    self.PanelSizer.Layout()
-                    self.mainSizer.Layout()
-                    self.Fit()
-                    self.panelType.Refresh()
+        try:
+            scheme, loc = uri.strip().split("://",1)
+        except:
+            return None
+        scheme = scheme.upper()
+        if scheme in ConnectorSchemes():
+            self.UriTypeChoice.SetStringSelection(scheme)
+            self._replaceSchemeEditor(scheme)
+            self.scheme_editor.SetLoc(loc)
 
     def GetURI(self):
-        if not self.selected or not self.panelType:
-            return ""
+        if self.scheme_editor is None:
+            return None
         else:
-            return self.panelType.GetURI()
+            return self.scheme+"://"+self.scheme_editor.GetLoc()
 
-    def _removePanelType(self):
-        for i in range(self.PanelSizer.GetItemCount()):
-            item = self.PanelSizer.GetItem(i)
-            item.DeleteWindows()
-            self.PanelSizer.Remove(i)
-            self.Fit()
-        self.PanelSizer.Layout()
+    def _replaceSchemeEditor(self, scheme):
+        self.scheme = scheme
+       
+        if self.scheme_editor is not None:
+            self.editor_sizer.Detach(self.scheme_editor)
+            self.scheme_editor.Destroy()
+            self.scheme_editor = None
 
-    def _getConnectorDialog(self, connectorType):
-        connector = ConnectorDialog(connectorType, self)
-        if connector and IConnectorPanel.providedBy(connector):
-            if verifyObject(IConnectorPanel, connector):
-                return connector
-        else:
-            return None
+        EditorClass = EditorClassFromScheme(scheme)
+        if EditorClass is not None:
+            self.scheme_editor = EditorClass(scheme,self)
+            self.editor_sizer.Add(self.scheme_editor)
+            self.scheme_editor.Refresh()
+        self.editor_sizer.Layout()
+        self.mainSizer.Layout()
+        self.Fit()
+