/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:45:15 UTC
  • mto: This revision was merged to the branch mainline in revision 492.
  • Revision ID: aaron@aaronbentley.com-20080508084515-0h1ge28g39mqab5s
Unify MergeDirectiveWindow and DiffWindow

Show diffs side-by-side

added added

removed removed

Lines of Context:
412
412
    differences between two revisions on a branch.
413
413
    """
414
414
 
415
 
    def __init__(self, parent=None):
 
415
    def __init__(self, parent=None, operations=None):
416
416
        Window.__init__(self, parent)
417
417
        self.set_border_width(0)
418
418
        self.set_title("bzrk diff")
423
423
        width = int(monitor.width * 0.66)
424
424
        height = int(monitor.height * 0.66)
425
425
        self.set_default_size(width, height)
426
 
 
 
426
        self.operations = operations
427
427
        self.construct()
428
428
 
429
429
    def construct(self):
443
443
 
444
444
        :return: None, meaning that no button bar will be used.
445
445
        """
446
 
        return None
 
446
        if self.operations is None:
 
447
            return None
 
448
        hbox = gtk.HButtonBox()
 
449
        hbox.set_layout(gtk.BUTTONBOX_START)
 
450
        for title, method in self.operations:
 
451
            merge_button = gtk.Button(title)
 
452
            merge_button.show()
 
453
            merge_button.set_relief(gtk.RELIEF_NONE)
 
454
            merge_button.connect("clicked", method)
 
455
            hbox.pack_start(merge_button, expand=False, fill=True)
 
456
        hbox.show()
 
457
        return hbox
 
458
 
 
459
    def _get_merge_target(self):
 
460
        d = gtk.FileChooserDialog('Merge branch', self,
 
461
                                  gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
 
462
                                  buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
 
463
                                           gtk.STOCK_CANCEL,
 
464
                                           gtk.RESPONSE_CANCEL,))
 
465
        try:
 
466
            result = d.run()
 
467
            if result != gtk.RESPONSE_OK:
 
468
                raise SelectCancelled()
 
469
            return d.get_current_folder_uri()
 
470
        finally:
 
471
            d.destroy()
 
472
 
 
473
    def _get_save_path(self, basename):
 
474
        d = gtk.FileChooserDialog('Save As', self,
 
475
                                  gtk.FILE_CHOOSER_ACTION_SAVE,
 
476
                                  buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
 
477
                                           gtk.STOCK_CANCEL,
 
478
                                           gtk.RESPONSE_CANCEL,))
 
479
        d.set_current_name(basename)
 
480
        try:
 
481
            result = d.run()
 
482
            if result != gtk.RESPONSE_OK:
 
483
                raise SelectCancelled()
 
484
            return urlutils.local_path_from_url(d.get_uri())
 
485
        finally:
 
486
            d.destroy()
447
487
 
448
488
    def set_diff_text(self, description, lines):
449
489
        """Set the diff from a text.
467
507
        self.diff.set_file(file_path)
468
508
 
469
509
 
470
 
class MergeDirectiveController(object):
471
 
 
472
 
    def __init__(self, directive, path):
 
510
class DiffController(object):
 
511
 
 
512
    def __init__(self, path, patch, window=None):
 
513
        self.path = path
 
514
        self.window = None
 
515
        self.patch = patch
 
516
        if window is None:
 
517
            window = DiffWindow(operations=self._provide_operations())
 
518
            self.initialize_window(window)
 
519
 
 
520
    def initialize_window(self, window):
 
521
        self.window = window
 
522
        window.set_diff_text(self.path, self.patch)
 
523
 
 
524
    def perform_save(self, window):
 
525
        try:
 
526
            save_path = self.window._get_save_path(osutils.basename(self.path))
 
527
        except SelectCancelled:
 
528
            return
 
529
        source = open(self.path, 'rb')
 
530
        try:
 
531
            target = open(save_path, 'wb')
 
532
            try:
 
533
                osutils.pumpfile(source, target)
 
534
            finally:
 
535
                target.close()
 
536
        finally:
 
537
            source.close()
 
538
 
 
539
    def _provide_operations(self):
 
540
        return [('Save', self.perform_save)]
 
541
 
 
542
 
 
543
class MergeDirectiveController(DiffController):
 
544
 
 
545
    def __init__(self, path, directive):
 
546
        DiffController.__init__(self, path, directive.patch.splitlines(True))
473
547
        self.directive = directive
474
 
        self.path = path
475
548
        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
549
 
486
550
    def _provide_operations(self):
487
551
        return [('Merge', self.perform_merge), ('Save', self.perform_save)]
517
581
        finally:
518
582
            tree.unlock()
519
583
 
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
 
 
555
 
    def _get_merge_target(self):
556
 
        d = gtk.FileChooserDialog('Merge branch', self,
557
 
                                  gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
558
 
                                  buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
559
 
                                           gtk.STOCK_CANCEL,
560
 
                                           gtk.RESPONSE_CANCEL,))
561
 
        try:
562
 
            result = d.run()
563
 
            if result != gtk.RESPONSE_OK:
564
 
                raise SelectCancelled()
565
 
            return d.get_current_folder_uri()
566
 
        finally:
567
 
            d.destroy()
568
 
 
569
 
    def _get_save_path(self, basename):
570
 
        d = gtk.FileChooserDialog('Save As', self,
571
 
                                  gtk.FILE_CHOOSER_ACTION_SAVE,
572
 
                                  buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK,
573
 
                                           gtk.STOCK_CANCEL,
574
 
                                           gtk.RESPONSE_CANCEL,))
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())
581
 
        finally:
582
 
            d.destroy()
583
 
 
584
584
 
585
585
def iter_changes_to_status(source, target):
586
586
    """Determine the differences between trees.