diff -r 173a07117f56 -r 1f90c55c4f78 HierarchicalFileList.st --- a/HierarchicalFileList.st Tue Apr 08 14:29:42 2003 +0200 +++ b/HierarchicalFileList.st Tue Apr 08 15:38:08 2003 +0200 @@ -35,8 +35,8 @@ ! HierarchicalFileList::HierarchicalFileItem subclass:#Directory - instanceVariableNames:'modificationTime fetchOperation makeIconGray' - classVariableNames:'' + instanceVariableNames:'modificationTime makeIconGray quickChildrenInfo' + classVariableNames:'StateUnknown StateHasChildren StateHasNoChildren StateFetching' poolDictionaries:'' privateIn:HierarchicalFileList ! @@ -222,7 +222,7 @@ index := children findFirst:[:el| el fileName = oldDir ]. index ~~ 0 ifTrue:[ newRoot at:index put:oldRoot ]. ]. - doExpand ifTrue:[ newRoot expand ]. + doExpand ifTrue:[ newRoot enforcedExpand ]. ! root:aRoot @@ -472,7 +472,7 @@ item := indicatorList removeFirst. (self includesIdentical:item) ifFalse:[ - "/ no longer visible + "/ item is no longer visible item resetFetchIndicator. item := nil ] @@ -783,6 +783,19 @@ " ! ! +!HierarchicalFileList::Directory class methodsFor:'initialization'! + +initialize + StateUnknown := nil. + StateHasChildren := #hasChildren. + StateHasNoChildren := #hasNoChildren. + StateFetching := #fetching + + " + self initialize + " +! ! + !HierarchicalFileList::Directory methodsFor:'accessing'! children @@ -801,30 +814,28 @@ ^ children ! -flushChildren - "flush the children because node not visible .... +icon + "returns the icon " - children notNil ifTrue:[ - "keep hasChildren information - " - children size ~~ 0 ifTrue:[ fetchOperation := #hasChildren ] - ifFalse:[ fetchOperation := #hasNoChildren ]. - children := nil. - ]. -! + + |nameKey| -icon - "returns the icon key - " isExpanded ifTrue:[ + (makeIconGray == true) ifTrue:[ + nameKey := #directoryOpenGray + ] ifFalse:[ + nameKey := #directoryOpen + ] + ] ifFalse:[ makeIconGray == true ifTrue:[ - ^ FileBrowser iconForKeyMatching:#directoryOpenGray - ]. - ^ FileBrowser iconForKeyMatching:#directoryOpen + nameKey := #directoryGray + ] ]. - makeIconGray == true ifTrue:[ - ^ FileBrowser iconForKeyMatching:#directoryGray + + nameKey notNil ifTrue:[ + ^ FileBrowser iconForKeyMatching:nameKey ]. + icon isNil ifTrue:[ ^ super icon ]. @@ -843,7 +854,7 @@ ! makeIconGray:something - "set the value of the instance variable 'makeIconGray' (automatically generated)" + "set/clear the flag which enforces the icon to be shown in grey" makeIconGray := something. ! @@ -859,19 +870,19 @@ " |model list hadChildren hasChildren| + self forgetAboutChildren. + model := self model. - model isNil ifTrue:[ "/ must reread later - fetchOperation := modificationTime := children := nil. - ^ nil + modificationTime := children := nil. + ^ nil ]. hadChildren := children size ~~ 0. "/ set to suppress reading of children children := #(). - fetchOperation := nil. modificationTime := self fileName modificationTime. model stopIndicatorValidationFor:self. @@ -926,12 +937,10 @@ basicFetchIndicator |hasChildren| - hasChildren := DirectoryContents directoryNamed:self fileName detect:(self model matchBlock). - hasChildren ifTrue:[ - fetchOperation := #hasChildren - ] ifFalse:[ - fetchOperation := #hasNoChildren - ]. + hasChildren := DirectoryContents directoryNamed:(self fileName) detect:(self model matchBlock). + self knownToHaveChildren:hasChildren. + children notNil ifTrue:[self halt]. + children isNil ifTrue:[ "setup modification time to suppress monitorCycle " @@ -940,29 +949,31 @@ ! fetchIndicator - "fetch the indicator value which indicates whether children exists or not - called by the list + "fetch the indicator value which indicates whether children exist or not. + Called by the lists update process. " children notNil ifTrue:[ "/ children already read - fetchOperation := nil. - ^ self + self forgetAboutChildren. + ^ self ]. - fetchOperation ~~ #fetching ifTrue:[ - "/ children will be updated .... + self isFetchingChildrenInfo ifFalse:[ + "/ children will be updated in a second.... ^ self ]. "/ suppress restart of fetchIndicator self basicFetchIndicator. + children notNil ifTrue:[self halt]. + children notNil ifTrue:[ - fetchOperation := nil. + self forgetAboutChildren. children notEmpty ifTrue:[ self changed:#redraw ]. ] ifFalse:[ "/ is a remote or very slow file system - fetchOperation == #hasChildren ifTrue:[ + self isKnownToHaveChildren ifTrue:[ self changed:#redraw ]. ]. @@ -971,35 +982,95 @@ resetFetchIndicator "update indication cycle has deregistered the item " - fetchOperation := nil. + + self forgetAboutChildren. +! ! + +!HierarchicalFileList::Directory methodsFor:'private'! + +flushChildren + "flush the children because the node is going to be invisible. + " + children notNil ifTrue:[ + self knownToHaveChildren:(children size ~~ 0). + children := nil. + ]. +! ! + +!HierarchicalFileList::Directory methodsFor:'private - quick children info'! + +forgetAboutChildren + quickChildrenInfo := StateUnknown +! + +isChildrenInfoValid + ^ quickChildrenInfo ~~ StateUnknown and:[quickChildrenInfo ~~ StateFetching] +! + +isFetchingChildrenInfo + ^ quickChildrenInfo == StateFetching +! + +isKnownToHaveChildren + ^ quickChildrenInfo == StateHasChildren +! + +isKnownToHaveNoChildren + ^ quickChildrenInfo == StateHasNoChildren +! + +knownToHaveChildren:aBoolean + aBoolean ifTrue:[ + quickChildrenInfo := StateHasChildren. + ] ifFalse:[ + quickChildrenInfo := StateHasNoChildren. + ]. +! + +setFetchingChildrenInfo + quickChildrenInfo := StateFetching ! ! !HierarchicalFileList::Directory methodsFor:'queries'! +canExpand + super canExpand ifTrue:[^ true]. + "/ in case we are fetching the subdirectory + self isFetchingChildrenInfo ifTrue:[ +self halt. + ]. + + ^ false +! + hasChildren - "returns true if children exists + "returns true if children exist " |model| children notNil ifTrue:[ - fetchOperation := nil. - ^ children size ~~ 0 + self forgetAboutChildren. + ^ children size ~~ 0 ]. - fetchOperation notNil ifTrue:[ - ^ fetchOperation == #hasChildren + self isFetchingChildrenInfo ifTrue:[ + ^ false. + ]. + self isChildrenInfoValid ifTrue:[ + ^ self isKnownToHaveChildren ]. model := self model. model notNil ifTrue:[ - fetchOperation := #fetching. + self setFetchingChildrenInfo. model startIndicatorValidationFor:self. ] ifFalse:[ self error:'should not happen' mayProceed:true. - fetchOperation := nil + self forgetAboutChildren ]. - ^ children size ~~ 0 + children size ~~ 0 ifTrue:[self halt. ^ true]. + ^ false ! isDirectory @@ -1015,7 +1086,8 @@ invalidateRepairNow:doRepair "invalidate contents " - fetchOperation := modificationTime := nil. + modificationTime := nil. + self forgetAboutChildren isExpanded ifFalse:[ children := nil @@ -1037,7 +1109,8 @@ modificationTime := nil. isExpanded ifFalse:[ - fetchOperation := children := nil. + children := nil. + self forgetAboutChildren ] ifTrue:[ self monitoringCycle. @@ -1064,20 +1137,22 @@ ^ self ]. ]. + DirectoryContents flushCachedDirectoryFor:(self fileName). isExpanded ifFalse:[ timeChanged ifTrue:[ - fetchOperation := children := nil. + children := nil. + self forgetAboutChildren. self changed:#redraw. ]. ^ self ]. - model := self model. + children isNil ifTrue:[ children := #() ]. "/ disable update during merge - - fetchOperation := nil. - mergedList := model childrenFor:self. + self forgetAboutChildren. + model := self model. + mergedList := model childrenFor:self. mergedList size == 0 ifTrue:[ self removeAll. @@ -1085,7 +1160,6 @@ ]. size := children size. - size == 0 ifTrue:[ self addAll:mergedList. ^ self @@ -1139,11 +1213,15 @@ "returns true if children exists " children notNil ifTrue:[ - fetchOperation := nil. + self forgetAboutChildren. ^ children size ~~ 0 ]. - fetchOperation := #hasChildren. - ^ true + + "/ assume that there are children; + "/ this might be wrong and clicking on the expand-icon + "/ will then not perform an expand, but remove the can-expand indicator. + self knownToHaveChildren:true. + ^ true ! isRemoteDirectory @@ -1153,5 +1231,7 @@ !HierarchicalFileList class methodsFor:'documentation'! version - ^ '$Header: /cvs/stx/stx/libwidg2/HierarchicalFileList.st,v 1.43 2003-03-03 10:21:56 penk Exp $' + ^ '$Header: /cvs/stx/stx/libwidg2/HierarchicalFileList.st,v 1.44 2003-04-08 13:38:08 cg Exp $' ! ! + +HierarchicalFileList::Directory initialize!