Tools__ChangeSetDiffTool.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Thu, 17 Jan 2013 17:16:17 +0000
branchjv
changeset 12320 5b4ec70d83c1
parent 12318 1dda95be3d40
child 12321 13d791d84a47
permissions -rw-r--r--
UI fixes in ChangeSetDiffTool. More will come.

"
 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 mergeDataHolder
		showVersionMethodDiffsHolder showCopyrightMethodDiffsHolder
		highlightConflictsHolder hasDiffsetHolder mergeSavedHolder list1
		list2'
	classVariableNames:'LastDiffInfo'
	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 - 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' asText allItalic colorizeAllWith:Color gray lighter
! !

!ChangeSetDiffTool 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>"
! !

!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'!

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
            )
           (UISubSpecification
              name: 'Label'
              layout: (LayoutFrame 0 0 30 0 0 1 86 0)
              initiallyInvisible: true
              visibilityChannel: hasDiffsetHolder
              minorKey: labelSpec
            )
           (VariableVerticalPanelSpec
              name: 'Panel'
              layout: (LayoutFrame 0 0 86 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)
            )
           )
         
        )
      )
! !

!ChangeSetDiffTool 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::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>"
! !

!ChangeSetDiffTool class methodsFor:'menu specs'!

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: Ctrl2
          )
         (MenuItem
            enabled: hasSelection
            label: 'Merge using B'
            itemValue: listMenuMergeUsingB
            shortcutKey: Ctrl3
          )
         (MenuItem
            enabled: hasSelection
            label: 'Merge using Base'
            itemValue: listMenuMergeUsingBase
            shortcutKey: Ctrl1
          )
         (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: '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: canSave
            label: 'Save'
            itemValue: fileMenuSave
            isButton: true
            labelImage: (ResourceRetriever ToolbarIconLibrary saveImageIcon)
          )
         (MenuItem
            label: '-'
          )
         (MenuItem
            label: 'Move to Previous'
            itemValue: menuMoveUp
            isButton: true
            labelImage: (ResourceRetriever ToolbarIconLibrary mergePrev24x24)
          )
         (MenuItem
            label: 'Move to Next'
            itemValue: menuMoveDown
            isButton: true
            labelImage: (ResourceRetriever ToolbarIconLibrary mergeNext24x24)
          )
         (MenuItem
            label: 'Move to Previous Conflict'
            itemValue: menuMoveUpConflict
            isButton: true
            labelImage: (ResourceRetriever ToolbarIconLibrary mergePrevConflict24x24)
          )
         (MenuItem
            label: 'Move to Next Conflict'
            itemValue: menuMoveDownConflict
            isButton: true
            labelImage: (ResourceRetriever ToolbarIconLibrary mergeNextConflict24x24)
          )
         (MenuItem
            label: '-'
          )
         (MenuItem
            label: 'Merge using Base'
            itemValue: menuMergeUsingBase
            isButton: true
            labelImage: (ResourceRetriever ToolbarIconLibrary mergeUsingBase24x24)
          )
         (MenuItem
            label: 'Merge using A'
            itemValue: menuMergeUsingA
            isButton: true
            labelImage: (ResourceRetriever ToolbarIconLibrary mergeUsingA24x24)
          )
         (MenuItem
            label: 'Merge using B'
            itemValue: menuMergeUsingB
            isButton: true
            labelImage: (ResourceRetriever ToolbarIconLibrary mergeUsingB24x24)
          )
         )
        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>"
!

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 - selection'!

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'!

list1View: aView
    list1 := aView application.

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

list2View: aView
    list2 := aView application.

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

textDiff2Tool

    ^TextDiff2Tool new
        labelAHolder: self versionALabelHolder;
         textAHolder: self versionATextHolder;

        labelBHolder: self versionBLabelHolder;
         textBHolder: self versionBTextHolder;

        yourself

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

