bzr branch
http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz
| 
166
by Jelmer Vernooij
 Add very simple framework for TortoiseBzr.  | 
1  | 
# Simple TortoiseSVN-like Bazaar plugin for the Windows Shell
 | 
2  | 
# Published under the GNU GPL, v2 or later.
 | 
|
3  | 
# Copyright (C) 2007 Jelmer Vernooij <jelmer@samba.org>
 | 
|
4  | 
||
5  | 
import pythoncom  | 
|
6  | 
from win32com.shell import shell, shellcon  | 
|
7  | 
import win32gui  | 
|
8  | 
import win32con  | 
|
9  | 
||
10  | 
"""Windows shell extension that adds context menu items to Bazaar branches."""
 | 
|
11  | 
class BazaarShellExtension:  | 
|
12  | 
_reg_progid_ = "Bazaar.ShellExtension.ContextMenu"  | 
|
13  | 
_reg_desc_ = "Bazaar Shell Extension"  | 
|
14  | 
_reg_clsid_ = "{EEE9936B-73ED-4D45-80C9-AF918354F885}"  | 
|
15  | 
_com_interfaces_ = [shell.IID_IShellExtInit, shell.IID_IContextMenu]  | 
|
16  | 
_public_methods_ = [  | 
|
17  | 
"Initialize", # From IShellExtInit  | 
|
18  | 
"QueryContextMenu", "InvokeCommand", "GetCommandString" # IContextMenu  | 
|
19  | 
	]
 | 
|
20  | 
||
21  | 
def Initialize(self, folder, dataobj, hkey):  | 
|
22  | 
self.dataobj = dataobj  | 
|
23  | 
||
24  | 
def QueryContextMenu(self, hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags):  | 
|
25  | 
format_etc = win32con.CF_HDROP, None, 1, -1, pythoncom.TYMED_HGLOBAL  | 
|
26  | 
sm = self.dataobj.GetData(format_etc)  | 
|
27  | 
num_files = shell.DragQueryFile(sm.data_handle, -1)  | 
|
28  | 
if num_files>1:  | 
|
29  | 
msg = "&Hello from Python (with %d files selected)" % num_files  | 
|
30  | 
else:  | 
|
31  | 
fname = shell.DragQueryFile(sm.data_handle, 0)  | 
|
32  | 
msg = "&Hello from Python (with '%s' selected)" % fname  | 
|
33  | 
idCmd = idCmdFirst  | 
|
34  | 
items = []  | 
|
35  | 
if (uFlags & 0x000F) == shellcon.CMF_NORMAL: # Check == here, since CMF_NORMAL=0  | 
|
36  | 
print "CMF_NORMAL..."  | 
|
37  | 
items.append(msg)  | 
|
38  | 
elif uFlags & shellcon.CMF_VERBSONLY:  | 
|
39  | 
print "CMF_VERBSONLY..."  | 
|
40  | 
items.append(msg + " - shortcut")  | 
|
41  | 
elif uFlags & shellcon.CMF_EXPLORE:  | 
|
42  | 
print "CMF_EXPLORE..."  | 
|
43  | 
items.append(msg + " - normal file, right-click in Explorer")  | 
|
44  | 
elif uFlags & CMF_DEFAULTONLY:  | 
|
45  | 
print "CMF_DEFAULTONLY...\r\n"  | 
|
46  | 
else:  | 
|
47  | 
print "** unknown flags", uFlags  | 
|
48  | 
win32gui.InsertMenu(hMenu, indexMenu,  | 
|
49  | 
win32con.MF_SEPARATOR|win32con.MF_BYPOSITION,  | 
|
50  | 
0, None)  | 
|
51  | 
indexMenu += 1  | 
|
52  | 
for item in items:  | 
|
53  | 
win32gui.InsertMenu(hMenu, indexMenu,  | 
|
54  | 
win32con.MF_STRING|win32con.MF_BYPOSITION,  | 
|
55  | 
idCmd, item)  | 
|
56  | 
indexMenu += 1  | 
|
57  | 
idCmd += 1  | 
|
58  | 
||
59  | 
win32gui.InsertMenu(hMenu, indexMenu,  | 
|
60  | 
win32con.MF_SEPARATOR|win32con.MF_BYPOSITION,  | 
|
61  | 
0, None)  | 
|
62  | 
indexMenu += 1  | 
|
63  | 
return idCmd-idCmdFirst # Must return number of menu items we added.  | 
|
64  | 
||
65  | 
def InvokeCommand(self, ci):  | 
|
66  | 
mask, hwnd, verb, params, dir, nShow, hotkey, hicon = ci  | 
|
67  | 
	# FIXME: Run the actual command
 | 
|
68  | 
||
69  | 
def GetCommandString(self, cmd, typ):  | 
|
70  | 
return "Hello from Python!!"  | 
|
71  | 
||
72  | 
registryKeys = [  | 
|
73  | 
"*\\shellex\\ContextMenuHandlers",  | 
|
74  | 
"Directory\\Background\\shellex\\ContextMenuHandlers",  | 
|
75  | 
"Directory\\shellex\\ContextMenuHandlers",  | 
|
76  | 
"Folder\\shellex\\ContextmenuHandlers"  | 
|
77  | 
	]
 | 
|
78  | 
||
79  | 
def DllRegisterServer():  | 
|
80  | 
import _winreg  | 
|
81  | 
for keyname in registryKeys:  | 
|
82  | 
key = _winreg.CreateKey(_winreg.HKEY_CLASSES_ROOT, keyname)  | 
|
83  | 
subkey = _winreg.CreateKey(key, "TortoiseBzr")  | 
|
84  | 
_winreg.SetValueEx(subkey, None, 0, _winreg.REG_SZ, BazaarShellExtension._reg_clsid_)  | 
|
85  | 
_winreg.CloseKey(subkey)  | 
|
86  | 
_winreg.CloseKey(key)  | 
|
87  | 
||
88  | 
print BazaarShellExtension._reg_desc_, "registration complete."  | 
|
89  | 
||
90  | 
def DllUnregisterServer():  | 
|
91  | 
import _winreg  | 
|
92  | 
try:  | 
|
93  | 
for keyname in registryKeys:  | 
|
94  | 
_winreg.DeleteKey(_winreg.HKEY_CLASSES_ROOT,  | 
|
95  | 
"%s\\TortoiseBzr" % keyname)  | 
|
96  | 
except WindowsError, details:  | 
|
97  | 
import errno  | 
|
98  | 
if details.errno != errno.ENOENT:  | 
|
99  | 
            raise
 | 
|
100  | 
print BazaarShellExtension._reg_desc_, "unregistration complete."  | 
|
101  | 
||
102  | 
if __name__ == '__main__':  | 
|
103  | 
from win32com.server import register  | 
|
104  | 
register.UseCommandLine(BazaarShellExtension,  | 
|
105  | 
finalize_register = DllRegisterServer,  | 
|
106  | 
finalize_unregister = DllUnregisterServer)  |