/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: Curtis Hovey
  • Date: 2011-07-31 16:50:29 UTC
  • mto: This revision was merged to the branch mainline in revision 741.
  • Revision ID: sinzui.is@verizon.net-20110731165029-9gixuqypi3lwapzm
Removed import_pygtk because gi does not impicitly call Main(). Inlined checks for gtk availablility.

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