📄 extensionservice.py
字号:
#----------------------------------------------------------------------------# Name: ExtensionService.py# Purpose: Extension Service for IDE## Author: Peter Yared## Created: 5/23/05# CVS-ID: $ID:$# Copyright: (c) 2005-2006 ActiveGrid, Inc.# License: wxWindows License#----------------------------------------------------------------------------import wximport wx.lib.pydocviewimport MessageServiceimport ProjectEditorimport osimport os.pathimport activegrid.util.xmlutils as xmlutils_ = wx.GetTranslation#----------------------------------------------------------------------------# Constants#----------------------------------------------------------------------------SPACE = 10HALF_SPACE = 5#----------------------------------------------------------------------------# Classes#----------------------------------------------------------------------------class Extension: def __init__(self, menuItemName=None): self.menuItemName = menuItemName self.id = 0 self.menuItemDesc = '' self.command = '' self.commandPreArgs = '' self.commandPostArgs = '' self.fileExt = None self.opOnSelectedFile = Trueclass ExtensionService(wx.lib.pydocview.DocService): EXTENSIONS_KEY = "/AG_Extensions" def __init__(self): self.LoadExtensions() def __getExtensionKeyName(extensionName): return "%s/%s" % (ExtensionService.EXTENSIONS_KEY, extensionName) __getExtensionKeyName = staticmethod(__getExtensionKeyName) def LoadExtensions(self): self._extensions = [] extensionNames = [] config = wx.ConfigBase_Get() path = config.GetPath() try: config.SetPath(ExtensionService.EXTENSIONS_KEY) cont, value, index = config.GetFirstEntry() while cont: extensionNames.append(value) cont, value, index = config.GetNextEntry(index) finally: config.SetPath(path) for extensionName in extensionNames: extensionData = config.Read(self.__getExtensionKeyName(extensionName)) if extensionData: extension = xmlutils.unmarshal(extensionData.encode('utf-8')) self._extensions.append(extension) def SaveExtensions(self): config = wx.ConfigBase_Get() config.DeleteGroup(ExtensionService.EXTENSIONS_KEY) for extension in self._extensions: config.Write(self.__getExtensionKeyName(extension.menuItemName), xmlutils.marshal(extension)) def GetExtensions(self): return self._extensions def SetExtensions(self, extensions): self._extensions = extensions def CheckSumExtensions(self): return xmlutils.marshal(self._extensions) def InstallControls(self, frame, menuBar = None, toolBar = None, statusBar = None, document = None): toolsMenuIndex = menuBar.FindMenu(_("&Tools")) if toolsMenuIndex > -1: toolsMenu = menuBar.GetMenu(toolsMenuIndex) else: toolsMenu = wx.Menu() if self._extensions: if toolsMenu.GetMenuItems(): toolsMenu.AppendSeparator() for ext in self._extensions: # Append a tool menu item for each extension ext.id = wx.NewId() toolsMenu.Append(ext.id, ext.menuItemName) wx.EVT_MENU(frame, ext.id, frame.ProcessEvent) wx.EVT_UPDATE_UI(frame, ext.id, frame.ProcessUpdateUIEvent) if toolsMenuIndex == -1: index = menuBar.FindMenu(_("&Run")) if index == -1: index = menuBar.FindMenu(_("&Project")) if index == -1: index = menuBar.FindMenu(_("&Format")) if index == -1: index = menuBar.FindMenu(_("&View")) menuBar.Insert(index + 1, toolsMenu, _("&Tools")) def ProcessEvent(self, event): id = event.GetId() for extension in self._extensions: if id == extension.id: self.OnExecuteExtension(extension) return True return False def ProcessUpdateUIEvent(self, event): id = event.GetId() for extension in self._extensions: if id == extension.id: if extension.fileExt: doc = wx.GetApp().GetDocumentManager().GetCurrentDocument() if doc and '*' in extension.fileExt: event.Enable(True) return True if doc: for fileExt in extension.fileExt: if fileExt in doc.GetDocumentTemplate().GetFileFilter(): event.Enable(True) return True if extension.opOnSelectedFile and isinstance(doc, ProjectEditor.ProjectDocument): filename = doc.GetFirstView().GetSelectedFile() if filename: template = wx.GetApp().GetDocumentManager().FindTemplateForPath(filename) for fileExt in extension.fileExt: if fileExt in template.GetFileFilter(): event.Enable(True) return True event.Enable(False) return False return False def OnExecuteExtension(self, extension): if extension.fileExt: doc = wx.GetApp().GetDocumentManager().GetCurrentDocument() if not doc: return if extension.opOnSelectedFile and isinstance(doc, ProjectEditor.ProjectDocument): filename = doc.GetFirstView().GetSelectedFile() if not filename: filename = doc.GetFilename() else: filename = doc.GetFilename() ext = os.path.splitext(filename)[1] if not '*' in extension.fileExt: if not ext or ext[1:] not in extension.fileExt: return cmds = [extension.command] if extension.commandPreArgs: cmds.append(extension.commandPreArgs) cmds.append(filename) if extension.commandPostArgs: cmds.append(extension.commandPostArgs) os.spawnv(os.P_NOWAIT, extension.command, cmds) else: cmd = extension.command if extension.commandPreArgs: cmd = cmd + ' ' + extension.commandPreArgs if extension.commandPostArgs: cmd = cmd + ' ' + extension.commandPostArgs f = os.popen(cmd) messageService = wx.GetApp().GetService(MessageService.MessageService) messageService.ShowWindow() view = messageService.GetView() for line in f.readlines(): view.AddLines(line) view.GetControl().EnsureCaretVisible() f.close()class ExtensionOptionsPanel(wx.Panel): def __init__(self, parent, id): wx.Panel.__init__(self, parent, id) extOptionsPanelBorderSizer = wx.BoxSizer(wx.VERTICAL) extOptionsPanelSizer = wx.BoxSizer(wx.HORIZONTAL) extCtrlSizer = wx.BoxSizer(wx.VERTICAL) extCtrlSizer.Add(wx.StaticText(self, -1, _("External Tools:")), 0, wx.BOTTOM, HALF_SPACE) self._extListBox = wx.ListBox(self, -1, style=wx.LB_SINGLE) self.Bind(wx.EVT_LISTBOX, self.OnListBoxSelect, self._extListBox) extCtrlSizer.Add(self._extListBox, 1, wx.BOTTOM | wx.EXPAND, SPACE) buttonSizer = wx.GridSizer(cols=2, vgap=HALF_SPACE, hgap=HALF_SPACE) self._moveUpButton = wx.Button(self, -1, _("Move Up"))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -