Tools__ChangeSetDiffTool.st
author Stefan Vogel <sv@exept.de>
Sun, 02 Oct 2011 21:52:17 +0200
changeset 10741 e4645cbb0958
parent 10194 ce5e1fc44d81
child 10879 0dc2095adecf
permissions -rw-r--r--
Fix package def libbasic3->libtool

"
 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:'listHolder singleSelectionHolder diffsetHolder titleHolder
		firstColSelectionHolder navigatorPanelSpecHolder diffMenuHolder
		diffsetHolderPrivate selectionHolder versionATextHolder
		versionBTextHolder'
	classVariableNames:''
	poolDictionaries:''
	category:'Interface-Diff'
!

SimpleDialog subclass:#OpenDialog
	instanceVariableNames:'doAcceptEnabled changesetSpecAHolder changesetSpecBHolder'
	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.

"
! !

!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 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::ChangeSetDiffBrowser andSelector:#oneColumnNavigatorSpec
     Tools::ChangeSetDiffBrowser 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: inGeneratorHolder
                  aspect: diffsetHolderPrivate
                ) 
               (SubChannelInfoSpec
                  subAspect: listEntryLabelGenerator
                  aspect: diffListEntryLabelGeneratorAspect
                )
                
               (SubChannelInfoSpec
                  subAspect: menuHolder
                  aspect: listMenuHolder
                ) 
               (SubChannelInfoSpec
                  subAspect: outGeneratorHolder
                  aspect: selectionHolder
                )
              )
              createNewApplication: true
              createNewBuilder: false
            )
           )
         
        )
      )
!

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::ChangeSetDiffBrowser andSelector:#twoColumnNavigatorSpec
     Tools::ChangeSetDiffBrowser 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: 'FirstColumn'
                    hasHorizontalScrollBar: false
                    hasVerticalScrollBar: false
                    majorKey: #'Tools::ChangeSetDiffList'
                    subAspectHolders: 
                   (Array
                      
                     (SubChannelInfoSpec
                        subAspect: inGeneratorHolder
                        aspect: diffsetHolderPrivate
                      ) 
                     (SubChannelInfoSpec
                        subAspect: listEntryLabelGenerator
                        aspect: diffListEntryLabelGeneratorAspect
                      )
                      
                     (SubChannelInfoSpec
                        subAspect: menuHolder
                        aspect: listMenuHolder
                      ) 
                     (SubChannelInfoSpec
                        subAspect: outGeneratorHolder
                        aspect: firstColSelectionHolder
                      )
                    )
                    createNewApplication: true
                    createNewBuilder: true
                  )
                 (SubCanvasSpec
                    name: 'SecondColumn'
                    hasHorizontalScrollBar: false
                    hasVerticalScrollBar: false
                    majorKey: #'Tools::ChangeSetDiffList'
                    subAspectHolders: 
                   (Array
                      
                     (SubChannelInfoSpec
                        subAspect: inGeneratorHolder
                        aspect: firstColSelectionHolder
                      ) 
                     (SubChannelInfoSpec
                        subAspect: listEntryLabelGenerator
                        aspect: diffListEntryLabelGeneratorAspect
                      )
                      
                     (SubChannelInfoSpec
                        subAspect: menuHolder
                        aspect: listMenuHolder
                      ) 
                     (SubChannelInfoSpec
                        subAspect: outGeneratorHolder
                        aspect: selectionHolder
                      )
                    )
                    createNewApplication: true
                    createNewBuilder: true
                  )
                 )
               
              )
              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 665 397)
          menu: mainMenu
        )
        component: 
       (SpecCollection
          collection: (
           (UISubSpecification
              name: 'Label'
              layout: (LayoutFrame 0 0 0 0 0 1 56 0)
              minorKey: labelSpec
            )
           (VariableVerticalPanelSpec
              name: 'Panel'
              layout: (LayoutFrame 0 0 56 0 0 1 0 1)
              showHandle: true
              component: 
             (SpecCollection
                collection: (
                 (SubCanvasSpec
                    name: 'NavigatorPanel'
                    hasHorizontalScrollBar: false
                    hasVerticalScrollBar: false
                    specHolder: navigatorPanelSpecHolder
                    createNewBuilder: false
                  )
                 (SubCanvasSpec
                    name: 'TextDiff'
                    majorKey: #'Tools::TextDiffTool'
                    minorKey: windowSpecForEmbedding
                    subAspectHolders: 
                   (Array
                      
                     (SubChannelInfoSpec
                        subAspect: labelAHolder
                        aspect: versionALabelHolder
                      ) 
                     (SubChannelInfoSpec
                        subAspect: labelBHolder
                        aspect: versionBLabelHolder
                      )
                      
                     (SubChannelInfoSpec
                        subAspect: textAHolder
                        aspect: versionATextHolder
                      ) 
                     (SubChannelInfoSpec
                        subAspect: textBHolder
                        aspect: versionBTextHolder
                      )
                    )
                    createNewApplication: true
                    createNewBuilder: true
                  )
                 )
               
              )
              handles: (Any 0.5 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
            )
           )
         
        )
      )
