📄 addin.py
字号:
win32clipboard.SetClipboardData(win32con.CF_BITMAP, handle) win32clipboard.CloseClipboard() button.Style = constants.msoButtonIconAndCaption button.PasteFace()# A class that manages an "Outlook Explorer" - that is, a top-level window# All UI elements are managed here, and there is one instance per explorer.class ExplorerWithEvents: def Init(self, manager, explorers_collection): self.manager = manager self.have_setup_ui = False self.explorers_collection = explorers_collection self.toolbar = None def SetupUI(self): manager = self.manager assert self.toolbar is None, "Should not yet have a toolbar" # Add our "Spam" and "Not Spam" buttons tt_text = _("Move the selected message to the Spam folder,\n" \ "and train the system that this is Spam.") self.but_delete_as = self._AddControl( None, constants.msoControlButton, ButtonDeleteAsSpamEvent, (self.manager, self), Caption=_("Spam"), TooltipText = tt_text, BeginGroup = False, Tag = "SpamBayesCommand.DeleteAsSpam", image = "delete_as_spam.bmp") # And again for "Not Spam" tt_text = _(\ "Recovers the selected item back to the folder\n" \ "it was filtered from (or to the Inbox if this\n" \ "folder is not known), and trains the system that\n" \ "this is a good message\n") self.but_recover_as = self._AddControl( None, constants.msoControlButton, ButtonRecoverFromSpamEvent, (self.manager, self), Caption=_("Not Spam"), TooltipText = tt_text, Tag = "SpamBayesCommand.RecoverFromSpam", image = "recover_ham.bmp") # The main tool-bar dropdown with all our entries. # Add a pop-up menu to the toolbar # but loop around twice - first time we may find a non-functioning button popup = None for attempt in range(2): popup = self._AddControl( None, constants.msoControlPopup, None, None, Caption=_("SpamBayes"), TooltipText = _("SpamBayes anti-spam filters and functions"), Enabled = True, Tag = "SpamBayesCommand.Popup") if popup is None: # If the strategy below works for child buttons, we should # consider trying to re-create the top-level toolbar too. break # Convert from "CommandBarItem" to derived # "CommandBarPopup" Not sure if we should be able to work # this out ourselves, but no introspection I tried seemed # to indicate we can. VB does it via strongly-typed # declarations. popup = CastTo(popup, "CommandBarPopup") # And add our children. child = self._AddControl(popup, constants.msoControlButton, ButtonEvent, (manager.ShowManager,), Caption=_("SpamBayes Manager..."), TooltipText = _("Show the SpamBayes manager dialog."), Enabled = True, Visible=True, Tag = "SpamBayesCommand.Manager") # Only necessary to check the first child - if the first works, # the others will too if child is None: # Try and delete the popup, the bounce around the loop again, # which will re-create it. try: item = self.CommandBars.FindControl( Type = constants.msoControlPopup, Tag = "SpamBayesCommand.Popup") if item is None: print "ERROR: Could't re-find control to delete" break item.Delete(False) print "The above toolbar message is common - " \ "recreating the toolbar..." except pythoncom.com_error, e: print "ERROR: Failed to delete our dead toolbar control" break # ok - toolbar deleted - just run around the loop again continue self._AddControl(popup, constants.msoControlButton, ButtonEvent, (ShowClues, self.manager, self), Caption=_("Show spam clues for current message"), Enabled=True, Visible=True, Tag = "SpamBayesCommand.Clues") self._AddControl(popup, constants.msoControlButton, ButtonEvent, (manager.ShowFilterNow,), Caption=_("Filter messages..."), Enabled=True, Visible=True, Tag = "SpamBayesCommand.FilterNow") self._AddControl(popup, constants.msoControlButton, ButtonEvent, (EmptySpamFolder, self.manager), Caption=_("Empty Spam Folder"), Enabled=True, Visible=True, BeginGroup=True, Tag = "SpamBayesCommand.EmptySpam") self._AddControl(popup, constants.msoControlButton, ButtonEvent, (CheckLatestVersion, self.manager,), Caption=_("Check for new version"), Enabled=True, Visible=True, BeginGroup=True, Tag = "SpamBayesCommand.CheckVersion") helpPopup = self._AddControl( popup, constants.msoControlPopup, None, None, Caption=_("Help"), TooltipText = _("SpamBayes help documents"), Enabled = True, Tag = "SpamBayesCommand.HelpPopup") if helpPopup is not None: helpPopup = CastTo(helpPopup, "CommandBarPopup") self._AddHelpControl(helpPopup, _("About SpamBayes"), "about.html", "SpamBayesCommand.Help.ShowAbout") self._AddHelpControl(helpPopup, _("Troubleshooting Guide"), "docs/troubleshooting.html", "SpamBayesCommand.Help.ShowTroubleshooting") self._AddHelpControl(helpPopup, _("SpamBayes Website"), "http://spambayes.sourceforge.net/", "SpamBayesCommand.Help.ShowSpamBayes Website") self._AddHelpControl(helpPopup, _("Frequently Asked Questions"), "http://spambayes.sourceforge.net/faq.html", "SpamBayesCommand.Help.ShowFAQ") self._AddHelpControl(helpPopup, _("SpamBayes Bug Tracker"), "http://sourceforge.net/tracker/?group_id=61702&atid=498103", "SpamBayesCommand.Help.BugTacker") # If we are running from Python sources, enable a few extra items if not hasattr(sys, "frozen"): self._AddControl(popup, constants.msoControlButton, ButtonEvent, (Tester, self.manager), Caption=_("Execute test suite"), Enabled=True, Visible=True, BeginGroup=True, Tag = "SpamBayesCommand.TestSuite") self.have_setup_ui = True def _AddHelpControl(self, parent, caption, url, tag): self._AddControl(parent, constants.msoControlButton, ButtonEvent, (self.manager.ShowHtml, url), Caption=caption, Enabled=True, Visible=True, Tag=tag) def _AddControl(self, parent, # who the control is added to control_type, # type of control to add. events_class, events_init_args, # class/Init() args **item_attrs): # extra control attributes. # Outlook Toolbars suck :) # We have tried a number of options: temp/perm in the standard toolbar, # Always creating our own toolbar, etc. # This seems to be fairly common: # http://groups.google.com/groups?threadm=eKKmbvQvAHA.1808%40tkmsftngp02 # Now the strategy is just to use our own, permanent toolbar, with # permanent items, and ignore uninstall issues. # We search all commandbars for a control with our Tag. If found, we # use it (the user may have customized the bar and moved our buttons # elsewhere). If we can not find the child control, we then try and # locate our toolbar, creating if necessary. Our items get added to # that. assert item_attrs.has_key('Tag'), "Need a 'Tag' attribute!" image_fname = None if 'image' in item_attrs: image_fname = item_attrs['image'] del item_attrs['image'] tag = item_attrs["Tag"] item = self.CommandBars.FindControl( Type = control_type, Tag = tag) # we only create top-level items as permanent, so we keep a little control # over how they are ordered, especially between releases where the # subitems are subject to change. This will prevent the user # customising the dropdown items, but that is probably OK. # (we could stay permanent and use the 'before' arg, but this # is still pretty useless if the user has customized) temporary = parent is not None if item is not None and temporary: # oops - we used to create them perm, but item.Delete(False) item = None if item is None: if parent is None: # No parent specified - that means top-level - locate the # toolbar to use as the parent. if self.toolbar is None: # See if we can find our "SpamBayes" toolbar # Indexing via the name appears unreliable, so just loop # Pity we have no "Tag" on a toolbar - then we could even # handle being renamed by the user. bars = self.CommandBars for i in range(bars.Count): toolbar = bars.Item(i+1) if toolbar.Name == "SpamBayes": self.toolbar = toolbar break else: # for not broken - can't find toolbar. Create a new one. # Create it as a permanent one (which is default) print "Creating new SpamBayes toolbar to host our buttons" self.toolbar = bars.Add(toolbar_name, constants.msoBarTop, Temporary=False) self.toolbar.Visible = True parent = self.toolbar # Now add the item itself to the parent. try: item = parent.Controls.Add(Type=control_type, Temporary=temporary) except pythoncom.com_error, e: # Toolbars seem to still fail randomly for some users. # eg, bug [ 755738 ] Latest CVS outllok doesn't work print "FAILED to add the toolbar item '%s' - %s" % (tag,e) return if image_fname: # Eeek - only available in derived class. assert control_type == constants.msoControlButton but = CastTo(item, "_CommandBarButton") SetButtonImage(but, image_fname, self.manager) # Set the extra attributes passed in. for attr, val in item_attrs.items(): setattr(item, attr, val) # didn't previously set this, and it seems to fix alot of problem - so # we set it for every object, even existing ones. item.OnAction = "<!" + OutlookAddin._reg_progid_ + ">" # Hook events for the item, but only if we haven't already in some # other explorer instance. if events_class is not None and tag not in self.explorers_collection.button_event_map: item = DispatchWithEvents(item, events_class) item.Init(*events_init_args) # We must remember the item itself, else the events get disconnected # as the item destructs. self.explorers_collection.button_event_map[tag] = item return item def GetSelectedMessages(self, allow_multi = True, explorer = None): if explorer is None: explorer = self.Application.ActiveExplorer() sel = explorer.Selection if sel.Count > 1 and not allow_multi: self.manager.ReportError(_("Please select a single item"),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -