Tools__ChangeSetDiffTool.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Wed, 19 Jul 2017 09:42:32 +0200
branchjv
changeset 17619 edb119820fcb
parent 17133 f9f20407fbf9
child 18532 cccb41254edf
permissions -rw-r--r--
Issue #154: Set window style using `#beToolWindow` to indicate that the minirunner window is kind of support tool rather than some X11 specific code (which does not work on Windows of course) See https://swing.fit.cvut.cz/projects/stx-jv/ticket/154

"
 Copyright (c) 2007-2010 Jan Vrany
 Copyright (c) 2009-2010 eXept Software AG

 Permission is hereby granted, free of charge, to any person
 obtaining a copy of this software and associated documentation
 files (the 'Software'), to deal in the Software without
 restriction, including without limitation the rights to use,
 copy, modify, merge, publish, distribute, sublicense, and/or sell
 copies of the Software, and to permit persons to whom the
 Software is furnished to do so, subject to the following
 conditions:

 The above copyright notice and this permission notice shall be
 included in all copies or substantial portions of the Software.

 THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 OTHER DEALINGS IN THE SOFTWARE.
"
"{ Package: 'stx:libtool' }"

"{ NameSpace: Tools }"

ApplicationModel subclass:#ChangeSetDiffTool
	instanceVariableNames:'infoPanel diffInfoHolder listHolder singleSelectionHolder
		diffsetHolder titleHolder firstColSelectionHolder
		navigatorPanelSpecHolder diffMenuHolder diffsetHolderPrivate
		selectionHolder versionATextHolder versionBTextHolder
		versionBaseTextHolder textDiffToolHolder
		textDiffToolWindowSpecHolder mergeHolder mergeData
		mergeDataHolder showVersionMethodDiffsHolder
		showCopyrightMethodDiffsHolder highlightConflictsHolder
		hasDiffsetHolder mergeSavedHolder canSaveHolder
		autoMoveToNextConflictHolder textDiff2App textDiff3App list1App
		list2App alreadyWarnedAboutUnsavedMerge labelSpecHolder
		labelsView navigatorAndDiffPanelView codeAspectHolder'
	classVariableNames:'LastDiffInfo AutoMoveToNextConflict'
	poolDictionaries:''
	category:'Interface-Diff'
!

SimpleDialog subclass:#OpenDialog
	instanceVariableNames:'doAcceptEnabled changesetSpecAHolder changesetSpecBHolder
		changesetSpecBaseHolder changesetSpecBaseEnabledHolder
		changesetSpecMergedHolder changesetSpecMergedEnabledHolder'
	classVariableNames:'LastDirectory'
	poolDictionaries:''
	privateIn:ChangeSetDiffTool
!

!ChangeSetDiffTool class methodsFor:'documentation'!

copyright
"
 Copyright (c) 2007-2010 Jan Vrany
 Copyright (c) 2009-2010 eXept Software AG

 Permission is hereby granted, free of charge, to any person
 obtaining a copy of this software and associated documentation
 files (the 'Software'), to deal in the Software without
 restriction, including without limitation the rights to use,
 copy, modify, merge, publish, distribute, sublicense, and/or sell
 copies of the Software, and to permit persons to whom the
 Software is furnished to do so, subject to the following
 conditions:

 The above copyright notice and this permission notice shall be
 included in all copies or substantial portions of the Software.

 THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 OTHER DEALINGS IN THE SOFTWARE.

"
!

documentation
"
    Tool for viewing/merging differences between two change sets

    [author:]
	Jan Vrany <jan.vrany@fit.cvut.cz>

    [instance variables:]

    [class variables:]

    [see also:]

"
!

examples
"
  Starting the application:
								[exBegin]
    Tools::ChangeSetDiffTool open

								[exEnd]

  Show differences between CVS HEAD and SVN jv-branch
  NewSystemBrowser:
								[exBegin]
    | cvsCs svnCs |

    cvsCs := ChangeSet fromFile:'/home/jv/Private/Projects/SmalltalkX/sources/branches/exept@HEAD/stx/libtool/Tools__NewSystemBrowser.st'.
    svnCs := ChangeSet fromFile:'/home/jv/Private/Projects/SmalltalkX/sources/branches/jv2/build/stx/libtool/Tools__NewSystemBrowser.st'.

    Tools::ChangeSetDiffTool new
	open;
	fileMenuOpenOnDiffBetween: cvsCs and: svnCs.

								[exEnd]

  Show differences between CVS HEAD and SVN jv-branch and
  base version of NewSystemBrowser:

								[exBegin]
    | cvsBaseCs cvsCs svnCs |

    cvsBaseCs := ChangeSet fromFile:'/home/jv/Private/Projects/SmalltalkX/sources/branches/exept@2012-01-01/stx/libtool/Tools__NewSystemBrowser.st'.
    cvsCs := ChangeSet fromFile:'/home/jv/Private/Projects/SmalltalkX/sources/branches/exept@HEAD/stx/libtool/Tools__NewSystemBrowser.st'.
    svnCs := ChangeSet fromFile:'/home/jv/Private/Projects/SmalltalkX/sources/branches/jv2/build/stx/libtool/Tools__NewSystemBrowser.st'.

    Tools::ChangeSetDiffTool new
	open;
	fileMenuOpenOnDiffBetween: cvsCs and: svnCs base: cvsBaseCs

								[exEnd]



"
! !

!ChangeSetDiffTool class methodsFor:'accessing'!

autoMoveToNextConflict
    ^AutoMoveToNextConflict == true

    "Created: / 17-01-2013 / 19:49:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

autoMoveToNextConflict: aBoolean
    AutoMoveToNextConflict := aBoolean

    "Created: / 17-01-2013 / 19:49:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!ChangeSetDiffTool class methodsFor:'accessing - defaults'!

versionAColor

    ^Color green lightened lightened

    "Created: / 01-11-2009 / 10:14:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

versionBColor

    ^Color blue lightened lightened

    "Created: / 01-11-2009 / 10:14:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

versionBaseColor

    ^Color yellow lightened lightened

    "Created: / 01-11-2009 / 10:14:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

versionNotPresentText
    ^ 'Not present' allItalic withColor:Color gray lighter
! !

!ChangeSetDiffTool class methodsFor:'image specs'!

mergeDiff3AToMergedArrow30x30

    ^ToolbarIconLibrary mergeDiff3AToMergedArrow30x30

    "Created: / 17-01-2013 / 23:51:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

mergeDiff3BToMergedArrow30x30

    ^ToolbarIconLibrary mergeDiff3BToMergedArrow30x30

    "Created: / 17-01-2013 / 23:51:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

mergeDiff3BaseToAArrow30x30

    ^ToolbarIconLibrary mergeDiff3BaseToAArrow30x30

    "Created: / 17-01-2013 / 23:52:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

mergeDiff3BaseToBArrow30x30

    ^ToolbarIconLibrary mergeDiff3BaseToBArrow30x30

    "Created: / 17-01-2013 / 23:51:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

versionA24x24

    ^ToolbarIconLibrary versionA24x24

    "Created: / 24-03-2010 / 20:49:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

versionB24x24

    ^ToolbarIconLibrary versionB24x24

    "Created: / 24-03-2010 / 20:50:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

versionBase24x24

    ^ToolbarIconLibrary versionBase24x24

    "Created: / 17-01-2013 / 22:53:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

versionMerged24x24

    ^ToolbarIconLibrary versionMerged24x24

    "Created: / 17-01-2013 / 22:54:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!ChangeSetDiffTool class methodsFor:'interface opening'!

open
    | tool |

    tool := self new.
    tool open.
    tool window sensor pushUserEvent: #fileMenuOpen for: tool.

    "Created: / 01-08-2012 / 15:13:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!ChangeSetDiffTool class methodsFor:'interface specs'!

labelDiff2Spec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:Tools::ChangeSetDiffTool andSelector:#labelDiff2Spec
     Tools::ChangeSetDiffTool new openInterface:#labelDiff2Spec
    "

    <resource: #canvas>

    ^
     #(FullSpec
	name: labelDiff2Spec
	window:
       (WindowSpec
	  label: 'Label'
	  name: 'Label'
	  min: (Point 10 10)
	  bounds: (Rectangle 0 0 600 60)
	)
	component:
       (SpecCollection
	  collection: (
	   (UISubSpecification
	      name: 'LabelA'
	      layout: (LayoutFrame 0 0 0 0 0 1 0 0.5)
	      minorKey: versionALabelSpec
	    )
	   (UISubSpecification
	      name: 'LabelB'
	      layout: (LayoutFrame 0 0 0 0.5 0 1 0 1)
	      minorKey: versionBLabelSpec
	    )
	   )

	)
      )
!

labelDiff3Spec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:Tools::ChangeSetDiffTool andSelector:#labelDiff3Spec
     Tools::ChangeSetDiffTool new openInterface:#labelDiff3Spec
    "

    <resource: #canvas>

    ^
     #(FullSpec
	name: labelDiff3Spec
	window:
       (WindowSpec
	  label: 'Label'
	  name: 'Label'
	  min: (Point 10 10)
	  bounds: (Rectangle 0 0 600 90)
	)
	component:
       (SpecCollection
	  collection: (
	   (UISubSpecification
	      name: 'LabelBase'
	      layout: (LayoutFrame 0 0 0 0 0 1 30 0)
	      minorKey: versionBaseLabelSpec
	    )
	   (UISubSpecification
	      name: 'LabelA'
	      layout: (LayoutFrame 0 0 30 0 0 1 60 0)
	      minorKey: versionALabelSpec
	    )
	   (UISubSpecification
	      name: 'LabelB'
	      layout: (LayoutFrame 0 0 60 0 0 1 0 1)
	      minorKey: versionBLabelSpec
	    )
	   )

	)
      )
!

labelMergeSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:Tools::ChangeSetDiffTool andSelector:#labelMergeSpec
     Tools::ChangeSetDiffTool new openInterface:#labelMergeSpec
    "

    <resource: #canvas>

    ^
     #(FullSpec
	name: labelMergeSpec
	window:
       (WindowSpec
	  label: 'Label'
	  name: 'Label'
	  min: (Point 10 10)
	  bounds: (Rectangle 0 0 600 120)
	)
	component:
       (SpecCollection
	  collection: (
	   (UISubSpecification
	      name: 'LabelBase'
	      layout: (LayoutFrame 0 0 0 0 0 1 30 0)
	      minorKey: mergeBaseLabelSpec
	    )
	   (UISubSpecification
	      name: 'LabelA'
	      layout: (LayoutFrame 0 0 30 0 0 1 60 0)
	      minorKey: mergeALabelSpec
	    )
	   (UISubSpecification
	      name: 'LabelB'
	      layout: (LayoutFrame 0 0 60 0 0 1 90 0)
	      minorKey: mergeBLabelSpec
	    )
	   (UISubSpecification
	      name: 'SubSpecification1'
	      layout: (LayoutFrame 0 0 90 0 0 1 0 1)
	      minorKey: mergeMergeLabelSpec
	    )
	   )

	)
      )

    "Modified: / 17-01-2013 / 23:47:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

labelSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:SVN::DiffBrowser andSelector:#labelSpec
     SVN::DiffBrowser new openInterface:#labelSpec
    "

    <resource: #canvas>

    ^ 
     #(FullSpec
        name: labelSpec
        window: 
       (WindowSpec
          label: 'Label'
          name: 'Label'
          min: (Point 10 10)
          bounds: (Rectangle 0 0 600 48)
        )
        component: 
       (SpecCollection
          collection: (
           (UISubSpecification
              name: 'LabelA'
              layout: (LayoutFrame 0 0 0 0 0 1 0 0.5)
              minorKey: versionALabelSpec
            )
           (UISubSpecification
              name: 'LabelB'
              layout: (LayoutFrame 0 0 0 0.5 0 1 0 1)
              minorKey: versionBLabelSpec
            )
           )
         
        )
      )
!

oneColumnNavigatorSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:Tools::ChangeSetDiffTool andSelector:#oneColumnNavigatorSpec
     Tools::ChangeSetDiffTool new openInterface:#oneColumnNavigatorSpec
    "

    <resource: #canvas>

    ^
     #(FullSpec
	name: oneColumnNavigatorSpec
	window:
       (WindowSpec
	  label: 'One Column Navigator'
	  name: 'One Column Navigator'
	  min: (Point 10 10)
	  bounds: (Rectangle 0 0 300 300)
	)
	component:
       (SpecCollection
	  collection: (
	   (SubCanvasSpec
	      name: 'DiffList'
	      layout: (LayoutFrame 0 0 0 0 0 1 0 1)
	      hasHorizontalScrollBar: false
	      hasVerticalScrollBar: false
	      majorKey: #'Tools::ChangeSetDiffList'
	      subAspectHolders:
	     (Array

	       (SubChannelInfoSpec
		  subAspect: highlightConflictsHolder
		  aspect: highlightConflictsHolder
		)
	       (SubChannelInfoSpec
		  subAspect: inGeneratorHolder
		  aspect: diffsetHolderPrivate
		)

	       (SubChannelInfoSpec
		  subAspect: listEntryLabelGenerator
		  aspect: diffListEntryLabelGeneratorAspect
		)
	       (SubChannelInfoSpec
		  subAspect: menuHolder
		  aspect: listMenuHolder
		)

	       (SubChannelInfoSpec
		  subAspect: outGeneratorHolder
		  aspect: selectionHolder
		)
	       (SubChannelInfoSpec
		  subAspect: showCopyrightMethodDiffsHolder
		  aspect: showCopyrightMethodDiffsHolder
		)

	       (SubChannelInfoSpec
		  subAspect: showVersionMethodDiffsHolder
		  aspect: showVersionMethodDiffsHolder
		)
	      )
	      createNewApplication: true
	      createNewBuilder: false
	      postBuildCallback: list1View:
	    )
	   )

	)
      )
!

twoColumnNavigatorSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:Tools::ChangeSetDiffTool andSelector:#twoColumnNavigatorSpec
     Tools::ChangeSetDiffTool new openInterface:#twoColumnNavigatorSpec
    "

    <resource: #canvas>

    ^
     #(FullSpec
	name: twoColumnNavigatorSpec
	window:
       (WindowSpec
	  label: 'Two Column Navigator'
	  name: 'Two Column Navigator'
	  min: (Point 10 10)
	  bounds: (Rectangle 0 0 300 300)
	)
	component:
       (SpecCollection
	  collection: (
	   (VariableHorizontalPanelSpec
	      name: 'Columns'
	      layout: (LayoutFrame 0 0 0 0 0 1 0 1)
	      component:
	     (SpecCollection
		collection: (
		 (SubCanvasSpec
		    name: 'LeftList'
		    hasHorizontalScrollBar: false
		    hasVerticalScrollBar: false
		    majorKey: #'Tools::ChangeSetDiffList'
		    subAspectHolders:
		   (Array

		     (SubChannelInfoSpec
			subAspect: highlightConflictsHolder
			aspect: highlightConflictsHolder
		      )
		     (SubChannelInfoSpec
			subAspect: inGeneratorHolder
			aspect: diffsetHolderPrivate
		      )

		     (SubChannelInfoSpec
			subAspect: listEntryLabelGenerator
			aspect: diffListEntryLabelGeneratorAspect
		      )
		     (SubChannelInfoSpec
			subAspect: menuHolder
			aspect: listMenuHolder
		      )

		     (SubChannelInfoSpec
			subAspect: outGeneratorHolder
			aspect: firstColSelectionHolder
		      )
		     (SubChannelInfoSpec
			subAspect: showCopyrightMethodDiffsHolder
			aspect: showCopyrightMethodDiffsHolder
		      )

		     (SubChannelInfoSpec
			subAspect: showVersionMethodDiffsHolder
			aspect: showVersionMethodDiffsHolder
		      )
		    )
		    createNewApplication: true
		    createNewBuilder: true
		    postBuildCallback: list1View:
		  )
		 (SubCanvasSpec
		    name: 'RightList'
		    hasHorizontalScrollBar: false
		    hasVerticalScrollBar: false
		    majorKey: #'Tools::ChangeSetDiffList'
		    subAspectHolders:
		   (Array

		     (SubChannelInfoSpec
			subAspect: highlightConflictsHolder
			aspect: highlightConflictsHolder
		      )
		     (SubChannelInfoSpec
			subAspect: inGeneratorHolder
			aspect: firstColSelectionHolder
		      )

		     (SubChannelInfoSpec
			subAspect: listEntryLabelGenerator
			aspect: diffListEntryLabelGeneratorAspect
		      )
		     (SubChannelInfoSpec
			subAspect: menuHolder
			aspect: listMenuHolder
		      )

		     (SubChannelInfoSpec
			subAspect: outGeneratorHolder
			aspect: selectionHolder
		      )
		     (SubChannelInfoSpec
			subAspect: showCopyrightMethodDiffsHolder
			aspect: showCopyrightMethodDiffsHolder
		      )

		     (SubChannelInfoSpec
			subAspect: showVersionMethodDiffsHolder
			aspect: showVersionMethodDiffsHolder
		      )
		    )
		    createNewApplication: true
		    createNewBuilder: true
		    postBuildCallback: list2View:
		  )
		 )

	      )
	      handles: (Any 0.5 1.0)
	    )
	   )

	)
      )
!

windowSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:Tools::ChangeSetDiffTool andSelector:#windowSpec
     Tools::ChangeSetDiffTool new openInterface:#windowSpec
     Tools::ChangeSetDiffTool open
    "

    <resource: #canvas>

    ^
     #(FullSpec
	name: windowSpec
	window:
       (WindowSpec
	  label: 'Diff Browser'
	  name: 'Diff Browser'
	  min: (Point 10 10)
	  bounds: (Rectangle 0 0 1024 768)
	  menu: mainMenu
	)
	component:
       (SpecCollection
	  collection: (
	   (MenuPanelSpec
	      name: 'ToolBar'
	      layout: (LayoutFrame 0 0 0 0 0 1 30 0)
	      menu: toolbarMenu
	      textDefault: true
	    )
	   (SubCanvasSpec
	      name: 'InfoPanel'
	      layout: (LayoutFrame 0 0 30 0 0 1 70 0)
	      level: 0
	      initiallyInvisible: true
	      hasHorizontalScrollBar: false
	      hasVerticalScrollBar: false
	      clientKey: infoPanel
	      createNewBuilder: false
	    )
	   (ViewSpec
	      name: 'Content'
	      layout: (LayoutFrame 0 0 30 0 0 1 0 1)
	      component:
	     (SpecCollection
		collection: (
		 (SubCanvasSpec
		    name: 'Labels'
		    layout: (LayoutFrame 0 0 0 0 0 1 60 0)
		    hasHorizontalScrollBar: false
		    hasVerticalScrollBar: false
		    specHolder: labelSpecHolder
		    createNewBuilder: false
		    postBuildCallback: labelsView:
		  )
		 (VariableVerticalPanelSpec
		    name: 'NavigatorAndDiffPanel'
		    layout: (LayoutFrame 0 0 60 0 0 1 0 1)
		    initiallyInvisible: true
		    visibilityChannel: hasDiffsetHolder
		    showHandle: true
		    component:
		   (SpecCollection
		      collection: (
		       (SubCanvasSpec
			  name: 'NavigatorPanel'
			  hasHorizontalScrollBar: false
			  hasVerticalScrollBar: false
			  specHolder: navigatorPanelSpecHolder
			  createNewBuilder: false
			)
		       (SubCanvasSpec
			  name: 'SubCanvas1'
			  specHolder: textDiffToolWindowSpecHolder
			  clientHolder: textDiffToolHolder
			  createNewBuilder: false
			)
		       )

		    )
		    handles: (Any 0.3 1.0)
		    postBuildCallback: navigatorAndDiffPanelView:
		  )
		 )

	      )
	    )
	   )

	)
      )

    "Modified: / 18-01-2013 / 00:07:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!ChangeSetDiffTool class methodsFor:'interface specs - labels'!

mergeALabelSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:Tools::ChangeSetDiffTool andSelector:#mergeALabelSpec
     Tools::ChangeSetDiffTool new openInterface:#mergeALabelSpec
    "

    <resource: #canvas>

    ^
     #(FullSpec
	name: mergeALabelSpec
	window:
       (WindowSpec
	  label: 'Version A'
	  name: 'Version A'
	  min: (Point 10 10)
	  bounds: (Rectangle 0 0 300 30)
	  backgroundColor: (Color 79.6078431372549 90.5882352941177 69.4117647058823)
	  forceRecursiveBackground: true
	)
	component:
       (SpecCollection
	  collection: (
	   (LabelSpec
	      label: 'mergeDiff3BaseToAArrow30x30'
	      name: 'Label1'
	      layout: (LayoutFrame 0 0 0 0 30 0 0 1)
	      hasCharacterOrientedLabel: false
	      translateLabel: true
	    )
	   (LabelSpec
	      label: 'versionA24x24'
	      name: 'VersionAIcon'
	      layout: (LayoutFrame 30 0 -12 0.5 57 0 12 0.5)
	      hasCharacterOrientedLabel: false
	      translateLabel: true
	    )
	   (LabelSpec
	      label: 'mergeDiff3AToMergedArrow30x30'
	      name: 'Label2'
	      layout: (LayoutFrame 60 0 0 0 90 0 0 1)
	      hasCharacterOrientedLabel: false
	      translateLabel: true
	    )
	   (LabelSpec
	      label: 'Version A'
	      name: 'VersionALabel'
	      layout: (LayoutFrame 90 0 0 0 0 1 0 1)
	      translateLabel: true
	      labelChannel: versionALabelHolder
	      resizeForLabel: true
	      adjust: left
	    )
	   (LabelSpec
	      label: '(A)'
	      name: 'ALabel'
	      layout: (LayoutFrame -30 1 0 0 0 1 0 1)
	      translateLabel: true
	    )
	   )

	)
      )
!

mergeBLabelSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:Tools::ChangeSetDiffTool andSelector:#versionBLabelSpec
     Tools::ChangeSetDiffTool new openInterface:#versionBLabelSpec
    "

    <resource: #canvas>

    ^
     #(FullSpec
	name: versionBLabelSpec
	window:
       (WindowSpec
	  label: 'Version B'
	  name: 'Version B'
	  min: (Point 10 10)
	  bounds: (Rectangle 0 0 300 30)
	  backgroundColor: (Color 100.0 90.5882352941177 60.0)
	  forceRecursiveBackground: true
	)
	component:
       (SpecCollection
	  collection: (
	    (LabelSpec
	      label: 'mergeDiff3BaseToBArrow30x30'
	      name: 'Label1'
	      layout: (LayoutFrame 0 0 0 0 30 0 0 1)
	      hasCharacterOrientedLabel: false
	      translateLabel: true
	    )
	   (LabelSpec
	      label: 'versionB24x24'
	      name: 'VersionBIcon'
	      layout: (LayoutFrame 30 0 -12 0.5 57 0 12 0.5)
	      hasCharacterOrientedLabel: false
	      translateLabel: true
	    )
	    (LabelSpec
	      label: 'mergeDiff3BToMergedArrow30x30'
	      name: 'Label2'
	      layout: (LayoutFrame 60 0 0 0 90 0 0 1)
	      hasCharacterOrientedLabel: false
	      translateLabel: true
	    )
	   (LabelSpec
	      label: 'Version B'
	      name: 'VersionBLabel'
	      layout: (LayoutFrame 90 0 0 0 167 0 0 1)
	      translateLabel: true
	      labelChannel: versionBLabelHolder
	      resizeForLabel: true
	      adjust: left
	      useDynamicPreferredWidth: true
	      usePreferredWidth: true
	    )
	     (LabelSpec
	     label: '(B)'
	     name: 'BLabel'
	     layout: (LayoutFrame -30 1 0 0 0 1 0 1)
	     translateLabel: true
	    )
	   )

	)
      )

    "Created: / 17-01-2013 / 23:44:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

mergeBaseLabelSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:Tools::ChangeSetDiffTool andSelector:#versionBaseLabelSpec
     Tools::ChangeSetDiffTool new openInterface:#versionBaseLabelSpec
    "

    <resource: #canvas>

    ^
     #(FullSpec
	name: versionBaseLabelSpec
	window:
       (WindowSpec
	  label: 'Version Base'
	  name: 'Version Base'
	  min: (Point 10 10)
	  bounds: (Rectangle 0 0 300 30)
	  backgroundColor: (Color 67.843137254902 87.843137254902 96.4705882352941)
	  forceRecursiveBackground: true
	)
	component:
       (SpecCollection
	  collection: (
	   (LabelSpec
	      label: 'versionBase24x24'
	      name: 'VersionBIcon'
	      layout: (LayoutFrame 0 0 -12 0.5 27 0 12 0.5)
	      hasCharacterOrientedLabel: false
	      translateLabel: true
	    )
	   (LabelSpec
	      label: 'Version B'
	      name: 'VersionBLabel'
	      layout: (LayoutFrame 90 0 0 0 190 0 0 1)
	      translateLabel: true
	      labelChannel: versionBaseLabelHolder
	      resizeForLabel: true
	      adjust: left
	      useDynamicPreferredWidth: true
	      usePreferredWidth: true
	    )
	   (LabelSpec
	      label: '(Base)'
	      name: 'BaseLabel'
	      layout: (LayoutFrame -50 1 0 0 0 1 0 1)
	      translateLabel: true
	    )
	   )

	)
      )

    "Created: / 17-01-2013 / 23:44:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

mergeMergeLabelSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:Tools::ChangeSetDiffTool andSelector:#mergeMergeLabelSpec
     Tools::ChangeSetDiffTool new openInterface:#mergeMergeLabelSpec
    "

    <resource: #canvas>

    ^
     #(FullSpec
	name: mergeMergeLabelSpec
	window:
       (WindowSpec
	  label: 'Version Merged'
	  name: 'Version Merged'
	  min: (Point 10 10)
	  bounds: (Rectangle 0 0 300 30)
	  backgroundColor: (Color 96.2554360265507 72.7275501640345 95.8999008163577)
	  forceRecursiveBackground: true
	)
	component:
       (SpecCollection
	  collection: (
	   (LabelSpec
	      label: 'versionMerged24x24'
	      name: 'VersionMergedIcon'
	      layout: (LayoutFrame 60 0 -12 0.5 87 0 12 0.5)
	      hasCharacterOrientedLabel: false
	      translateLabel: true
	    )
	   (LabelSpec
	      label: 'Version B'
	      name: 'VersionMergedLabel'
	      layout: (LayoutFrame 90 0 0 0 267 0 0 1)
	      translateLabel: true
	      labelChannel: versionMergedLabelHolder
	      resizeForLabel: true
	      adjust: left
	      useDynamicPreferredWidth: true
	      usePreferredWidth: true
	    )
	   (LabelSpec
	      label: '(Merge)'
	      name: 'MergedLabel'
	      layout: (LayoutFrame -70 1 0 0 0 1 0 1)
	      translateLabel: true
	    )
	   )

	)
      )
!

versionALabelSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:Tools::ChangeSetDiffTool andSelector:#versionALabelSpec
     Tools::ChangeSetDiffTool new openInterface:#versionALabelSpec
    "

    <resource: #canvas>

    ^ 
     #(FullSpec
        name: versionALabelSpec
        window: 
       (WindowSpec
          label: 'Version A'
          name: 'Version A'
          min: (Point 10 10)
          bounds: (Rectangle 0 0 300 30)
          backgroundColor: (Color 79.6078431372549 90.5882352941177 69.4117647058823)
          forceRecursiveBackground: true
        )
        component: 
       (SpecCollection
          collection: (
           (LabelSpec
              label: 'versionA24x24'
              name: 'VersionAIcon'
              layout: (LayoutFrame 0 0 -12 0.5 27 0 12 0.5)
              hasCharacterOrientedLabel: false
              translateLabel: true
            )
           (LabelSpec
              label: 'Version A'
              name: 'VersionALabel'
              layout: (LayoutFrame 30 0 0 0 0 1 0 1)
              translateLabel: true
              labelChannel: versionALabelHolder
              resizeForLabel: true
              adjust: left
            )
           (LabelSpec
              label: '(A)'
              name: 'ALabel'
              layout: (LayoutFrame -30 1 0 0 0 1 0 1)
              translateLabel: true
            )
           )
         
        )
      )
!

versionBLabelSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:Tools::ChangeSetDiffTool andSelector:#versionBLabelSpec
     Tools::ChangeSetDiffTool new openInterface:#versionBLabelSpec
    "

    <resource: #canvas>

    ^ 
     #(FullSpec
        name: versionBLabelSpec
        window: 
       (WindowSpec
          label: 'Version B'
          name: 'Version B'
          min: (Point 10 10)
          bounds: (Rectangle 0 0 300 30)
          backgroundColor: (Color 100.0 90.5882352941177 60.0)
          forceRecursiveBackground: true
        )
        component: 
       (SpecCollection
          collection: (
           (LabelSpec
              label: 'versionB24x24'
              name: 'VersionBIcon'
              layout: (LayoutFrame 0 0 -12 0.5 27 0 12 0.5)
              hasCharacterOrientedLabel: false
              translateLabel: true
            )
           (LabelSpec
              label: 'Version B'
              name: 'VersionBLabel'
              layout: (LayoutFrame 30 0 0 0 167 0 0 1)
              translateLabel: true
              labelChannel: versionBLabelHolder
              resizeForLabel: true
              adjust: left
              useDynamicPreferredWidth: true
              usePreferredWidth: true
            )
             (LabelSpec
             label: '(B)'
             name: 'BLabel'
             layout: (LayoutFrame -30 1 0 0 0 1 0 1)
             translateLabel: true
            )
           )
         
        )
      )

    "Modified: / 16-12-2011 / 14:17:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

versionBaseLabelSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:Tools::ChangeSetDiffTool andSelector:#versionBaseLabelSpec
     Tools::ChangeSetDiffTool new openInterface:#versionBaseLabelSpec
    "

    <resource: #canvas>

    ^
     #(FullSpec
	name: versionBaseLabelSpec
	window:
       (WindowSpec
	  label: 'Version Base'
	  name: 'Version Base'
	  min: (Point 10 10)
	  bounds: (Rectangle 0 0 300 30)
	  backgroundColor: (Color 67.843137254902 87.843137254902 96.4705882352941)
	  forceRecursiveBackground: true
	)
	component:
       (SpecCollection
	  collection: (
	   (LabelSpec
	      label: 'versionBase24x24'
	      name: 'VersionBIcon'
	      layout: (LayoutFrame 0 0 -12 0.5 27 0 12 0.5)
	      hasCharacterOrientedLabel: false
	      translateLabel: true
	    )
	   (LabelSpec
	      label: 'Version B'
	      name: 'VersionBLabel'
	      layout: (LayoutFrame 30 0 0 0 190 0 0 1)
	      translateLabel: true
	      labelChannel: versionBaseLabelHolder
	      resizeForLabel: true
	      adjust: left
	      useDynamicPreferredWidth: true
	      usePreferredWidth: true
	    )
	   (LabelSpec
	      label: '(Base)'
	      name: 'BaseLabel'
	      layout: (LayoutFrame -50 1 0 0 0 1 0 1)
	      translateLabel: true
	    )
	   )

	)
      )
!

versionMergeLabelSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:Tools::ChangeSetDiffTool andSelector:#versionBaseLabelSpec
     Tools::ChangeSetDiffTool new openInterface:#versionBaseLabelSpec
    "

    <resource: #canvas>

    ^
     #(FullSpec
	name: versionBaseLabelSpec
	window:
       (WindowSpec
	  label: 'Version Merged'
	  name: 'Version Merged'
	  min: (Point 10 10)
	  bounds: (Rectangle 0 0 300 30)
	  backgroundColor: (Color 96.2554360265507 72.7275501640345 95.8999008163577)
	  forceRecursiveBackground: true
	)
	component:
       (SpecCollection
	  collection: (
	   (LabelSpec
	      label: 'versionMerged24x24'
	      name: 'VersionMergedIcon'
	      layout: (LayoutFrame 0 0 -12 0.5 27 0 12 0.5)
	      hasCharacterOrientedLabel: false
	      translateLabel: true
	    )
	   (LabelSpec
	      label: 'Version B'
	      name: 'VersionMergedLabel'
	      layout: (LayoutFrame 30 0 0 0 190 0 0 1)
	      translateLabel: true
	      labelChannel: versionMergedLabelHolder
	      resizeForLabel: true
	      adjust: left
	      useDynamicPreferredWidth: true
	      usePreferredWidth: true
	    )
	   (LabelSpec
	      label: '(Merge)'
	      name: 'MergedLabel'
	      layout: (LayoutFrame -70 1 0 0 0 1 0 1)
	      translateLabel: true
	    )
	   )

	)
      )

    "Created: / 17-01-2013 / 22:53:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!ChangeSetDiffTool class methodsFor:'menu specs'!

listMenu
    "This resource specification was automatically generated
     by the MenuEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the MenuEditor may not be able to read the specification."

    "
     MenuEditor new openOnClass:SVN::DiffBrowser andSelector:#listMenu
     (Menu new fromLiteralArrayEncoding:(SVN::DiffBrowser listMenu)) startUp
    "

    <resource: #menu>

    ^ 
     #(Menu
        (
         (MenuItem
            label: 'Browse'
            itemValue: listMenuBrowse
            translateLabel: true
          )
         (MenuItem
            label: '-'
          )
         (MenuItem
            label: 'Load version A'
            itemValue: listMenuLoadVersionA
            nameKey: LoadVersionA
            translateLabel: true
            labelImage: (ResourceRetriever #'SVN::IconLibrary' versionA16x16 'Load version A')
          )
         (MenuItem
            label: 'Load version B'
            itemValue: listMenuLoadVersionB
            nameKey: LoadVersionB
            translateLabel: true
            labelImage: (ResourceRetriever #'SVN::IconLibrary' versionB16x16 'Load version B')
          )
         (MenuItem
            label: '-'
          )
         (MenuItem
            enabled: hasSelection
            label: 'Inspect'
            itemValue: listMenuInspect
            translateLabel: true
          )
         )
        nil
        nil
      )
!

listMenuDiff
    "This resource specification was automatically generated
     by the MenuEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the MenuEditor may not be able to read the specification."


    "
     MenuEditor new openOnClass:Tools::ChangeSetDiffTool andSelector:#listMenu
     (Menu new fromLiteralArrayEncoding:(Tools::ChangeSetDiffTool listMenu)) startUp
    "

    <resource: #menu>

    ^
     #(Menu
	(
	 (MenuItem
	    enabled: hasSelection
	    label: 'Browse'
	    itemValue: listMenuBrowse
	    translateLabel: true
	  )
	 (MenuItem
	    label: '-'
	  )
	 (MenuItem
	    enabled: hasSelection
	    label: 'Load version A'
	    itemValue: listMenuLoadVersionA
	    nameKey: LoadVersionA
	    translateLabel: true
	    labelImage: (ResourceRetriever #'SVN::IconLibrary' versionA16x16 'Load version A')
	  )
	 (MenuItem
	    enabled: hasSelection
	    label: 'Load version B'
	    itemValue: listMenuLoadVersionB
	    nameKey: LoadVersionB
	    translateLabel: true
	    labelImage: (ResourceRetriever #'SVN::IconLibrary' versionB16x16 'Load version B')
	  )
	 (MenuItem
	    label: '-'
	  )
	 (MenuItem
	    label: 'Open in...'
	    translateLabel: true
	    submenu:
	   (Menu
	      (
	       (MenuItem
		  enabled: hasSelection
		  label: 'Inspector'
		  itemValue: listMenuInspect
		  translateLabel: true
		)
	       (MenuItem
		  enabled: hasSelection
		  label: 'kdiff3'
		  itemValue: listMenuOpenInExternal:
		  translateLabel: true
		  argument: 'kdiff3'
		)
	       (MenuItem
		  enabled: hasSelection
		  label: 'meld'
		  itemValue: listMenuOpenInExternal:
		  translateLabel: true
		  argument: 'meld'
		)
	       )
	      nil
	      nil
	    )
	  )
	 )
	nil
	nil
      )

    "Created: / 16-01-2013 / 15:47:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

listMenuMerge
    "This resource specification was automatically generated
     by the MenuEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the MenuEditor may not be able to read the specification."


    "
     MenuEditor new openOnClass:Tools::ChangeSetDiffTool andSelector:#listMenuMerge
     (Menu new fromLiteralArrayEncoding:(Tools::ChangeSetDiffTool listMenuMerge)) startUp
    "

    <resource: #menu>

    ^
     #(Menu
	(
	 (MenuItem
	    enabled: hasSelection
	    label: 'Browse'
	    itemValue: listMenuBrowse
	  )
	 (MenuItem
	    label: '-'
	  )
	 (MenuItem
	    enabled: hasSelection
	    label: 'Merge using A'
	    itemValue: listMenuMergeUsingA
	    shortcutKey: Cmd2
	  )
	 (MenuItem
	    enabled: hasSelection
	    label: 'Merge using B'
	    itemValue: listMenuMergeUsingB
	    shortcutKey: Cmd3
	  )
	 (MenuItem
	    enabled: hasSelection
	    label: 'Merge using Base'
	    itemValue: listMenuMergeUsingBase
	    shortcutKey: Cmd1
	  )
	 (MenuItem
	    label: '-'
	  )
	 (MenuItem
	    label: 'Open in...'
	    submenu:
	   (Menu
	      (
	       (MenuItem
		  enabled: hasSelection
		  label: 'Inspector'
		  itemValue: listMenuInspect
		)
	       (MenuItem
		  enabled: hasSelection
		  label: 'kdiff3'
		  itemValue: listMenuOpenInExternal:
		  argument: 'kdiff3'
		)
	       (MenuItem
		  enabled: hasSelection
		  label: 'meld'
		  itemValue: listMenuOpenInExternal:
		  argument: 'meld'
		)
	       )
	      nil
	      nil
	    )
	  )
	 )
	nil
	nil
      )
!

mainMenu
    "This resource specification was automatically generated
     by the MenuEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the MenuEditor may not be able to read the specification."


    "
     MenuEditor new openOnClass:Tools::ChangeSetDiffTool andSelector:#mainMenu
     (Menu new fromLiteralArrayEncoding:(Tools::ChangeSetDiffTool mainMenu)) startUp
    "

    <resource: #menu>

    ^
     #(Menu
	(
	 (MenuItem
	    label: 'File'
	    submenu:
	   (Menu
	      (
	       (MenuItem
		  label: 'Open...'
		  itemValue: fileMenuOpen
		  shortcutKey: Ctrlo
		)
	       (MenuItem
		  enabled: canSave
		  label: 'Save'
		  itemValue: fileMenuSave
		  shortcutKey: Ctrls
		)
	       (MenuItem
		  enabled: canSaveAs
		  label: 'Save As...'
		  itemValue: fileMenuSaveAs
		)
	       (MenuItem
		  enabled: canSaveAsPatch
		  label: 'Save As Patch '
		  itemValue: fileMenuSaveAsPatch
		  isVisible: false
		)
	       (MenuItem
		  enabled: canSaveMergedAs
		  label: 'Save Merged as... '
		  itemValue: fileMenuSaveMergedAs
		)
	       (MenuItem
		  label: '-'
		)
	       (MenuItem
		  label: 'Exit'
		  itemValue: closeRequest
		  shortcutKey: Ctrlq
		)
	       )
	      nil
	      nil
	    )
	  )
	 (MenuItem
	    label: 'Changeset'
	    submenu:
	   (Menu
	      (
	       (MenuItem
		  enabled: isDiff2Or3
		  label: 'Browse changes (A)'
		  itemValue: changesetMenuBrowseA
		)
	       (MenuItem
		  enabled: isDiff2Or3
		  label: 'Browse changes (B)'
		  itemValue: changesetMenuBrowseB
		)
	       (MenuItem
		  enabled: isDiff3
		  label: 'Browse changes (Base)'
		  itemValue: changesetMenuBrowseBase
		)
	       (MenuItem
		  enabled: isMerge
		  label: 'Browse changes (Merge)'
		  itemValue: changesetMenuBrowseMerge
		)
	       )
	      nil
	      nil
	    )
	  )
	 (MenuItem
	    label: 'Movement'
	    submenu:
	   (Menu
	      (
	       (MenuItem
		  label: 'Go to Previous Delta'
		  itemValue: menuMoveUp
		)
	       (MenuItem
		  label: 'Go To Next Delta'
		  itemValue: menuMoveDown
		)
	       (MenuItem
		  label: 'Go to Previous Conflict'
		  itemValue: menuMoveUpConflict
		  shortcutKey: CmdCursorUp
		)
	       (MenuItem
		  label: 'Go to Next Conflict'
		  itemValue: menuMoveDownConflict
		  shortcutKey: CmdCursorDown
		)
	       (MenuItem
		  label: '-'
		)
	       (MenuItem
		  label: 'Automatically Go to Next Conflict'
		  indication: autoMoveToNextConflictHolder
		)
	       )
	      nil
	      nil
	    )
	  )
	 (MenuItem
	    label: 'Change'
	    submenuChannel: listMenu
	  )
	 (MenuItem
	    label: 'View'
	    submenu:
	   (Menu
	      (
	       (MenuItem
		  label: 'Show Diffs in Version Methods'
		  indication: showVersionMethodDiffsHolder
		)
	       (MenuItem
		  label: 'Show Diff in #copyright Methods'
		  indication: showCopyrightMethodDiffsHolder
		)
	       (MenuItem
		  label: 'Highlight Conflicts'
		  indication: highlightConflictsHolder
		)
	       )
	      nil
	      nil
	    )
	  )
	 )
	nil
	nil
      )
!

toolbarMenu
    "This resource specification was automatically generated
     by the MenuEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the MenuEditor may not be able to read the specification."


    "
     MenuEditor new openOnClass:Tools::ChangeSetDiffTool andSelector:#toolbarMenu
     (Menu new fromLiteralArrayEncoding:(Tools::ChangeSetDiffTool toolbarMenu)) startUp
    "

    <resource: #menu>

    ^
     #(Menu
	(
	 (MenuItem
	    label: 'Open'
	    itemValue: fileMenuOpen
	    isButton: true
	    labelImage: (ResourceRetriever ToolbarIconLibrary loadFromFile22x22Icon)
	  )
	 (MenuItem
	    enabled: canSaveHolder
	    label: 'Save'
	    itemValue: fileMenuSave
	    isButton: true
	    labelImage: (ResourceRetriever ToolbarIconLibrary saveImageIcon)
	  )
	 (MenuItem
	    label: '-'
	  )
	 (MenuItem
	    label: 'Go to Previous Delta'
	    itemValue: menuMoveUp
	    isButton: true
	    labelImage: (ResourceRetriever ToolbarIconLibrary mergePrev24x24)
	  )
	 (MenuItem
	    label: 'Go to Next Delta'
	    itemValue: menuMoveDown
	    isButton: true
	    labelImage: (ResourceRetriever ToolbarIconLibrary mergeNext24x24)
	  )
	 (MenuItem
	    label: 'Go to Previous Conflict'
	    itemValue: menuMoveUpConflict
	    isButton: true
	    isVisible: mergeHolder
	    labelImage: (ResourceRetriever ToolbarIconLibrary mergePrevConflict24x24)
	  )
	 (MenuItem
	    label: 'Go to Next Conflict'
	    itemValue: menuMoveDownConflict
	    isButton: true
	    isVisible: mergeHolder
	    labelImage: (ResourceRetriever ToolbarIconLibrary mergeNextConflict24x24)
	  )
	 (MenuItem
	    label: '-'
	    isVisible: mergeHolder
	  )
	 (MenuItem
	    label: 'Merge using Base'
	    itemValue: listMenuMergeUsingBase
	    isButton: true
	    isVisible: mergeHolder
	    labelImage: (ResourceRetriever ToolbarIconLibrary mergeUsingBaseAll24x24)
	  )
	 (MenuItem
	    label: 'Merge using A'
	    itemValue: listMenuMergeUsingA
	    isButton: true
	    isVisible: mergeHolder
	    labelImage: (ResourceRetriever ToolbarIconLibrary mergeUsingAAll24x24)
	  )
	 (MenuItem
	    label: 'Merge using B'
	    itemValue: listMenuMergeUsingB
	    isButton: true
	    isVisible: mergeHolder
	    labelImage: (ResourceRetriever ToolbarIconLibrary mergeUsingBAll24x24)
	  )
	 )
	nil
	nil
      )
! !

!ChangeSetDiffTool class methodsFor:'plugIn spec'!

aspectSelectors
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this. If it is corrupted,
     the UIPainter may not be able to read the specification."

    "Return a description of exported aspects;
     these can be connected to aspects of an embedding application
     (if this app is embedded in a subCanvas)."

    ^ #(
        #diffsetHolder
      ).

! !

!ChangeSetDiffTool methodsFor:'accessing'!

beSingleColumn

    self navigatorPanelSpecHolder value: #oneColumnNavigatorSpec

    "Created: / 20-11-2009 / 20:41:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

beTwoColumn

    self navigatorPanelSpecHolder value: #twoColumnNavigatorSpec

    "Created: / 20-11-2009 / 20:42:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

beTwoColumn: aBoolean

    aBoolean
        ifTrue:[self beTwoColumn]
        ifFalse:[self beSingleColumn]

    "Created: / 20-11-2009 / 20:43:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

codeAspect
    ^self codeAspectHolder value

    "Created: / 04-04-2013 / 18:23:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

diffInfo

    ^self diffInfoHolder value

    "Created: / 20-03-2012 / 11:00:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

diffset
    
    ^self diffsetHolder value

    "Created: / 05-12-2009 / 11:53:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

diffset: aDiff3Set

    self diffsetHolder value: aDiff3Set

    "Created: / 01-11-2009 / 09:33:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

patchset

    | patchset |
    patchset := ChangeSet new.
    self diffset do:
        [:diff|patchset add:diff versionA].
    ^patchset

    "Created: / 05-12-2009 / 11:54:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

selection

    ^self selectionHolder value

    "Created: / 22-10-2008 / 11:30:03 / Jan Vrany <vranyj1@fel.cvut.cz>"
!

showCopyrightMethodDiffs
    ^self showCopyrightMethodDiffsHolder value

    "Created: / 10-08-2012 / 16:07:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

showCopyrightMethodDiffs: aBoolean
    self showCopyrightMethodDiffsHolder value: aBoolean

    "Created: / 10-08-2012 / 16:07:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

showVersionMethodDiffs
    ^ self showVersionMethodDiffsHolder value

    "Created: / 10-08-2012 / 16:07:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

showVersionMethodDiffs: aBoolean
    self showVersionMethodDiffsHolder value: aBoolean

    "Created: / 10-08-2012 / 16:08:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

title: aString

    self titleHolder value: aString

    "Created: / 19-11-2009 / 15:44:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!ChangeSetDiffTool methodsFor:'accessing-menus'!

listMenu
    | spec |

    spec := self isMerge ifTrue:[self class listMenuMerge] ifFalse:[self class listMenuDiff].
    ^Menu decodeFromLiteralArray: spec.

    "Created: / 16-01-2013 / 15:50:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!ChangeSetDiffTool methodsFor:'accessing-selection'!

selection: entry


    self isOneColumnBrowser ifTrue:[
	list1App selection: entry
    ] ifFalse:[
	| parent |

	parent := self diffsetHolderPrivate value diffs
		    detect:[:each|each diffs includes: entry] ifNone:[nil].
	parent notNil ifTrue:[
	    list1App selection: parent.
	    list1App updateOutputGenerator.
	    list2App updateList.
	    list2App selection: entry.

	]
    ]

    "Created: / 22-10-2008 / 11:30:11 / Jan Vrany <vranyj1@fel.cvut.cz>"
    "Modified: / 17-01-2013 / 16:28:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

theFirstSelectedEntry
    | selection |

    selection := self selectionHolder value.
    selection isNil ifTrue:[ ^ nil ].
    selection := selection collect:[:e|e]. "/selection might be an Iterator
    selection  isEmpty ifTrue:[ ^nil ].
    ^selection first

    "Created: / 17-01-2013 / 16:58:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

theLastSelectedEntry
    | selection |

    selection := self selectionHolder value.
    selection isNil ifTrue:[ ^ nil ].
    selection := selection collect:[:e|e]. "/selection might be an Iterator
    selection  isEmpty ifTrue:[ ^nil ].
    ^selection last

    "Created: / 17-01-2013 / 13:22:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

theSingleSelectedObject

    | sel selSize obj |
    sel := self selection.

    (sel isCollection and:[self isString not])
        ifFalse:[^sel].

    selSize := 0.
    obj := nil.        
    sel do:
        [:each|
        selSize := selSize + 1.
        selSize > 1 ifTrue:[^nil].
        obj := each].
    ^obj

    "Created: / 10-11-2009 / 11:12:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 20-11-2009 / 19:54:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!ChangeSetDiffTool methodsFor:'accessing-subApps'!

textDiff2Tool
    textDiff2App isNil ifTrue:[
	textDiff2App := TextDiff2Tool new
	    labelAHolder: self versionALabelHolder;
	     textAHolder: self versionATextHolder;

	    labelBHolder: self versionBLabelHolder;
	     textBHolder: self versionBTextHolder;

	    codeAspectHolder: self codeAspectHolder;

	    yourself
    ].
    ^textDiff2App

    "Created: / 16-03-2012 / 13:58:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 04-04-2013 / 18:17:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

textDiff3Tool
    textDiff3App isNil ifTrue:[
	textDiff3App := TextDiff3Tool new
	    mergeHolder: self mergeHolder;
	    mergeDataHolder: self mergeDataHolder;

	    labelCHolder: self versionBaseLabelHolder;
	     textCHolder: self versionBaseTextHolder;

	    labelBHolder: self versionBLabelHolder;
	     textBHolder: self versionBTextHolder;

	    labelAHolder: self versionALabelHolder;
	     textAHolder: self versionATextHolder;

	    codeAspectHolder: self codeAspectHolder;


	    yourself
    ].
    ^textDiff3App

    "Created: / 16-03-2012 / 15:16:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 04-04-2013 / 18:17:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!ChangeSetDiffTool methodsFor:'accessing-subviews'!

labelsView:something
    labelsView := something.
!

list1View: aView
    list1App := aView application.

    "Created: / 17-01-2013 / 13:44:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

list2View: aView
    list2App := aView application.

    "Created: / 17-01-2013 / 13:44:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

navigatorAndDiffPanelView:something
    navigatorAndDiffPanelView := something.
! !

!ChangeSetDiffTool methodsFor:'aspects'!

autoMoveToNextConflictHolder

    autoMoveToNextConflictHolder isNil ifTrue:[
	autoMoveToNextConflictHolder := AspectAdaptor forAspect: #autoMoveToNextConflict.
	autoMoveToNextConflictHolder subject: self class.
    ].
    ^autoMoveToNextConflictHolder

    "Created: / 17-01-2013 / 19:51:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

canSaveHolder
    "return/create the 'canSaveHolder' value holder (automatically generated)"

    canSaveHolder isNil ifTrue:[
	canSaveHolder := false asValue
    ].
    ^ canSaveHolder

    "Modified: / 17-01-2013 / 21:00:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

codeAspectHolder
    "return/create the valueHolder 'codeAspectHolder'"

    codeAspectHolder isNil ifTrue:[
	codeAspectHolder := ValueHolder with:nil "defaultValue here".
    ].
    ^ codeAspectHolder
!

diffInfoHolder
    "return/create the 'diffInfoHolder' value holder (automatically generated)"

    diffInfoHolder isNil ifTrue:[
	diffInfoHolder := ValueHolder new.
	diffInfoHolder addDependent:self.
    ].
    ^ diffInfoHolder
!

diffInfoHolder:something
    "set the 'diffInfoHolder' value holder (automatically generated)"

    |oldValue newValue|

    diffInfoHolder notNil ifTrue:[
	oldValue := diffInfoHolder value.
	diffInfoHolder removeDependent:self.
    ].
    diffInfoHolder := something.
    diffInfoHolder notNil ifTrue:[
	diffInfoHolder addDependent:self.
    ].
    newValue := diffInfoHolder value.
    oldValue ~~ newValue ifTrue:[
	self update:#value with:newValue from:diffInfoHolder.
    ].
!

diffListEntryLabelGeneratorAspect

    ^nil

    "Created: / 24-11-2009 / 10:01:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

diffsetHolder
    "return/create the 'diffsetHolder' value holder (automatically generated)"

    diffsetHolder isNil ifTrue:[
        diffsetHolder := ValueHolder new.
        diffsetHolder addDependent:self.
    ].
    ^ diffsetHolder
!

diffsetHolder:aValueHolder
    "set the 'diffsetHolder' value holder (automatically generated)"

    |oldValue newValue|

    diffsetHolder notNil ifTrue:[
        oldValue := diffsetHolder value.
        diffsetHolder removeDependent:self.
    ].
    diffsetHolder := aValueHolder.
    diffsetHolder notNil ifTrue:[
        diffsetHolder addDependent:self.
    ].
    newValue := diffsetHolder value.
    oldValue ~~ newValue ifTrue:[
        self update:#value with:newValue from:diffsetHolder.
    ].
!

diffsetHolderPrivate
    "return/create the 'diffSetHolderPrivate' value holder (automatically generated)"

    diffsetHolderPrivate isNil ifTrue:[
        diffsetHolderPrivate := ValueHolder with: (self diffsetHolder value).
    ].
    ^ diffsetHolderPrivate

    "Created: / 05-12-2009 / 11:03:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

firstColSelectionHolder
    "return/create the valueHolder 'firstColSelectionHolder'"

    firstColSelectionHolder isNil ifTrue:[
        firstColSelectionHolder := ValueHolder with:nil "defaultValue here".
    ].
    ^ firstColSelectionHolder
!

hasDiffsetHolder
    "return/create the 'hasDiffsetHolder' value holder (automatically generated)"

    hasDiffsetHolder isNil ifTrue:[
	hasDiffsetHolder := false asValue
    ].
    ^ hasDiffsetHolder

    "Modified: / 01-08-2012 / 17:16:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

hasDiffsetHolder:something
    "set the 'hasDiffsetHolder' value holder (automatically generated)"

    hasDiffsetHolder := something.
!

