by
Changes to 18 files · Browse files at 9d1ee2a6dda6 Showing diff from parent a5135af9c4b2 5e11b92e2e74 Diff from another changeset...
@@ -12,6 +12,16 @@ Root: HKLM32; Subkey: Software\TortoiseHg; Check: Is64BitInstallMode; Flags: uninsdeletekey
Root: HKLM32; Subkey: Software\TortoiseHg; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {app}
+; cmenu handler COM control
+Root: HKCR; Subkey: CLSID\{{B456DB9F-7BF4-478c-937A-05130C2C212E}; Flags: uninsdeletekey; Components: shell
+Root: HKCR; Subkey: CLSID\{{B456DB9F-7BF4-478c-937A-05130C2C212E}; ValueType: string; ValueName: ; ValueData: TortoiseHg; Components: shell
+Root: HKCR; Subkey: CLSID\{{B456DB9F-7BF4-478c-937A-05130C2C212E}\InProcServer32; ValueType: string; ValueName: ; ValueData: {app}\THgShell.dll; Components: shell
+Root: HKCR; Subkey: CLSID\{{B456DB9F-7BF4-478c-937A-05130C2C212E}\InProcServer32; ValueType: string; ValueName: ThreadingModel; ValueData: Apartment; Components: shell
+Root: HKCR32; Subkey: CLSID\{{B456DB9F-7BF4-478c-937A-05130C2C212E}; Check: Is64BitInstallMode; Flags: uninsdeletekey; Components: shell
+Root: HKCR32; Subkey: CLSID\{{B456DB9F-7BF4-478c-937A-05130C2C212E}; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: TortoiseHg; Components: shell
+Root: HKCR32; Subkey: CLSID\{{B456DB9F-7BF4-478c-937A-05130C2C212E}\InProcServer32; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {app}\THgShellx86.dll; Components: shell
+Root: HKCR32; Subkey: CLSID\{{B456DB9F-7BF4-478c-937A-05130C2C212E}\InProcServer32; Check: Is64BitInstallMode; ValueType: string; ValueName: ThreadingModel; ValueData: Apartment; Components: shell
+
; overlay handler COM controls
; Normal
Root: HKCR; Subkey: CLSID\{{B456DBA0-7BF4-478c-937A-05130C2C212E}; Flags: uninsdeletekey; Components: shell
@@ -64,10 +74,12 @@Root: HKLM32; Subkey: Software\TortoiseOverlays\Unversioned; Check: Is64BitInstallMode; ValueType: string; ValueName: TortoiseHg; ValueData: {{B456DBA6-7BF4-478c-937A-05130C2C212E}; Components: shell
; Make them approved by administrator
+Root: HKLM; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; ValueType: string; ValueName: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell
Root: HKLM; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; ValueType: string; ValueName: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell
Root: HKLM; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; ValueType: string; ValueName: {{B456DBA1-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell
Root: HKLM; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; ValueType: string; ValueName: {{B456DBA2-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell
Root: HKLM; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; ValueType: string; ValueName: {{B456DBA6-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell
+Root: HKLM32; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; Check: Is64BitInstallMode; ValueType: string; ValueName: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell
Root: HKLM32; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; Check: Is64BitInstallMode; ValueType: string; ValueName: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell
Root: HKLM32; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; Check: Is64BitInstallMode; ValueType: string; ValueName: {{B456DBA1-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell
Root: HKLM32; Subkey: SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved; Check: Is64BitInstallMode; ValueType: string; ValueName: {{B456DBA2-7BF4-478c-937A-05130C2C212E}; ValueData: TortoiseHg; Flags: uninsdeletevalue; Components: shell
@@ -75,32 +87,32 @@
; Context menu handlers
Root: HKCR; Subkey: Directory\shellex\ContextMenuHandlers\TortoiseHgCMenu; Flags: uninsdeletekey; Components: shell
-Root: HKCR; Subkey: Directory\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell
+Root: HKCR; Subkey: Directory\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell
Root: HKCR32; Subkey: Directory\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; Flags: uninsdeletekey; Components: shell
-Root: HKCR32; Subkey: Directory\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell
+Root: HKCR32; Subkey: Directory\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell
Root: HKCR; Subkey: Directory\Background\shellex\ContextMenuHandlers\TortoiseHgCMenu; Flags: uninsdeletekey; Components: shell
-Root: HKCR; Subkey: Directory\Background\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell
+Root: HKCR; Subkey: Directory\Background\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell
Root: HKCR32; Subkey: Directory\Background\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; Flags: uninsdeletekey; Components: shell
-Root: HKCR32; Subkey: Directory\Background\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell
+Root: HKCR32; Subkey: Directory\Background\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell
Root: HKCR; Subkey: Drive\shellex\ContextMenuHandlers\TortoiseHgCMenu; Flags: uninsdeletekey; Components: shell
-Root: HKCR; Subkey: Drive\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell
+Root: HKCR; Subkey: Drive\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell
Root: HKCR32; Subkey: Drive\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; Flags: uninsdeletekey; Components: shell
-Root: HKCR32; Subkey: Drive\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell
+Root: HKCR32; Subkey: Drive\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell
Root: HKCR; Subkey: Folder\shellex\ContextMenuHandlers\TortoiseHgCMenu; Flags: uninsdeletekey; Components: shell
-Root: HKCR; Subkey: Folder\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell
+Root: HKCR; Subkey: Folder\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell
Root: HKCR32; Subkey: Folder\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; Flags: uninsdeletekey; Components: shell
-Root: HKCR32; Subkey: Folder\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell
+Root: HKCR32; Subkey: Folder\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell
Root: HKCR; Subkey: *\shellex\ContextMenuHandlers\TortoiseHgCMenu; Flags: uninsdeletekey; Components: shell
-Root: HKCR; Subkey: *\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell
+Root: HKCR; Subkey: *\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell
Root: HKCR32; Subkey: *\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; Flags: uninsdeletekey; Components: shell
-Root: HKCR32; Subkey: *\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell
+Root: HKCR32; Subkey: *\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell
Root: HKCR; Subkey: InternetShortcut\shellex\ContextMenuHandlers\TortoiseHgCMenu; Flags: uninsdeletekey; Components: shell
-Root: HKCR; Subkey: InternetShortcut\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell
+Root: HKCR; Subkey: InternetShortcut\shellex\ContextMenuHandlers\TortoiseHgCMenu; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell
Root: HKCR32; Subkey: InternetShortcut\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; Flags: uninsdeletekey; Components: shell
-Root: HKCR32; Subkey: InternetShortcut\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DBA0-7BF4-478c-937A-05130C2C212E}; Components: shell
+Root: HKCR32; Subkey: InternetShortcut\shellex\ContextMenuHandlers\TortoiseHgCMenu; Check: Is64BitInstallMode; ValueType: string; ValueName: ; ValueData: {{B456DB9F-7BF4-478c-937A-05130C2C212E}; Components: shell
|
@@ -303,7 +303,7 @@ self.update_recent_committers()
committer = os.environ.get('HGUSER') or self.repo.ui.config('ui', 'username')
if committer:
- self.update_recent_committers(committer)
+ self.update_recent_committers(hglib.toutf(committer))
self.committer_cbbox.set_active(0)
adv_hbox.pack_start(gtk.Label(_('Auto-includes:')), False, False, 2)
@@ -400,8 +400,10 @@ return label
self.parent1_label = add_parent()
self.parent2_label = add_parent()
- parents_vbox.pack_start(gtk.HSeparator())
- vbox2.pack_start(parents_vbox, False, False)
+ parents_hbox = gtk.HBox()
+ parents_hbox.pack_start(parents_vbox, False, False, 5)
+ vbox2.pack_start(parents_hbox, False, False, 2)
+ vbox2.pack_start(gtk.HSeparator(), False, False)
self.vpaned = gtk.VPaned()
self.vpaned.pack1(vbox, shrink=False)
@@ -420,6 +422,7 @@
def update_recent_committers(self, name=None):
+ """ 'name' argument must be in UTF-8. """
if name is not None:
self._mru_committers.add(name)
self._mru_committers.compact()
@@ -938,7 +941,7 @@ self.refresh_complete()
return
- self.update_recent_committers(user)
+ self.update_recent_committers(hglib.toutf(user))
incs = hglib.fromutf(self.autoinc_entry.get_text())
self.opts['include'] = [i.strip() for i in incs.split(',') if i.strip()]
autopush = self.autopush.get_active()
|
@@ -32,6 +32,7 @@ dialog = gtk.Dialog(parent=parent, flags=gtk.DIALOG_MODAL,
buttons=buttons)
dialog.set_title(_('TortoiseHg Prompt'))
+ dialog.set_has_separator(False)
entry = gtk.Entry()
entry.set_text(default or '')
entry.set_visibility(visible)
|
@@ -601,6 +601,17 @@ self.set_default_size(320, 240)
self.connect('delete-event', self.delete_event)
+ # accelerators
+ accelgroup = gtk.AccelGroup()
+ self.add_accel_group(accelgroup)
+ mod = gtklib.get_thg_modifier()
+ for key, modifier in (gtk.accelerator_parse(mod+'w'),
+ gtk.accelerator_parse(mod+'q'),
+ gtk.accelerator_parse('Escape')):
+ self.add_accelerator('thg-close', accelgroup, key,
+ modifier, gtk.ACCEL_VISIBLE)
+ self.connect('thg-close', self.delete_event)
+
# log viewer
self.log = CmdLogWidget()
self.add(self.log)
@@ -638,7 +649,7 @@
### signal handlers ###
- def delete_event(self, widget, event):
+ def delete_event(self, *args):
if hasattr(self, 'close_hook'):
if self.close_hook(self):
self.hide()
|
@@ -19,16 +19,15 @@ """ Dialog to initialize a Mercurial repo """
def __init__(self, repos=[]):
""" Initialize the Dialog """
- gtk.Dialog.__init__(self, title=_('Create a new repository'))
+ gtk.Dialog.__init__(self, title=_('TortoiseHg Init'))
gtklib.set_tortoise_icon(self, 'menucreaterepos.ico')
gtklib.set_tortoise_keys(self)
self.set_resizable(False)
self.set_has_separator(False)
+ self.connect('response', self.dialog_response)
# add buttons
- createbutton = gtk.Button(_('Create'))
- createbutton.connect('clicked', lambda b: self.init())
- self.action_area.pack_end(createbutton)
+ self.add_button(_('Create'), gtk.RESPONSE_OK)
self.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE)
self.cwd = os.getcwd()
@@ -70,8 +69,20 @@ except:
pass
+ def dialog_response(self, dialog, response_id):
+ # Create button
+ if response_id == gtk.RESPONSE_OK:
+ self.init()
+ # Cancel button or dialog closing by the user
+ elif response_id in (gtk.RESPONSE_CLOSE, gtk.RESPONSE_DELETE_EVENT):
+ return # close dialog
+ else:
+ raise _('unexpected response id: %s') % response_id
+
+ self.run() # don't close dialog
+
def dest_clicked(self, button):
- """ select destination folder to clone """
+ """ select destination folder to init """
response = gtklib.NativeFolderSelectDialog(
initial=self.cwd,
title=_('Select Destination Folder')).run()
@@ -84,7 +95,7 @@ dest = hglib.fromutf(self.destentry.get_text())
# verify input
- if dest == "":
+ if dest == '':
dialog.error_dialog(self, _('Destination path is empty'),
_('Please enter the directory path'))
self.destentry.grab_focus()
@@ -129,7 +140,7 @@ dialog.info_dialog(self, _('New repository created'),
_('in directory %s') % hglib.toutf(os.path.abspath(dest)))
- self.response(gtk.RESPONSE_OK)
+ self.response(gtk.RESPONSE_CLOSE)
def run(ui, *pats, **opts):
return InitDialog(pats)
|
@@ -778,7 +778,7 @@
def mq_context_menu(self):
m = gtklib.MenuItems()
- cmenu_qimport = create_menu(_('qimport'), self.qimport_rev)
+ cmenu_qimport = create_menu(_('QImport Revision'), self.qimport_rev)
cmenu_strip = create_menu(_('Strip Revision...'), self.strip_rev)
try:
|
@@ -88,12 +88,9 @@
# revision input
revbox = gtk.HBox()
- lbl = gtk.Label(_('HTTP Port:'))
- lbl.set_property('width-chars', 16)
- lbl.set_alignment(0, 0.5)
self._port_input = gtk.Entry()
self._port_input.set_text(self.defport)
- revbox.pack_start(lbl, False, False)
+ revbox.pack_start(gtk.Label(_('HTTP Port:')), False, False, 4)
revbox.pack_start(self._port_input, False, False)
vbox.pack_start(revbox, False, False, 2)
|
@@ -19,12 +19,14 @@
keep = i18n.keepgettext()
+RESPONSE_ADD = 1
+RESPONSE_REMOVE = 2
+
class TagAddDialog(gtk.Dialog):
""" Dialog to add tag to Mercurial repo """
def __init__(self, repo, tag='', rev=''):
""" Initialize the Dialog """
- gtk.Dialog.__init__(self,
- buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
+ gtk.Dialog.__init__(self)
gtklib.set_tortoise_keys(self)
self.set_title(_('Tag - %s') % hglib.get_reponame(repo))
self.set_resizable(False)
@@ -33,15 +35,10 @@
self.repo = repo
- # add Add button
- addbutton = gtk.Button(_('Add'))
- addbutton.connect('clicked', lambda b: self._do_add_tag())
- self.action_area.pack_end(addbutton)
-
- # add Remove button
- removebutton = gtk.Button(_('Remove'))
- removebutton.connect('clicked', lambda b: self._do_rm_tag())
- self.action_area.pack_end(removebutton)
+ # add buttons
+ self.add_button(_('Add'), RESPONSE_ADD)
+ self.add_button(_('Remove'), RESPONSE_REMOVE)
+ self.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE)
# persistent settings
self.settings = settings.Settings('tagadd')
@@ -54,7 +51,8 @@ self._tagslist = gtk.ListStore(str)
self._taglistbox = gtk.ComboBoxEntry(self._tagslist, 0)
self._tag_input = self._taglistbox.get_child()
- self._tag_input.connect('activate', self._taginput_activated)
+ self._tag_input.connect('activate',
+ lambda *a: self.response(RESPONSE_ADD))
self._tag_input.set_text(tag)
table.add_row(_('Tag:'), self._taglistbox, padding=False)
@@ -138,13 +136,21 @@ self._commit_message.grab_focus()
def dialog_response(self, dialog, response_id):
- self.store_settings()
- if response_id == gtk.RESPONSE_CLOSE \
- or response_id == gtk.RESPONSE_DELETE_EVENT:
+ # Add button
+ if response_id == RESPONSE_ADD:
+ self._do_add_tag()
+ # Remove button
+ elif response_id == RESPONSE_REMOVE:
+ self._do_remove_tag()
+ # Close button or closed by the user
+ elif response_id in (gtk.RESPONSE_CLOSE, gtk.RESPONSE_DELETE_EVENT):
+ self.store_settings()
self.destroy()
+ return # close dialog
+ else:
+ raise _('unexpected response id: %s') % response_id
- def _taginput_activated(self, taginput):
- self._do_add_tag()
+ self.run() # don't close dialog
def _do_add_tag(self):
# gather input data
@@ -183,7 +189,7 @@ traceback.format_exc())
return False
- def _do_rm_tag(self):
+ def _do_remove_tag(self):
# gather input data
is_local = self._local_tag.get_active()
name = self._tag_input.get_text()
@@ -203,7 +209,7 @@ message = ''
try:
- self._rm_hg_tag(name, message, is_local, english=eng_msg)
+ self._remove_hg_tag(name, message, is_local, english=eng_msg)
dialog.info_dialog(self, _('Tagging completed'),
_('Tag "%s" has been removed') % name)
self._refresh()
@@ -233,7 +239,7 @@
self.repo.tag(name, r, hglib.fromutf(message), local, user, date)
- def _rm_hg_tag(self, name, message, local, user=None, date=None,
+ def _remove_hg_tag(self, name, message, local, user=None, date=None,
english=False):
if not name in self.repo.tags():
raise util.Abort(_("Tag '%s' does not exist") % name)
|
@@ -29,10 +29,12 @@ self.set_title(_('TortoiseHg Taskbar'))
about = gtk.Button(_('About'))
+ okay = gtk.Button(_('OK'))
+ cancel = gtk.Button(_('Cancel'))
self.apply = gtk.Button(_('Apply'))
- close = gtk.Button(_('Close'))
vbox = gtk.VBox()
+ vbox.set_border_width(5)
self.add(vbox)
# Create a new notebook, place the position of the tabs
@@ -170,12 +172,16 @@ accelgroup = gtk.AccelGroup()
self.add_accel_group(accelgroup)
+ # Padding
+ vbox.pack_start(gtk.HBox(), False, False, 3)
+
# Bottom buttons
bbox = gtk.HBox()
- vbox.pack_start(bbox, False, False, 2)
+ vbox.pack_start(bbox, False, False)
lefthbbox = gtk.HButtonBox()
lefthbbox.set_layout(gtk.BUTTONBOX_START)
+ lefthbbox.set_spacing(6)
bbox.pack_start(lefthbbox, False, False)
about.connect('clicked', self.about)
@@ -185,18 +191,25 @@
righthbbox = gtk.HButtonBox()
righthbbox.set_layout(gtk.BUTTONBOX_END)
+ righthbbox.set_spacing(6)
bbox.pack_start(righthbbox, False, False)
+ okay.connect('clicked', self.okay_clicked)
+ key, modifier = gtk.accelerator_parse('Return')
+ okay.add_accelerator('clicked', accelgroup, key, 0,
+ gtk.ACCEL_VISIBLE)
+ righthbbox.pack_start(okay, False, False)
+
+ cancel.connect('clicked', lambda x: self.destroy())
+ key, modifier = gtk.accelerator_parse('Escape')
+ cancel.add_accelerator('clicked', accelgroup, key, 0,
+ gtk.ACCEL_VISIBLE)
+ righthbbox.pack_start(cancel, False, False)
+
self.apply.connect('clicked', self.apply_clicked)
self.apply.set_sensitive(False)
righthbbox.pack_start(self.apply, False, False)
- close.connect('clicked', lambda x: self.destroy())
- key, modifier = gtk.accelerator_parse('Escape')
- close.add_accelerator('clicked', accelgroup, key, 0,
- gtk.ACCEL_VISIBLE)
- righthbbox.pack_start(close, False, False)
-
def add_page(self, notebook, tab):
frame = gtk.Frame()
frame.set_border_width(5)
@@ -305,6 +318,10 @@ def top_clicked(self, button):
self.move_to_other(self.submlist)
+ def okay_clicked(self, button):
+ self.store_shell_configs()
+ self.destroy()
+
def apply_clicked(self, button):
self.store_shell_configs()
button.set_sensitive(False)
|
@@ -523,6 +523,7 @@ gtk.STOCK_APPLY, gtk.RESPONSE_APPLY))
gtklib.set_tortoise_keys(self)
self._btn_apply = self.action_area.get_children()[0]
+ self.set_has_separator(False)
self.ui = ui.ui()
try:
|
Change 1 of 16
Show Entire File
win32/shellext/CShellExtCMenu.cpp
Stacked
renamed from win32/shellext/ContextMenu.cpp
|
||
---|---|---|
|
|
@@ -1,11 +1,14 @@ #include "stdafx.h"
-#include "ShellExt.h"
#include "TortoiseUtils.h"
#include "StringUtils.h"
#include "Dirstatecache.h"
#include "Thgstatus.h"
#include "Winstat.h"
#include "InitStatus.h"
+#include "ShellExt.h"
+
+#include "CShellExtCMenu.h"
+
#include <map>
@@ -301,10 +304,10 @@
// IContextMenu
STDMETHODIMP
-CShellExt::QueryContextMenu(
+CShellExtCMenu::QueryContextMenu(
HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
{
- TDEBUG_TRACE("CShellExt::QueryContextMenu");
+ TDEBUG_TRACE("CShellExtCMenu::QueryContextMenu");
InitMenuMaps();
UINT idCmd = idCmdFirst;
@@ -444,7 +447,7 @@ RemoveMenu(hSubMenu, indexSubMenu - 1, MF_BYPOSITION);
}
- TDEBUG_TRACE(" CShellExt::QueryContextMenu: adding main THG menu");
+ TDEBUG_TRACE(" CShellExtCMenu::QueryContextMenu: adding main THG menu");
InsertSubMenuItemWithIcon2(hMenu, hSubMenu, indexMenu++, idCmd++,
L"TortoiseHG", "hg.ico");
@@ -456,15 +459,15 @@
STDMETHODIMP
-CShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
+CShellExtCMenu::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
{
- TDEBUG_TRACE("CShellExt::InvokeCommand");
+ TDEBUG_TRACE("CShellExtCMenu::InvokeCommand");
HRESULT hr = E_INVALIDARG;
if (!HIWORD(lpcmi->lpVerb))
{
UINT idCmd = LOWORD(lpcmi->lpVerb);
- TDEBUG_TRACE("CShellExt::InvokeCommand: idCmd = " << idCmd);
+ TDEBUG_TRACE("CShellExtCMenu::InvokeCommand: idCmd = " << idCmd);
MenuIdCmdMap::iterator iter = MenuIdMap.find(idCmd);
if (iter != MenuIdMap.end())
{
@@ -474,7 +477,7 @@ else
{
TDEBUG_TRACE(
- "CShellExt::InvokeCommand: action not found for idCmd "
+ "CShellExtCMenu::InvokeCommand: action not found for idCmd "
<< idCmd
);
}
@@ -484,7 +487,7 @@
STDMETHODIMP
-CShellExt::GetCommandString(
+CShellExtCMenu::GetCommandString(
UINT_PTR idCmd, UINT uFlags, UINT FAR *reserved,
LPSTR pszName, UINT cchMax)
{
@@ -513,7 +516,7 @@ }
TDEBUG_TRACE(
- "CShellExt::GetCommandString: idCmd = " << idCmd
+ "CShellExtCMenu::GetCommandString: idCmd = " << idCmd
<< ", uFlags = " << uFlags << " (" << sflags << ")"
<< ", cchMax = " << cchMax
);
@@ -521,12 +524,12 @@ MenuIdCmdMap::iterator iter = MenuIdMap.find(static_cast<UINT>(idCmd));
if (iter == MenuIdMap.end())
{
- TDEBUG_TRACE("CShellExt::GetCommandString: idCmd not found");
+ TDEBUG_TRACE("CShellExtCMenu::GetCommandString: idCmd not found");
}
else
{
TDEBUG_TRACE(
- "CShellExt::GetCommandString: name = \"" << iter->second.name << "\"");
+ "CShellExtCMenu::GetCommandString: name = \"" << iter->second.name << "\"");
if (uFlags == GCS_HELPTEXTW)
{
@@ -537,7 +540,7 @@ if (size >= 40)
{
TDEBUG_TRACE(
- "CShellExt::GetCommandString: warning:"
+ "CShellExtCMenu::GetCommandString: warning:"
<< " length of help text is " << size
<< ", which is not reasonably short (<40)");
}
@@ -566,7 +569,7 @@
if (cchMax < 1)
{
- TDEBUG_TRACE("CShellExt::GetCommandString: cchMax = "
+ TDEBUG_TRACE("CShellExtCMenu::GetCommandString: cchMax = "
<< cchMax << " (is <1)");
return res;
}
@@ -583,7 +586,7 @@
size = wcslen(src);
- TDEBUG_TRACEW(L"CShellExt::GetCommandString: res = " << int(res)
+ TDEBUG_TRACEW(L"CShellExtCMenu::GetCommandString: res = " << int(res)
<< L", pszName (wide) = \"" << dest << L"\"");
}
else
@@ -593,14 +596,14 @@
size = strlen(psz);
- TDEBUG_TRACE("CShellExt::GetCommandString: res = " << int(res)
+ TDEBUG_TRACE("CShellExtCMenu::GetCommandString: res = " << int(res)
<< ", pszName = \"" << psz << "\"");
}
if (size > cchMax-1)
{
TDEBUG_TRACE(
- "CShellExt::GetCommandString: string was truncated: size = "
+ "CShellExtCMenu::GetCommandString: string was truncated: size = "
<< size << ", cchMax = " << cchMax);
}
@@ -609,7 +612,7 @@
STDMETHODIMP
-CShellExt::HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam)
+CShellExtCMenu::HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT res;
return HandleMenuMsg2(uMsg, wParam, lParam, &res);
@@ -617,7 +620,7 @@
STDMETHODIMP
-CShellExt::HandleMenuMsg2(
+CShellExtCMenu::HandleMenuMsg2(
UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
// A great tutorial on owner drawn menus in shell extension can be found
@@ -667,7 +670,7 @@}
-void CShellExt::DoHgtk(const std::string &cmd)
+void CShellExtCMenu::DoHgtk(const std::string &cmd)
{
std::string dir = GetTHgProgRoot();
if (dir.empty())
@@ -748,3 +751,126 @@ LaunchCommand(hgcmd, cwd);
InitStatus::check();
}
+
+
+STDMETHODIMP CShellExtCMenu::Initialize(
+ LPCITEMIDLIST pIDFolder, LPDATAOBJECT pDataObj, HKEY hRegKey)
+{
+ TCHAR name[MAX_PATH+1];
+
+ TDEBUG_TRACE("CShellExtCMenu::Initialize");
+ TDEBUG_TRACE(" pIDFolder: " << pIDFolder);
+ TDEBUG_TRACE(" pDataObj: " << pDataObj);
+
+ myFolder.clear();
+ myFiles.clear();
+
+ if (pDataObj)
+ {
+ FORMATETC fmt = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
+ STGMEDIUM stg = { TYMED_HGLOBAL };
+ if (SUCCEEDED(pDataObj->GetData(&fmt, &stg)) && stg.hGlobal)
+ {
+ HDROP hDrop = (HDROP) GlobalLock(stg.hGlobal);
+
+ if (hDrop)
+ {
+ UINT uNumFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
+ TDEBUG_TRACE(" hDrop uNumFiles = " << uNumFiles);
+ for (UINT i = 0; i < uNumFiles; ++i) {
+ if (DragQueryFile(hDrop, i, name, MAX_PATH) > 0)
+ {
+ TDEBUG_TRACE(" DragQueryFile [" << i << "] = " << name);
+ myFiles.push_back(name);
+ }
+ }
+ }
+ else
+ {
+ TDEBUG_TRACE(" hDrop is NULL ");
+ }
+
+ GlobalUnlock(stg.hGlobal);
+ if (stg.pUnkForRelease)
+ {
+ IUnknown* relInterface = (IUnknown*) stg.pUnkForRelease;
+ relInterface->Release();
+ }
+ }
+ else
+ {
+ TDEBUG_TRACE(" pDataObj->GetData failed");
+ }
+ }
+
+ // if a directory background
+ if (pIDFolder)
+ {
+ SHGetPathFromIDList(pIDFolder, name);
+ TDEBUG_TRACE(" Folder " << name);
+ myFolder = name;
+ }
+
+ return NOERROR;
+}
+
+
+CShellExtCMenu::CShellExtCMenu(char dummy) :
+ m_ppszFileUserClickedOn(0)
+{
+ m_cRef = 0L;
+ CShellExt::IncDllRef();
+}
+
+
+CShellExtCMenu::~CShellExtCMenu()
+{
+ CShellExt::DecDllRef();
+}
+
+
+STDMETHODIMP_(ULONG) CShellExtCMenu::AddRef()
+{
+ ThgCriticalSection cs(CShellExt::GetCriticalSection());
+ return ++m_cRef;
+}
+
+
+STDMETHODIMP_(ULONG) CShellExtCMenu::Release()
+{
+ ThgCriticalSection cs(CShellExt::GetCriticalSection());
+ if(--m_cRef)
+ return m_cRef;
+ delete this;
+ return 0L;
+}
+
+
+STDMETHODIMP CShellExtCMenu::QueryInterface(REFIID riid, LPVOID FAR* ppv)
+{
+ *ppv = NULL;
+ if (IsEqualIID(riid, IID_IShellExtInit) || IsEqualIID(riid, IID_IUnknown))
+ {
+ *ppv = (LPSHELLEXTINIT) this;
+ }
+ else if (IsEqualIID(riid, IID_IContextMenu))
+ {
+ *ppv = (LPCONTEXTMENU) this;
+ }
+ else if (IsEqualIID(riid, IID_IContextMenu2))
+ {
+ *ppv = (IContextMenu2*) this;
+ }
+ else if (IsEqualIID(riid, IID_IContextMenu3))
+ {
+ *ppv = (IContextMenu3*) this;
+ }
+
+ if (*ppv)
+ {
+ AddRef();
+ return NOERROR;
+ }
+
+ return E_NOINTERFACE;
+}
|
|
@@ -0,0 +1,45 @@ + #ifndef _CShellExtCMenu_h_
+#define _CShellExtCMenu_h_
+
+#include <vector>
+#include <string>
+
+
+class CShellExtCMenu: public IContextMenu3, IShellExtInit
+{
+ ULONG m_cRef;
+
+ LPTSTR* m_ppszFileUserClickedOn; // [MAX_PATH]
+ std::vector<std::string> myFiles;
+ std::string myFolder;
+
+ void DoHgtk(const std::string&);
+
+public:
+ explicit CShellExtCMenu(char dummy);
+ ~CShellExtCMenu();
+
+ // IUnknown
+ STDMETHODIMP QueryInterface(REFIID riid, LPVOID FAR *ppv);
+ STDMETHODIMP_(ULONG) AddRef();
+ STDMETHODIMP_(ULONG) Release();
+
+ // IContextMenu3
+ STDMETHODIMP QueryContextMenu(
+ HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast,
+ UINT uFlags);
+ STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi);
+ STDMETHODIMP GetCommandString(
+ UINT_PTR idCmd, UINT uFlags, UINT FAR* reserved,LPSTR pszName,
+ UINT cchMax);
+ STDMETHODIMP HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam);
+ STDMETHODIMP HandleMenuMsg2(
+ UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* pResult);
+
+ // IShellExtInit
+ STDMETHODIMP Initialize(
+ LPCITEMIDLIST pIDFolder, LPDATAOBJECT pDataObj, HKEY hKeyID);
+};
+
+
+#endif
|
Change 1 of 3
Show Entire File
win32/shellext/CShellExtOverlay.cpp
Stacked
renamed from win32/shellext/IconOverlay.cpp
|
||
---|---|---|
@@ -3,14 +3,15 @@ #include "TortoiseUtils.h"
#include "StringUtils.h"
#include "QueryDirstate.h"
+#include "CShellExtOverlay.h"
#include <shlwapi.h>
-STDMETHODIMP CShellExt::GetOverlayInfo(
+STDMETHODIMP CShellExtOverlay::GetOverlayInfo(
LPWSTR pwszIconFile, int cchMax, int *pIndex, DWORD *pdwFlags)
{
- TDEBUG_TRACE("CShellExt::GetOverlayInfo: myTortoiseClass = " << myTortoiseClass);
+ TDEBUG_TRACE("CShellExtOverlay::GetOverlayInfo: myTortoiseClass = " << myTortoiseClass);
// icons are determined by TortoiseOverlays shim
*pIndex = 0;
*pdwFlags = 0;
@@ -19,16 +20,16 @@}
-STDMETHODIMP CShellExt::GetPriority(int *pPriority)
+STDMETHODIMP CShellExtOverlay::GetPriority(int *pPriority)
{
*pPriority = 1;
return S_OK;
}
-STDMETHODIMP CShellExt::IsMemberOf(LPCWSTR pwszPath, DWORD /* dwAttrib */)
+STDMETHODIMP CShellExtOverlay::IsMemberOf(LPCWSTR pwszPath, DWORD /* dwAttrib */)
{
- ThgCriticalSection cs(GetCriticalSection());
+ ThgCriticalSection cs(CShellExt::GetCriticalSection());
std::string cval;
if (GetRegistryConfig("EnableOverlays", cval) != 0 && cval == "0")
@@ -53,3 +54,53 @@
return S_FALSE;
}
+
+
+CShellExtOverlay::CShellExtOverlay(char tortoiseClass) :
+ myTortoiseClass(tortoiseClass)
+{
+ m_cRef = 0L;
+ CShellExt::IncDllRef();
+}
+
+
+CShellExtOverlay::~CShellExtOverlay()
+{
+ CShellExt::DecDllRef();
+}
+
+
+STDMETHODIMP_(ULONG) CShellExtOverlay::AddRef()
+{
+ ThgCriticalSection cs(CShellExt::GetCriticalSection());
+ return ++m_cRef;
+}
+
+
+STDMETHODIMP_(ULONG) CShellExtOverlay::Release()
+{
+ ThgCriticalSection cs(CShellExt::GetCriticalSection());
+ if(--m_cRef)
+ return m_cRef;
+ delete this;
+ return 0L;
+}
+
+
+STDMETHODIMP CShellExtOverlay::QueryInterface(REFIID riid, LPVOID FAR* ppv)
+{
+ *ppv = NULL;
+ if (IsEqualIID(riid, IID_IShellIconOverlayIdentifier)
+ || IsEqualIID(riid, IID_IUnknown) )
+ {
+ *ppv = (IShellIconOverlayIdentifier*) this;
+ }
+
+ if (*ppv)
+ {
+ AddRef();
+ return NOERROR;
+ }
+
+ return E_NOINTERFACE;
+}
|
|
@@ -0,0 +1,27 @@ + #ifndef _CShellExtOverlay_h_
+#define _CShellExtOverlay_h_
+
+
+class CShellExtOverlay: public IShellIconOverlayIdentifier
+{
+ ULONG m_cRef;
+ const char myTortoiseClass;
+
+public:
+ explicit CShellExtOverlay(char Class);
+ ~CShellExtOverlay();
+
+ // IUnknown
+ STDMETHODIMP QueryInterface(REFIID riid, LPVOID FAR *ppv);
+ STDMETHODIMP_(ULONG) AddRef();
+ STDMETHODIMP_(ULONG) Release();
+
+ // IShellIconOverlayIdentifier
+ STDMETHODIMP GetOverlayInfo(
+ LPWSTR pwszIconFile, int cchMax, int* pIndex, DWORD* pdwFlags);
+ STDMETHODIMP GetPriority(int* pPriority);
+ STDMETHODIMP IsMemberOf(LPCWSTR pwszPath, DWORD dwAttrib);
+};
+
+
+#endif
|
@@ -7,8 +7,8 @@
OBJECTS_THGSGELL = $(OBJECTS_DIRSTATE) \
InitStatus.obj \
- ContextMenu.obj \
- IconOverlay.obj \
+ CShellExtCMenu.obj \
+ CShellExtOverlay.obj \
ShellExt.obj \
StringUtils.obj \
dirstate.obj \
@@ -16,8 +16,7 @@ Dirstatecache.obj \
DirectoryStatus.obj \
Thgstatus.obj \
- QueryDirstate.obj \
- ThgDebug.obj
+ QueryDirstate.obj
LIBS = User32.lib Ole32.lib Shlwapi.lib Shell32.lib Advapi32.lib
DEFFILE = ShellExt.def
|
|
@@ -3,11 +3,17 @@ #include "TortoiseUtils.h"
#include "StringUtils.h"
#include "InitStatus.h"
+#include "ThgClassFactory.h"
+#include "CShellExtCMenu.h"
+#include "CShellExtOverlay.h"
+
#include <olectl.h>
#define INITGUID
#include <initguid.h>
+DEFINE_GUID(CLSID_TortoiseHgCmenu, 0xb456db9fL, 0x7bf4, 0x478c, 0x93, 0x7a, 0x5, 0x13, 0xc, 0x2c, 0x21, 0x2e);
+
DEFINE_GUID(CLSID_TortoiseHg0, 0xb456dba0L, 0x7bf4, 0x478c, 0x93, 0x7a, 0x5, 0x13, 0xc, 0x2c, 0x21, 0x2e);
DEFINE_GUID(CLSID_TortoiseHg1, 0xb456dba1L, 0x7bf4, 0x478c, 0x93, 0x7a, 0x5, 0x13, 0xc, 0x2c, 0x21, 0x2e);
DEFINE_GUID(CLSID_TortoiseHg2, 0xb456dba2L, 0x7bf4, 0x478c, 0x93, 0x7a, 0x5, 0x13, 0xc, 0x2c, 0x21, 0x2e);
@@ -19,8 +25,6 @@UINT g_cRefThisDll = 0;
HINSTANCE g_hmodThisDll = NULL;
-HMENU hSubMenu = 0;
-
CRITICAL_SECTION g_critical_section;
@@ -75,34 +79,39 @@ TDEBUG_TRACE("DllGetClassObject clsid = " << WideToMultibyte(pwszShellExt));
*ppvOut = NULL;
- if (IsEqualIID(rclsid, CLSID_TortoiseHg0))
+ typedef ThgClassFactory<CShellExtOverlay> FactOvl;
+ typedef ThgClassFactory<CShellExtCMenu> FactCmenu;
+
+ if (IsEqualIID(rclsid, CLSID_TortoiseHgCmenu))
{
- CDllRegSxClassFactory *pcf =
- new CDllRegSxClassFactory('C'); // clean
+ FactCmenu *pcf = new FactCmenu(0);
+ TDEBUG_TRACE("DllGetClassObject clsname = " << "CLSID_TortoiseHgCmenu");
+ return pcf->QueryInterface(riid, ppvOut);
+ }
+ else if (IsEqualIID(rclsid, CLSID_TortoiseHg0))
+ {
+ FactOvl *pcf = new FactOvl('C'); // clean
TDEBUG_TRACE("DllGetClassObject clsname = " << "CLSID_TortoiseHg0");
++InitStatus::inst().unchanged_;
return pcf->QueryInterface(riid, ppvOut);
}
else if (IsEqualIID(rclsid, CLSID_TortoiseHg1))
{
- CDllRegSxClassFactory *pcf =
- new CDllRegSxClassFactory('A'); // added
+ FactOvl *pcf = new FactOvl('A'); // added
TDEBUG_TRACE("DllGetClassObject clsname = " << "CLSID_TortoiseHg1");
++InitStatus::inst().added_;
return pcf->QueryInterface(riid, ppvOut);
}
else if (IsEqualIID(rclsid, CLSID_TortoiseHg2))
{
- CDllRegSxClassFactory *pcf =
- new CDllRegSxClassFactory('M'); // modified
+ FactOvl *pcf = new FactOvl('M'); // modified
TDEBUG_TRACE("DllGetClassObject clsname = " << "CLSID_TortoiseHg2");
++InitStatus::inst().modified_;
return pcf->QueryInterface(riid, ppvOut);
}
else if (IsEqualIID(rclsid, CLSID_TortoiseHg6))
{
- CDllRegSxClassFactory *pcf =
- new CDllRegSxClassFactory('?'); // not in repo
+ FactOvl *pcf = new FactOvl('?'); // not in repo
TDEBUG_TRACE("DllGetClassObject clsname = " << "CLSID_TortoiseHg6");
++InitStatus::inst().notinrepo_;
return pcf->QueryInterface(riid, ppvOut);
@@ -119,110 +128,6 @@
VOID _UnloadResources(VOID)
{
- if (hSubMenu)
- DestroyMenu(hSubMenu);
-}
-
-
-LPCRITICAL_SECTION CDllRegSxClassFactory::GetCriticalSection()
-{
- return &g_critical_section;
-}
-
-
-CDllRegSxClassFactory::CDllRegSxClassFactory(char classToMake) :
- myclassToMake(classToMake)
-{
- ThgCriticalSection cs(GetCriticalSection());
- m_cRef = 0L;
- g_cRefThisDll++;
-}
-
-
-CDllRegSxClassFactory::~CDllRegSxClassFactory()
-{
- ThgCriticalSection cs(GetCriticalSection());
- g_cRefThisDll--;
-}
-
-
-STDMETHODIMP CDllRegSxClassFactory::QueryInterface(
- REFIID riid, LPVOID FAR* ppv)
-{
- *ppv = NULL;
-
- if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory))
- {
- *ppv = (LPCLASSFACTORY) this;
- AddRef();
- return NOERROR;
- }
-
- return E_NOINTERFACE;
-}
-
-
-STDMETHODIMP_(ULONG) CDllRegSxClassFactory::AddRef()
-{
- ThgCriticalSection cs(GetCriticalSection());
- return ++m_cRef;
-}
-
-
-STDMETHODIMP_(ULONG) CDllRegSxClassFactory::Release()
-{
- ThgCriticalSection cs(GetCriticalSection());
- if (--m_cRef)
- return m_cRef;
-
- delete this;
- return 0L;
-}
-
-
-STDMETHODIMP CDllRegSxClassFactory::CreateInstance(
- LPUNKNOWN pUnkOuter, REFIID riid, LPVOID* ppvObj)
-{
- *ppvObj = NULL;
-
- if (pUnkOuter)
- return CLASS_E_NOAGGREGATION;
-
- LPCSHELLEXT pShellExt = new CShellExt(myclassToMake);
- if (NULL == pShellExt)
- return E_OUTOFMEMORY;
-
- return pShellExt->QueryInterface(riid, ppvObj);
-}
-
-
-STDMETHODIMP CDllRegSxClassFactory::LockServer(BOOL fLock)
-{
- return NOERROR;
-}
-
-
-CShellExt::CShellExt(char tortoiseClass) :
- myTortoiseClass(tortoiseClass),
- m_ppszFileUserClickedOn(0)
-{
- ThgCriticalSection cs(GetCriticalSection());
-
- m_cRef = 0L;
- m_pDataObj = NULL;
-
- g_cRefThisDll++;
-}
-
-
-CShellExt::~CShellExt()
-{
- ThgCriticalSection cs(GetCriticalSection());
-
- if (m_pDataObj)
- m_pDataObj->Release();
-
- g_cRefThisDll--;
}
@@ -232,116 +137,15 @@}
-STDMETHODIMP CShellExt::QueryInterface(REFIID riid, LPVOID FAR* ppv)
-{
- *ppv = NULL;
- if (IsEqualIID(riid, IID_IShellExtInit) || IsEqualIID(riid, IID_IUnknown))
- {
- *ppv = (LPSHELLEXTINIT) this;
- }
- else if (IsEqualIID(riid, IID_IContextMenu))
- {
- *ppv = (LPCONTEXTMENU) this;
- }
- else if (IsEqualIID(riid, IID_IContextMenu2))
- {
- *ppv = (IContextMenu2*) this;
- }
- else if (IsEqualIID(riid, IID_IContextMenu3))
- {
- *ppv = (IContextMenu3*) this;
- }
- else if (IsEqualIID(riid, IID_IShellIconOverlayIdentifier))
- {
- *ppv = (IShellIconOverlayIdentifier*) this;
- }
-
- if (*ppv)
- {
- AddRef();
- return NOERROR;
- }
-
- return E_NOINTERFACE;
+void CShellExt::IncDllRef()
+{
+ ThgCriticalSection cs(CShellExt::GetCriticalSection());
+ g_cRefThisDll++;
}
-STDMETHODIMP_(ULONG) CShellExt::AddRef()
+void CShellExt::DecDllRef()
{
- ThgCriticalSection cs(GetCriticalSection());
- return ++m_cRef;
+ ThgCriticalSection cs(CShellExt::GetCriticalSection());
+ g_cRefThisDll--;
}
-
-
-STDMETHODIMP_(ULONG) CShellExt::Release()
-{
- ThgCriticalSection cs(GetCriticalSection());
-
- if(--m_cRef)
- return m_cRef;
-
- delete this;
- return 0L;
-}
-
-
-STDMETHODIMP CShellExt::Initialize(
- LPCITEMIDLIST pIDFolder, LPDATAOBJECT pDataObj, HKEY hRegKey)
-{
- TCHAR name[MAX_PATH+1];
-
- TDEBUG_TRACE("CShellExt::Initialize");
- TDEBUG_TRACE(" pIDFolder: " << pIDFolder);
- TDEBUG_TRACE(" pDataObj: " << pDataObj);
-
- myFolder.clear();
- myFiles.clear();
-
- if (pDataObj)
- {
- FORMATETC fmt = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
- STGMEDIUM stg = { TYMED_HGLOBAL };
- if (SUCCEEDED(pDataObj->GetData(&fmt, &stg)) && stg.hGlobal)
- {
- HDROP hDrop = (HDROP) GlobalLock(stg.hGlobal);
-
- if (hDrop)
- {
- UINT uNumFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
- TDEBUG_TRACE(" hDrop uNumFiles = " << uNumFiles);
- for (UINT i = 0; i < uNumFiles; ++i) {
- if (DragQueryFile(hDrop, i, name, MAX_PATH) > 0)
- {
- TDEBUG_TRACE(" DragQueryFile [" << i << "] = " << name);
- myFiles.push_back(name);
- }
- }
- }
- else
- {
- TDEBUG_TRACE(" hDrop is NULL ");
- }
-
- GlobalUnlock(stg.hGlobal);
- if (stg.pUnkForRelease)
- {
- IUnknown* relInterface = (IUnknown*) stg.pUnkForRelease;
- relInterface->Release();
- }
- }
- else
- {
- TDEBUG_TRACE(" pDataObj->GetData failed");
- }
- }
-
- // if a directory background
- if (pIDFolder)
- {
- SHGetPathFromIDList(pIDFolder, name);
- TDEBUG_TRACE(" Folder " << name);
- myFolder = name;
- }
-
- return NOERROR;
-}
|
@@ -1,84 +1,15 @@ #ifndef _SHELL_EXT_H_
#define _SHELL_EXT_H_
-#include <vector>
-#include <string>
-
-class CDllRegSxClassFactory: public IClassFactory
+class CShellExt
{
- protected:
- ULONG m_cRef;
- const char myclassToMake;
-
- public:
- explicit CDllRegSxClassFactory(char classToMake);
- ~CDllRegSxClassFactory();
-
- static LPCRITICAL_SECTION GetCriticalSection();
-
- STDMETHODIMP QueryInterface(REFIID, LPVOID FAR*);
- STDMETHODIMP_(ULONG) AddRef();
- STDMETHODIMP_(ULONG) Release();
-
- STDMETHODIMP CreateInstance(LPUNKNOWN, REFIID, LPVOID FAR*);
- STDMETHODIMP LockServer(BOOL);
+public:
+ static LPCRITICAL_SECTION GetCriticalSection();
+ static void IncDllRef();
+ static void DecDllRef();
};
-typedef CDllRegSxClassFactory* LPCSHELLEXTCLASSFACTORY;
-
-
-class CShellExt:
- public IContextMenu3, IShellIconOverlayIdentifier, IShellExtInit
-{
- const char myTortoiseClass;
-
- protected:
- ULONG m_cRef;
- LPDATAOBJECT m_pDataObj;
-
- LPTSTR* m_ppszFileUserClickedOn; // [MAX_PATH]
- std::vector<std::string> myFiles;
- std::string myFolder;
-
- void CShellExt::DoHgtk(const std::string&);
-
- public:
- static LPCRITICAL_SECTION GetCriticalSection();
-
- explicit CShellExt(char Class);
- ~CShellExt();
-
- // IUnknown
- STDMETHODIMP QueryInterface(REFIID riid, LPVOID FAR *ppv);
- STDMETHODIMP_(ULONG) AddRef();
- STDMETHODIMP_(ULONG) Release();
-
- // IContextMenu3
- STDMETHODIMP QueryContextMenu(
- HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast,
- UINT uFlags);
- STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi);
- STDMETHODIMP GetCommandString(
- UINT_PTR idCmd, UINT uFlags, UINT FAR* reserved,LPSTR pszName,
- UINT cchMax);
- STDMETHODIMP HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam);
- STDMETHODIMP HandleMenuMsg2(
- UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* pResult);
-
- // IShellIconOverlayIdentifier
- STDMETHODIMP GetOverlayInfo(
- LPWSTR pwszIconFile, int cchMax, int* pIndex, DWORD* pdwFlags);
- STDMETHODIMP GetPriority(int* pPriority);
- STDMETHODIMP IsMemberOf(LPCWSTR pwszPath, DWORD dwAttrib);
-
- // IShellExtInit
- STDMETHODIMP Initialize(
- LPCITEMIDLIST pIDFolder, LPDATAOBJECT pDataObj, HKEY hKeyID);
- };
-
-typedef CShellExt* LPCSHELLEXT;
-
class ThgCriticalSection
{
|
|
@@ -0,0 +1,86 @@ + #ifndef _ThgClassFactory_h_
+#define _ThgClassFactory_h_
+
+#include "ShellExt.h"
+
+
+template <class T>
+class ThgClassFactory: public IClassFactory
+{
+ ULONG m_cRef;
+ const char myclassToMake;
+
+public:
+ explicit ThgClassFactory(char classToMake) :
+ myclassToMake(classToMake)
+ {
+ CShellExt::IncDllRef();
+ m_cRef = 0L;
+ }
+
+
+ ~ThgClassFactory()
+ {
+ CShellExt::DecDllRef();
+ }
+
+
+ STDMETHODIMP QueryInterface(
+ REFIID riid, LPVOID FAR* ppv)
+ {
+ *ppv = NULL;
+
+ if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory))
+ {
+ *ppv = (LPCLASSFACTORY) this;
+ AddRef();
+ return NOERROR;
+ }
+
+ return E_NOINTERFACE;
+ }
+
+
+ STDMETHODIMP_(ULONG) AddRef()
+ {
+ ThgCriticalSection cs(CShellExt::GetCriticalSection());
+ return ++m_cRef;
+ }
+
+
+ STDMETHODIMP_(ULONG) Release()
+ {
+ ThgCriticalSection cs(CShellExt::GetCriticalSection());
+ if (--m_cRef)
+ return m_cRef;
+
+ delete this;
+ return 0L;
+ }
+
+
+ STDMETHODIMP CreateInstance(
+ LPUNKNOWN pUnkOuter, REFIID riid, LPVOID* ppvObj)
+ {
+ *ppvObj = NULL;
+
+ if (pUnkOuter)
+ return CLASS_E_NOAGGREGATION;
+
+ T *pShellExt = new T(myclassToMake);
+ if (NULL == pShellExt)
+ return E_OUTOFMEMORY;
+
+ return pShellExt->QueryInterface(riid, ppvObj);
+ }
+
+
+ STDMETHODIMP LockServer(BOOL fLock)
+ {
+ return NOERROR;
+ }
+
+};
+
+
+#endif
|
Loading...