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