Addresses #498

# HG changeset patch
# User Emmanuel Rosa <[email protected]>
# Date 1258233560 18000
# Node ID 2525801b8b8d8bd57059100df380ccffdbaa1ce1
# Parent  ddb08f5804cefab69b4f60da4db14883392f95b5
add bookmark renaming

Addresses #498

diff --git a/tortoisehg/hgtk/bookmark.py b/tortoisehg/hgtk/bookmark.py
--- a/tortoisehg/hgtk/bookmark.py
+++ b/tortoisehg/hgtk/bookmark.py
@@ -155,3 +155,106 @@
                            repo=self.repo, 
                            mark=name,
                            delete=True)
+
+class BookmarkRenameDialog(gtk.Dialog):
+    """ Dialog to rename a bookmark """
+    def __init__(self, repo, bookmark='', rev=''):
+        """ Initialize the Dialog """
+        gtk.Dialog.__init__(self,
+                            buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
+        gtklib.set_tortoise_keys(self)
+        self.set_title(_('Bookmark - %s') % hglib.get_reponame(repo))
+        self.set_resizable(False)
+        self.set_has_separator(False)
+        self.connect('response', self.dialog_response)
+
+        self.repo = repo
+
+        # add Rename button
+        renamebutton = gtk.Button(_('Rename'))
+        renamebutton.connect('clicked', lambda b: self._do_rename_bookmark())
+        self.action_area.pack_end(renamebutton)
+
+        # top layout table
+        table = gtklib.LayoutTable()
+        self.vbox.pack_start(table, True, True, 2)
+
+        ## bookmark name input
+        self._bookmarkslist = gtk.ListStore(str)
+        self._bookmarklistbox = gtk.ComboBoxEntry(self._bookmarkslist, 0)
+        self._bookmark_input = self._bookmarklistbox.get_child()
+        self._bookmark_input.connect('activate', self._bookmarkinput_activated)
+        self._bookmark_input.set_text(bookmark)
+        table.add_row(_('Bookmark:'), self._bookmarklistbox, padding=False)
+
+        ## revision input
+        self._name_input = gtk.Entry()
+        table.add_row(_('New name:'), self._name_input)
+
+        # prepare to show
+        self._refresh()
+        self._bookmarklistbox.grab_focus()
+
+    def _refresh(self):
+        """ update display on dialog with recent repo data """
+        self.repo.invalidate()
+        self._bookmarkslist.clear()
+        self._bookmark_input.set_text("")
+
+        # add bookmarks to drop-down list
+        bookmarks = hglib.get_repo_bookmarks(self.repo) 
+        bookmarks.sort()
+        for bookmarkname in bookmarks:
+            if bookmarkname == "tip":
+                continue
+            self._bookmarkslist.append([bookmarkname])
+
+    def dialog_response(self, dialog, response_id):
+        if response_id == gtk.RESPONSE_CLOSE \
+                or response_id == gtk.RESPONSE_DELETE_EVENT:
+            self.destroy()
+
+    def _bookmarkinput_activated(self, bookmarkinput):
+        self._do_rename_bookmark()
+
+    def _do_rename_bookmark(self):
+        # gather input data
+        name = self._bookmark_input.get_text()
+        new_name = self._name_input.get_text()
+
+        # verify input
+        if name == '':
+            dialog.error_dialog(self, _('Bookmark input is empty'),
+                         _('Please enter bookmark name'))
+            self._bookmark_input.grab_focus()
+            return False
+
+        if new_name == '':
+            dialog.error_dialog(self, _('Bookmark new name input is empty'),
+                         _('Please enter new bookmark name'))
+            self._bookmark_input.grab_focus()
+            return False
+
+        # rename bookmark 
+        try:
+            self._rename_hg_bookmark(name, new_name)
+            dialog.info_dialog(self, _('Bookmarking completed'),
+                              _('Bookmark "%s" has been renamed to "%s"') % 
+                              (name, new_name))
+            self._refresh()
+        except util.Abort, inst:
+            dialog.error_dialog(self, _('Error in bookmarking'), str(inst))
+            return False
+        except:
+            dialog.error_dialog(self, _('Error in bookmarking'),
+                    traceback.format_exc())
+            return False
+
+    def _rename_hg_bookmark(self, name, new_name):
+        if new_name in hglib.get_repo_bookmarks(self.repo):
+            raise util.Abort(_('a bookmark named "%s" already exists') % new_name)
+        bookmarks.bookmark(ui=ui.ui(), 
+                           repo=self.repo, 
+                           mark=new_name,
+                           rename=name)
+
diff --git a/tortoisehg/hgtk/history.py b/tortoisehg/hgtk/history.py
--- a/tortoisehg/hgtk/history.py
+++ b/tortoisehg/hgtk/history.py
@@ -722,6 +722,8 @@
         if 'bookmarks' in self.exs:
             m.append(create_menu(_('Add/Remove B_ookmark...'), 
                                    self.add_bookmark))
+            m.append(create_menu(_('Rename Bookmark...'), 
+                                   self.rename_bookmark))
             m.append_sep()
 
         cmenu_backout = create_menu(_('Backout Revision...'), self.backout_rev)
@@ -1741,6 +1743,21 @@
         dialog.connect('destroy', refresh)
         self.show_dialog(dialog)
 
+    def rename_bookmark(self, menuitem):
+        # save bookmark info for detecting new bookmarks added
+        oldbookmarks = hglib.get_repo_bookmarks(self.repo) 
+        oldlen = len(self.repo)
+        rev = self.currevid
+
+        def refresh(*args):
+            self.refresh_on_marker_change(oldlen, 
+                                          oldbookmarks, 
+                                          hglib.get_repo_bookmarks(self.repo))
+
+        dialog = bookmark.BookmarkRenameDialog(self.repo, rev=str(rev))
+        dialog.connect('destroy', refresh)
+        self.show_dialog(dialog)
+
     def show_status(self, menuitem):
         rev = self.currevid
         statopts = self.merge_opts(commands.table['^status|st'][1],
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Tortoisehg-develop mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tortoisehg-develop

Reply via email to