# HG changeset patch # User Claus Gittinger # Date 1377158347 -7200 # Node ID c1c9bfd7ad188ad7ef2bbc480f6e75caacf1cc9a # Parent 482172c551b386e0db68b361e23943aec3c13c21 class: DataSetBuilder added: #makeAllCellsSelectable #makeAllCellsUnselectable changed: #menuEdit category of:46 methods diff -r 482172c551b3 -r c1c9bfd7ad18 DataSetBuilder.st --- a/DataSetBuilder.st Sun Aug 11 11:59:20 2013 +0200 +++ b/DataSetBuilder.st Thu Aug 22 09:59:07 2013 +0200 @@ -2668,6 +2668,20 @@ itemValue: makeSelectedCellsSelectable translateLabel: true ) + (MenuItem + label: '-' + ) + + (MenuItem + label: 'Make All Cells Unselectable' + itemValue: makeAllCellsUnselectable + translateLabel: true + ) + (MenuItem + label: 'Make All Cells Selectable' + itemValue: makeAllCellsSelectable + translateLabel: true + ) ) nil nil @@ -3502,454 +3516,7 @@ "/ aDataSetColumnSpec editorType: #InputField. ! ! -!DataSetBuilder methodsFor:'operations'! - -addCellSeparators - self addRowSeparators. - self addColumnSeparators. -! - -addColumnSeparators - self selectedColumnsDo:[:eachColDescr | - eachColDescr showColSeparator:true - ]. - self updateAfterOperation. -! - -addLabelColumnSeparators - self selectedColumnsDo:[:eachColDescr | - eachColDescr labelButtonType:#Button - ]. - self updateAfterOperation. -! - -addLabelSeparators - self selectedColumnsDo:[:eachColDescr | - eachColDescr labelButtonType:#Button - ]. - self updateAfterOperation. -! - -addRowSeparators - self selectedColumnsDo:[:eachColDescr | - eachColDescr showRowSeparator:true - ]. - self updateAfterOperation. -! - -alignColumns:how - self selectedColumnsDo:[:eachColDescr | - eachColDescr columnAlignment:how - ]. - self updateAfterOperation. -! - -alignColumnsCentered - self alignColumns:#centered -! - -alignColumnsLeft - self alignColumns:#left -! - -alignColumnsRight - self alignColumns:#right -! - -alignLabels:how - self selectedColumnsDo:[:eachColDescr | - eachColDescr labelAlignment:how - ]. - self updateAfterOperation. -! - -alignLabelsCentered - self alignLabels:#centered -! - -alignLabelsLeft - self alignLabels:#left -! - -alignLabelsRight - self alignLabels:#right -! - -makeColumnsSelectable - self makeColumnsSelectable:true -! - -makeColumnsSelectable:aBoolean - self selectedColumnsDo:[:eachColDescr | - eachColDescr canSelect:aBoolean - ]. - self updateAfterOperation. -! - -makeColumnsUnselectable - self makeColumnsSelectable:false -! - -makeSelectedCellsSelectable - self selectedColumnsDo:[:eachColDescr | - eachColDescr canSelect:true - ]. - self updateAfterOperation. -! - -makeSelectedCellsUnselectable - self selectedColumnsDo:[:eachColDescr | - eachColDescr canSelect:false - ]. - self updateAfterOperation. -! - -removeCellSeparators - self removeRowSeparators. - self removeColumnSeparators. -! - -removeColumnSeparators - self selectedColumnsDo:[:eachColDescr | - eachColDescr showColSeparator:false - ]. - self updateAfterOperation. -! - -removeLabelColumnSeparators - self selectedColumnsDo:[:eachColDescr | - eachColDescr labelButtonType:#Group - ]. - self updateAfterOperation. -! - -removeLabelSeparators - self selectedColumnsDo:[:eachColDescr | - eachColDescr labelButtonType:#None - ]. - self updateAfterOperation. -! - -removeRowSeparators - self selectedColumnsDo:[:eachColDescr | - eachColDescr showRowSeparator:false - ]. - self updateAfterOperation. -! - -selectedColumnsDo:aBlock - selectedColumnIndex isCollection ifTrue:[ - selectedColumnIndex do:[:idx | aBlock value:(columns at:idx)]. - ] ifFalse:[ - selectedColumnIndex ~~ 0 ifTrue:[ - selectedColumnIndex notNil ifTrue:[ - aBlock value:(columns at:selectedColumnIndex) - ] - ]. - ]. -! - -setCellColorSelectors - |fgSelector bgSelector| - - fgSelector := Dialog request:'FG-Selector for all selected Columns (accept empty for none):'. - fgSelector isNil ifTrue:[^ self]. - - bgSelector := Dialog request:'BG-Selector for all selected Columns (accept empty for none):'. - bgSelector isNil ifTrue:[^ self]. - - self selectedColumnsDo:[:eachColDescr | - bgSelector notEmpty ifTrue:[ - eachColDescr backgroundSelector:bgSelector - ]. - fgSelector notEmpty ifTrue:[ - eachColDescr foregroundSelector:fgSelector - ]. - ]. - self updateAfterOperation. -! - -setSelectedCellColorSelectors - |fgSelector bgSelector| - - fgSelector := Dialog request:'Selected FG-Selector for all selected Columns (accept empty for none):'. - fgSelector isNil ifTrue:[^ self]. - - bgSelector := Dialog request:'Selected BG-Selector for all selected Columns (accept empty for none):'. - bgSelector isNil ifTrue:[^ self]. - - self selectedColumnsDo:[:eachColDescr | - bgSelector notEmpty ifTrue:[ - eachColDescr selectedBackgroundSelector:bgSelector - ]. - fgSelector notEmpty ifTrue:[ - eachColDescr selectedForegroundSelector:fgSelector - ]. - ]. - self updateAfterOperation. -! - -updateAfterOperation - self updateColumnView. - self updateInputFields. - self setModified. -! ! - -!DataSetBuilder methodsFor:'private'! - -labelFromColumn:aColumn - |label| - - aColumn rendererType == #rowSelector ifTrue:[ - ^ 'Row Selector' - ]. - label := aColumn label. - label isNil ifTrue:[^ nil]. - - label isString ifTrue:[^ label]. - - label size > 0 ifTrue:[ - label := label at:1. - ]. - ^ label printString -! - -labelInPreviewPressed:anIndex - (self componentAt:#labelAndColumns) selection:anIndex -! - -updateColumnView - "updates the column view from column descriptions" - - |size previewColumns columnList| - - columnView notNil ifTrue:[ - columnList := List new. - previewColumns := OrderedCollection new. - - (size := columns size) ~~ 0 ifTrue:[ - columns do:[:aCol| - previewColumns add:(aCol copy) - ]. - previewColumns keysAndValuesDo:[:anIndex :column| - column - readSelector: #at:; - writeSelector: #at:put:; - backgroundSelector:nil; - foregroundSelector:nil; - rowSeparatorSelector:nil; - selectSelector: nil; - showComboFieldSelector: nil; - selectSelector: nil; - doubleClickedSelector: nil; - printSelector: nil; - visibilitySelector: nil; - menu: nil; - labelActionSelector:#labelInPreviewPressed:; - labelActionArgument:anIndex; - choices:#choices; - sortSelector: nil; - isSortable: false - ]. - #(' 1' ' 2' ' x') do:[:suffix| - |oneRow| - - oneRow := Row new:size. - 1 to:size do:[:i | oneRow at: i put: ('Cell%1-%2' bindWith:suffix with:i)]. - columnList add: oneRow. - ] - ]. - - columnView list: #(). - columnView columnDescriptors: previewColumns. - columnView list: columnList. - ]. - - "Modified: / 27.10.1998 / 14:41:16 / cg" -! - -updateInputFields - "reloads item value into input fields" - - |column notifyValue| - - (column := self selectedColumn) isNil ifTrue:[ - self tabModel value:0. - ] ifFalse:[ - notifyValue := nil. "/ old: '' -> problems with Toggles (asBoolean) - - aspects do:[:anAspect| anAspect value:notifyValue ]. - aspects keysAndValuesDo:[:aKey :aModel | - aModel value:(column perform:aKey) withoutNotifying: self - ]. - -"/ REPALCE nil by empty string for specific inputFields without an adapter - #( #labelActionArgument #formatString #id ) do:[:aKey| |model| - model := aspects at:aKey. - model value isNil ifTrue:[model value:notifyValue withoutNotifying: self] - ]. - - tabSelection == 0 ifTrue:[self tabModel value:1]. - ]. -! ! - -!DataSetBuilder methodsFor:'selection'! - -selectedColumn - "returns selected column or nil" - - selectedColumnIndex isCollection ifTrue:[ - ^ selectedColumnIndex size == 1 - ifTrue:[ columns at:selectedColumnIndex first ] - ifFalse:[ nil ] - ]. - - ^selectedColumnIndex == 0 - ifFalse:[columns at:selectedColumnIndex ifAbsent: nil] - ifTrue: [nil] -! - -selectedColumnIndex - "returns selected column index or 0" - - ^selectedColumnIndex -! - -selectedColumnIndex:something - "changes selected column and updates specifications" - - something == selectedColumnIndex ifFalse:[ - selectedColumnIndex := something ? 0. - "/ self assert:( selectedColumnIndex <= columns size ). - "/ self assert:( selectedColumnIndex <= self seqList size ). - self isColumnSelected value: true - ]. -! - -selectedColumnIndices - "returns selected column indices or #()" - - selectedColumnIndex == 0 ifTrue:[ ^ #() ]. - selectedColumnIndex isNumber ifTrue:[ ^ Array with:selectedColumnIndex ]. - ^selectedColumnIndex -! - -selectedColumns - selectedColumnIndex isCollection ifTrue:[ - ^ selectedColumnIndex collect:[:idx | columns at:idx] - ]. - - ^ selectedColumnIndex == 0 - ifFalse:[ Array with:(columns at:selectedColumnIndex) ] - ifTrue: [ #() ] -! - -singleSelectedColumnIndex - selectedColumnIndex isCollection ifTrue:[ - ^ selectedColumnIndex size == 1 - ifTrue:[ selectedColumnIndex first ] - ifFalse:[ 0 ] - ]. - - ^ selectedColumnIndex -! - -tabSelection:something - "changes selected tab and set corresponding specification" - - |view spec| - - something == tabSelection ifTrue:[^self]. - - (tabSelection := something) isNil ifTrue:[ - tabSelection == 0 ifTrue:[^ self]. - tabSelection := 0. - ]. - - self selectedColumn isNil ifTrue:[ - tabSelection ~~ 0 ifTrue:[ - self tabModel value:0 - ] ifFalse:[ - self canvasHolder value:nil - ]. - ^ self - ]. - - tabSelection == 0 ifTrue:[ - ^ self tabModel value:1. - ]. - - (view := listOfSpecViews at:tabSelection) isNil ifTrue:[ - view := SimpleView new. - spec := (self class slices at:tabSelection) last. - -"/ view client:nil spec:(self class interfaceSpecFor:spec) builder:(self builder). - view client:self spec:spec builder:(self builder). - listOfSpecViews at:tabSelection put:view. - ]. - self canvasHolder value:view -! ! - -!DataSetBuilder methodsFor:'startup & release'! - -commonPostBuild - columnView := self componentAt:#columnView. - - columns notEmpty ifTrue: [ - self tabModel value: 1. - self selectedColumnModel value:nil; value:1. "/ toggle to force change - self updateInputFields. - self updateInfoLabel. - self updateHistory - ]. - - (self componentAt: #labelAndColumns) - selectConditionBlock: [:i|self askForItemModification]; - action: [:i|self cancel]; - selection: 1. - - "/ using masters infoHolder ? - (builder aspectAt:#useAlienInfoLabelHolder) == true ifTrue:[ - (builder componentAt:#mainPanel) layout bottomOffset:0. - (builder componentAt:#infoBarSubSpec) beInvisible - ] -! - -openModal - "sets the modalOpened flag, so later, - there is no need to ask for saving into a class" - - modalOpened := true. - super openModal -! - -openModalOnResourceSpec: aListSpec - "sets the modalOpened flag, so later, - there is no need to ask for saving into a class" - - modalOpened := true. - super openModalOnResourceSpec: aListSpec - - -! - -postBuildListOfItemsView:aView - listOfItemsView := aView -! - -postBuildSpecView:aView - listOfItemsView := aView -! - -postOpenWith:aBuilder - "reset keyboardProcessor for menuBar" - - super postOpenWith:aBuilder. - aBuilder keyboardProcessor menuBar:nil. - self windowGroup addPreEventHook:self. -! ! - -!DataSetBuilder methodsFor:'user actions'! +!DataSetBuilder methodsFor:'menu & user actions'! accept "accept changes made" @@ -4389,6 +3956,467 @@ self openHTMLDocument:'tools/uipainter/DataSetBuilder.html'. ! ! +!DataSetBuilder methodsFor:'menu operations'! + +addCellSeparators + self addRowSeparators. + self addColumnSeparators. +! + +addColumnSeparators + self selectedColumnsDo:[:eachColDescr | + eachColDescr showColSeparator:true + ]. + self updateAfterOperation. +! + +addLabelColumnSeparators + self selectedColumnsDo:[:eachColDescr | + eachColDescr labelButtonType:#Button + ]. + self updateAfterOperation. +! + +addLabelSeparators + self selectedColumnsDo:[:eachColDescr | + eachColDescr labelButtonType:#Button + ]. + self updateAfterOperation. +! + +addRowSeparators + self selectedColumnsDo:[:eachColDescr | + eachColDescr showRowSeparator:true + ]. + self updateAfterOperation. +! + +alignColumns:how + self selectedColumnsDo:[:eachColDescr | + eachColDescr columnAlignment:how + ]. + self updateAfterOperation. +! + +alignColumnsCentered + self alignColumns:#centered +! + +alignColumnsLeft + self alignColumns:#left +! + +alignColumnsRight + self alignColumns:#right +! + +alignLabels:how + self selectedColumnsDo:[:eachColDescr | + eachColDescr labelAlignment:how + ]. + self updateAfterOperation. +! + +alignLabelsCentered + self alignLabels:#centered +! + +alignLabelsLeft + self alignLabels:#left +! + +alignLabelsRight + self alignLabels:#right +! + +makeAllCellsSelectable + columns do:[:eachColDescr | + eachColDescr canSelect:true + ]. + self updateAfterOperation. +! + +makeAllCellsUnselectable + columns do:[:eachColDescr | + eachColDescr canSelect:false + ]. + self updateAfterOperation. +! + +makeColumnsSelectable + self makeColumnsSelectable:true +! + +makeColumnsSelectable:aBoolean + self selectedColumnsDo:[:eachColDescr | + eachColDescr canSelect:aBoolean + ]. + self updateAfterOperation. +! + +makeColumnsUnselectable + self makeColumnsSelectable:false +! + +makeSelectedCellsSelectable + self selectedColumnsDo:[:eachColDescr | + eachColDescr canSelect:true + ]. + self updateAfterOperation. +! + +makeSelectedCellsUnselectable + self selectedColumnsDo:[:eachColDescr | + eachColDescr canSelect:false + ]. + self updateAfterOperation. +! + +removeCellSeparators + self removeRowSeparators. + self removeColumnSeparators. +! + +removeColumnSeparators + self selectedColumnsDo:[:eachColDescr | + eachColDescr showColSeparator:false + ]. + self updateAfterOperation. +! + +removeLabelColumnSeparators + self selectedColumnsDo:[:eachColDescr | + eachColDescr labelButtonType:#Group + ]. + self updateAfterOperation. +! + +removeLabelSeparators + self selectedColumnsDo:[:eachColDescr | + eachColDescr labelButtonType:#None + ]. + self updateAfterOperation. +! + +removeRowSeparators + self selectedColumnsDo:[:eachColDescr | + eachColDescr showRowSeparator:false + ]. + self updateAfterOperation. +! + +selectedColumnsDo:aBlock + selectedColumnIndex isCollection ifTrue:[ + selectedColumnIndex do:[:idx | aBlock value:(columns at:idx)]. + ] ifFalse:[ + selectedColumnIndex ~~ 0 ifTrue:[ + selectedColumnIndex notNil ifTrue:[ + aBlock value:(columns at:selectedColumnIndex) + ] + ]. + ]. +! + +setCellColorSelectors + |fgSelector bgSelector| + + fgSelector := Dialog request:'FG-Selector for all selected Columns (accept empty for none):'. + fgSelector isNil ifTrue:[^ self]. + + bgSelector := Dialog request:'BG-Selector for all selected Columns (accept empty for none):'. + bgSelector isNil ifTrue:[^ self]. + + self selectedColumnsDo:[:eachColDescr | + bgSelector notEmpty ifTrue:[ + eachColDescr backgroundSelector:bgSelector + ]. + fgSelector notEmpty ifTrue:[ + eachColDescr foregroundSelector:fgSelector + ]. + ]. + self updateAfterOperation. +! + +setSelectedCellColorSelectors + |fgSelector bgSelector| + + fgSelector := Dialog request:'Selected FG-Selector for all selected Columns (accept empty for none):'. + fgSelector isNil ifTrue:[^ self]. + + bgSelector := Dialog request:'Selected BG-Selector for all selected Columns (accept empty for none):'. + bgSelector isNil ifTrue:[^ self]. + + self selectedColumnsDo:[:eachColDescr | + bgSelector notEmpty ifTrue:[ + eachColDescr selectedBackgroundSelector:bgSelector + ]. + fgSelector notEmpty ifTrue:[ + eachColDescr selectedForegroundSelector:fgSelector + ]. + ]. + self updateAfterOperation. +! + +updateAfterOperation + self updateColumnView. + self updateInputFields. + self setModified. +! ! + +!DataSetBuilder methodsFor:'private'! + +labelFromColumn:aColumn + |label| + + aColumn rendererType == #rowSelector ifTrue:[ + ^ 'Row Selector' + ]. + label := aColumn label. + label isNil ifTrue:[^ nil]. + + label isString ifTrue:[^ label]. + + label size > 0 ifTrue:[ + label := label at:1. + ]. + ^ label printString +! + +labelInPreviewPressed:anIndex + (self componentAt:#labelAndColumns) selection:anIndex +! + +updateColumnView + "updates the column view from column descriptions" + + |size previewColumns columnList| + + columnView notNil ifTrue:[ + columnList := List new. + previewColumns := OrderedCollection new. + + (size := columns size) ~~ 0 ifTrue:[ + columns do:[:aCol| + previewColumns add:(aCol copy) + ]. + previewColumns keysAndValuesDo:[:anIndex :column| + column + readSelector: #at:; + writeSelector: #at:put:; + backgroundSelector:nil; + foregroundSelector:nil; + rowSeparatorSelector:nil; + selectSelector: nil; + showComboFieldSelector: nil; + selectSelector: nil; + doubleClickedSelector: nil; + printSelector: nil; + visibilitySelector: nil; + menu: nil; + labelActionSelector:#labelInPreviewPressed:; + labelActionArgument:anIndex; + choices:#choices; + sortSelector: nil; + isSortable: false + ]. + #(' 1' ' 2' ' x') do:[:suffix| + |oneRow| + + oneRow := Row new:size. + 1 to:size do:[:i | oneRow at: i put: ('Cell%1-%2' bindWith:suffix with:i)]. + columnList add: oneRow. + ] + ]. + + columnView list: #(). + columnView columnDescriptors: previewColumns. + columnView list: columnList. + ]. + + "Modified: / 27.10.1998 / 14:41:16 / cg" +! + +updateInputFields + "reloads item value into input fields" + + |column notifyValue| + + (column := self selectedColumn) isNil ifTrue:[ + self tabModel value:0. + ] ifFalse:[ + notifyValue := nil. "/ old: '' -> problems with Toggles (asBoolean) + + aspects do:[:anAspect| anAspect value:notifyValue ]. + aspects keysAndValuesDo:[:aKey :aModel | + aModel value:(column perform:aKey) withoutNotifying: self + ]. + +"/ REPALCE nil by empty string for specific inputFields without an adapter + #( #labelActionArgument #formatString #id ) do:[:aKey| |model| + model := aspects at:aKey. + model value isNil ifTrue:[model value:notifyValue withoutNotifying: self] + ]. + + tabSelection == 0 ifTrue:[self tabModel value:1]. + ]. +! ! + +!DataSetBuilder methodsFor:'selection'! + +selectedColumn + "returns selected column or nil" + + selectedColumnIndex isCollection ifTrue:[ + ^ selectedColumnIndex size == 1 + ifTrue:[ columns at:selectedColumnIndex first ] + ifFalse:[ nil ] + ]. + + ^selectedColumnIndex == 0 + ifFalse:[columns at:selectedColumnIndex ifAbsent: nil] + ifTrue: [nil] +! + +selectedColumnIndex + "returns selected column index or 0" + + ^selectedColumnIndex +! + +selectedColumnIndex:something + "changes selected column and updates specifications" + + something == selectedColumnIndex ifFalse:[ + selectedColumnIndex := something ? 0. + "/ self assert:( selectedColumnIndex <= columns size ). + "/ self assert:( selectedColumnIndex <= self seqList size ). + self isColumnSelected value: true + ]. +! + +selectedColumnIndices + "returns selected column indices or #()" + + selectedColumnIndex == 0 ifTrue:[ ^ #() ]. + selectedColumnIndex isNumber ifTrue:[ ^ Array with:selectedColumnIndex ]. + ^selectedColumnIndex +! + +selectedColumns + selectedColumnIndex isCollection ifTrue:[ + ^ selectedColumnIndex collect:[:idx | columns at:idx] + ]. + + ^ selectedColumnIndex == 0 + ifFalse:[ Array with:(columns at:selectedColumnIndex) ] + ifTrue: [ #() ] +! + +singleSelectedColumnIndex + selectedColumnIndex isCollection ifTrue:[ + ^ selectedColumnIndex size == 1 + ifTrue:[ selectedColumnIndex first ] + ifFalse:[ 0 ] + ]. + + ^ selectedColumnIndex +! + +tabSelection:something + "changes selected tab and set corresponding specification" + + |view spec| + + something == tabSelection ifTrue:[^self]. + + (tabSelection := something) isNil ifTrue:[ + tabSelection == 0 ifTrue:[^ self]. + tabSelection := 0. + ]. + + self selectedColumn isNil ifTrue:[ + tabSelection ~~ 0 ifTrue:[ + self tabModel value:0 + ] ifFalse:[ + self canvasHolder value:nil + ]. + ^ self + ]. + + tabSelection == 0 ifTrue:[ + ^ self tabModel value:1. + ]. + + (view := listOfSpecViews at:tabSelection) isNil ifTrue:[ + view := SimpleView new. + spec := (self class slices at:tabSelection) last. + +"/ view client:nil spec:(self class interfaceSpecFor:spec) builder:(self builder). + view client:self spec:spec builder:(self builder). + listOfSpecViews at:tabSelection put:view. + ]. + self canvasHolder value:view +! ! + +!DataSetBuilder methodsFor:'startup & release'! + +commonPostBuild + columnView := self componentAt:#columnView. + + columns notEmpty ifTrue: [ + self tabModel value: 1. + self selectedColumnModel value:nil; value:1. "/ toggle to force change + self updateInputFields. + self updateInfoLabel. + self updateHistory + ]. + + (self componentAt: #labelAndColumns) + selectConditionBlock: [:i|self askForItemModification]; + action: [:i|self cancel]; + selection: 1. + + "/ using masters infoHolder ? + (builder aspectAt:#useAlienInfoLabelHolder) == true ifTrue:[ + (builder componentAt:#mainPanel) layout bottomOffset:0. + (builder componentAt:#infoBarSubSpec) beInvisible + ] +! + +openModal + "sets the modalOpened flag, so later, + there is no need to ask for saving into a class" + + modalOpened := true. + super openModal +! + +openModalOnResourceSpec: aListSpec + "sets the modalOpened flag, so later, + there is no need to ask for saving into a class" + + modalOpened := true. + super openModalOnResourceSpec: aListSpec + + +! + +postBuildListOfItemsView:aView + listOfItemsView := aView +! + +postBuildSpecView:aView + listOfItemsView := aView +! + +postOpenWith:aBuilder + "reset keyboardProcessor for menuBar" + + super postOpenWith:aBuilder. + aBuilder keyboardProcessor menuBar:nil. + self windowGroup addPreEventHook:self. +! ! + !DataSetBuilder::Row methodsFor:'accessing'! choices