/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 commit.py

  • Committer: Mark Lee
  • Date: 2009-07-11 18:39:14 UTC
  • mto: This revision was merged to the branch mainline in revision 661.
  • Revision ID: bzr@lazymalevolence.com-20090711183914-zuii3et5skiv2njo
Re-ignore credits.pickle.

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
 
17
import os.path
17
18
import re
18
19
 
19
 
from gi.repository import Gtk
20
 
from gi.repository import GObject
21
 
from gi.repository import Pango
 
20
try:
 
21
    import pygtk
 
22
    pygtk.require("2.0")
 
23
except:
 
24
    pass
 
25
 
 
26
import gtk
 
27
import gobject
 
28
import pango
22
29
 
23
30
from bzrlib import (
 
31
    branch,
24
32
    errors,
25
33
    osutils,
26
34
    trace,
30
38
except ImportError:
31
39
    from bzrlib.util import bencode
32
40
 
 
41
from bzrlib.plugins.gtk import _i18n
33
42
from bzrlib.plugins.gtk.dialog import question_dialog
34
43
from bzrlib.plugins.gtk.errors import show_bzr_error
35
 
from bzrlib.plugins.gtk.i18n import _i18n
36
44
 
37
45
try:
38
46
    import dbus
103
111
    return fixed_newline.decode('utf-8')
104
112
 
105
113
 
106
 
class CommitDialog(Gtk.Dialog):
 
114
class CommitDialog(gtk.Dialog):
107
115
    """Implementation of Commit."""
108
116
 
109
117
    def __init__(self, wt, selected=None, parent=None):
110
 
        GObject.GObject.__init__(self, title="Commit to %s" % wt.basedir,
 
118
        gtk.Dialog.__init__(self, title="Commit to %s" % wt.basedir,
111
119
                            parent=parent, flags=0,)
112
120
        self.connect('delete-event', self._on_delete_window)
113
121
        self._question_dialog = question_dialog
114
122
 
115
 
        self.set_type_hint(Gdk.WindowTypeHint.NORMAL)
 
123
        self.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_NORMAL)
116
124
 
117
125
        self._wt = wt
118
126
        # TODO: Do something with this value, it is used by Olive
280
288
        """Build up the dialog widgets."""
281
289
        # The primary pane which splits it into left and right (adjustable)
282
290
        # sections.
283
 
        self._hpane = Gtk.HPaned()
 
291
        self._hpane = gtk.HPaned()
284
292
 
285
293
        self._construct_left_pane()
286
294
        self._construct_right_pane()
287
295
        self._construct_action_pane()
288
296
 
289
 
        self.vbox.pack_start(self._hpane, True, True, 0)
 
297
        self.vbox.pack_start(self._hpane)
290
298
        self._hpane.show()
291
299
        self.set_focus(self._global_message_text_view)
292
300
 
311
319
        self._hpane.set_position(300)
312
320
 
313
321
    def _construct_accelerators(self):
314
 
        group = Gtk.AccelGroup()
315
 
        group.connect_group(Gdk.keyval_from_name('N'),
316
 
                            Gdk.EventMask.CONTROL_MASK, 0, self._on_accel_next)
 
322
        group = gtk.AccelGroup()
 
323
        group.connect_group(gtk.gdk.keyval_from_name('N'),
 
324
                            gtk.gdk.CONTROL_MASK, 0, self._on_accel_next)
317
325
        self.add_accel_group(group)
318
326
 
319
327
        # ignore the escape key (avoid closing the window)
320
328
        self.connect_object('close', self.emit_stop_by_name, 'close')
321
329
 
322
330
    def _construct_left_pane(self):
323
 
        self._left_pane_box = Gtk.VBox(homogeneous=False, spacing=5)
 
331
        self._left_pane_box = gtk.VBox(homogeneous=False, spacing=5)
324
332
        self._construct_file_list()
325
333
        self._construct_pending_list()
326
334
 
327
 
        self._check_local = Gtk.CheckButton(_i18n("_Only commit locally"),
 
335
        self._check_local = gtk.CheckButton(_i18n("_Only commit locally"),
328
336
                                            use_underline=True)
329
337
        self._left_pane_box.pack_end(self._check_local, False, False)
330
338
        self._check_local.set_active(False)
339
347
        # commit, and 1 for file commit, and it looked good. But I don't seem
340
348
        # to have a way to do that with the gtk boxes... :( (Which is extra
341
349
        # weird since wx uses gtk on Linux...)
342
 
        self._right_pane_table = Gtk.Table(rows=10, columns=1, homogeneous=False)
 
350
        self._right_pane_table = gtk.Table(rows=10, columns=1, homogeneous=False)
343
351
        self._right_pane_table.set_row_spacings(5)
344
352
        self._right_pane_table.set_col_spacings(5)
345
353
        self._right_pane_table_row = 0
351
359
        self._hpane.pack2(self._right_pane_table, resize=True, shrink=True)
352
360
 
353
361
    def _construct_action_pane(self):
354
 
        self._button_cancel = Gtk.Button(stock=Gtk.STOCK_CANCEL)
 
362
        self._button_cancel = gtk.Button(stock=gtk.STOCK_CANCEL)
355
363
        self._button_cancel.connect('clicked', self._on_cancel_clicked)
356
364
        self._button_cancel.show()
357
365
        self.action_area.pack_end(self._button_cancel)
358
 
        self._button_commit = Gtk.Button(_i18n("Comm_it"), use_underline=True)
 
366
        self._button_commit = gtk.Button(_i18n("Comm_it"), use_underline=True)
359
367
        self._button_commit.connect('clicked', self._on_commit_clicked)
360
 
        self._button_commit.set_can_default(True)
 
368
        self._button_commit.set_flags(gtk.CAN_DEFAULT)
361
369
        self._button_commit.show()
362
370
        self.action_area.pack_end(self._button_commit)
363
371
        self._button_commit.grab_default()
371
379
        """
372
380
        end_row = self._right_pane_table_row + weight
373
381
        options = 0
374
 
        expand_opts = Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL | Gtk.AttachOptions.SHRINK
 
382
        expand_opts = gtk.EXPAND | gtk.FILL | gtk.SHRINK
375
383
        if expanding:
376
384
            options = expand_opts
377
385
        self._right_pane_table.attach(widget, 0, 1,
380
388
        self._right_pane_table_row = end_row
381
389
 
382
390
    def _construct_file_list(self):
383
 
        self._files_box = Gtk.VBox(homogeneous=False, spacing=0)
384
 
        file_label = Gtk.Label(label=_i18n('Files'))
 
391
        self._files_box = gtk.VBox(homogeneous=False, spacing=0)
 
392
        file_label = gtk.Label(_i18n('Files'))
385
393
        # file_label.show()
386
 
        self._files_box.pack_start(file_label, False, True, 0)
 
394
        self._files_box.pack_start(file_label, expand=False)
387
395
 
388
 
        self._commit_all_files_radio = Gtk.RadioButton(
 
396
        self._commit_all_files_radio = gtk.RadioButton(
389
397
            None, _i18n("Commit all changes"))
390
 
        self._files_box.pack_start(self._commit_all_files_radio, False, True, 0)
 
398
        self._files_box.pack_start(self._commit_all_files_radio, expand=False)
391
399
        self._commit_all_files_radio.show()
392
400
        self._commit_all_files_radio.connect('toggled',
393
401
            self._toggle_commit_selection)
394
 
        self._commit_selected_radio = Gtk.RadioButton(
 
402
        self._commit_selected_radio = gtk.RadioButton(
395
403
            self._commit_all_files_radio, _i18n("Only commit selected changes"))
396
 
        self._files_box.pack_start(self._commit_selected_radio, False, True, 0)
 
404
        self._files_box.pack_start(self._commit_selected_radio, expand=False)
397
405
        self._commit_selected_radio.show()
398
406
        self._commit_selected_radio.connect('toggled',
399
407
            self._toggle_commit_selection)
402
410
            self._commit_all_files_radio.set_sensitive(False)
403
411
            self._commit_selected_radio.set_sensitive(False)
404
412
 
405
 
        scroller = Gtk.ScrolledWindow()
406
 
        scroller.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
407
 
        self._treeview_files = Gtk.TreeView()
 
413
        scroller = gtk.ScrolledWindow()
 
414
        scroller.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
 
415
        self._treeview_files = gtk.TreeView()
408
416
        self._treeview_files.show()
409
417
        scroller.add(self._treeview_files)
410
 
        scroller.set_shadow_type(Gtk.ShadowType.IN)
 
418
        scroller.set_shadow_type(gtk.SHADOW_IN)
411
419
        scroller.show()
412
420
        self._files_box.pack_start(scroller,
413
421
                                   expand=True, fill=True)
414
422
        self._files_box.show()
415
 
        self._left_pane_box.pack_start(self._files_box, True, True, 0)
 
423
        self._left_pane_box.pack_start(self._files_box)
416
424
 
417
425
        # Keep note that all strings stored in a ListStore must be UTF-8
418
426
        # strings. GTK does not support directly setting and restoring Unicode
419
427
        # objects.
420
 
        liststore = Gtk.ListStore(
421
 
            GObject.TYPE_STRING,  # [0] file_id
422
 
            GObject.TYPE_STRING,  # [1] real path
423
 
            GObject.TYPE_BOOLEAN, # [2] checkbox
424
 
            GObject.TYPE_STRING,  # [3] display path
425
 
            GObject.TYPE_STRING,  # [4] changes type
426
 
            GObject.TYPE_STRING,  # [5] commit message
 
428
        liststore = gtk.ListStore(
 
429
            gobject.TYPE_STRING,  # [0] file_id
 
430
            gobject.TYPE_STRING,  # [1] real path
 
431
            gobject.TYPE_BOOLEAN, # [2] checkbox
 
432
            gobject.TYPE_STRING,  # [3] display path
 
433
            gobject.TYPE_STRING,  # [4] changes type
 
434
            gobject.TYPE_STRING,  # [5] commit message
427
435
            )
428
436
        self._files_store = liststore
429
437
        self._treeview_files.set_model(liststore)
430
 
        crt = Gtk.CellRendererToggle()
 
438
        crt = gtk.CellRendererToggle()
431
439
        crt.set_property('activatable', not bool(self._pending))
432
440
        crt.connect("toggled", self._toggle_commit, self._files_store)
433
441
        if self._pending:
434
442
            name = _i18n('Commit*')
435
443
        else:
436
444
            name = _i18n('Commit')
437
 
        commit_col = Gtk.TreeViewColumn(name, crt, active=2)
 
445
        commit_col = gtk.TreeViewColumn(name, crt, active=2)
438
446
        commit_col.set_visible(False)
439
447
        self._treeview_files.append_column(commit_col)
440
 
        self._treeview_files.append_column(Gtk.TreeViewColumn(_i18n('Path'),
441
 
                                           Gtk.CellRendererText(), text=3))
442
 
        self._treeview_files.append_column(Gtk.TreeViewColumn(_i18n('Type'),
443
 
                                           Gtk.CellRendererText(), text=4))
 
448
        self._treeview_files.append_column(gtk.TreeViewColumn(_i18n('Path'),
 
449
                                           gtk.CellRendererText(), text=3))
 
450
        self._treeview_files.append_column(gtk.TreeViewColumn(_i18n('Type'),
 
451
                                           gtk.CellRendererText(), text=4))
444
452
        self._treeview_files.connect('cursor-changed',
445
453
                                     self._on_treeview_files_cursor_changed)
446
454
 
467
475
    def _construct_pending_list(self):
468
476
        # Pending information defaults to hidden, we put it all in 1 box, so
469
477
        # that we can show/hide all of them at once
470
 
        self._pending_box = Gtk.VBox()
 
478
        self._pending_box = gtk.VBox()
471
479
        self._pending_box.hide()
472
480
 
473
 
        pending_message = Gtk.Label()
 
481
        pending_message = gtk.Label()
474
482
        pending_message.set_markup(
475
483
            _i18n('<i>* Cannot select specific files when merging</i>'))
476
484
        self._pending_box.pack_start(pending_message, expand=False, padding=5)
477
485
        pending_message.show()
478
486
 
479
 
        pending_label = Gtk.Label(label=_i18n('Pending Revisions'))
 
487
        pending_label = gtk.Label(_i18n('Pending Revisions'))
480
488
        self._pending_box.pack_start(pending_label, expand=False, padding=0)
481
489
        pending_label.show()
482
490
 
483
 
        scroller = Gtk.ScrolledWindow()
484
 
        scroller.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
485
 
        self._treeview_pending = Gtk.TreeView()
 
491
        scroller = gtk.ScrolledWindow()
 
492
        scroller.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
 
493
        self._treeview_pending = gtk.TreeView()
486
494
        scroller.add(self._treeview_pending)
487
 
        scroller.set_shadow_type(Gtk.ShadowType.IN)
 
495
        scroller.set_shadow_type(gtk.SHADOW_IN)
488
496
        scroller.show()
489
497
        self._pending_box.pack_start(scroller,
490
498
                                     expand=True, fill=True, padding=5)
491
499
        self._treeview_pending.show()
492
 
        self._left_pane_box.pack_start(self._pending_box, True, True, 0)
 
500
        self._left_pane_box.pack_start(self._pending_box)
493
501
 
494
 
        liststore = Gtk.ListStore(GObject.TYPE_STRING, # revision_id
495
 
                                  GObject.TYPE_STRING, # date
496
 
                                  GObject.TYPE_STRING, # committer
497
 
                                  GObject.TYPE_STRING, # summary
 
502
        liststore = gtk.ListStore(gobject.TYPE_STRING, # revision_id
 
503
                                  gobject.TYPE_STRING, # date
 
504
                                  gobject.TYPE_STRING, # committer
 
505
                                  gobject.TYPE_STRING, # summary
498
506
                                 )
499
507
        self._pending_store = liststore
500
508
        self._treeview_pending.set_model(liststore)
501
 
        self._treeview_pending.append_column(Gtk.TreeViewColumn(_i18n('Date'),
502
 
                                             Gtk.CellRendererText(), text=1))
503
 
        self._treeview_pending.append_column(Gtk.TreeViewColumn(_i18n('Committer'),
504
 
                                             Gtk.CellRendererText(), text=2))
505
 
        self._treeview_pending.append_column(Gtk.TreeViewColumn(_i18n('Summary'),
506
 
                                             Gtk.CellRendererText(), text=3))
 
509
        self._treeview_pending.append_column(gtk.TreeViewColumn(_i18n('Date'),
 
510
                                             gtk.CellRendererText(), text=1))
 
511
        self._treeview_pending.append_column(gtk.TreeViewColumn(_i18n('Committer'),
 
512
                                             gtk.CellRendererText(), text=2))
 
513
        self._treeview_pending.append_column(gtk.TreeViewColumn(_i18n('Summary'),
 
514
                                             gtk.CellRendererText(), text=3))
507
515
 
508
516
    def _construct_diff_view(self):
509
 
        from bzrlib.plugins.gtk.diff import DiffView
 
517
        from diff import DiffView
510
518
 
511
519
        # TODO: jam 2007-10-30 The diff label is currently disabled. If we
512
520
        #       decide that we really don't ever want to display it, we should
513
521
        #       actually remove it, and other references to it, along with the
514
522
        #       tests that it is set properly.
515
 
        self._diff_label = Gtk.Label(label=_i18n('Diff for whole tree'))
 
523
        self._diff_label = gtk.Label(_i18n('Diff for whole tree'))
516
524
        self._diff_label.set_alignment(0, 0)
517
525
        self._right_pane_table.set_row_spacing(self._right_pane_table_row, 0)
518
526
        self._add_to_right_table(self._diff_label, 1, False)
523
531
        self._diff_view.show()
524
532
 
525
533
    def _construct_file_message(self):
526
 
        scroller = Gtk.ScrolledWindow()
527
 
        scroller.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
 
534
        scroller = gtk.ScrolledWindow()
 
535
        scroller.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
528
536
 
529
 
        self._file_message_text_view = Gtk.TextView()
 
537
        self._file_message_text_view = gtk.TextView()
530
538
        scroller.add(self._file_message_text_view)
531
 
        scroller.set_shadow_type(Gtk.ShadowType.IN)
 
539
        scroller.set_shadow_type(gtk.SHADOW_IN)
532
540
        scroller.show()
533
541
 
534
 
        self._file_message_text_view.modify_font(Pango.FontDescription("Monospace"))
535
 
        self._file_message_text_view.set_wrap_mode(Gtk.WrapMode.WORD)
 
542
        self._file_message_text_view.modify_font(pango.FontDescription("Monospace"))
 
543
        self._file_message_text_view.set_wrap_mode(gtk.WRAP_WORD)
536
544
        self._file_message_text_view.set_accepts_tab(False)
537
545
        self._file_message_text_view.show()
538
546
 
539
 
        self._file_message_expander = Gtk.Expander(_i18n('File commit message'))
 
547
        self._file_message_expander = gtk.Expander(_i18n('File commit message'))
540
548
        self._file_message_expander.set_expanded(True)
541
549
        self._file_message_expander.add(scroller)
542
550
        self._add_to_right_table(self._file_message_expander, 1, False)
543
551
        self._file_message_expander.show()
544
552
 
545
553
    def _construct_global_message(self):
546
 
        self._global_message_label = Gtk.Label(label=_i18n('Global Commit Message'))
 
554
        self._global_message_label = gtk.Label(_i18n('Global Commit Message'))
547
555
        self._global_message_label.set_markup(
548
556
            _i18n('<b>Global Commit Message</b>'))
549
557
        self._global_message_label.set_alignment(0, 0)
552
560
        # Can we remove the spacing between the label and the box?
553
561
        self._global_message_label.show()
554
562
 
555
 
        scroller = Gtk.ScrolledWindow()
556
 
        scroller.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
 
563
        scroller = gtk.ScrolledWindow()
 
564
        scroller.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
557
565
 
558
 
        self._global_message_text_view = Gtk.TextView()
 
566
        self._global_message_text_view = gtk.TextView()
559
567
        self._set_global_commit_message(self._saved_commit_messages_manager.get()[0])
560
 
        self._global_message_text_view.modify_font(Pango.FontDescription("Monospace"))
 
568
        self._global_message_text_view.modify_font(pango.FontDescription("Monospace"))
561
569
        scroller.add(self._global_message_text_view)
562
 
        scroller.set_shadow_type(Gtk.ShadowType.IN)
 
570
        scroller.set_shadow_type(gtk.SHADOW_IN)
563
571
        scroller.show()
564
572
        self._add_to_right_table(scroller, 2, True)
565
 
        self._file_message_text_view.set_wrap_mode(Gtk.WrapMode.WORD)
 
573
        self._file_message_text_view.set_wrap_mode(gtk.WRAP_WORD)
566
574
        self._file_message_text_view.set_accepts_tab(False)
567
575
        self._global_message_text_view.show()
568
576
 
683
691
                _i18n('Commit cancelled'),
684
692
                _i18n('Do you want to save your commit messages ?'),
685
693
                parent=self)
686
 
            if response == Gtk.ResponseType.NO:
 
694
            if response == gtk.RESPONSE_NO:
687
695
                 # save nothing and destroy old comments if any
688
696
                mgr = SavedCommitMessagesManager()
689
697
        mgr.save(self._wt, self._wt.branch)
690
 
        self.response(Gtk.ResponseType.CANCEL) # close window
 
698
        self.response(gtk.RESPONSE_CANCEL) # close window
691
699
 
692
700
    @show_bzr_error
693
701
    def _on_commit_clicked(self, button):
702
710
                _i18n('Commit with an empty message?'),
703
711
                _i18n('You can describe your commit intent in the message.'),
704
712
                parent=self)
705
 
            if response == Gtk.ResponseType.NO:
 
713
            if response == gtk.RESPONSE_NO:
706
714
                # Kindly give focus to message area
707
715
                self._global_message_text_view.grab_focus()
708
716
                return
724
732
                _i18n("Unknown files exist in the working tree. Commit anyway?"),
725
733
                parent=self)
726
734
                # Doesn't set a parent for the dialog..
727
 
            if response == Gtk.ResponseType.NO:
 
735
            if response == gtk.RESPONSE_NO:
728
736
                return
729
737
            break
730
738
 
745
753
                _i18n('There are no changes in the working tree.'
746
754
                      ' Do you want to commit anyway?'),
747
755
                parent=self)
748
 
            if response == Gtk.ResponseType.YES:
 
756
            if response == gtk.RESPONSE_YES:
749
757
                rev_id = self._wt.commit(message,
750
758
                               allow_pointless=True,
751
759
                               strict=False,
755
763
        self.committed_revision_id = rev_id
756
764
        # destroy old comments if any
757
765
        SavedCommitMessagesManager().save(self._wt, self._wt.branch)
758
 
        self.response(Gtk.ResponseType.OK)
 
766
        self.response(gtk.RESPONSE_OK)
759
767
 
760
768
    def _get_global_commit_message(self):
761
769
        buf = self._global_message_text_view.get_buffer()
804
812
            self.global_message = u''
805
813
            self.file_messages = {}
806
814
        else:
807
 
            config = branch.get_config()
 
815
            config = branch.get_config()._get_branch_data_config()
808
816
            self.global_message = config.get_user_option(
809
817
                'gtk_global_commit_message')
810
818
            if self.global_message is None: