# HG changeset patch # User Simon Heimberg <[email protected]> # Date 1234800759 -3600 # Node ID 9521df28903da5391789bcbb2b341613c9e01a10 # Parent a7d4a0c9e5e57b5be8c174e79ba22d4ac7621f7d add separate module for menu creation
diff -r a7d4a0c9e5e5 -r 9521df28903d tortoise/menuthg.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tortoise/menuthg.py Mon Feb 16 17:12:39 2009 +0100 @@ -0,0 +1,271 @@ +# Published under the GNU GPL, v2 or later. +# Copyright (C) 2007 Jelmer Vernooij <[email protected]> +# Copyright (C) 2007 Henry Ludemann <[email protected]> +# Copyright (C) 2007 TK Soh <[email protected]> + +import os +#import tempfile +from mercurial import hg +from thgutil import * +from mercurial import ui +from mercurial.i18n import _ + +try: + from mercurial.error import RepoError +except ImportError: + from mercurial.repo import RepoError + + +class TortoiseMenu(object): + + def __init__(self, menutext, helptext, handler, icon=None, state=True): + self.menutext = menutext + self.helptext = helptext + self.handler = handler + self.state = state + self.icon = icon + + def isSubmenu(): + return false + + def isSep(): + return false + + +class TortoiseSubmenu(TortoiseMenu): + + def __init__(self, menutext, helptext, menus=[], icon=None): + TortoiseMenu.__init(self, menutext, helptext, None, icon) + self.menus = menus[:] + + def add_menu(self, menutext, helptext, handler, icon=None, state=True): + self.menus.append(TortoiseMenu(menutext, helptext, + handler, icon, state)) + + def add_sep(self): + self.menus.append(TortoiseMenuSep()) + + def get_menus(self): + return self.menus + + def append(self, entry): + self.menus.append(entry) + + def isSubmenu(): + return true + + +class TortoiseMenuSep(object): + + def isSubmenu(): + return false + + def isSep(): + return true + + +class menuThg: + """shell extension that adds context menu items""" + + def __init__(self): + self.handlers = self + self.name = "TortoiseHG" + + def get_commands_dragdrop(self, srcfiles, destfolder): + """ + Get a list of commands valid for the current selection. + + Commands are instances of TortoiseMenu, TortoiseMenuSep or TortoiseMenu + """ + + print "_get_commands_dragdrop() on %s" % ", ".join(self._filenames) + + # we can only accept dropping one item + if len(srcfiles) > 1: + return [] + + # open repo + drag_repo = None + drop_repo = None + + print "drag = %s" % self.srcfiles[0] + print "drop = %s" % self.destfolder + + drag_path = self.srcfiles[0] + drag_repo = open_repo(drag_path) + if not drag_repo: + return [] + if drag_repo and drag_repo.root != drag_path: + return [] # dragged item must be a hg repo root directory + + drop_repo = open_repo(self._folder) + + thgmenu = [] + thgmenu.append(TortoiseMenu(_("Create Clone"), + _("Create clone here from source"), + self.handlers._clone_here, icon="menuclone.ico")) + + if drop_repo: + thgmenu.append(TortoiseMenu(_("Synchronize"), + _("Synchronize with dragged repository"), + self.handlers._synch_here, icon="menusynch.py")) + return thgmenu + + def get_commands(self, files): + """ + Get a list of commands valid for the current selection. + + Commands are instances of TortoiseMenu, TortoiseMenuSep or TortoiseMenu + """ + + print "_get_commands() on %s" % ", ".join(self._filenames) + + # open repo + repo = open_repo(files[0]) + + if repo: + thgmenu.append(TortoiseMenu(_("HG Commit..."), + _("Commit changes in repository"), + self.handlers._commit, icon="menucommit.ico")) + + menu = TortoiseSubmenu(self.name, "Mercurial", [], icon="hg.ico") + + if repo is None: + menu.append(TortoiseMenu(_("Clone a Repository"), + _("clone a repository"), + self.handlers._clone, icon="menuclone.ico")) + menu.append(TortoiseMenu(_("Create Repository Here"), + _("create a new repository in this directory"), + self.handlers._init, icon="menucreaterepos.ico", + state=os.path.isdir(rpath))) + else: + + for f in self._filenames: + if f.endswith('.hgignore'): + menu.append(TortoiseMenu(_("Modify ignore filter"), + _("Modify repository ignore filter"), + self.handlers._hgignore, icon="general.ico")) # needs ico + break + + menu.append(TortoiseMenu(_("View File Status"), + _("Repository status"), + self.handlers._status, icon="menushowchanged.ico")) + + menu.append(TortoiseMenu(_("(Un)Shelve Changes"), + _("Shelve repository changes"), + self.handlers._shelve, icon="general.ico")) # needs ico + + # Visual Diff (any extdiff command) + has_vdiff = repo.ui.config('tortoisehg', 'vdiff', '') != '' + menu.append(TortoiseMenu(_("Visual Diff"), + _("View changes using GUI diff tool"), + self.handlers._vdiff, icon="TortoiseMerge.ico", + state=has_vdiff)) + + if len(self._filenames) == 0: + menu.append(TortoiseMenu(_("Guess Renames"), + _("Detect renames and copies"), + self.handlers._guess_rename, icon="general.ico")) # needs ico + elif len(self._filenames) == 1: + result.append(TortoiseMenu(_("Rename file"), + _("Rename file or directory"), + self.handlers._rename, icon="general.ico")) # needs ico + + menu.append(TortoiseMenu(_("Add Files"), + _("Add files to Hg repository"), + self.handlers._add, icon="menuadd.ico")) + menu.append(TortoiseMenu(_("Remove Files"), + _("Remove selected files on the next commit"), + self.handlers._remove, icon="menudelete.ico")) + menu.append(TortoiseMenu(_("Undo Changes"), + _("Revert selected files"), + self.handlers._revert, icon="menurevert.ico")) + + # we can only annotate file but not directories + annotatible = len(files) > 0 + for f in self._filenames: + if not os.path.isfile(f): + annotatible = False + break + menu.append(TortoiseMenu(_("Annotate Files"), + _("show changeset information per file line"), + self.handlers._annotate, icon="menublame.ico", + state=annotatible)) + + menu.append(TortoiseMenuSep()) + menu.append(TortoiseMenu(_("Update To Revision"), + _("update working directory"), + self.handlers._update, icon="menucheckout.ico")) + + can_merge = len(repo.heads()) > 1 and \ + len(repo.changectx(None).parents()) < 2 + menu.append(TortoiseMenu(_("Merge Revisions"), + _("merge working directory with another revision"), + self.handlers._merge, icon="menumerge.ico", + state=can_merge)) + + in_merge = len(repo.changectx(None).parents()) > 1 + menu.append(TortoiseMenu(_("Undo Merge"), + _("Undo merge by updating to revision"), + self.handlers._merge, icon="menuunmerge.ico", + state=in_merge)) + + menu.append(TortoiseMenuSep()) + + menu.append(TortoiseMenu(_("View Changelog"), + _("View revision history"), + self.handlers._history, icon="menulog.ico")) + + menu.append(TortoiseMenu(_("Search Repository"), + _("Search revisions of files for a text pattern"), + self.handlers._grep, icon="menurepobrowse.ico")) + + if repo.ui.config('tortoisehg', 'view'): + menu.append(TortoiseMenu(_("Revision Graph"), + _("View history with DAG graph"), + self.handlers._view, icon="menurevisiongraph.ico")) + + menu.append(TortoiseMenuSep()) + + menu.append(TortoiseMenu(_("Synchronize..."), + _("Synchronize with remote repository"), + self.handlers._synch, icon="menusynch.ico")) + menu.append(TortoiseMenu(_("Recovery..."), + _("General repair and recovery of repository"), + self.handlers._recovery, icon="general.ico")) + menu.append(TortoiseMenu(_("Web Server"), + _("start web server for this repository"), + self.handlers._serve, icon="proxy.ico")) + + menu.append(TortoiseMenuSep()) + menu.append(TortoiseMenu(_("Create Clone"), + _("Clone a repository here"), + self.handlers._clone, icon="menuclone.ico")) + can_init = repo.root != rpath and os.path.isdir(rpath) + menu.append(TortoiseMenu(_("Create Repository Here"), + _("create a new repository in this directory"), + self.handlers._init, icon="menucreaterepos.ico", + state=can_init)) + + # config settings menu + menu.append(TortoiseMenuSep()) + optmenu = TortoiseSubmenu(_("Settings"), '', + icon="menusettings.ico") + optmenu.add_menu(_("Global"), + _("Configure user wide settings"), + self.handlers._config_user, icon="settings_user.ico") + if repo: + optmenu.add_menu(_("Repository"), + _("Configure settings local to this repository"), + self.handlers._config_repo, + icon="settings_repo.ico") + menu.append(optmenu) + + # add common menu items + menu.append(TortoiseMenuSep()) + menu.append(TortoiseMenu(_("About"), _("About TortoiseHg"), + self.handlers._about, icon="menuabout.ico")) + + thgmenu.append(menu) + thgmenu.append(TortoiseMenuSep()) + return thgmenu ------------------------------------------------------------------------------ Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA -OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise -Strategies to boost innovation and cut costs with open source participation -Receive a $600 discount off the registration fee with the source code: SFAD http://p.sf.net/sfu/XcvMzF8H _______________________________________________ Tortoisehg-develop mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/tortoisehg-develop
