DirectoryDifferenceViewApplication.st
changeset 11105 7983da617733
child 11116 86de3247a42f
equal deleted inserted replaced
11104:6f9259e46cb0 11105:7983da617733
       
     1 "{ Package: 'stx:libtool' }"
       
     2 
       
     3 AbstractFileFinderApplicationComponent subclass:#DirectoryDifferenceViewApplication
       
     4 	instanceVariableNames:'directory1Holder directory2Holder directory1 directory2
       
     5 		filesOnlyInDirectory1 filesOnlyInDirectory2
       
     6 		filesWhichAreDifferent directoriesOnlyInDirectory1
       
     7 		directoriesOnlyInDirectory2'
       
     8 	classVariableNames:''
       
     9 	poolDictionaries:''
       
    10 	category:'Interface-Tools-File'
       
    11 !
       
    12 
       
    13 
       
    14 !DirectoryDifferenceViewApplication class methodsFor:'interface specs'!
       
    15 
       
    16 windowSpec
       
    17     "This resource specification was automatically generated
       
    18      by the UIPainter of ST/X."
       
    19 
       
    20     "Do not manually edit this!! If it is corrupted,
       
    21      the UIPainter may not be able to read the specification."
       
    22 
       
    23     "
       
    24      UIPainter new openOnClass:DirectoryDifferenceViewApplication andSelector:#windowSpec
       
    25      DirectoryDifferenceViewApplication new openInterface:#windowSpec
       
    26      DirectoryDifferenceViewApplication open
       
    27     "
       
    28 
       
    29     <resource: #canvas>
       
    30 
       
    31     ^ 
       
    32      #(FullSpec
       
    33         name: windowSpec
       
    34         window: 
       
    35        (WindowSpec
       
    36           label: 'Directory Diff'
       
    37           name: 'Directory Diff'
       
    38           min: (Point 377 131)
       
    39           bounds: (Rectangle 0 0 758 512)
       
    40         )
       
    41         component: 
       
    42        (SpecCollection
       
    43           collection: (
       
    44            (MenuPanelSpec
       
    45               name: 'ToolBar1'
       
    46               layout: (LayoutFrame 0 0.0 0 0 0 1.0 32 0)
       
    47               level: 0
       
    48               menu: searchMenu
       
    49               textDefault: true
       
    50             )
       
    51            (ProgressIndicatorSpec
       
    52               name: 'ProgressIndicator1'
       
    53               layout: (LayoutFrame 125 0 11 0 231 0 21 0)
       
    54               visibilityChannel: enableStop
       
    55               backgroundColor: (Color 0.0 66.9993133440146 66.9993133440146)
       
    56               showPercentage: false
       
    57               isActivityIndicator: true
       
    58             )
       
    59            (ViewSpec
       
    60               name: 'Box1'
       
    61               layout: (LayoutFrame 0 0.0 32 0 0 1.0 130 0)
       
    62               component: 
       
    63              (SpecCollection
       
    64                 collection: (
       
    65                  (LabelSpec
       
    66                     label: 'Directory1:'
       
    67                     name: 'DirectoryLabel'
       
    68                     layout: (LayoutFrame 2 0 7 0 154 0 24 0)
       
    69                     activeHelpKey: searchDirectory
       
    70                     translateLabel: true
       
    71                     adjust: right
       
    72                   )
       
    73                  (FilenameInputFieldSpec
       
    74                     name: 'DirectoryEntryField'
       
    75                     layout: (LayoutFrame 156 0 4 0 0 1 24 0)
       
    76                     activeHelpKey: searchDirectory
       
    77                     model: directory1Holder
       
    78                     immediateAccept: true
       
    79                     acceptOnPointerLeave: false
       
    80                   )
       
    81                  (LabelSpec
       
    82                     label: 'Directory2:'
       
    83                     name: 'Label2'
       
    84                     layout: (LayoutFrame 2 0 31 0 154 0 48 0)
       
    85                     activeHelpKey: searchDirectory
       
    86                     translateLabel: true
       
    87                     adjust: right
       
    88                   )
       
    89                  (FilenameInputFieldSpec
       
    90                     name: 'FilenameEntryField1'
       
    91                     layout: (LayoutFrame 156 0 28 0 0 1 48 0)
       
    92                     activeHelpKey: searchDirectory
       
    93                     model: directory2Holder
       
    94                     immediateAccept: true
       
    95                     acceptOnPointerLeave: false
       
    96                   )
       
    97                  (LabelSpec
       
    98                     label: 'Compare Files Named:'
       
    99                     name: 'FileNameLabel'
       
   100                     layout: (LayoutFrame 2 0 55 0 154 0 72 0)
       
   101                     activeHelpKey: namePattern
       
   102                     translateLabel: true
       
   103                     adjust: right
       
   104                   )
       
   105                  (InputFieldSpec
       
   106                     name: 'FileNameEntryField'
       
   107                     layout: (LayoutFrame 156 0 52 0 -315 1 72 0)
       
   108                     activeHelpKey: namePattern
       
   109                     tabable: true
       
   110                     model: namePatternHolder
       
   111                     immediateAccept: true
       
   112                     acceptOnLeave: false
       
   113                     acceptOnPointerLeave: false
       
   114                   )
       
   115                  (CheckBoxSpec
       
   116                     label: 'Ignore Case'
       
   117                     name: 'IgnoreCaseInNameCheckBox'
       
   118                     layout: (LayoutFrame -169 1 53 0 -4 1 76 0)
       
   119                     activeHelpKey: ignoreCase
       
   120                     tabable: true
       
   121                     model: ignoreCaseInName
       
   122                     translateLabel: true
       
   123                   )
       
   124                  (LabelSpec
       
   125                     label: 'But Not Named:'
       
   126                     name: 'Label1'
       
   127                     layout: (LayoutFrame 2 0 79 0 154 0 96 0)
       
   128                     activeHelpKey: namePattern
       
   129                     translateLabel: true
       
   130                     adjust: right
       
   131                   )
       
   132                  (InputFieldSpec
       
   133                     name: 'EntryField1'
       
   134                     layout: (LayoutFrame 156 0 76 0 -315 1 96 0)
       
   135                     activeHelpKey: namePattern
       
   136                     tabable: true
       
   137                     model: excludedNamePatternHolder
       
   138                     immediateAccept: true
       
   139                     acceptOnLeave: false
       
   140                     acceptOnPointerLeave: false
       
   141                   )
       
   142                  (CheckBoxSpec
       
   143                     label: 'Ignore Case'
       
   144                     name: 'CheckBox1'
       
   145                     layout: (LayoutFrame -169 1 77 0 -4 1 100 0)
       
   146                     activeHelpKey: ignoreCase
       
   147                     tabable: true
       
   148                     model: ignoreCaseInExcludedName
       
   149                     translateLabel: true
       
   150                   )
       
   151                  )
       
   152                
       
   153               )
       
   154             )
       
   155            (VariableVerticalPanelSpec
       
   156               name: 'VariableVerticalPanel1'
       
   157               layout: (LayoutFrame 0 0.0 140 0 0 1.0 0 1)
       
   158               component: 
       
   159              (SpecCollection
       
   160                 collection: (
       
   161                  (DataSetSpec
       
   162                     name: 'Table1'
       
   163                     model: selectionHolder
       
   164                     hasHorizontalScrollBar: true
       
   165                     hasVerticalScrollBar: true
       
   166                     dataList: matchedFilesList
       
   167                     doubleClickSelector: fileDoubleClick:
       
   168                     columnHolder: searchResultTable
       
   169                     valueChangeSelector: fileSelected:
       
   170                     multipleSelectOk: true
       
   171                   )
       
   172                  (NonScrollableArbitraryComponentSpec
       
   173                     name: 'NonScrollableArbitraryComponent1'
       
   174                     component: DiffTextView
       
   175                   )
       
   176                  )
       
   177                
       
   178               )
       
   179               handles: (Any 0.5 1.0)
       
   180             )
       
   181            )
       
   182          
       
   183         )
       
   184       )
       
   185 ! !
       
   186 
       
   187 !DirectoryDifferenceViewApplication class methodsFor:'tableColumns specs'!
       
   188 
       
   189 searchResultTable
       
   190     "This resource specification was automatically generated
       
   191      by the DataSetBuilder of ST/X."
       
   192 
       
   193     "Do not manually edit this!! If it is corrupted,
       
   194      the DataSetBuilder may not be able to read the specification."
       
   195 
       
   196     "
       
   197      DataSetBuilder new openOnClass:DirectoryDifferenceViewApplication andSelector:#searchResultTable
       
   198     "
       
   199 
       
   200     <resource: #tableColumns>
       
   201 
       
   202     ^#(
       
   203       (DataSetColumnSpec
       
   204          label: 'Filename'
       
   205          id: 'FileName'
       
   206          labelButtonType: Button
       
   207          model: at:
       
   208          menuFromApplication: false
       
   209          writeSelector: at:put:
       
   210          showRowSeparator: false
       
   211          showColSeparator: false
       
   212        )
       
   213       (DataSetColumnSpec
       
   214          label: 'Diff'
       
   215          id: 'Diff'
       
   216          labelButtonType: Button
       
   217          model: at:
       
   218          menuFromApplication: false
       
   219          writeSelector: at:put:
       
   220          showRowSeparator: false
       
   221          showColSeparator: false
       
   222        )
       
   223       )
       
   224     
       
   225 ! !
       
   226 
       
   227 !DirectoryDifferenceViewApplication methodsFor:'accessing'!
       
   228 
       
   229 directory1:directory1Arg directory2:directory2Arg 
       
   230     self directory1Holder value:directory1Arg.
       
   231     self directory2Holder value:directory2Arg.
       
   232 
       
   233 "/    self namePatternHolder value:newPattern.
       
   234     self enableStop value:false.
       
   235     self enableSearch value:true.
       
   236     ^ true.
       
   237 
       
   238     "Modified: / 12-01-2012 / 01:36:54 / cg"
       
   239 !
       
   240 
       
   241 directory1Holder
       
   242     directory1Holder isNil ifTrue:[
       
   243         directory1Holder := nil asValue
       
   244     ].
       
   245     ^ directory1Holder
       
   246 
       
   247     "Created: / 12-01-2012 / 01:37:31 / cg"
       
   248 !
       
   249 
       
   250 directory2Holder
       
   251     directory2Holder isNil ifTrue:[
       
   252         directory2Holder := nil asValue
       
   253     ].
       
   254     ^ directory2Holder
       
   255 
       
   256     "Created: / 12-01-2012 / 01:37:41 / cg"
       
   257 ! !
       
   258 
       
   259 !DirectoryDifferenceViewApplication methodsFor:'comparing'!
       
   260 
       
   261 doSearch
       
   262     |dir1 dir2|
       
   263 
       
   264     filesOnlyInDirectory1 := OrderedCollection new.
       
   265     filesOnlyInDirectory2 := OrderedCollection new.
       
   266     directoriesOnlyInDirectory1 := OrderedCollection new.
       
   267     directoriesOnlyInDirectory2 := OrderedCollection new.
       
   268     filesWhichAreDifferent := OrderedCollection new.
       
   269 
       
   270     dir1 := self directory1Holder value.
       
   271     dir1 isNil ifTrue:[^ self].
       
   272 
       
   273     dir2 := self directory2Holder value.
       
   274     dir2 isNil ifTrue:[^ self].
       
   275 
       
   276     dir1 := dir1 asFilename.
       
   277     dir2 := dir2 asFilename.
       
   278 
       
   279     self 
       
   280         startSearchTask:[
       
   281             self changeInformationTo:'Directory Diff - searching ' toTab:true.
       
   282 
       
   283             self shownListHolder valueHolder:(self matchedFilesList).
       
   284 
       
   285             dir1 recursiveDirectoryContentsDo:[:relFn1 |
       
   286                 |fn1 fn2|
       
   287 
       
   288                 fn1 := dir1 construct:relFn1.
       
   289                 fn2 := dir2 construct:relFn1.
       
   290 
       
   291                 fn1 isDirectory ifTrue:[
       
   292                     self notify:('Comparing %1...' bindWith:relFn1 asString allBold).
       
   293                     fn2 exists ifFalse:[
       
   294                         directoriesOnlyInDirectory1 add:fn1.
       
   295                         self matchedFilesList add:{ relFn1 . 'Directory only in directory1' }.
       
   296                     ].
       
   297                 ] ifFalse:[
       
   298                     fn2 exists ifTrue:[
       
   299                         (fn1 sameContentsAs:fn2) ifFalse:[
       
   300                             filesWhichAreDifferent add:fn1.
       
   301                             self matchedFilesList add:{ relFn1 . 'Different' }.
       
   302                         ].
       
   303                     ] ifFalse:[
       
   304                         filesOnlyInDirectory1 add:fn1.
       
   305                         self matchedFilesList add:{ relFn1 . 'File only in directory1' }.
       
   306                     ].
       
   307                 ].
       
   308             ].
       
   309             dir2 recursiveDirectoryContentsDo:[:relFn2 |
       
   310                 |fn1 fn2|
       
   311 
       
   312                 fn2 := dir2 construct:relFn2.
       
   313                 fn1 := dir1 construct:relFn2.
       
   314                 fn1 exists ifFalse:[
       
   315                     fn1 isDirectory ifTrue:[
       
   316                         directoriesOnlyInDirectory1 add:fn1.
       
   317                         self matchedFilesList add:{ relFn2 . 'Directory only in directory2' }.
       
   318                     ] ifFalse:[
       
   319                         filesOnlyInDirectory2 add:fn2.
       
   320                         self matchedFilesList add:{ relFn2 . 'File only in directory2' }.
       
   321                     ]
       
   322                 ].
       
   323             ].
       
   324             filesOnlyInDirectory1 notEmpty ifTrue:[
       
   325                 Transcript showCR:('%1 files only in directory1' bindWith:filesOnlyInDirectory1 size).
       
   326             ].
       
   327             filesOnlyInDirectory2 notEmpty ifTrue:[
       
   328                 Transcript showCR:('%1 files only in directory2' bindWith:filesOnlyInDirectory2 size).
       
   329             ].
       
   330             directoriesOnlyInDirectory1 notEmpty ifTrue:[
       
   331                 Transcript showCR:('%1 directories only in directory1' bindWith:directoriesOnlyInDirectory1 size).
       
   332             ].
       
   333             directoriesOnlyInDirectory2 notEmpty ifTrue:[
       
   334                 Transcript showCR:('%1 directories only in directory2' bindWith:directoriesOnlyInDirectory2 size).
       
   335             ].
       
   336             filesWhichAreDifferent notEmpty ifTrue:[
       
   337                 Transcript showCR:('%1 files are different' bindWith:filesWhichAreDifferent size).
       
   338             ]
       
   339         ]
       
   340         name:'Directory Diff'.
       
   341 
       
   342     "Created: / 12-01-2012 / 01:07:20 / cg"
       
   343 ! !
       
   344 
       
   345 !DirectoryDifferenceViewApplication methodsFor:'startup & release'!
       
   346 
       
   347 postOpenWith:aBuilder
       
   348     super postOpenWith:aBuilder.
       
   349     self doSearch
       
   350 
       
   351     "Created: / 12-01-2012 / 01:41:18 / cg"
       
   352 ! !
       
   353 
       
   354 !DirectoryDifferenceViewApplication class methodsFor:'documentation'!
       
   355 
       
   356 version
       
   357     ^ '$Header: /cvs/stx/stx/libtool/DirectoryDifferenceViewApplication.st,v 1.1 2012-01-12 01:53:26 cg Exp $'
       
   358 !
       
   359 
       
   360 version_CVS
       
   361     ^ '$Header: /cvs/stx/stx/libtool/DirectoryDifferenceViewApplication.st,v 1.1 2012-01-12 01:53:26 cg Exp $'
       
   362 ! !