Addresses #498

# HG changeset patch
# User Emmanuel Rosa <goaway1...@gmail.com>
# Date 1258145492 18000
# Node ID 4d7fd3e1f2307e645328c0db8f145da987f64768
# Parent  f92edba5cf8cc93f74436ef19da864b920c54be0
add bookmark dialog

Addresses #498

diff --git a/tortoisehg/hgtk/bookmarkadd.py b/tortoisehg/hgtk/bookmarkadd.py
new file mode 100644
--- /dev/null
+++ b/tortoisehg/hgtk/bookmarkadd.py
@@ -0,0 +1,160 @@
+# bookmarkadd.py - TortoiseHg dialog to add bookmark
+#
+# Copyright 2007 TK Soh <teekay...@gmail.com>
+# Copyright 2007 Steve Borho <st...@borho.org>
+# Copyright 2009 Emmanuel Rosa <goaway1...@gmail.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2, incorporated herein by reference.
+
+import os
+import gtk
+import traceback
+
+from mercurial import hg, ui, util
+from hgext import bookmarks
+
+from tortoisehg.util.i18n import _
+from tortoisehg.util import hglib, i18n
+
+from tortoisehg.hgtk import dialog, gtklib
+
+keep = i18n.keepgettext()
+
+class BookmarkAddDialog(gtk.Dialog):
+    """ Dialog to add bookmark to Mercurial repo """
+    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 Add button
+        addbutton = gtk.Button(_('Add'))
+        addbutton.connect('clicked', lambda b: self._do_add_bookmark())
+        self.action_area.pack_end(addbutton)
+
+        # add Remove button
+        removebutton = gtk.Button(_('Remove'))
+        removebutton.connect('clicked', lambda b: self._do_rm_bookmark())
+        self.action_area.pack_end(removebutton)
+
+        # 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._rev_input = gtk.Entry()
+        self._rev_input.set_width_chars(12)
+        self._rev_input.set_text(rev)
+        table.add_row(_('Revision:'), self._rev_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_add_bookmark()
+
+    def _do_add_bookmark(self):
+        # gather input data
+        name = self._bookmark_input.get_text()
+        rev = self._rev_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
+
+        # add bookmark to repo
+        try:
+            self._add_hg_bookmark(name, rev)
+            dialog.info_dialog(self, _('Bookmarking completed'),
+                              _('Bookmark "%s" has been added') % 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 _do_rm_bookmark(self):
+        # gather input data
+        name = self._bookmark_input.get_text()
+
+        # verify input
+        if name == '':
+            dialog.error_dialog(self, _('Bookmark name is empty'),
+                         _('Please select bookmark name to remove'))
+            self._bookmark_input.grab_focus()
+            return False
+
+        try:
+            self._rm_hg_bookmark(name)
+            dialog.info_dialog(self, _('Bookmarking completed'),
+                              _('Bookmark "%s" has been removed') % 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 _add_hg_bookmark(self, name, revision):
+        if name in hglib.get_repo_bookmarks(self.repo):
+            raise util.Abort(_('a bookmark named "%s" already exists') % name)
+
+        ctx = self.repo[revision]
+        r = ctx.node()
+        bookmarks.bookmark(ui=ui.ui(), 
+                           repo=self.repo, 
+                           rev=revision, 
+                           mark=name)
+
+    def _rm_hg_bookmark(self, name):
+        if not name in hglib.get_repo_bookmarks(self.repo):
+            raise util.Abort(_("Bookmark '%s' does not exist") % name)
+
+        bookmarks.bookmark(ui=ui.ui(), 
+                           repo=self.repo, 
+                           mark=name,
+                           delete=True)
diff --git a/tortoisehg/hgtk/history.py b/tortoisehg/hgtk/history.py
--- a/tortoisehg/hgtk/history.py
+++ b/tortoisehg/hgtk/history.py
@@ -25,7 +25,7 @@
 from tortoisehg.hgtk import gdialog, gtklib, hgcmd, gorev, thgstrip
 from tortoisehg.hgtk import backout, status, hgemail, tagadd, update, merge
 from tortoisehg.hgtk import archive, changeset, thgconfig, thgmq, histdetails
-from tortoisehg.hgtk import statusbar
+from tortoisehg.hgtk import statusbar, bookmarkadd
 
 def create_menu(label, callback):
     menuitem = gtk.MenuItem(label, True)
@@ -719,6 +719,7 @@
         m.append(create_menu(_('_Bundle rev:tip...'), self.bundle_rev_to_tip))
         m.append_sep()
         m.append(create_menu(_('Add/Remove _Tag...'), self.add_tag))
+        m.append(create_menu(_('Add/Remove B_ookmark...'), self.add_bookmark))
         cmenu_backout = create_menu(_('Backout Revision...'), self.backout_rev)
         m.append(cmenu_backout)
         m.append(create_menu(_('_Revert'), self.revert))
@@ -1108,6 +1109,15 @@
     def get_extras(self):
         return self.stbar
 
+    def refresh_on_marker_change(self, oldlen, oldmarkers, newmarkers):
+        self.repo.invalidate()
+        self.changeview.clear_cache()
+        if len(self.repo) != oldlen:
+            self.reload_log()
+        else:
+            if newmarkers != oldmarkers:
+                self.refresh_model()
+        
     def apply_clicked(self, button):
         combo = self.ppullcombo
         list, iter = combo.get_model(), combo.get_active_iter()
@@ -1705,19 +1715,27 @@
         rev = self.currevid
 
         def refresh(*args):
-            self.repo.invalidate()
-            self.changeview.clear_cache()
-            if len(self.repo) != oldlen:
-                self.reload_log()
-            else:
-                newtags = self.repo.tagslist()
-                if newtags != oldtags:
-                    self.refresh_model()
+            self.refresh_on_marker_change(oldlen, oldtags, self.repo.tagslist())
 
         dialog = tagadd.TagAddDialog(self.repo, rev=str(rev))
         dialog.connect('destroy', refresh)
         self.show_dialog(dialog)
 
+    def add_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 = bookmarkadd.BookmarkAddDialog(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],
diff --git a/tortoisehg/util/hglib.py b/tortoisehg/util/hglib.py
--- a/tortoisehg/util/hglib.py
+++ b/tortoisehg/util/hglib.py
@@ -236,3 +236,5 @@
             return_path = path_aux
     return return_path
 
+def get_repo_bookmarks(repo):
+    return repo._bookmarks.keys()
------------------------------------------------------------------------------
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
Tortoisehg-develop@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tortoisehg-develop

Reply via email to