]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/samples/ide/activegrid/tool/UICommon.py
move wxPython to new trunk
[wxWidgets.git] / wxPython / samples / ide / activegrid / tool / UICommon.py
diff --git a/wxPython/samples/ide/activegrid/tool/UICommon.py b/wxPython/samples/ide/activegrid/tool/UICommon.py
deleted file mode 100644 (file)
index a70cdf3..0000000
+++ /dev/null
@@ -1,735 +0,0 @@
-#----------------------------------------------------------------------------
-# Name:         UICommon.py
-# Purpose:      Shared UI stuff
-#
-# Author:       Matt Fryer, Morgan Hua
-#
-# Created:      3/10/05
-# CVS-ID:       $Id$
-# Copyright:    (c) 2005-2006 ActiveGrid, Inc.
-# License:      wxWindows License
-#----------------------------------------------------------------------------
-
-import os
-import os.path
-import wx
-import string
-import ProjectEditor
-import activegrid.util.appdirs as appdirs
-import activegrid.util.fileutils as fileutils
-import activegrid.util.strutils as strutils
-import activegrid.util.sysutils as sysutils
-import activegrid.util.xmlutils as xmlutils
-_ = wx.GetTranslation
-
-def CreateDirectoryControl( parent, fileLabel=_("File Name:"), dirLabel=_("Directory:"), fileExtension="*", startingName="", startingDirectory=None, choiceDirs=None, appDirDefaultStartDir=False, returnAll=False, useDirDialog=False):
-
-    if not choiceDirs:
-        choiceDirs = []
-        projectDirs = []
-
-        if appDirDefaultStartDir:
-            appDirectory = wx.ConfigBase_Get().Read(ProjectEditor.PROJECT_DIRECTORY_KEY, ProjectEditor.NEW_PROJECT_DIRECTORY_DEFAULT)
-        else:
-            appDirectory = wx.ConfigBase_Get().Read(ProjectEditor.PROJECT_DIRECTORY_KEY)
-        if appDirectory:
-            choiceDirs.append(appDirectory)
-            if appDirDefaultStartDir and not startingDirectory:
-                startingDirectory = appDirectory
-
-        projectService = wx.GetApp().GetService(ProjectEditor.ProjectService)
-        if projectService:
-            curProjectDoc = projectService.GetCurrentProject()
-            if curProjectDoc:
-                homeDir = curProjectDoc.GetAppDocMgr().homeDir
-                if homeDir and (homeDir not in choiceDirs):
-                    choiceDirs.append(homeDir)
-                if not startingDirectory:
-                    startingDirectory = homeDir
-                    
-            for projectDoc in projectService.GetOpenProjects():
-                if projectDoc == curProjectDoc:
-                    continue
-                homeDir = projectDoc.GetAppDocMgr().homeDir
-                if homeDir and (homeDir not in projectDirs):
-                    projectDirs.append(homeDir)
-                projectDirs.sort(CaseInsensitiveCompare)
-            for projectDir in projectDirs:
-                if projectDir not in choiceDirs:
-                    choiceDirs.append(projectDir)
-
-        if startingDirectory and (startingDirectory not in choiceDirs):
-            choiceDirs.insert(0, startingDirectory)
-            
-        if os.getcwd() not in choiceDirs:
-            choiceDirs.append(os.getcwd())                
-        if appdirs.getSystemDir() not in choiceDirs:
-            choiceDirs.append(appdirs.getSystemDir()) 
-
-    if not startingDirectory:
-        startingDirectory = os.getcwd()
-        
-    nameControl = wx.TextCtrl(parent, -1, startingName, size=(-1,-1))
-    nameLabelText = wx.StaticText(parent, -1, fileLabel)
-    dirLabelText = wx.StaticText(parent, -1, dirLabel)
-    dirControl = wx.ComboBox(parent, -1, startingDirectory, size=(-1,-1), choices=choiceDirs)
-    dirControl.SetToolTipString(startingDirectory)
-    button = wx.Button(parent, -1, _("Browse..."))
-    allControls = [nameControl, nameLabelText, dirLabelText, dirControl, button]
-    
-    def OnFindDirClick(event): 
-        name = ""  
-        nameCtrlValue = nameControl.GetValue()
-        if nameCtrlValue:
-            root, ext = os.path.splitext( nameCtrlValue )
-            if ext == '.' + fileExtension:
-                name = nameCtrlValue
-            else:
-                name = _("%s.%s") % (nameCtrlValue, fileExtension)
-                
-        if not useDirDialog:
-            dlg = wx.FileDialog(parent, _("Choose a filename and directory"),
-                       defaultDir = dirControl.GetValue().strip(),
-                       defaultFile = name,
-                       wildcard= "*.%s" % fileExtension,
-                       style=wx.SAVE|wx.CHANGE_DIR)
-        else:
-            dlg = wx.DirDialog(wx.GetApp().GetTopWindow(),
-                        _("Choose a directory:"),
-                        defaultPath=dirControl.GetValue().strip(),
-                        style=wx.DD_DEFAULT_STYLE|wx.DD_NEW_DIR_BUTTON)
-            
-        if dlg.ShowModal() != wx.ID_OK:
-            dlg.Destroy()
-            return
-        path = dlg.GetPath()
-        dlg.Destroy()
-        
-        if path:
-            if not useDirDialog:
-                dir, filename = os.path.split(path)
-                if dirControl.FindString(dir) == wx.NOT_FOUND:
-                    dirControl.Insert(dir, 0)
-                dirControl.SetValue(dir)
-                dirControl.SetToolTipString(dir)
-                nameControl.SetValue(filename)
-            else:
-                dirControl.SetValue(path)
-                dirControl.SetToolTipString(path)
-
-    parent.Bind(wx.EVT_BUTTON, OnFindDirClick, button)
-    
-    def Validate(allowOverwriteOnPrompt=False, infoString='', validClassName=False, ignoreFileConflicts=False):
-        projName = nameControl.GetValue().strip()
-        if projName == "":
-            wx.MessageBox(_("Please provide a %sfile name.") % infoString, _("Provide a File Name"))            
-            return False
-        if projName.find(' ') != -1:
-            wx.MessageBox(_("Please provide a %sfile name that does not contains spaces.") % infoString, _("Spaces in File Name"))            
-            return False
-        if validClassName:
-            if projName[0].isdigit():
-                wx.MessageBox(_("File name cannot start with a number.  Please enter a different name."), _("Invalid File Name"))            
-                return False
-            if projName.endswith(".agp"):
-                projName2 = projName[:-4]
-            else:
-                projName2 = projName
-            if not projName2.replace("_", "a").isalnum():  # [a-zA-Z0-9_]  note '_' is allowed and ending '.agp'.
-                wx.MessageBox(_("Name must be alphanumeric ('_' allowed).  Please enter a valid name."), _("Project Name"))
-                return False
-
-        dirName = dirControl.GetValue().strip()
-        if dirName == "":
-            wx.MessageBox(_("No directory.  Please provide a directory."), _("Provide a Directory"))            
-            return False
-        if os.sep == "\\" and dirName.find("/") != -1:
-            wx.MessageBox(_("Wrong delimiter '/' found in directory path.  Use '%s' as delimiter.") % os.sep, _("Provide a Valid Directory"))            
-            return False
-        if not os.path.exists(dirName):
-            wx.MessageBox(_("That %sdirectory does not exist.  Please choose an existing directory.") % infoString, _("Provide a Valid Directory"))            
-            return False
-        if not ignoreFileConflicts:
-            filePath = os.path.join(dirName, MakeNameEndInExtension(projName, "." + fileExtension))
-            if os.path.exists(filePath):
-                if allowOverwriteOnPrompt:
-                    res = wx.MessageBox(_("That %sfile already exists. Would you like to overwrite it.") % infoString, "File Exists", style=wx.YES_NO|wx.NO_DEFAULT)
-                    return (res == wx.YES)  
-                else:                
-                    wx.MessageBox(_("That %sfile already exists. Please choose a different name.") % infoString, "File Exists")
-                    return False
-
-        return True    
-    HALF_SPACE = 5
-    flexGridSizer = wx.FlexGridSizer(cols = 3, vgap = HALF_SPACE, hgap = HALF_SPACE)
-    flexGridSizer.AddGrowableCol(1,1)
-    if not useDirDialog:
-        flexGridSizer.Add(nameLabelText, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT)
-        flexGridSizer.Add(nameControl, 2, flag=wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
-        flexGridSizer.Add(button, flag=wx.ALIGN_RIGHT|wx.LEFT, border=HALF_SPACE)        
-        flexGridSizer.Add(dirLabelText, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT)
-        flexGridSizer.Add(dirControl, 2, flag=wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
-        flexGridSizer.Add(wx.StaticText(parent, -1, ""), 0)
-    else:
-        flexGridSizer.Add(nameLabelText, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT)
-        flexGridSizer.Add(nameControl, 2, flag=wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
-        flexGridSizer.Add(wx.StaticText(parent, -1, ""), 0)
-        flexGridSizer.Add(dirLabelText, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT)
-        flexGridSizer.Add(dirControl, 2, flag=wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
-        flexGridSizer.Add(button, flag=wx.ALIGN_RIGHT|wx.LEFT, border=HALF_SPACE)        
-        
-    if returnAll:
-        return nameControl, dirControl, flexGridSizer, Validate, allControls
-    else:
-        return nameControl, dirControl, flexGridSizer, Validate
-
-
-def CreateDirectoryOnlyControl( parent, dirLabel=_("Location:"), startingDirectory=None, choiceDirs=None, appDirDefaultStartDir=False):
-
-    if not choiceDirs:
-        choiceDirs = []
-        projectDirs = []
-
-        if appDirDefaultStartDir:
-            appDirectory = wx.ConfigBase_Get().Read(ProjectEditor.PROJECT_DIRECTORY_KEY, ProjectEditor.NEW_PROJECT_DIRECTORY_DEFAULT)
-        else:
-            appDirectory = wx.ConfigBase_Get().Read(ProjectEditor.PROJECT_DIRECTORY_KEY)
-        if appDirectory:
-            choiceDirs.append(appDirectory)
-            if appDirDefaultStartDir and not startingDirectory:
-                startingDirectory = appDirectory
-
-        projectService = wx.GetApp().GetService(ProjectEditor.ProjectService)
-        if projectService:
-            curProjectDoc = projectService.GetCurrentProject()
-            if curProjectDoc:
-                homeDir = curProjectDoc.GetAppDocMgr().homeDir
-                if homeDir and (homeDir not in choiceDirs):
-                    choiceDirs.append(homeDir)
-                if not startingDirectory:
-                    startingDirectory = homeDir
-                    
-            for projectDoc in projectService.GetOpenProjects():
-                if projectDoc == curProjectDoc:
-                    continue
-                homeDir = projectDoc.GetAppDocMgr().homeDir
-                if homeDir and (homeDir not in projectDirs):
-                    projectDirs.append(homeDir)
-                projectDirs.sort(CaseInsensitiveCompare)
-            for projectDir in projectDirs:
-                if projectDir not in choiceDirs:
-                    choiceDirs.append(projectDir)
-
-        if startingDirectory and (startingDirectory not in choiceDirs):
-            choiceDirs.insert(0, startingDirectory)
-
-        if os.getcwd() not in choiceDirs:
-            choiceDirs.append(os.getcwd())                
-        if appdirs.getSystemDir() not in choiceDirs:
-            choiceDirs.append(appdirs.getSystemDir())                
-            
-
-    if not startingDirectory:
-        startingDirectory = os.getcwd()
-            
-    dirLabelText = wx.StaticText(parent, -1, dirLabel)
-    dirControl = wx.ComboBox(parent, -1, startingDirectory, size=(-1,-1), choices=choiceDirs)
-    dirControl.SetToolTipString(startingDirectory)
-    button = wx.Button(parent, -1, _("Browse..."))
-    
-    def OnFindDirClick(event): 
-            dlg = wx.DirDialog(wx.GetApp().GetTopWindow(),
-                                _("Choose a directory:"),
-                                defaultPath=dirControl.GetValue().strip(),
-                                style=wx.DD_DEFAULT_STYLE|wx.DD_NEW_DIR_BUTTON)
-            dlg.CenterOnParent()
-            if dlg.ShowModal() == wx.ID_OK:
-                dir = dlg.GetPath()
-                if dirControl.FindString(dir) == wx.NOT_FOUND:
-                    dirControl.Insert(dir, 0)
-                dirControl.SetValue(dir)
-                dirControl.SetToolTipString(dir)
-            dlg.Destroy()            
-
-    parent.Bind(wx.EVT_BUTTON, OnFindDirClick, button)
-    
-    def Validate(allowOverwriteOnPrompt=False):
-        dirName = dirControl.GetValue().strip()
-        if dirName == "":
-            wx.MessageBox(_("Please provide a directory."), _("Provide a Directory"))            
-            return False
-        if os.sep == "\\" and dirName.find("/") != -1:
-            wx.MessageBox(_("Wrong delimiter '/' found in directory path.  Use '%s' as delimiter.") % os.sep, _("Provide a Valid Directory"))            
-            return False
-        if not os.path.exists(dirName):
-            wx.MessageBox(_("That directory does not exist. Please choose an existing directory."), _("Provide a Valid Directory"))            
-            return False
-        return True  
-          
-    HALF_SPACE = 5
-    flexGridSizer = wx.FlexGridSizer(cols = 3, vgap = HALF_SPACE, hgap = HALF_SPACE)
-    flexGridSizer.AddGrowableCol(1,1)
-    flexGridSizer.Add(dirLabelText, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT|wx.RIGHT, border=HALF_SPACE)
-    flexGridSizer.Add(dirControl, 2, flag=wx.ALIGN_CENTER_VERTICAL|wx.EXPAND, border=HALF_SPACE)
-    flexGridSizer.Add(button, flag=wx.ALIGN_RIGHT|wx.LEFT, border=HALF_SPACE)
-        
-    return dirControl, flexGridSizer, Validate
-
-
-def CreateNameOnlyControl( parent, fileLabel, startingName="", startingDirectoryControl=None):
-
-    fileLabelText = wx.StaticText(parent, -1, fileLabel)
-    nameControl = wx.TextCtrl(parent, -1, startingName, size=(-1,-1))
-        
-    def Validate(allowOverwriteOnPrompt=False, validClassName=False):
-        projName = nameControl.GetValue().strip()
-        if projName == "":
-            wx.MessageBox(_("Blank name.  Please enter a valid name."), _("Project Name"))            
-            return False
-        if projName.find(' ') != -1:
-            wx.MessageBox(_("Spaces in name.  Name cannot have spaces."), _("Project Name"))            
-            return False
-        if validClassName:
-            if projName[0].isdigit():
-                wx.MessageBox(_("Name cannot start with a number.  Please enter a valid name."), _("Project Name"))            
-                return False
-            if projName.endswith(".agp"):
-                projName2 = projName[:-4]
-            else:
-                projName2 = projName
-            if not projName2.replace("_", "a").isalnum():  # [a-zA-Z0-9_]  note '_' is allowed and ending '.agp'.
-                wx.MessageBox(_("Name must be alphanumeric ('_' allowed).  Please enter a valid name."), _("Project Name"))
-                return False
-        path = os.path.join(startingDirectoryControl.GetValue().strip(), projName)
-        if os.path.exists(path):
-            if os.path.isdir(path):
-                message = _("Project '%s' already exists.  Would you like to overwrite the contents of the project?") % projName
-            else: # os.path.isfile(path):
-                message = _("'%s' already exists as a file.  Would you like to replace it with the project?") % nameControl.GetValue().strip()
-                    
-            yesNoMsg = wx.MessageDialog(wx.GetApp().GetTopWindow(),
-                          message,
-                          _("Project Directory Exists"),
-                          wx.YES_NO|wx.ICON_QUESTION
-                          )
-            yesNoMsg.CenterOnParent()
-            status = yesNoMsg.ShowModal()
-            yesNoMsg.Destroy()
-            if status == wx.ID_NO:
-                return False
-        return True  
-          
-    HALF_SPACE = 5
-    flexGridSizer = wx.FlexGridSizer(cols = 2, vgap = HALF_SPACE, hgap = HALF_SPACE)
-    flexGridSizer.AddGrowableCol(1,1)
-    flexGridSizer.Add(fileLabelText, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT|wx.TOP|wx.RIGHT, border=HALF_SPACE)
-    flexGridSizer.Add(nameControl, 2, flag=wx.ALIGN_CENTER_VERTICAL|wx.EXPAND, border=HALF_SPACE)
-        
-    return nameControl, flexGridSizer, Validate
-    
-
-def ValidateName(name, ext=None, hint="name"):
-    """ Returns an error string if there is something wrong with the name.
-        Otherwise it returns None
-    """
-    if name == "":
-        return _("Blank %s.  Please enter a valid %s.") % (hint, hint)
-
-    if name.find(' ') != -1:
-        return _("Spaces in %s.  %s cannot have spaces.") % (hint, hint.title())
-
-    if name[0].isdigit():
-        return _("%s cannot start with a number.  Please enter a valid %s.") % (hint.title(), hint)
-
-    if ext and name.endswith(ext):  # strip extension if provided
-        lenExt = len(ext)
-        name = name[:-lenExt]
-        
-    if not name.replace("_", "a").isalnum():  # [a-zA-Z0-9_]  note '_' is allowed and ext ending.
-        return _("%s must be alphanumeric ('_' allowed).  Please enter a valid %s.") % (hint.title(), hint)
-
-    return None
-
-
-def GetCurrentProject():
-    projectDocument = None
-    projectService = wx.GetApp().GetService(ProjectEditor.ProjectService)
-    if projectService:
-        projectDocument = projectService.GetCurrentProject()
-    return projectDocument
-
-def AddFilesToCurrentProject(paths, folderPath=None, types=None, names=None, save=False):
-    projectService = wx.GetApp().GetService(ProjectEditor.ProjectService)
-    if projectService:
-        projectDocument = projectService.GetCurrentProject()
-        if projectDocument:
-            files = projectDocument.GetFiles()
-            for path in paths:
-                if path in files:
-                    paths.remove(path)
-            if paths:
-                projectDocument.GetCommandProcessor().Submit(ProjectEditor.ProjectAddFilesCommand(projectDocument, paths, folderPath=folderPath, types=types, names=names))
-                if save:
-                    projectDocument.OnSaveDocument(projectDocument.GetFilename())
-
-def AddFilesToProject(projectDocument, paths, types=None, names=None, save=False):
-    if projectDocument:
-        files = projectDocument.GetFiles()
-        for path in paths:
-            if path in files:
-                paths.remove(path)
-        if paths:
-            projectDocument.GetCommandProcessor().Submit(ProjectEditor.ProjectAddFilesCommand(projectDocument, paths, types=types, names=names))
-            if save:
-                projectDocument.OnSaveDocument(projectDocument.GetFilename())
-
-
-def MakeNameEndInExtension(name, extension):
-    if not name:
-        return name
-    root, ext = os.path.splitext(name)
-    if ext == extension:
-        return name
-    else:
-        return name + extension
-
-def GetPythonExecPath():
-    pythonExecPath = wx.ConfigBase_Get().Read("ActiveGridPythonLocation")
-    if not pythonExecPath:
-        pythonExecPath = sysutils.pythonExecPath
-    return pythonExecPath
-    
-
-def GetPHPExecPath():
-    PHPExecPath = wx.ConfigBase_Get().Read("ActiveGridPHPLocation")
-    return PHPExecPath
-
-
-def GetPHPINIPath():
-    PHPINIPath = wx.ConfigBase_Get().Read("ActiveGridPHPINILocation")
-    return PHPINIPath
-
-
-def _DoRemoveRecursive(path, skipFile=None, skipped=False):
-    if path == skipFile:
-        skipped = True
-    elif os.path.isdir(path):
-        for file in os.listdir(path):
-            file_or_dir = os.path.join(path,file)
-            if skipFile == file_or_dir:
-                skipped = True
-            elif os.path.isdir(file_or_dir) and not os.path.islink(file_or_dir):
-                if _DoRemoveRecursive(file_or_dir, skipFile): # it's a directory recursive call to function again
-                    skipped = True
-            else:
-                os.remove(file_or_dir) # it's a file, delete it
-        if not skipped:
-            os.rmdir(path) # delete the directory here
-    else:
-        os.remove(path)
-        
-    return skipped
-
-
-def RemoveRecursive(path, skipFile=None):
-    _DoRemoveRecursive(path, skipFile)    
-
-
-def CaseInsensitiveCompare(s1, s2):
-    """ Method used by sort() to sort values in case insensitive order """
-    return strutils.caseInsensitiveCompare(s1, s2)
-
-
-def GetAnnotation(model, elementName):
-    """ Get an object's annotation used for tooltips """
-    if hasattr(model, "_complexType"):
-        ct = model._complexType
-    elif hasattr(model, "__xsdcomplextype__"):
-        ct = model.__xsdcomplextype__
-    else:
-        ct = None
-            
-    if ct:
-        el = ct.findElement(elementName)
-        if el and el.annotation:
-            return el.annotation
-            
-    return ""
-
-
-def GetDisplayName(doc, name):
-    if name:
-        appDocMgr = doc.GetAppDocMgr()
-        if appDocMgr:
-            name = appDocMgr.toDisplayTypeName(name)
-        else:
-            namespace, name = xmlutils.splitType(name)
-            if namespace and hasattr(doc.GetModel(), "getXmlNamespaces"):
-                for xmlkey, xmlval in doc.GetModel().getXmlNamespaces().iteritems():
-                    if xmlval == namespace:
-                        name = "%s:%s" % (xmlkey, name)
-                        break                    
-    
-        if name:
-            import activegrid.model.schema as schemalib
-            baseTypeName = schemalib.mapXsdType(name)
-            if baseTypeName:
-                name = baseTypeName
-
-    return name
-
-
-def GetInternalName(doc, name):
-    if name:
-        appDocMgr = doc.GetAppDocMgr()
-        if appDocMgr:
-            name = appDocMgr.toInternalTypeName(name)
-        else:
-            namespace, name = xmlutils.splitType(name)
-            if namespace and hasattr(doc.GetModel(), "getXmlNamespaces"):
-                for xmlkey, xmlval in doc.GetModel().getXmlNamespaces().iteritems():
-                    if xmlkey == namespace:
-                        name = "%s:%s" % (xmlval, name)
-                        break  
-                                          
-        import activegrid.model.schema as schemalib
-        name = schemalib.mapAGType(name)
-
-    return name
-
-
-#----------------------------------------------------------------------------
-# Methods for finding application level info
-#----------------------------------------------------------------------------
-
-def GetProjectForDoc(doc):
-    """ Given a document find which project it belongs to.
-        Tries to intelligently resolve conflicts if it is in more than one open project.
-    """
-    projectService = wx.GetApp().GetService(ProjectEditor.ProjectService)
-
-    projectDoc = projectService.FindProjectFromMapping(doc)
-    if projectDoc:
-        return projectDoc
-
-    projectDoc = projectService.GetCurrentProject()
-    if not projectDoc:
-        return None
-    if projectDoc.IsFileInProject(doc.GetFilename()):
-        return projectDoc
-
-    projects = []
-    openDocs = wx.GetApp().GetDocumentManager().GetDocuments()
-    for openDoc in openDocs:
-        if openDoc == projectDoc:
-            continue
-        if(isinstance(openDoc, ProjectEditor.ProjectDocument)):
-            if openDoc.IsFileInProject(doc.GetFilename()):
-                projects.append(openDoc)
-                
-    if projects:
-        if len(projects) == 1:
-            return projects[0]
-        else:
-            choices = [os.path.basename(project.GetFilename()) for project in projects]
-            dlg = wx.SingleChoiceDialog(wx.GetApp().GetTopWindow(), _("'%s' found in more than one project.\nWhich project should be used for this operation?") % os.path.basename(doc.GetFilename()), _("Select Project"), choices, wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER|wx.OK|wx.CENTRE)
-            dlg.CenterOnParent()
-            projectDoc = None
-            if dlg.ShowModal() == wx.ID_OK:
-                i = dlg.GetSelection()
-                projectDoc = projects[i]
-            dlg.Destroy()
-            return projectDoc
-
-    return None
-
-
-def GetAppInfoForDoc(doc):
-    """ Get the AppInfo for a given document """
-    projectDoc = GetProjectForDoc(doc)
-    if projectDoc:
-        return projectDoc.GetAppInfo()
-    return None
-
-
-def GetAppDocMgrForDoc(doc):
-    """ Get the AppDocMgr for a given document """
-    projectDoc = GetProjectForDoc(doc)
-    if projectDoc:
-        return projectDoc.GetModel()
-    return None
-
-
-def GetAppInfoLanguage(doc=None):
-    from activegrid.server.projectmodel import LANGUAGE_DEFAULT
-    
-    if doc:
-        language = doc.GetAppInfo().language
-    else:
-        language = None
-        
-    if not language:
-        config = wx.ConfigBase_Get()
-        language = config.Read(ProjectEditor.APP_LAST_LANGUAGE, LANGUAGE_DEFAULT)
-        
-        if doc:
-            doc.GetAppInfo().language = language  # once it is selected, it must be set.
-        
-    return language
-
-def AddWsdlAgToProjectFromWsdlRegistration(wsdlRegistration):
-    """Add wsdl ag for registry entry."""
-
-    wsdlPath = wsdlRegistration.path
-    rootPath = None
-    serviceRefName = wsdlRegistration.name
-    
-    agwsDoc = _InitWsdlAg(wsdlPath, rootPath, serviceRefName)
-
-    if (agwsDoc == None):
-        return
-
-    serviceRef = agwsDoc.GetModel()    
-    
-    serviceRef.serviceType = wsdlRegistration.type
-
-    import activegrid.server.deployment as deployment
-
-    if (serviceRef.serviceType == deployment.SERVICE_LOCAL):
-        serviceRef.localService = deployment.LocalService(
-            wsdlRegistration.codeFile)
-        
-    elif (serviceRef.serviceType == deployment.SERVICE_DATABASE):
-        serviceRef.databaseService = deployment.DatabaseService(
-            wsdlRegistration.datasourceName)
-        
-    elif (serviceRef.serviceType == deployment.SERVICE_SOAP):
-        pass
-    
-    elif (serviceRef.serviceType == deployment.SERVICE_RSS):
-        serviceRef.rssService = deployment.RssService(wsdlRegistration.feedUrl)
-        
-    elif (serviceRef.serviceType == deployment.SERVICE_REST):
-        serviceRef.restService = deployment.RestService(
-            wsdlRegistration.baseUrl)
-    else:
-        raise AssertionError("Unknown service type")
-
-    _AddToProject(agwsDoc, addWsdl=True)
-    
-
-def AddWsdlAgToProject(wsdlPath, rootPath=fileutils.AG_SYSTEM_STATIC_VAR_REF,
-                       serviceRefName=None, className=None, serviceType=None,
-                       dataSourceName=None):
-    """
-       wsdlPath: path to wsdl from rootPath. If wsdlPath is absolute, rootPath
-       is ignored. rootPath is also ignored when rootPath is set to None. 
-       rootPath: defaults to ${AG_SYSTEM_STATIC}.
-       serviceRefName: If None, it will be set to the wsdl file name without
-       the .wsdl file extension.
-       className: if not None, will be used for the the wsdlag's ClassName.
-       serviceType: defaults to local.
-       dataSourceName: if serviceType is deployment.DATABASE, the ds must be
-       provided.
-    """
-    import WsdlAgEditor
-    import XFormWizard
-    import activegrid.model.basedocmgr as basedocmgr
-    import activegrid.server.deployment as deployment
-
-    if (serviceType == None):
-        serviceType = deployment.SERVICE_LOCAL
-
-
-    agwsDoc = _InitWsdlAg(wsdlPath, rootPath, serviceRefName)
-
-    if (agwsDoc == None):
-        return
-
-    serviceRef = agwsDoc.GetModel()    
-    
-    serviceRef.serviceType = serviceType
-
-    if (serviceType == deployment.SERVICE_DATABASE and dataSourceName != None):
-        serviceRef.databaseService = deployment.DatabaseService(dataSourceName)
-    else:
-        serviceRef.localService = deployment.LocalService(className=className)
-
-    _AddToProject(agwsDoc)
-        
-
-def _AddToProject(agwsDoc, addWsdl=False):
-    import activegrid.model.basedocmgr as basedocmgr    
-    projectDoc = GetCurrentProject()
-    agwsDoc.OnSaveDocument(agwsDoc.GetFilename())
-
-    files = [agwsDoc.fileName]
-    types = [basedocmgr.FILE_TYPE_SERVICE]
-    names = [agwsDoc.GetModel().name]
-    if (addWsdl):
-        m = agwsDoc.GetModel()        
-        wsdlName = os.path.splitext(os.path.basename(m.filePath))[0]
-        appDocMgr = projectDoc.GetAppDocMgr()
-        if (appDocMgr.findService(wsdlName) == None):
-            m = agwsDoc.GetModel()            
-            files.append(m.filePath)
-            types.append(None)
-            names.append(wsdlName)
-    
-    ProjectEditor.ProjectAddFilesCommand(projectDoc, files, types=types,
-                                         names=names).Do()
-    
-
-def _InitWsdlAg(wsdlPath, rootPath=fileutils.AG_SYSTEM_STATIC_VAR_REF,
-                serviceRefName=None):
-
-    projectDoc = GetCurrentProject()
-    appDocMgr = projectDoc.GetAppDocMgr()
-
-    if (serviceRefName == None):
-        serviceRefName = os.path.splitext(os.path.basename(wsdlPath))[0]
-    
-    if (appDocMgr.findServiceRef(serviceRefName) != None):
-        return None
-
-    import WsdlAgEditor
-    import XFormWizard
-    import activegrid.server.deployment as deployment
-
-    template = XFormWizard.GetTemplate(WsdlAgEditor.WsdlAgDocument)
-    ext = template.GetDefaultExtension()
-    fullPath = os.path.join(appDocMgr.homeDir, serviceRefName + ext)
-
-    agwsDoc = template.CreateDocument(
-        fullPath, flags=(wx.lib.docview.DOC_NO_VIEW|wx.lib.docview.DOC_NEW|
-                         wx.lib.docview.DOC_OPEN_ONCE))
-    
-    serviceRef = agwsDoc.GetModel()
-    serviceRef.name = serviceRefName
-
-    if (rootPath == None or os.path.isabs(wsdlPath)):
-        serviceRef.filePath = wsdlPath
-    else:
-        # make sure to use forward slashes for the path to the .wsdl
-        wsdlPath = wsdlPath.replace("\\", "/")
-        
-        if not wsdlPath.startswith("/"):
-            wsdlPath = "/%s" % wsdlPath
-        serviceRef.filePath = "%s%s" % (rootPath, wsdlPath)
-
-    agwsDoc.fileName = fullPath        
-
-    return agwsDoc
-
-
-def GetSchemaName(schema):
-    return os.path.basename(schema.fileName)
-
-
-class AGChoice(wx.Choice):
-    """Extension to wx.Choice that fixes linux bug where first item of choices
-    passed into ctor would be visible, but not selected."""
-    def __init__(self, parent, id, choices=[]):
-        super(AGChoice, self).__init__(parent=parent, id=id)
-        self.AppendItems(choices)