!

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

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

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:SVN::DiffBrowser andSelector:#mainMenu
     (Menu new fromLiteralArrayEncoding:(SVN::DiffBrowser mainMenu)) startUp
    "

    <resource: #menu>

    ^ 
     #(Menu
        (
         (MenuItem
            label: 'File'
            translateLabel: true
            submenu: 
           (Menu
              (
               (MenuItem
                  label: 'Open'
                  itemValue: fileMenuOpen
                  translateLabel: true
                  shortcutKey: Ctrlo
                )
               (MenuItem
                  enabled: false
                  label: 'Save as patch '
                  itemValue: fileMenuSaveAsPatch
                  translateLabel: true
                )
               (MenuItem
                  label: '-'
                )
               (MenuItem
                  label: 'Exit'
                  itemValue: closeRequest
                  translateLabel: true
                )
               )
              nil
              nil
            )
          )
         (MenuItem
            label: 'Diff'
            translateLabel: true
            submenuChannel: listMenu
          )
         )
        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>"
!

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

selection: selection

    ^self selectionHolder value: selection

    "Created: / 22-10-2008 / 11:30:11 / Jan Vrany <vranyj1@fel.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:'aspects'!

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
!

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

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 
        ifNil:[ diffMenuHolder := ValueHolder with:(Menu decodeFromLiteralArray: self class listMenu) ].
    ^ diffMenuHolder

    "Created: / 21-11-2009 / 18:52:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
    "Modified: / 09-12-2009 / 23:34:16 / 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>"
!

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

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

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 ifNil:[
        versionATextHolder := ValueHolder new
    ].
    ^versionATextHolder

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

versionBLabelHolder

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

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

versionBTextHolder

    versionBTextHolder ifNil:[
        versionBTextHolder := ValueHolder new
    ].
    ^versionBTextHolder

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

!ChangeSetDiffTool methodsFor:'change & update'!

diffsetChanged

    | ds |

    ds := self diffsetHolder value.

    self diffsetHolderPrivate value: 
        (self isOneColumnBrowser 
            ifTrue:[ds flattened]
            ifFalse:[ds value]).

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

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

selectionChanged

    | diffItem |

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

    self versionATextHolder setValue: diffItem versionAText.
    self versionBTextHolder setValue: diffItem versionBText.

    self versionATextHolder changed: #value.
    self versionBTextHolder changed: #value.

    "Created: / 22-10-2008 / 11:29:24 / Jan Vrany <vranyj1@fel.cvut.cz>"
    "Modified: / 06-07-2011 / 12:47:43 / 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.
    ].

    ^super update: aspect with: param from: sender

    "Created: / 05-12-2009 / 11:02:57 / 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
            ].
    ].
! !

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

fileMenuOpen

    | dlg a b |
    dlg := OpenDialog new.
    dlg open ifFalse:[^self].
    a := dlg changeSetA.
    b := dlg changeSetB.
    ^self fileMenuOpenOnDiffBetween: a and: b

    "Modified: / 06-07-2011 / 11:36:08 / 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>"
!

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

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

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

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

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

!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'
              name: 'VersionALabel'
              layout: (LayoutFrame 30 0 5 0 0 1 0 1)
              translateLabel: true
              resizeForLabel: true
              adjust: left
            )
           )
         
        )
      )

    "Modified: / 06-07-2011 / 11:24:44 / 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'
              name: 'VersionBLabel'
              layout: (LayoutFrame 30 0 5 0 97 0 0 1)
              translateLabel: true
              resizeForLabel: true
              adjust: left
              useDynamicPreferredWidth: true
              usePreferredWidth: true
            )
           )
         
        )
      )

    "Modified: / 06-07-2011 / 11:24:39 / 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>"
!

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

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

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.2 2011-10-02 19:52:17 stefan Exp $'
!

version_SVN
    ^ '§Id: SVN__DiffBrowser.st 346 2011-06-29 06:40:53Z vranyj1 §'
! !