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

  • Committer: Aaron Bentley
  • Date: 2008-05-08 08:16:51 UTC
  • mto: This revision was merged to the branch mainline in revision 492.
  • Revision ID: aaron@aaronbentley.com-20080508081651-cx3a679h03m7wt1n
Refactor merge directive window into MergeController

Show diffs side-by-side

added added

removed removed

Lines of Context:
467
467
        self.diff.set_file(file_path)
468
468
 
469
469
 
470
 
class MergeDirectiveWindow(DiffWindow):
 
470
class MergeDirectiveController(object):
471
471
 
472
472
    def __init__(self, directive, path):
473
 
        DiffWindow.__init__(self, None)
474
 
        self._merge_target = None
475
473
        self.directive = directive
476
474
        self.path = path
477
 
 
478
 
    def _get_button_bar(self):
479
 
        """The button bar has only the Merge button"""
480
 
        merge_button = gtk.Button('Merge')
481
 
        merge_button.show()
482
 
        merge_button.set_relief(gtk.RELIEF_NONE)
483
 
        merge_button.connect("clicked", self.perform_merge)
484
 
 
485
 
        save_button = gtk.Button('Save')
486
 
        save_button.show()
487
 
        save_button.set_relief(gtk.RELIEF_NONE)
488
 
        save_button.connect("clicked", self.perform_save)
489
 
 
490
 
        hbox = gtk.HButtonBox()
491
 
        hbox.set_layout(gtk.BUTTONBOX_START)
492
 
        hbox.pack_start(merge_button, expand=False, fill=True)
493
 
        hbox.pack_start(save_button, expand=False, fill=True)
494
 
        hbox.show()
495
 
        return hbox
 
475
        self.merge_target = None
 
476
        self.window = None
 
477
 
 
478
    @staticmethod
 
479
    def for_gtk(directive, path):
 
480
        controller = MergeDirectiveController(directive, path)
 
481
        window = MergeDirectiveWindow(controller._provide_operations())
 
482
        controller.window = window
 
483
        window.set_diff_text(path, directive.patch.splitlines(True))
 
484
        return controller
 
485
 
 
486
    def _provide_operations(self):
 
487
        return [('Merge', self.perform_merge), ('Save', self.perform_save)]
496
488
 
497
489
    def perform_merge(self, window):
498
 
        try:
499
 
            tree = self._get_merge_target()
500
 
        except SelectCancelled:
501
 
            return
 
490
        if self.merge_target is None:
 
491
            try:
 
492
                self.merge_target = self.window._get_merge_target()
 
493
            except SelectCancelled:
 
494
                return
 
495
        tree = workingtree.WorkingTree.open(self.merge_target)
502
496
        tree.lock_write()
503
497
        try:
504
498
            try:
517
511
                    warning_dialog(_('Conflicts encountered'),
518
512
                                   _('Please resolve the conflicts manually'
519
513
                                     ' before committing.'))
520
 
                self.destroy()
 
514
                self.window.destroy()
521
515
            except Exception, e:
522
516
                error_dialog('Error', str(e))
523
517
        finally:
524
518
            tree.unlock()
525
519
 
 
520
    def perform_save(self, window):
 
521
        try:
 
522
            save_path = self.window._get_save_path(osutils.basename(self.path))
 
523
        except SelectCancelled:
 
524
            return
 
525
        source = open(self.path, 'rb')
 
526
        try:
 
527
            target = open(save_path, 'wb')
 
528
            try:
 
529
                osutils.pumpfile(source, target)
 
530
            finally:
 
531
                target.close()
 
532
        finally:
 
533
            source.close()
 
534
 
 
535
 
 
536
class MergeDirectiveWindow(DiffWindow):
 
537
 
 
538
    def __init__(self, operations):
 
539
        self.operations = operations
 
540
        DiffWindow.__init__(self, None)
 
541
 
 
542
    def _get_button_bar(self):
 
543
        """The button bar has only the Merge button"""
 
544
        hbox = gtk.HButtonBox()
 
545
        hbox.set_layout(gtk.BUTTONBOX_START)
 
546
        for title, method in self.operations:
 
547
            merge_button = gtk.Button(title)
 
548
            merge_button.show()
 
549
            merge_button.set_relief(gtk.RELIEF_NONE)
 
550
            merge_button.connect("clicked", method)
 
551
            hbox.pack_start(merge_button, expand=False, fill=True)
 
552
        hbox.show()
 
553
        return hbox
 
554
 
526
555
    def _get_merge_target(self):
527
 
        if self._merge_target is not None:
528
 
            return self._merge_target
529
556
        d = gtk.FileChooserDialog('Merge branch', self,
530
557
                                  gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
531
558
                                  buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
535
562
            result = d.run()
536
563
            if result != gtk.RESPONSE_OK:
537
564
                raise SelectCancelled()
538
 
            uri = d.get_current_folder_uri()
 
565
            return d.get_current_folder_uri()
539
566
        finally:
540
567
            d.destroy()
541
 
        return workingtree.WorkingTree.open(uri)
542
568
 
543
 
    def perform_save(self, window):
 
569
    def _get_save_path(self, basename):
544
570
        d = gtk.FileChooserDialog('Save As', self,
545
571
                                  gtk.FILE_CHOOSER_ACTION_SAVE,
546
572
                                  buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
547
573
                                           gtk.STOCK_CANCEL,
548
574
                                           gtk.RESPONSE_CANCEL,))
549
 
        d.set_current_name(osutils.basename(self.path))
550
 
        try:
551
 
            try:
552
 
                result = d.run()
553
 
                if result != gtk.RESPONSE_OK:
554
 
                    raise SelectCancelled()
555
 
                uri = d.get_uri()
556
 
            finally:
557
 
                d.destroy()
558
 
        except SelectCancelled:
559
 
            return
560
 
        source = open(self.path, 'rb')
561
 
        try:
562
 
            target = open(urlutils.local_path_from_url(uri), 'wb')
563
 
            try:
564
 
                target.write(source.read())
565
 
            finally:
566
 
                target.close()
 
575
        d.set_current_name(basename)
 
576
        try:
 
577
            result = d.run()
 
578
            if result != gtk.RESPONSE_OK:
 
579
                raise SelectCancelled()
 
580
            return urlutils.local_path_from_url(d.get_uri())
567
581
        finally:
568
 
            source.close()
 
582
            d.destroy()
569
583
 
570
584
 
571
585
def iter_changes_to_status(source, target):