projecteditor.py
来自「Wxpython Implemented on Windows CE, Sou」· Python 代码 · 共 1,633 行 · 第 1/5 页
PY
1,633 行
This forces the project view to show the correct project.
"""
view = wx.lib.docview.Document.GetFirstView(self)
view.SetProject(self.GetFilename()) # ensure project is displayed in view
return view
def GetModel(self):
return self._projectModel
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)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?