textDiff3Tool

    ^TextDiff3Tool new
        labelCHolder: self versionBaseLabelHolder;
         textCHolder: self versionBaseTextHolder;

        labelBHolder: self versionBLabelHolder;
         textBHolder: self versionBTextHolder;


        labelAHolder: self versionALabelHolder;
         textAHolder: self versionATextHolder;

        mergeHolder: self mergeHolder;
        mergeDataHolder: self mergeDataHolder;

        yourself

    "Created: / 16-03-2012 / 15:16:14 / 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:[
        list1 selection: entry
    ] ifFalse:[
        | parent |

        parent := self diffsetHolderPrivate value diffs 
                    detect:[:each|each diffs includes: entry] ifNone:[nil].
        parent notNil ifTrue:[
            list1 selection: parent.
            list1 updateOutputGenerator.
            list2 updateList.
            list2 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>"
! !

!ChangeSetDiffTool methodsFor:'aspects'!

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>"
!

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.
    info notNil ifTrue:[
        self infoPanel showProgressLabeled: (resources string:'Reading changesets') while: [
            info read.
            self diffset: info diffset.
            self updateViews.
        ].
    ]

    "Created: / 19-03-2012 / 23:40:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 15-01-2013 / 11:40:03 / 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 diffsetHolderPrivate value: 
        (self isOneColumnBrowser 
            ifTrue:[ds flattened sort]
            ifFalse:[ds value sort]).

    self versionALabelHolder value: ds versionALabel.
    self versionBLabelHolder value: ds versionBLabel.
    self versionBaseLabelHolder value: ds versionBaseLabel.

    "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: / 17-01-2013 / 13:58:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

mergeDataChanged

    "Created: / 16-01-2013 / 09:24:14 / 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 mergeDataChanged.
        ^self.
    ].

    ^super update: aspect with: param from: sender

    "Created: / 05-12-2009 / 11:02:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 16-01-2013 / 09:24:14 / 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 select:[:e | true ]) do:[:diff | 
        diff versionA 
            ifNotNil:[
                loadA enable.
                loadA label:'Load version ' , diff versionALabel
            ].
        diff versionB 
            ifNotNil:[
                loadB
                    label:'Load version ' , diff versionBLabel;
                    enable
            ].
    ].
!

updateViews

    self diffInfo isNil ifTrue:[ ^ self ].

    self diffInfo isDiff3 ifTrue:[
        self textDiffToolHolder value isDiff3 ifFalse:[
            textDiffToolHolder value: self textDiff3Tool.
        ].

    ] ifFalse:[
        self textDiffToolHolder value isDiff2 ifFalse:[
            textDiffToolHolder value: self textDiff2Tool.
        ].
    ].
    self mergeHolder value: self diffInfo isMerge.

    "Created: / 20-03-2012 / 10:21:22 / 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 openOn: (changeset , self diffInfo same)

    "Created: / 16-12-2011 / 14:31:18 / 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 ifFalse:[
        info := ChangeSetDiffInfo new.
        info specMerge: ChangeSetSpec changeSet
    ].
    dlg diffInfo: info.
    dlg open ifFalse:[^self].
    info := dlg diffInfo.

    ^self fileMenuOpenOnDiffInfo: info

    "Modified: / 18-09-2012 / 11:37:46 / 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 := Smalltalk::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 current systemBrowserClass
                    openInClass:cls selector:sel

            ] ifFalse:[
                UserPreferences current 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:'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"

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

    "Created: / 20-03-2012 / 15:00:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 17-01-2013 / 12:25:28 / 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 isMerged]

    "Created: / 20-03-2012 / 15:03:26 / 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>"
! !

!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>"
!

isOneColumnBrowser

    ^self navigatorPanelSpecHolder value = #oneColumnNavigatorSpec

    "Created: / 05-12-2009 / 11:04:53 / 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_CVS
    ^ '§Header: /cvs/stx/stx/libtool/Tools__ChangeSetDiffTool.st,v 1.5 2011/12/19 08:39:53 vrany Exp §'
!

version_SVN
    ^ '$Id: Tools__ChangeSetDiffTool.st 8089 2013-01-17 17:16:17Z vranyj1 $'
! !