/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz

« back to all changes in this revision

Viewing changes to tortoise-bzr.py

  • Committer: Jelmer Vernooij
  • Date: 2007-03-09 16:54:51 UTC
  • Revision ID: vernooij@lenovo-c29b82cd-20070309165451-v3h0d43a4godr2qa
Add very simple framework for TortoiseBzr.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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)