hasSelectionHolder

    |holder|

    (holder := builder bindingAt:#hasSelectionHolder) isNil ifTrue:[
        holder := (AspectAdaptor forAspect: #notEmptyOrNil)
            subjectChannel: self selectionHolder.
        builder aspectAt:#hasSelectionHolder put: holder
    ].
    ^ holder.

    "Created: / 22-10-2008 / 11:34:36 / Jan Vrany <vranyj1@fel.cvut.cz>"
    "Modified: / 22-10-2008 / 12:38:47 / Jan Vrany <vranyj1@fel.cvut.cz>"
!

highlightConflictsHolder
    "return/create the 'highlightConflictsHolder' value holder (automatically generated)"

    highlightConflictsHolder isNil ifTrue:[
	highlightConflictsHolder := true asValue
    ].
    ^ highlightConflictsHolder

    "Modified: / 01-08-2012 / 17:07:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

highlightConflictsHolder:something
    "set the 'highlightConflictsHolder' value holder (automatically generated)"

    highlightConflictsHolder := something.
!

infoPanel
    infoPanel isNil ifTrue:[
	infoPanel := InlineMessageDialog new
    ].
    ^ infoPanel

    "Created: / 09-02-2012 / 19:23:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

labelSpecHolder
    "return/create the 'labelSpecHolder' value holder (automatically generated)"

    labelSpecHolder isNil ifTrue:[
	labelSpecHolder := nil asValue

    ].
    ^ labelSpecHolder

    "Modified: / 17-01-2013 / 23:32:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

listHolder
    "return/create the 'listHolder' value holder (automatically generated)"

    listHolder isNil ifTrue:[
        listHolder := ValueHolder new.
    ].
    ^ listHolder

    "Modified: / 01-11-2009 / 16:57:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

listMenuHolder
    diffMenuHolder isNil ifTrue:[
"/        diffMenuHolder := ValueHolder with:self listMenu
      diffMenuHolder := BlockValue with:[:v|self listMenu] argument: self mergeHolder
    ].
    ^ diffMenuHolder

    "Created: / 21-11-2009 / 18:52:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 18-11-2011 / 14:57:47 / cg"
    "Modified: / 16-01-2013 / 15:59:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

mergeDataHolder
    "return/create the 'mergeDataHolder' value holder (automatically generated)"

    mergeDataHolder isNil ifTrue:[
	mergeDataHolder := ValueHolder new.
	mergeDataHolder addDependent:self.
    ].
    ^ mergeDataHolder
!

mergeDataHolder:something
    "set the 'mergeDataHolder' value holder (automatically generated)"

    |oldValue newValue|

    mergeDataHolder notNil ifTrue:[
	oldValue := mergeDataHolder value.
	mergeDataHolder removeDependent:self.
    ].
    mergeDataHolder := something.
    mergeDataHolder notNil ifTrue:[
	mergeDataHolder addDependent:self.
    ].
    newValue := mergeDataHolder value.
    oldValue ~~ newValue ifTrue:[
	self update:#value with:newValue from:mergeDataHolder.
    ].
!

mergeHolder
    "return/create the 'mergeHolder' value holder (automatically generated)"

    mergeHolder isNil ifTrue:[
	mergeHolder := ValueHolder with: false.
    ].
    ^ mergeHolder

    "Modified: / 19-03-2012 / 14:09:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

mergeHolder:something
    "set the 'mergeHolder' value holder (automatically generated)"

    mergeHolder := something.
!

mergeSavedHolder
    "return/create the 'mergeSavedHolder' value holder (automatically generated)"

    mergeSavedHolder isNil ifTrue:[
	mergeSavedHolder := false asValue
    ].
    ^ mergeSavedHolder

    "Modified: / 15-01-2013 / 11:39:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

nameAspect

    ^(AspectAdaptor forAspect: #name)
        subjectChannel: self diffsetHolder

    "Created: / 01-11-2009 / 11:14:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

navigatorPanelSpecHolder
    <resource: #uiAspect>

    navigatorPanelSpecHolder isNil ifTrue:[
        navigatorPanelSpecHolder := ValueHolder with: #twoColumnNavigatorSpec.
    ].
    ^ navigatorPanelSpecHolder.

    "Modified: / 20-11-2009 / 20:12:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

secondColSelectionHolder
    "return/create the valueHolder 'firstColSelectionHolder'"

    ^self selectionHolder

    "Created: / 17-01-2013 / 12:49:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

selectionHolder
    "return/create the 'selectionHolder' value holder (automatically generated)"

    selectionHolder isNil ifTrue:[

        selectionHolder := ValueHolder new.
        selectionHolder addDependent:self.
    ].
    ^ selectionHolder

    "Modified (format): / 06-07-2011 / 12:25:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

showCopyrightMethodDiffsHolder
    "return/create the 'showCopyrightMethodDiffsHolder' value holder (automatically generated)"

    showCopyrightMethodDiffsHolder isNil ifTrue:[
	showCopyrightMethodDiffsHolder := true asValue
    ].
    ^ showCopyrightMethodDiffsHolder

    "Modified: / 01-08-2012 / 17:06:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

showCopyrightMethodDiffsHolder:something
    "set the 'showCopyrightMethodDiffsHolder' value holder (automatically generated)"

    showCopyrightMethodDiffsHolder := something.
!

showVersionMethodDiffsHolder
    "return/create the 'showVersionMethodDiffsHolder' value holder (automatically generated)"

    showVersionMethodDiffsHolder isNil ifTrue:[
	showVersionMethodDiffsHolder := true asValue.
    ].
    ^ showVersionMethodDiffsHolder

    "Modified: / 18-04-2012 / 19:02:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

showVersionMethodDiffsHolder:something
    "set the 'showVersionMethodDiffsHolder' value holder (automatically generated)"

    showVersionMethodDiffsHolder := something.
!

singleSelectionHolder
    "return/create the 'singleSelectionHolder' value holder (automatically generated)"

    singleSelectionHolder isNil ifTrue:[
        singleSelectionHolder := ValueHolder new.
    ].
    ^ singleSelectionHolder

    "Modified: / 10-11-2009 / 11:09:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

textDiffToolHolder
    "return/create the 'textDiffToolHolder' value holder (automatically generated)"

    textDiffToolHolder isNil ifTrue:[
	textDiffToolHolder := ValueHolder with: self textDiff2Tool.
    ].
    ^ textDiffToolHolder

    "Modified: / 16-03-2012 / 13:57:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

textDiffToolHolder:something
    "set the 'textDiffToolHolder' value holder (automatically generated)"

    textDiffToolHolder := something.
!

textDiffToolWindowSpecHolder
    "return/create the 'textDiffToolWindowSpecHolder' value holder (automatically generated)"

    textDiffToolWindowSpecHolder isNil ifTrue:[
	textDiffToolWindowSpecHolder := #windowSpecForEmbedding asValue.
    ].
    ^ textDiffToolWindowSpecHolder

    "Modified: / 16-03-2012 / 13:57:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

textDiffToolWindowSpecHolder:something
    "set the 'textDiffToolWindowSpecHolder' value holder (automatically generated)"

    textDiffToolWindowSpecHolder := something.
!

titleHolder
    "return/create the 'titleHolder' value holder (automatically generated)"

    titleHolder isNil ifTrue:[
        titleHolder := ValueHolder with: 'Diff Browser'.
    ].
    ^ titleHolder

    "Modified: / 01-11-2009 / 14:04:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

versionALabelHolder

    ^(AspectAdaptor forAspect: #versionALabel)
        subjectChannel: self diffsetHolder

    "Created: / 09-04-2011 / 23:30:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

versionATextHolder

    versionATextHolder isNil ifTrue:[
        versionATextHolder := ValueHolder new
    ].
    ^versionATextHolder

    "Created: / 06-07-2011 / 12:05:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 18-11-2011 / 14:57:56 / cg"
!

versionBLabelHolder

    ^(AspectAdaptor forAspect: #versionBLabel)
        subjectChannel: self diffsetHolder

    "Created: / 09-04-2011 / 23:30:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

versionBTextHolder

    versionBTextHolder isNil ifTrue:[
        versionBTextHolder := ValueHolder new
    ].
    ^versionBTextHolder

    "Created: / 06-07-2011 / 12:05:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 18-11-2011 / 14:57:59 / cg"
!

versionBaseLabelHolder

    ^(AspectAdaptor forAspect: #versionBaseLabel)
	subjectChannel: self diffsetHolder

    "Created: / 16-03-2012 / 15:18:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

versionBaseTextHolder

    versionBaseTextHolder isNil ifTrue:[
	versionBaseTextHolder := ValueHolder new
    ].
    ^versionBaseTextHolder

    "Modified: / 18-11-2011 / 14:57:59 / cg"
    "Created: / 16-03-2012 / 15:19:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!ChangeSetDiffTool methodsFor:'change & update'!

diffInfoChanged

    | info |
    info := self diffInfoHolder value.
    self hasDiffsetHolder value: false.
    self mergeSavedHolder value: false.
    self canSaveHolder value: false.
    info notNil ifTrue:[
	self infoPanel showProgressLabeled: (resources string:'Reading changesets') while: [
	    info read.
	    self diffset: info diffset.
	].
    ].

    "Created: / 19-03-2012 / 23:40:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 21-01-2013 / 21:12:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

diffsetChanged

    | ds |

    ds := self diffsetHolder value.
    ds depth = 2 ifTrue:[
	self beTwoColumn.
    ] ifFalse:[
	self beSingleColumn.
    ].
    self hasDiffsetHolder value: ds notNil.
    self canSaveHolder value: self canSave.
    alreadyWarnedAboutUnsavedMerge := false.


    self diffsetHolderPrivate value:
	(self isOneColumnBrowser
	    ifTrue:[ds flattened sort]
	    ifFalse:[ds value sort]).
    self autoMoveToNextConflictHolder value ifTrue:[
	self menuMoveDownConflict.
    ].
    self versionALabelHolder value: ds versionALabel.
    self versionBLabelHolder value: ds versionBLabel.
    self versionBaseLabelHolder value: ds versionBaseLabel.
    self updateViews.

    "Created: / 05-12-2009 / 11:03:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 29-06-2011 / 08:24:18 / Jan Vrany <enter your email here>"
    "Modified: / 21-01-2013 / 21:13:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

mergeDataChanged
    "Resolution has been changed..."

    self canSaveHolder value: self canSave.
    alreadyWarnedAboutUnsavedMerge := false.
    (self autoMoveToNextConflictHolder value and:[mergeData isMerged]) ifTrue:[
	self menuMoveDownConflict
    ]

    "Created: / 17-01-2013 / 20:06:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 17-01-2013 / 21:20:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

mergeDataHolderChanged
    mergeData notNil ifTrue:[mergeData removeDependent: self].
    mergeData := self mergeDataHolder value.
    mergeData notNil ifTrue:[mergeData addDependent: self].

    "Created: / 16-01-2013 / 09:24:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 17-01-2013 / 20:06:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

selectionChanged

    | diffItem mergeData |

    diffItem := self theSingleSelectedObject.
    self singleSelectionHolder value: diffItem.
    diffItem isNil ifTrue:[^self].

    self isMerge ifTrue:[
	self mergeDataHolder setValue: (mergeData := diffItem mergeInfo).
    ].
    self versionATextHolder setValue: diffItem versionAText.
    self versionBTextHolder setValue: diffItem versionBText.
    self versionBaseTextHolder setValue: diffItem versionBaseText.


    self versionATextHolder changed: #value.
    self versionBTextHolder changed: #value.
    self versionBaseTextHolder changed: #value.
    self isMerge ifTrue:[
	self mergeDataHolder changed: #value.
	"Maybe, there was no merge data beforehand. In that case,
	 update"
	mergeData isNil ifTrue:[
	    diffItem mergeInfo: (self mergeDataHolder value).
	]
    ]

    "Created: / 22-10-2008 / 11:29:24 / Jan Vrany <vranyj1@fel.cvut.cz>"
    "Modified: / 19-03-2012 / 14:59:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

update: aspect with: param from: sender

    sender == selectionHolder ifTrue:[
	self selectionChanged.
	^self.
    ].

    sender == diffsetHolder ifTrue:[
	self diffsetChanged.
	^self.
    ].

    sender == diffInfoHolder ifTrue:[
	self diffInfoChanged.
	^self.
    ].

    sender == mergeDataHolder ifTrue:[
	self mergeDataHolderChanged.
	^self.
    ].

    sender == mergeData ifTrue:[
	"Resolution has been changed..."
	self mergeDataChanged.
	^self.
    ].

    ^super update: aspect with: param from: sender

    "Created: / 05-12-2009 / 11:02:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified (format): / 17-01-2013 / 20:06:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

updateListMenu
    |menu diffs loadA loadB|

    menu := self listMenuHolder value.
    diffs := self selection ? #().
    loadA := menu atNameKey:#LoadVersionA.
    loadA disable.
    loadB := menu atNameKey:#LoadVersionB.
    loadB disable.

    diffs do:[:diff | 
        diff versionA 
            ifNotNil:[
                loadA 
                    label:('Load version ' , diff versionALabel);
                    enable.
            ].
        diff versionB 
            ifNotNil:[
                loadB
                    label:('Load version ' , diff versionBLabel);
                    enable
            ].
    ].
!

updateViews

    (self diffInfo notNil and:[self diffInfo isDiff3]) ifTrue:[
	self diffInfo isMerge ifTrue:[
	    self mergeHolder value: true.
	    self labelSpecHolder value: #labelMergeSpec.
	    self labelHeight: 120.
	] ifFalse:[
	    self mergeHolder value: false.
	    self labelSpecHolder value: #labelDiff3Spec.
	    self labelHeight: 90.
	].
	self textDiffToolHolder value isDiff3 ifFalse:[
	    textDiffToolHolder value: self textDiff3Tool.
	].


    ] ifFalse:[
	self mergeHolder value: false.
	self labelSpecHolder value: #labelDiff2Spec.
	self labelHeight: 60.

	self textDiffToolHolder value isDiff2 ifFalse:[
	    textDiffToolHolder value: self textDiff2Tool.
	].
    ].

    "Created: / 20-03-2012 / 10:21:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 21-01-2013 / 21:16:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!ChangeSetDiffTool methodsFor:'hooks'!

commonPostOpen
    self updateViews

    "Created: / 21-01-2013 / 21:18:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!ChangeSetDiffTool methodsFor:'initialization'!

initialize

    super initialize.
    self createBuilder

    "Created: / 22-10-2008 / 12:37:14 / Jan Vrany <vranyj1@fel.cvut.cz>"
! !

!ChangeSetDiffTool methodsFor:'menu actions'!

changesetMenuBrowse: changeset

    (Tools::ChangeSetBrowser2 on: (changeset , self diffInfo same))
        allowRemove: true;
        open

    "Created: / 16-12-2011 / 14:31:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 12-11-2013 / 17:19:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

changesetMenuBrowseA

    self changesetMenuBrowse: self diffInfo diffset changesetA

    "Created: / 16-12-2011 / 14:23:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

changesetMenuBrowseB

    self changesetMenuBrowse: self diffInfo diffset changesetB

    "Created: / 16-12-2011 / 14:27:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

changesetMenuBrowseBase

    self changesetMenuBrowse: self diffInfo diffset changesetBase

    "Created: / 20-03-2012 / 13:34:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

changesetMenuBrowseMerge

    self changesetMenuBrowse: self diffInfo diffset changesetMerged

    "Created: / 20-03-2012 / 14:34:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

fileMenuOpen

    | dlg info |
    dlg := OpenDialog new.
    info := LastDiffInfo.
    info isNil ifTrue:[
        info := ChangeSetDiffInfo new.
        info specMerge: ChangeSetSpec changeSet
    ] ifFalse:[
        info := info deepCopy.
    ].
    dlg diffInfo: info.
    dlg open ifFalse:[^self].
    info := dlg diffInfo.

    ^self fileMenuOpenOnDiffInfo: info

    "Modified: / 13-11-2013 / 11:54:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

fileMenuOpenOnDiffBetween: a and: b

    self diffset: (ChangeSetDiff versionA: a versionB: b).

    "Created: / 21-03-2011 / 23:23:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 29-06-2011 / 08:10:17 / Jan Vrany <enter your email here>"
    "Modified: / 06-07-2011 / 12:56:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

fileMenuOpenOnDiffInfo: info

    LastDiffInfo := info.
    self diffInfoHolder value: info

    "Created: / 20-03-2012 / 00:04:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

fileMenuSave
    self fileMenuSaveAs: self diffInfo specMergeFile.

    "Modified: / 20-03-2012 / 15:07:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

fileMenuSaveAs
    | info file suggestion |

    info := self diffInfo.
    suggestion := (info specMerge isFile ifTrue:['merged.chg'] ifFalse:[info specMergeFile]).
    file := Dialog requestFileName:'Select File for Save' default: (suggestion) pattern:('*.chg;*.st').
    file isNil ifTrue:[^self].
    self fileMenuSaveAs: file.

    "Modified: / 20-03-2012 / 15:07:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

fileMenuSaveAs: aFilename

    self fileMenuSaveAs: aFilename format: #classSource

    "Created: / 20-03-2012 / 15:07:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

fileMenuSaveAs: aFilename format: format

    | changesToSave |

    changesToSave := (self diffInfo diffset changesetMerged) , (self diffInfo same).
    changesToSave := changesToSave reject:[:chg|chg isDoIt].
    changesToSave saveToFile: aFilename format: format.
    self mergeSavedHolder value: true

    "Created: / 20-03-2012 / 15:09:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 15-01-2013 / 11:40:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

fileMenuSaveAsPatch
    | filename |
    
    filename := Dialog requestFileName: 'Enter filename' default:'patch.chg' ifFail:[^self].
    self patchset fileOutAs: filename.

    "Modified: / 05-12-2009 / 12:37:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

fileMenuSaveMergedAs

    self halt.

    "Modified: / 03-08-2012 / 15:39:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

listMenuBrowse

    | items |
    items := self selection collect:[:e|e]. "/must do collect as selection is an iterator..."
    items size == 1 ifTrue:[
        | item cls sel |
        item:= items anElement.
        cls := item changeClass.
        sel := item changeSelector.
        cls notNil ifTrue:[
            sel notNil ifTrue:[
                UserPreferences systemBrowserClass
                    openInClass:cls selector:sel

            ] ifFalse:[
                UserPreferences systemBrowserClass
                    browseClass: cls
            ]
        ] ifFalse:[
            Dialog warn: (self class resources at: 'Oops, class is gone')
        ]
    ] ifFalse:[
        Dialog error: 'Not yet implemented (Tools::ChangeSetDiffTool » listMenuBrowse)'.                        
    ]

    "Created: / 30-11-2011 / 11:30:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

listMenuInspect

    (self selection collect:[:e|e]) inspect

    "Modified: / 24-11-2009 / 12:51:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

listMenuLoadVersionA

    self selection do:
        [:diff|diff versionA apply]

    "Modified: / 09-12-2009 / 23:09:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

listMenuLoadVersionB

    self selection do:
        [:diff|diff versionB apply]

    "Modified: / 09-12-2009 / 23:10:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

listMenuMergeUsingA
    self textDiffToolHolder value doMergeAllUsingA

    "Modified: / 16-01-2013 / 15:57:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

listMenuMergeUsingB
    self textDiffToolHolder value doMergeAllUsingB

    "Created: / 16-01-2013 / 15:57:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

listMenuMergeUsingBase
    self textDiffToolHolder value doMergeAllUsingBase

    "Created: / 16-01-2013 / 15:57:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

listMenuOpenInExternal: command

    (OperatingSystem canExecuteCommand: command) ifFalse:[
	Dialog warn: 'Sorry. ', command , ' is not installed or not in PATH'
    ].

    self selection do:[:item|
	| base a b cmd |
	item versionBase notNil ifTrue:[
	    base := Filename newTemporary.
	    base writingFileDo:[:s|s nextPutAll: item versionBase source].
	].
	a := Filename newTemporary.
	a writingFileDo:[:s|s nextPutAll: item versionA source].
	b := Filename newTemporary.
	b writingFileDo:[:s|s nextPutAll: item versionB source].

	base isNil ifTrue:[
	    cmd := '%1 %2 %3' bindWith: command with: a pathName with: b pathName
	] ifFalse:[
	    cmd := '%1 %4 %2 %3 ' bindWith: command with: a pathName with: b pathName with: base pathName.
	].
	[ OperatingSystem executeCommand: cmd.
	a remove.
	b remove.
	base notNil ifTrue:[base remove]. ] fork
    ]

    "Modified: / 17-03-2012 / 08:55:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

menuMoveDown
    self menuMoveDownToSuchThat: [:entry|true]

    "Modified: / 17-01-2013 / 16:53:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

menuMoveDownConflict
    self menuMoveDownToSuchThat: [:entry|entry isMerged not]

    "Modified: / 17-01-2013 / 16:53:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

menuMoveDownToSuchThat: aBlock
    | oldSel newSel |
    oldSel := self theLastSelectedEntry.
    newSel := self diffsetHolderPrivate value nextEntryAfter: oldSel suchThat: aBlock.
    self menuMoveTo: newSel.

    "Created: / 17-01-2013 / 16:52:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

menuMoveTo: entry

"/    self window sensor pushUserEvent:#selection: for: self withArgument: entry
    self selection: entry.

    "Created: / 17-01-2013 / 13:03:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 17-01-2013 / 16:27:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

menuMoveUp
    self menuMoveUpToSuchThat: [:entry|true]

    "Created: / 17-01-2013 / 16:58:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

menuMoveUpConflict
    self menuMoveUpToSuchThat: [:entry|entry isMerged not]

    "Created: / 17-01-2013 / 17:00:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

menuMoveUpToSuchThat: aBlock
    | oldSel newSel |
    oldSel := self theFirstSelectedEntry.
    newSel := self diffsetHolderPrivate value nextEntryBefore: oldSel suchThat: aBlock.
    self menuMoveTo: newSel.

    "Created: / 17-01-2013 / 16:58:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!ChangeSetDiffTool methodsFor:'private'!

labelHeight: height
    (labelsView notNil and:[navigatorAndDiffPanelView notNil]) ifTrue:[
	labelsView layout: (labelsView layout copy bottomOffset: height).
	navigatorAndDiffPanelView layout: (navigatorAndDiffPanelView layout copy topOffset: height).
    ].

    "Created: / 17-01-2013 / 23:38:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 21-01-2013 / 21:17:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!ChangeSetDiffTool methodsFor:'queries'!

canBrowse

    ^true

    "^[self selection notNil 
        and:[self selection versionA notNil]]"

    "Created: / 02-11-2009 / 18:32:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 21-11-2009 / 18:46:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

canSave
    "Returns true, if a merged file can be saved"

    ^self canSaveAs and:[self diffInfo specMerge isFile]

    "Created: / 20-03-2012 / 15:00:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 17-01-2013 / 21:09:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

canSaveAs
    "Returns true, if a merged file can be saved"

    | info |
    info := self diffInfo.
    info isNil ifTrue:[^false].
    ^info isMerge and:[info diffset notNil and:[info diffset isMerged]]

    "Created: / 20-03-2012 / 15:03:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 17-01-2013 / 20:57:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

canSaveAsPatch

    ^false

    "Created: / 20-03-2012 / 14:55:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

canSaveMergedAs
    "Returns true, if a merged file can be saved"

    | info |
    info := self diffInfo.
    info isNil ifTrue:[^false].
    ^info isMerge

    "Created: / 03-08-2012 / 15:25:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

hasSelection

    ^[self selection notNil]

    "Created: / 03-11-2009 / 10:48:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

isOneColumnBrowser

    ^self navigatorPanelSpecHolder value = #oneColumnNavigatorSpec

    "Created: / 05-12-2009 / 11:04:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!ChangeSetDiffTool methodsFor:'startup & release'!

closeRequest

    "/Warn about unsaved merge..."
    (alreadyWarnedAboutUnsavedMerge not and:[self canSave and:[mergeSavedHolder value not]]) ifTrue:[
	alreadyWarnedAboutUnsavedMerge := true.
	self infoPanel
	    reset;
	    beInformation;
	    message: (self resources string:'Output file (merge) has not been saved. Save?');
	    addButtonWithLabel: (self resources string:'Save') action: [
		self fileMenuSave.
		self closeDownViews.
	    ];
	    addButtonWithLabel: (self resources string:'Cancel') action:[self infoPanel hide];
	    show.
	^self.
    ].
    self closeDownViews.

    "Created: / 17-01-2013 / 21:02:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!ChangeSetDiffTool methodsFor:'testing'!

isDiff2
    ^self diffInfo notNil and:[self diffInfo isDiff2]

    "Created: / 20-03-2012 / 13:27:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

isDiff2Or3
    ^self diffInfo notNil and:[self diffInfo isDiff2 or:[self diffInfo isDiff3]]

    "Created: / 20-03-2012 / 13:29:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

isDiff3
    ^self diffInfo notNil and:[self diffInfo isDiff3]

    "Created: / 20-03-2012 / 13:27:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

isMerge
    ^self diffInfo notNil and:[self diffInfo isMerge]

    "Created: / 19-03-2012 / 11:53:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!ChangeSetDiffTool::OpenDialog class methodsFor:'image specs'!

versionA24x24

    ^ToolbarIconLibrary versionA24x24

    "Created: / 24-03-2010 / 20:49:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

versionB24x24

    ^ToolbarIconLibrary versionB24x24

    "Created: / 24-03-2010 / 20:50:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

versionBase24x24

    ^ToolbarIconLibrary versionBase24x24

    "Created: / 19-03-2012 / 23:11:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

versionMerged24x24

    ^ToolbarIconLibrary versionMerged24x24

    "Created: / 19-03-2012 / 23:34:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!ChangeSetDiffTool::OpenDialog class methodsFor:'interface specs'!

windowSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:Tools::ChangeSetDiffTool::OpenDialog andSelector:#windowSpec
     Tools::ChangeSetDiffTool::OpenDialog new openInterface:#windowSpec
     Tools::ChangeSetDiffTool::OpenDialog open
    "

    <resource: #canvas>

    ^
     #(FullSpec
	name: windowSpec
	window:
       (WindowSpec
	  label: 'Open...'
	  name: 'Open...'
	  min: (Point 10 10)
	  bounds: (Rectangle 0 0 640 457)
	)
	component:
       (SpecCollection
	  collection: (
	   (VerticalPanelViewSpec
	      name: 'VerticalPanel1'
	      layout: (LayoutFrame 0 0 0 0 0 1 -30 1)
	      horizontalLayout: fit
	      verticalLayout: top
	      horizontalSpace: 3
	      verticalSpace: 3
	      component:
	     (SpecCollection
		collection: (
		 (ViewSpec
		    name: 'B'
		    component:
		   (SpecCollection
		      collection: (
		       (UISubSpecification
			  name: 'SubSpecification2'
			  layout: (LayoutFrame 0 0 0 0 0 1 30 0)
			  minorKey: versionBLabelSpec
			)
		       (SubCanvasSpec
			  name: 'SubCanvas1'
			  layout: (LayoutFrame 30 0 30 0 0 1 0 1)
			  level: 0
			  hasHorizontalScrollBar: false
			  hasVerticalScrollBar: false
			  majorKey: #'Tools::ChangeSetSelectionDialog'
			  minorKey: windowSpecForEmbedding
			  subAspectHolders:
			 (Array

			   (SubChannelInfoSpec
			      subAspect: specHolder
			      aspect: changesetSpecBHolder
			    )
			  )
			  createNewApplication: true
			  createNewBuilder: true
			)
		       )

		    )
		    extent: (Point 640 99)
		  )
		 (ViewSpec
		    name: 'A'
		    component:
		   (SpecCollection
		      collection: (
		       (UISubSpecification
			  name: 'SubSpecification1'
			  layout: (LayoutFrame 0 0 0 0 0 1 30 0)
			  minorKey: versionALabelSpec
			)
		       (SubCanvasSpec
			  name: 'ChangesetASpec'
			  layout: (LayoutFrame 30 0 30 0 0 1 0 1)
			  level: 0
			  hasHorizontalScrollBar: false
			  hasVerticalScrollBar: false
			  majorKey: #'Tools::ChangeSetSelectionDialog'
			  minorKey: windowSpecForEmbedding
			  subAspectHolders:
			 (Array

			   (SubChannelInfoSpec
			      subAspect: specHolder
			      aspect: changesetSpecAHolder
			    )
			  )
			  createNewApplication: true
			  createNewBuilder: true
			)
		       )

		    )
		    extent: (Point 640 99)
		  )
		 (ViewSpec
		    name: 'Base'
		    component:
		   (SpecCollection
		      collection: (
		       (UISubSpecification
			  name: 'SubSpecification3'
			  layout: (LayoutFrame 0 0 0 0 0 1 30 0)
			  minorKey: versionBaseLabelSpec
			)
		       (SubCanvasSpec
			  name: 'SubCanvas2'
			  layout: (LayoutFrame 30 0 30 0 0 1 0 1)
			  level: 0
			  hasHorizontalScrollBar: false
			  hasVerticalScrollBar: false
			  majorKey: #'Tools::ChangeSetSelectionDialog'
			  minorKey: windowSpecForEmbedding
			  subAspectHolders:
			 (Array

			   (SubChannelInfoSpec
			      subAspect: enabledHolder
			      aspect: changesetSpecBaseEnabledHolder
			    )
			   (SubChannelInfoSpec
			      subAspect: specHolder
			      aspect: changesetSpecBaseHolder
			    )
			  )
			  createNewApplication: true
			  createNewBuilder: true
			)
		       )

		    )
		    extent: (Point 640 98)
		  )
		 (ViewSpec
		    name: 'Merge'
		    component:
		   (SpecCollection
		      collection: (
		       (UISubSpecification
			  name: 'SubSpecification4'
			  layout: (LayoutFrame 0 0 0 0 0 1 30 0)
			  minorKey: versionMergedLabelSpec
			)
		       (SubCanvasSpec
			  name: 'SubCanvas3'
			  layout: (LayoutFrame 30 0 30 0 0 1 -25 1)
			  level: 0
			  hasHorizontalScrollBar: false
			  hasVerticalScrollBar: false
			  majorKey: #'Tools::ChangeSetSelectionDialog'
			  minorKey: windowSpecForEmbedding
			  subAspectHolders:
			 (Array

			   (SubChannelInfoSpec
			      subAspect: enabledHolder
			      aspect: changesetSpecMergedEnabledHolder
			    )
			   (SubChannelInfoSpec
			      subAspect: specHolder
			      aspect: changesetSpecMergedHolder
			    )
			  )
			  createNewApplication: true
			  createNewBuilder: true
			)
		       )

		    )
		    extent: (Point 640 123)
		  )
		 )

	      )
	    )
	   (HorizontalPanelViewSpec
	      name: 'ButtonPanel'
	      layout: (LayoutFrame 3 0 -30 1 -3 1 0 1)
	      horizontalLayout: right
	      verticalLayout: center
	      horizontalSpace: 3
	      verticalSpace: 3
	      reverseOrderIfOKAtLeft: true
	      component:
	     (SpecCollection
		collection: (
		 (ActionButtonSpec
		    label: 'OK'
		    name: 'Button1'
		    translateLabel: true
		    model: doAccept
		    enableChannel: doAcceptEnabled
		    extent: (Point 125 22)
		  )
		 (ActionButtonSpec
		    label: 'Cancel'
		    name: 'Button2'
		    translateLabel: true
		    model: doCancel
		    extent: (Point 125 22)
		  )
		 )

	      )
	    )
	   )

	)
      )
!

windowSpec_old
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:Tools::ChangeSetDiffBrowser::OpenDialog andSelector:#windowSpec
     Tools::ChangeSetDiffBrowser::OpenDialog new openInterface:#windowSpec
     Tools::ChangeSetDiffBrowser::OpenDialog open
    "

    <resource: #canvas>

    ^
     #(FullSpec
	name: windowSpec
	window:
       (WindowSpec
	  label: 'Open...'
	  name: 'Open...'
	  min: (Point 10 10)
	  bounds: (Rectangle 0 0 640 130)
	)
	component:
       (SpecCollection
	  collection: (
	   (VariableHorizontalPanelSpec
	      name: 'ChangeSetsSpecPanel'
	      layout: (LayoutFrame 0 0 0 0 0 1 -30 1)
	      barWidth: 3
	      showHandle: true
	      component:
	     (SpecCollection
		collection: (
		 (ViewSpec
		    name: 'A'
		    component:
		   (SpecCollection
		      collection: (
		       (UISubSpecification
			  name: 'SubSpecification1'
			  layout: (LayoutFrame 0 0 0 0 0 1 30 0)
			  minorKey: versionALabelSpec
			)
		       (SubCanvasSpec
			  name: 'ChangesetASpec'
			  layout: (LayoutFrame 0 0 30 0 0 1 0 1)
			  hasHorizontalScrollBar: false
			  hasVerticalScrollBar: false
			  majorKey: #'Tools::ChangeSetSelectionDialog'
			  minorKey: windowSpecForEmbedding
			  subAspectHolders:
			 (Array

			   (SubChannelInfoSpec
			      subAspect: specHolder
			      aspect: changesetSpecAHolder
			    )
			  )
			  createNewApplication: true
			  createNewBuilder: true
			)
		       )

		    )
		  )
		 (ViewSpec
		    name: 'B'
		    component:
		   (SpecCollection
		      collection: (
		       (UISubSpecification
			  name: 'SubSpecification2'
			  layout: (LayoutFrame 0 0 0 0 0 1 30 0)
			  minorKey: versionBLabelSpec
			)
		       (SubCanvasSpec
			  name: 'SubCanvas1'
			  layout: (LayoutFrame 0 0 30 0 0 1 0 1)
			  hasHorizontalScrollBar: false
			  hasVerticalScrollBar: false
			  majorKey: #'Tools::ChangeSetSelectionDialog'
			  minorKey: windowSpecForEmbedding
			  subAspectHolders:
			 (Array

			   (SubChannelInfoSpec
			      subAspect: specHolder
			      aspect: changesetSpecBHolder
			    )
			  )
			  createNewApplication: true
			  createNewBuilder: true
			)
		       )

		    )
		  )
		 )

	      )
	      handles: (Any 0.5 1.0)
	    )
	   (HorizontalPanelViewSpec
	      name: 'ButtonPanel'
	      layout: (LayoutFrame 3 0 -30 1 -3 1 0 1)
	      horizontalLayout: right
	      verticalLayout: center
	      horizontalSpace: 3
	      verticalSpace: 3
	      reverseOrderIfOKAtLeft: true
	      component:
	     (SpecCollection
		collection: (
		 (ActionButtonSpec
		    label: 'OK'
		    name: 'Button1'
		    translateLabel: true
		    model: doAccept
		    enableChannel: doAcceptEnabled
		    extent: (Point 125 22)
		  )
		 (ActionButtonSpec
		    label: 'Cancel'
		    name: 'Button2'
		    translateLabel: true
		    model: doCancel
		    extent: (Point 125 22)
		  )
		 )

	      )
	    )
	   )

	)
      )

    "Modified: / 06-07-2011 / 11:32:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Created: / 19-03-2012 / 22:21:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!ChangeSetDiffTool::OpenDialog class methodsFor:'interface specs - labels'!

versionALabelSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:Tools::ChangeSetDiffBrowser::OpenDialog andSelector:#versionALabelSpec
     Tools::ChangeSetDiffBrowser::OpenDialog new openInterface:#versionALabelSpec
    "

    <resource: #canvas>

    ^
     #(FullSpec
	name: versionALabelSpec
	window:
       (WindowSpec
	  label: 'Version A'
	  name: 'Changeset A'
	  min: (Point 10 10)
	  bounds: (Rectangle 0 0 300 30)
	  backgroundColor: (Color 79.6078431372549 90.5882352941177 69.4117647058823)
	  forceRecursiveBackground: true
	)
	component:
       (SpecCollection
	  collection: (
	   (LabelSpec
	      label: 'versionA24x24'
	      name: 'VersionAIcon'
	      layout: (LayoutFrame 0 0 -12 0.5 27 0 12 0.5)
	      hasCharacterOrientedLabel: false
	      translateLabel: true
	    )
	   (LabelSpec
	      label: 'Version A (working copy)'
	      name: 'VersionALabel'
	      layout: (LayoutFrame 30 0 5 0 0 1 0 1)
	      translateLabel: true
	      resizeForLabel: true
	      adjust: left
	    )
	   )

	)
      )

    "Modified: / 19-03-2012 / 22:15:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

versionBLabelSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:Tools::ChangeSetDiffBrowser::OpenDialog andSelector:#versionBLabelSpec
     Tools::ChangeSetDiffBrowser::OpenDialog new openInterface:#versionBLabelSpec
    "

    <resource: #canvas>

    ^
     #(FullSpec
	name: versionBLabelSpec
	window:
       (WindowSpec
	  label: 'Version B'
	  name: 'Changeset B'
	  min: (Point 10 10)
	  bounds: (Rectangle 0 0 300 30)
	  backgroundColor: (Color 100.0 90.5882352941177 60.0)
	  forceRecursiveBackground: true
	)
	component:
       (SpecCollection
	  collection: (
	   (LabelSpec
	      label: 'versionB24x24'
	      name: 'VersionBIcon'
	      layout: (LayoutFrame 0 0 -12 0.5 27 0 12 0.5)
	      hasCharacterOrientedLabel: false
	      translateLabel: true
	    )
	   (LabelSpec
	      label: 'Version B (to be merged)'
	      name: 'VersionBLabel'
	      layout: (LayoutFrame 30 0 5 0 97 0 0 1)
	      translateLabel: true
	      resizeForLabel: true
	      adjust: left
	      useDynamicPreferredWidth: true
	      usePreferredWidth: true
	    )
	   )

	)
      )

    "Modified: / 19-03-2012 / 22:15:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

versionBaseLabelSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:Tools::ChangeSetDiffTool::OpenDialog andSelector:#versionBaseLabelSpec
     Tools::ChangeSetDiffTool::OpenDialog new openInterface:#versionBaseLabelSpec
    "

    <resource: #canvas>

    ^
     #(FullSpec
	name: versionBaseLabelSpec
	window:
       (WindowSpec
	  label: 'Version B'
	  name: 'Version B'
	  min: (Point 10 10)
	  bounds: (Rectangle 0 0 300 30)
	  backgroundColor: (Color 57.2182803082322 81.2832837415122 91.0872053101396)
	  forceRecursiveBackground: true
	)
	component:
       (SpecCollection
	  collection: (
	   (LabelSpec
	      label: 'versionBase24x24'
	      name: 'VersionBaseIcon'
	      layout: (LayoutFrame 0 0 -12 0.5 27 0 12 0.5)
	      hasCharacterOrientedLabel: false
	      translateLabel: true
	    )
	   (LabelSpec
	      label: 'Base'
	      name: 'VersionBLabel'
	      layout: (LayoutFrame 30 0 5 0 68 0 0 1)
	      translateLabel: true
	      resizeForLabel: true
	      adjust: left
	      useDynamicPreferredWidth: true
	      usePreferredWidth: true
	    )
	   (CheckBoxSpec
	      label: ''
	      name: 'CheckBox1'
	      layout: (LayoutFrame -30 1 0 0 0 1 0 1)
	      model: changesetSpecBaseEnabledHolder
	      translateLabel: true
	    )
	   )

	)
      )
!

versionMergedLabelSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:Tools::ChangeSetDiffTool::OpenDialog andSelector:#versionMergedLabelSpec
     Tools::ChangeSetDiffTool::OpenDialog new openInterface:#versionMergedLabelSpec
    "

    <resource: #canvas>

    ^
     #(FullSpec
	name: versionMergedLabelSpec
	window:
       (WindowSpec
	  label: 'Merge'
	  name: 'Merge'
	  min: (Point 10 10)
	  bounds: (Rectangle 0 0 300 30)
	  backgroundColor: (Color 92.6909285114824 62.388036926833 93.2265201800565)
	  forceRecursiveBackground: true
	)
	component:
       (SpecCollection
	  collection: (
	   (LabelSpec
	      label: 'versionMerged24x24'
	      name: 'VersionMergedIcon'
	      layout: (LayoutFrame 0 0 -12 0.5 27 0 12 0.5)
	      hasCharacterOrientedLabel: false
	      translateLabel: true
	    )
	   (LabelSpec
	      label: 'Merge'
	      name: 'VersionBLabel'
	      layout: (LayoutFrame 30 0 5 0 68 0 0 1)
	      translateLabel: true
	      resizeForLabel: true
	      adjust: left
	      useDynamicPreferredWidth: true
	      usePreferredWidth: true
	    )
	   (CheckBoxSpec
	      label: ''
	      name: 'CheckBox1'
	      layout: (LayoutFrame -30 1 0 0 0 1 0 1)
	      model: changesetSpecMergedEnabledHolder
	      translateLabel: true
	    )
	   )

	)
      )

    "Modified: / 19-03-2012 / 23:36:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!ChangeSetDiffTool::OpenDialog methodsFor:'accessing'!

changeSetA

    | specA |

    specA := self changesetSpecAHolder value.
    ^specA ifNil:[nil] ifNotNil:[specA changeSet]

    "Created: / 06-07-2011 / 11:36:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

changeSetASpec
    ^self changesetSpecAHolder value.

    "Created: / 20-03-2012 / 00:01:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

changeSetASpec: spec
    ^self changesetSpecAHolder value: spec

    "Created: / 01-08-2012 / 15:38:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

changeSetB

    | specB |

    specB := self changesetSpecBHolder value.
    ^specB ifNil:[nil] ifNotNil:[specB changeSet]

    "Created: / 06-07-2011 / 11:36:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

changeSetBSpec
    ^self changesetSpecBHolder value.

    "Created: / 20-03-2012 / 00:01:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

changeSetBSpec: spec
    ^self changesetSpecBHolder value: spec

    "Created: / 01-08-2012 / 15:38:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

changeSetBase

    | specBase |

    specBase := self changesetSpecBaseHolder value.
    ^specBase ifNil:[nil] ifNotNil:[specBase changeSet]

    "Created: / 16-03-2012 / 13:48:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

changeSetBaseSpec
    ^self changesetSpecBaseHolder value.

    "Created: / 20-03-2012 / 00:01:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

changeSetBaseSpec: spec
    ^self changesetSpecBaseHolder value: spec

    "Created: / 01-08-2012 / 15:38:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

changeSetMerged

    | specMerged |

    specMerged := self changesetSpecMergedHolder value.
    ^specMerged ifNil:[nil] ifNotNil:[specMerged changeSet]

    "Created: / 20-03-2012 / 00:01:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

changeSetMergedSpec
    ^self changesetSpecMergedHolder value.

    "Created: / 20-03-2012 / 00:01:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

changeSetMergedSpec: spec
    ^self changesetSpecMergedHolder value: spec

    "Created: / 01-08-2012 / 15:38:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

diffInfo
    "Returns a ChangeSetDiffInfo based on current data"

    | info |
    info := ChangeSetDiffInfo new.
    info specA: self changeSetASpec.
    info specB: self changeSetBSpec.
    self changesetSpecBaseEnabledHolder value ifTrue:[
	info specBase: self changeSetBaseSpec.
    ].
    changesetSpecMergedEnabledHolder value ifTrue:[
	info specMerge: self changeSetMergedSpec.
    ].
    ^info

    "Created: / 01-08-2012 / 15:41:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

diffInfo: info
    "Sets up dialog for given diff info"

    info isNil ifTrue:[ ^ self ].

    self changeSetASpec: info specA.
    self changeSetBSpec: info specB.
    self changeSetBaseSpec: info specBase.
    self changeSetMergedSpec: info specMerge.

    "Created: / 01-08-2012 / 15:37:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!ChangeSetDiffTool::OpenDialog methodsFor:'aspects'!

changesetSpecAHolder
    "return/create the 'changesetSpecAHolder' value holder (automatically generated)"

    changesetSpecAHolder isNil ifTrue:[
        changesetSpecAHolder := ValueHolder new.
    ].
    ^ changesetSpecAHolder
!

changesetSpecAHolder:something
    "set the 'changesetSpecAHolder' value holder (automatically generated)"

    changesetSpecAHolder := something.
!

changesetSpecBHolder
    "return/create the 'changesetSpecBHolder' value holder (automatically generated)"

    changesetSpecBHolder isNil ifTrue:[
        changesetSpecBHolder := ValueHolder new.
    ].
    ^ changesetSpecBHolder
!

changesetSpecBHolder:something
    "set the 'changesetSpecBHolder' value holder (automatically generated)"

    changesetSpecBHolder := something.
!

changesetSpecBaseEnabledHolder
    "return/create the 'changesetSpecBaseEnabledHolder' value holder (automatically generated)"

    changesetSpecBaseEnabledHolder isNil ifTrue:[
	changesetSpecBaseEnabledHolder := false asValue
    ].
    ^ changesetSpecBaseEnabledHolder

    "Modified: / 19-03-2012 / 23:20:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

changesetSpecBaseEnabledHolder:something
    "set the 'changesetSpecBaseEnabledHolder' value holder (automatically generated)"

    changesetSpecBaseEnabledHolder := something.
!

changesetSpecBaseHolder
    "return/create the 'changesetSpecBHolder' value holder (automatically generated)"

    changesetSpecBaseHolder isNil ifTrue:[
	changesetSpecBaseHolder := ValueHolder new.
    ].
    ^ changesetSpecBaseHolder

    "Created: / 16-03-2012 / 13:48:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

changesetSpecBaseHolder:something
    "set the 'changesetSpecBHolder' value holder (automatically generated)"

    changesetSpecBaseHolder := something.

    "Created: / 16-03-2012 / 13:49:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

changesetSpecMergedEnabledHolder
    "return/create the 'changesetSpecMergedEnabledHolder' value holder (automatically generated)"

    changesetSpecMergedEnabledHolder isNil ifTrue:[
	changesetSpecMergedEnabledHolder := false asValue
    ].
    ^ changesetSpecMergedEnabledHolder

    "Modified: / 19-03-2012 / 23:20:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

changesetSpecMergedEnabledHolder:something
    "set the 'changesetSpecMergedEnabledHolder' value holder (automatically generated)"

    changesetSpecMergedEnabledHolder := something.
!

changesetSpecMergedHolder
    "return/create the 'changesetSpecMergedHolder' value holder (automatically generated)"

    changesetSpecMergedHolder isNil ifTrue:[
	changesetSpecMergedHolder := ValueHolder new.
    ].
    ^ changesetSpecMergedHolder
!

changesetSpecMergedHolder:something
    "set the 'changesetSpecMergedHolder' value holder (automatically generated)"

    changesetSpecMergedHolder := something.
!

doAcceptEnabled
    <resource: #uiAspect>

    ^BlockValue 
        with:[:a :b|a value notNil and:[b value notNil]]
        argument:self changesetSpecAHolder
        argument:self changesetSpecAHolder.

    "Modified: / 06-07-2011 / 11:26:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!ChangeSetDiffTool::OpenDialog methodsFor:'events'!

closeAccept

    ^super closeAccept

    "Created: / 06-07-2011 / 12:09:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!ChangeSetDiffTool class methodsFor:'documentation'!

version
    ^ '$Header$'
!

version_CVS
    ^ '$Header$'
!

version_SVN
    ^ '$Id$'
! !