/[cvs]/nfo/projects/mess/src/client/windows/context_menu.py
ViewVC logotype

Annotation of /nfo/projects/mess/src/client/windows/context_menu.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.4 - (hide annotations)
Sat Jun 3 16:33:30 2006 UTC (18 years, 3 months ago) by joko
Branch: MAIN
Changes since 1.3: +38 -6 lines
File MIME type: text/x-python
+ Multiple menu entries & dispatcher (Use-Case: "Named Shortcuts")

1 joko 1.1 # A sample context menu handler.
2     # Adds a 'Hello from Python' menu entry to .py files. When clicked, a
3     # simple message box is displayed.
4     #
5     # To demostrate:
6     # * Execute this script to register the context menu.
7     # * Open Windows Explorer, and browse to a directory with a .py file.
8     # * Right-Click on a .py file - locate and click on 'Hello from Python' on
9     # the context menu.
10    
11 joko 1.4 # see also: http://www.codeproject.com/shell/ShellExtGuide2.asp
12    
13 joko 1.1 import pythoncom
14     from win32com.shell import shell, shellcon
15     import win32gui
16     import win32con
17 joko 1.4 import win32api, winerror
18 joko 1.1
19     IContextMenu_Methods = ["QueryContextMenu", "InvokeCommand", "GetCommandString"]
20     IShellExtInit_Methods = ["Initialize"]
21    
22     class ShellExtension:
23     _reg_progid_ = "Python.ShellExtension.ContextMenu"
24 joko 1.2 _reg_name_ = "MessClient"
25     _reg_desc_ = "Mess Shell Extension"
26 joko 1.1 _reg_clsid_ = "{CED0336C-C9EE-4a7f-8D7F-C660393C381F}"
27     _com_interfaces_ = [shell.IID_IShellExtInit, shell.IID_IContextMenu]
28     _public_methods_ = IContextMenu_Methods + IShellExtInit_Methods
29    
30     def Initialize(self, folder, dataobj, hkey):
31     print "Init", folder, dataobj, hkey
32     self.dataobj = dataobj
33    
34     def QueryContextMenu(self, hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags):
35 joko 1.3
36     # debug
37 joko 1.1 print "QCM", hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags
38 joko 1.3
39     # query the items clicked on
40 joko 1.1 format_etc = win32con.CF_HDROP, None, 1, -1, pythoncom.TYMED_HGLOBAL
41     sm = self.dataobj.GetData(format_etc)
42     num_files = shell.DragQueryFile(sm.data_handle, -1)
43 joko 1.3
44     #if num_files>1:
45     # msg = "&Hello from Python (with %d files selected)" % num_files
46     #else:
47     # fname = shell.DragQueryFile(sm.data_handle, 0)
48     # msg = "&Hello from Python (with '%s' selected)" % fname
49     self.files_selected = []
50     for i in range(0, num_files):
51     fname = shell.DragQueryFile(sm.data_handle, i)
52     if fname == 0: continue
53     self.files_selected.append(fname)
54    
55     # build context menu(s)
56     msg = "A&rchiveMe"
57 joko 1.1 idCmd = idCmdFirst
58     items = []
59     if (uFlags & 0x000F) == shellcon.CMF_NORMAL: # Check == here, since CMF_NORMAL=0
60     print "CMF_NORMAL..."
61 joko 1.4 items.append(msg + " - normal")
62 joko 1.1 elif uFlags & shellcon.CMF_VERBSONLY:
63     print "CMF_VERBSONLY..."
64     items.append(msg + " - shortcut")
65     elif uFlags & shellcon.CMF_EXPLORE:
66     print "CMF_EXPLORE..."
67 joko 1.3 #items.append(msg + " - normal file, right-click in Explorer")
68     items.append(msg)
69 joko 1.4 items.append("Named Shortcut &1")
70     items.append("Named Shortcut &2")
71 joko 1.1 elif uFlags & CMF_DEFAULTONLY:
72     print "CMF_DEFAULTONLY...\r\n"
73 joko 1.3 items.append("hello world - 1!")
74 joko 1.1 else:
75     print "** unknown flags", uFlags
76 joko 1.3 items.append("hello world - 2!")
77 joko 1.4
78     # create menu entries
79 joko 1.1 win32gui.InsertMenu(hMenu, indexMenu,
80     win32con.MF_SEPARATOR|win32con.MF_BYPOSITION,
81 joko 1.4 idCmd, None)
82 joko 1.1 indexMenu += 1
83 joko 1.4 idCmd += 1
84    
85 joko 1.1 for item in items:
86     win32gui.InsertMenu(hMenu, indexMenu,
87     win32con.MF_STRING|win32con.MF_BYPOSITION,
88     idCmd, item)
89     indexMenu += 1
90     idCmd += 1
91    
92     win32gui.InsertMenu(hMenu, indexMenu,
93     win32con.MF_SEPARATOR|win32con.MF_BYPOSITION,
94 joko 1.4 idCmd, None)
95 joko 1.1 indexMenu += 1
96 joko 1.4 idCmd += 1
97    
98 joko 1.1 return idCmd-idCmdFirst # Must return number of menu items we added.
99    
100 joko 1.4 def GetCommandString(self, cmdId, typ):
101     #if cmdId == 0:
102     # return "Hello from Python!!"
103     #else:
104     # return "abc"
105     return self._reg_name_ + "_" + cmdId;
106    
107 joko 1.1 def InvokeCommand(self, ci):
108     mask, hwnd, verb, params, dir, nShow, hotkey, hicon = ci
109    
110 joko 1.4 # If lpVerb really points to a string, ignore this function call and bail out.
111     if win32api.HIWORD( verb ) != 0:
112     return winerror.E_INVALIDARG
113    
114     function_id = win32api.LOWORD(verb)
115     # TODO: establish mapping with building the context menus in "QueryContextMenu"
116     if function_id == 1:
117     method = "ArchiveMe"
118     elif function_id == 2:
119     method = "Shortcut 1"
120     elif function_id == 3:
121     method = "Shortcut 2"
122     else:
123     method = "Unknown"
124    
125     # do action(s)
126     win32gui.MessageBox(hwnd, "\n".join(self.files_selected), method, win32con.MB_OK)
127 joko 1.1
128 joko 1.2
129 joko 1.1 def DllRegisterServer():
130     import _winreg
131 joko 1.2
132     # extended (via http://mail.python.org/pipermail/python-list/2003-December/198390.html)
133 joko 1.3
134 joko 1.2 # for folders
135     folder_key = _winreg.CreateKey(_winreg.HKEY_CLASSES_ROOT, "Folder\\shellex")
136     folder_subkey = _winreg.CreateKey(folder_key, "ContextMenuHandlers")
137     folder_subkey2 = _winreg.CreateKey(folder_subkey, ShellExtension._reg_name_)
138     _winreg.SetValueEx(folder_subkey2, None, 0, _winreg.REG_SZ, ShellExtension._reg_clsid_)
139    
140     # for files
141     file_key = _winreg.CreateKey(_winreg.HKEY_CLASSES_ROOT, "*\\shellex")
142     file_subkey = _winreg.CreateKey(file_key, "ContextMenuHandlers")
143     file_subkey2 = _winreg.CreateKey(file_subkey, ShellExtension._reg_name_)
144     _winreg.SetValueEx(file_subkey2, None, 0, _winreg.REG_SZ, ShellExtension._reg_clsid_)
145    
146 joko 1.1 print ShellExtension._reg_desc_, "registration complete."
147    
148 joko 1.2
149 joko 1.1 def DllUnregisterServer():
150     import _winreg
151 joko 1.2
152     # extended (via http://mail.python.org/pipermail/python-list/2003-December/198390.html)
153    
154 joko 1.1 try:
155 joko 1.2 # for folders
156     folder_key = _winreg.DeleteKey(_winreg.HKEY_CLASSES_ROOT,
157     "Folder\\shellex\\ContextMenuHandlers\\" + ShellExtension._reg_name_)
158     # for files
159     file_key = _winreg.DeleteKey(_winreg.HKEY_CLASSES_ROOT,
160     "*\\shellex\\ContextMenuHandlers\\" + ShellExtension._reg_name_)
161 joko 1.1 except WindowsError, details:
162     import errno
163     if details.errno != errno.ENOENT:
164     raise
165     print ShellExtension._reg_desc_, "unregistration complete."
166    
167     if __name__=='__main__':
168     from win32com.server import register
169     register.UseCommandLine(ShellExtension,
170     finalize_register = DllRegisterServer,
171     finalize_unregister = DllUnregisterServer)

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed