⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 projecteditor.py

📁 wxPython的基本示例程序
💻 PY
📖 第 1 页 / 共 5 页
字号:
    def SetModel(self, model):        self._projectModel = model    def OnCreate(self, path, flags):        projectService = wx.GetApp().GetService(ProjectService)        view = projectService.GetView()        if view:  # view already exists, reuse            # All project documents share the same view.            self.AddView(view)            if view.GetDocument():                # All project documents need to share the same command processor,                # to enable redo/undo of cross project document commands                cmdProcessor = view.GetDocument().GetCommandProcessor()                if cmdProcessor:                    self.SetCommandProcessor(cmdProcessor)        else:  # generate view            view = self.GetDocumentTemplate().CreateView(self, flags)            projectService.SetView(view)        return view    def LoadObject(self, fileObject):        self.SetModel(projectlib.load(fileObject))        self.GetModel().SetDocCallback(GetDocCallback)        return True    def SaveObject(self, fileObject):        projectlib.save(fileObject, self.GetModel())        return True    def OnOpenDocument(self, filePath):        projectService = wx.GetApp().GetService(ProjectService)        view = projectService.GetView()        if not os.path.exists(filePath):            wx.GetApp().CloseSplash()            msgTitle = wx.GetApp().GetAppName()            if not msgTitle:                msgTitle = _("File Error")            wx.MessageBox(_("Could not find '%s'.") % filePath,                          msgTitle,                          wx.OK | wx.ICON_EXCLAMATION | wx.STAY_ON_TOP,                          wx.GetApp().GetTopWindow())            return True  # if we return False, the Project View is destroyed, Service windows shouldn't be destroyed        fileObject = file(filePath, 'r')        try:            self.LoadObject(fileObject)        except:            wx.GetApp().CloseSplash()            msgTitle = wx.GetApp().GetAppName()            if not msgTitle:                msgTitle = _("File Error")            wx.MessageBox(_("Could not open '%s'.  %s") % (wx.lib.docview.FileNameFromPath(filePath), sys.exc_value),                          msgTitle,                          wx.OK | wx.ICON_EXCLAMATION | wx.STAY_ON_TOP,                          wx.GetApp().GetTopWindow())            return True  # if we return False, the Project View is destroyed, Service windows shouldn't be destroyed        self.Modify(False)        self.SetFilename(filePath, True)        view.AddProjectToView(self)        self.SetDocumentModificationDate()        self.UpdateAllViews()        self._savedYet = True        view.Activate()        return True    def AddFile(self, filePath, folderPath=None, type=None, name=None):        if type:            types = [type]        else:            types = None        if name:            names = [name]        else:            names = None                    return self.AddFiles([filePath], folderPath, types, names)    def AddFiles(self, filePaths=None, folderPath=None, types=None, names=None, files=None):        # Filter out files that are not already in the project        if filePaths:            newFilePaths = []            oldFilePaths = []            for filePath in filePaths:                if self.GetModel().FindFile(filePath):                    oldFilePaths.append(filePath)                else:                    newFilePaths.append(filePath)                projectService = wx.GetApp().GetService(ProjectService)            for i, filePath in enumerate(newFilePaths):                if types:                    type = types[i]                else:                    type = None                                    if names:                    name = names[i]                else:                    name = projectService.FindNameDefault(filePath)                                    if not folderPath:                    folder = projectService.FindLogicalViewFolderDefault(filePath)                else:                    folder = folderPath                                    self.GetModel().AddFile(filePath, folder, type, name)        elif files:            newFilePaths = []            oldFilePaths = []            for file in files:                if self.GetModel().FindFile(file.filePath):                    oldFilePaths.append(file.filePath)                else:                    newFilePaths.append(file.filePath)                    self.GetModel().AddFile(file=file)        else:            return False        self.AddNameSpaces(newFilePaths)                        self.UpdateAllViews(hint = ("add", self, newFilePaths, oldFilePaths))        if len(newFilePaths):            self.Modify(True)            return True        else:            return False    def RemoveFile(self, filePath):        return self.RemoveFiles([filePath])    def RemoveFiles(self, filePaths=None, files=None):        removedFiles = []                if files:            filePaths = []            for file in files:                filePaths.append(file.filePath)                          for filePath in filePaths:            file = self.GetModel().FindFile(filePath)            if file:                self.GetModel().RemoveFile(file)                removedFiles.append(file.filePath)                                                self.UpdateAllViews(hint = ("remove", self, removedFiles))        if len(removedFiles):            self.Modify(True)            return True        else:            return False    def RenameFile(self, oldFilePath, newFilePath, isProject = False):        try:            if oldFilePath == newFilePath:                return False            # projects don't have to exist yet, so not required to rename old file,            # but files must exist, so we'll try to rename and allow exceptions to occur if can't.            if not isProject or (isProject and os.path.exists(oldFilePath)):                os.rename(oldFilePath, newFilePath)            if isProject:                documents = self.GetDocumentManager().GetDocuments()                for document in documents:                    if os.path.normcase(document.GetFilename()) == os.path.normcase(oldFilePath):  # If the renamed document is open, update it                        document.SetFilename(newFilePath)                        document.SetTitle(wx.lib.docview.FileNameFromPath(newFilePath))                        document.UpdateAllViews(hint = ("rename", self, oldFilePath, newFilePath))            else:                self.UpdateFilePath(oldFilePath, newFilePath)                documents = self.GetDocumentManager().GetDocuments()                for document in documents:                    if os.path.normcase(document.GetFilename()) == os.path.normcase(oldFilePath):  # If the renamed document is open, update it                        document.SetFilename(newFilePath, notifyViews = True)                        document.UpdateAllViews(hint = ("rename", self, oldFilePath, newFilePath))            return True        except OSError, (code, message):            msgTitle = wx.GetApp().GetAppName()            if not msgTitle:                msgTitle = _("File Error")            wx.MessageBox("Could not rename '%s'.  '%s'" % (wx.lib.docview.FileNameFromPath(oldFilePath), message),                          msgTitle,                          wx.OK | wx.ICON_EXCLAMATION,                          wx.GetApp().GetTopWindow())            return False    def MoveFile(self, file, newFolderPath):        return self.MoveFiles([file], newFolderPath)    def MoveFiles(self, files, newFolderPath):        filePaths = []        isArray = isinstance(newFolderPath, type([]))        for i in range(len(files)):            if isArray:                files[i].logicalFolder = newFolderPath[i]            else:                files[i].logicalFolder = newFolderPath            filePaths.append(files[i].filePath)                    self.UpdateAllViews(hint = ("remove", self, filePaths))        self.UpdateAllViews(hint = ("add", self, filePaths, []))        self.Modify(True)        return True    def UpdateFilePath(self, oldFilePath, newFilePath):        file = self.GetModel().FindFile(oldFilePath)        self.RemoveFile(oldFilePath)        if file:            self.AddFile(newFilePath, file.logicalFolder, file.type, file.name)        else:            self.AddFile(newFilePath)    def RemoveInvalidPaths(self):        """Makes sure all paths project knows about are valid and point to existing files. Removes and returns list of invalid paths."""        invalidFileRefs = []                fileRefs = self.GetFileRefs()                for fileRef in fileRefs:            if not os.path.exists(fileRef.filePath):                invalidFileRefs.append(fileRef)        for fileRef in invalidFileRefs:            fileRefs.remove(fileRef)        return [fileRef.filePath for fileRef in invalidFileRefs]    def SetStageProjectFile(self):        self._stageProjectFile = True    def ArchiveProject(self, zipdest, stagedir):        """Zips stagedir, creates a zipfile that has as name the projectname, in zipdest. Returns path to zipfile."""        if os.path.exists(zipdest):            raise AssertionError("Cannot archive project, %s already exists" % zipdest)        fileutils.zip(zipdest, stagedir)        return zipdest    def StageProject(self, tmpdir, targetDataSourceMapping={}):        """ Copies all files this project knows about into staging location. Files that live outside of the project dir are copied into the root of the stage dir, and their recorded file path is updated. Files that live inside of the project dir keep their relative path. Generates .dpl file into staging dir. Returns path to staging dir."""        projname = self.GetProjectName()        stagedir = os.path.join(tmpdir, projname)        fileutils.remove(stagedir)        os.makedirs(stagedir)                # remove invalid files from project        self.RemoveInvalidPaths()                # required so relative paths are written correctly when .dpl file is        # generated below.        self.SetFilename(os.path.join(stagedir,                                      os.path.basename(self.GetFilename())))        projectdir = self.GetModel().homeDir        # Validate paths before actually copying, and populate a dict        # with src->dest so copying is easy.        # (fileDict: ProjectFile instance -> dest path (string))        fileDict = self._ValidateFilePaths(projectdir, stagedir)                # copy files to staging dir        self._StageFiles(fileDict)        # set target data source for schemas        self._SetSchemaTargetDataSource(fileDict, targetDataSourceMapping)        # it is unfortunate we require this. it would be nice if filepaths        # were only in the project        self._FixWsdlAgFiles(stagedir)                    # generate .dpl file        dplfilename = projname + deploymentlib.DEPLOYMENT_EXTENSION        dplfilepath = os.path.join(stagedir, dplfilename)        self.GenerateDeployment(dplfilepath)        if self._stageProjectFile:            # save project so we get the .agp file. not required for deployment            # but convenient if user wants to open the deployment in the IDE            agpfilename = projname + PROJECT_EXTENSION            agpfilepath = os.path.join(stagedir, agpfilename)            # if this project has deployment data sources configured, remove            # them. changing the project is fine, since this is a clone of            # the project the IDE has.            self.GetModel().GetAppInfo().ResetDeploymentDataSources()                        f = None            try:                f = open(agpfilepath, "w")                                # setting homeDir correctly is required for the "figuring out                # relative paths" logic when saving the project                self.GetModel().homeDir = stagedir                                projectlib.save(f, self.GetModel(), productionDeployment=True)            finally:                try:                    f.close()                except: pass        return stagedir    def _FixWsdlAgFiles(self, stagedir):        """For each wsdlag file in the stagedir: if referenced artifact (wsdl or code file) is a known product file (such as securityservice.wsdl), make sure patch to it is parameterized with special env var. We do not want to copy those files. For user artifacts, ensure the file lives in root of stagedir. This should be the case if it is part of project (since staging has run). If it is not at root of stagedir, copy it. Then update path in wsdlag."""        files = os.listdir(stagedir)        for f in files:            if (f.endswith(WsdlAgEditor.WsdlAgDocument.WSDL_AG_EXT)):                wsdlagpath = os.path.join(stagedir, f)                fileObject = None                modified = False                try:                    fileObject = open(wsdlagpath)                    serviceref = WsdlAgEditor.load(fileObject)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -