# HG changeset patch # User ca # Date 955629140 -7200 # Node ID 623e692f53fc6816d25379bb557d56f0e8dd6cf8 # Parent 421b2a1f4b313862b8df8da0cc3b62c5ab546532 add more functionality; canvas and help diff -r 421b2a1f4b31 -r 623e692f53fc TabListEditor.st --- a/TabListEditor.st Thu Apr 13 12:54:09 2000 +0200 +++ b/TabListEditor.st Thu Apr 13 14:32:20 2000 +0200 @@ -12,8 +12,10 @@ +"{ Package: '.:stx/libtool2' }" + ResourceSpecEditor subclass:#TabListEditor - instanceVariableNames:'rebuildMode testView listOfTabs selectedIndex' + instanceVariableNames:'listOfTabs' classVariableNames:'' poolDictionaries:'' category:'Interface-UIPainter' @@ -96,6 +98,16 @@ editAgument accessCharacterPosition shortcutKey + activeHelpKey + + majorKey + minorKey + createNewBuilder + + hasHorizontalScrollBar + hasVerticalScrollBar + miniScrollerHorizontal + miniScrollerVertical ) ! ! @@ -120,12 +132,15 @@ #addTabItem 'Adds a new tab item.' -#argument -'An optional argument stored with the tab item.' +#autoHideScrollBars +'ScrollBars should be made invisible dynamically, if there is nothing to scroll.' #canSelect 'Turns on/off whether the tab item is selectable.' +#createNewBuilder +'Create a new builder for the application; the application use its own aspects.' + #color 'Defines the foreground color of the label. The default color derives from the style sheet.' @@ -141,12 +156,48 @@ #fileSave 'Saves current tab list.' +#horizontalScroller +'Enable horizontal scrollability.' + +#horizontalMiniScroller +'Use a mini-scroller as horizontal scrollbar.' + +#majorKey +'Name of the class to be started; if empty, the application itself is used.' + +#minorKey +'Message sent to the class which returns the window specification (default: #windowSpec).' + +#verticalScroller +'Enable vertical scrollability.' + +#verticalMiniScroller +'Use a mini-scroller as vertical scrollbar.' + +#canvasTab +'Define an application, which is started if the tab is pressed the first time.' + +#basicTab +'Define the basic attributes.' + +#detailTab +'Define the optional/specific attributes.' + #label 'Label of the tab item.' #labelDerivesFromApplication 'If turned on, the label''s string is a selector returning a string or bitmap image, which is used as logo in the tab item.' +#detailsAccessCharaterPosition +'Index of the access character position of the textual label (optional).' + +#detailsAccelerator +'Key to be pressed to select the tab item from the keyboard (accelerator key).' + +#detailsArgument +'An optional argument stored with the tab item.' + #testPreview 'Turns on/off preview of the tab list.' @@ -174,7 +225,7 @@ !TabListEditor class methodsFor:'interface specs'! -tabSpec +basicSpec "This resource specification was automatically generated by the UIPainter of ST/X." @@ -182,22 +233,22 @@ the UIPainter may not be able to read the specification." " - UIPainter new openOnClass:TabListEditor andSelector:#tabSpec - TabListEditor new openInterface:#tabSpec + UIPainter new openOnClass:TabListEditor andSelector:#basicSpec + TabListEditor new openInterface:#basicSpec " ^ #(#FullSpec - #name: #tabSpec + #name: #basicSpec #window: #(#WindowSpec - #label: 'Tab Basic' - #name: 'Tab Basic' + #label: 'Basic' + #name: 'Basic' #min: #(#Point 10 10) #max: #(#Point 1280 1024) - #bounds: #(#Rectangle 12 22 440 249) + #bounds: #(#Rectangle 803 137 1232 347) ) #component: #(#SpecCollection @@ -209,19 +260,16 @@ #resizeForLabel: true ) #(#InputFieldSpec - #attributes: - #(#LabelField - nil #label - nil #tabable - true - ) #name: 'label' #layout: #(#LayoutFrame 100 0 15 0 -5 1.0 37 0) #activeHelpKey: #label #tabable: true #model: #label #group: #inputGroup - #acceptOnLostFocus: true + #immediateAccept: true + #acceptOnReturn: false + #acceptOnTab: false + #acceptOnLostFocus: false #acceptChannel: #acceptChannel #modifiedChannel: #modifiedChannel #acceptOnPointerLeave: false @@ -233,20 +281,17 @@ #resizeForLabel: true ) #(#InputFieldSpec - #attributes: - #(#label - nil #shortcutKey - nil #tabable - true - ) #name: 'shortcutKey' #layout: #(#LayoutFrame 100 0 44 0 -5 1.0 66 0) - #activeHelpKey: #label + #activeHelpKey: #detailsAccelerator #tabable: true #model: #shortcutKey #group: #inputGroup #type: #symbolOrNil - #acceptOnLostFocus: true + #immediateAccept: true + #acceptOnReturn: false + #acceptOnTab: false + #acceptOnLostFocus: false #acceptChannel: #acceptChannel #modifiedChannel: #modifiedChannel #acceptOnPointerLeave: false @@ -258,21 +303,16 @@ #resizeForLabel: true ) #(#InputFieldSpec - #attributes: - #(#tabable - true #ArgumentField - nil #editAgument - nil - ) #name: 'editAgument' #layout: #(#LayoutFrame 100 0 73 0 -5 1.0 95 0) - #activeHelpKey: #argument + #activeHelpKey: #detailsArgument #tabable: true #model: #editAgument #group: #inputGroup - #acceptOnReturn: true - #acceptOnTab: true - #acceptOnLostFocus: true + #immediateAccept: true + #acceptOnReturn: false + #acceptOnTab: false + #acceptOnLostFocus: false #acceptChannel: #acceptChannel #modifiedChannel: #modifiedChannel #acceptOnPointerLeave: false @@ -284,30 +324,22 @@ #resizeForLabel: true ) #(#InputFieldSpec - #attributes: - #(#label - nil #accessCharacterPos - nil #tabable - true #accessCharacterPosition - nil - ) #name: 'accessCharacterPosition' #layout: #(#LayoutFrame 278 0 103 0 -5 1.0 125 0) - #activeHelpKey: #label + #activeHelpKey: #detailsAccessCharaterPosition #tabable: true #model: #accessCharacterPosition #group: #inputGroup #type: #number - #acceptOnLostFocus: true + #immediateAccept: true + #acceptOnReturn: false + #acceptOnTab: false + #acceptOnLostFocus: false #acceptChannel: #acceptChannel #modifiedChannel: #modifiedChannel #acceptOnPointerLeave: false ) #(#CheckBoxSpec - #attributes: - #(#tabable - true - ) #label: 'Application provides translation ' #name: 'translateLabel' #layout: #(#Point 96 135) @@ -315,14 +347,259 @@ #tabable: true #model: #translateLabel ) + #(#LabelSpec + #label: 'Help Key:' + #name: 'activeHelp' + #layout: #(#AlignmentOrigin 98 0 190 0 1 0.5) + #resizeForLabel: true + ) + #(#InputFieldSpec + #name: 'activeHelpKey' + #layout: #(#LayoutFrame 100 0 179 0 -5 1.0 201 0) + #activeHelpKey: #label + #tabable: true + #model: #activeHelpKey + #group: #inputGroup + #type: #symbolOrNil + #immediateAccept: true + #acceptOnReturn: false + #acceptOnTab: false + #acceptOnLostFocus: false + #acceptChannel: #acceptChannel + #modifiedChannel: #modifiedChannel + #acceptOnPointerLeave: false + ) + ) + + ) + ) +! + +canvasSpec + "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:TabListEditor andSelector:#canvasSpec + TabListEditor new openInterface:#canvasSpec + " + + + + ^ + #(#FullSpec + #name: #canvasSpec + #window: + #(#WindowSpec + #label: 'Canvas' + #name: 'Canvas' + #min: #(#Point 10 10) + #max: #(#Point 1280 1024) + #bounds: #(#Rectangle 803 137 1186 357) + ) + #component: + #(#SpecCollection + #collection: #( + #(#LabelSpec + #label: 'Class Name:' + #name: 'majorKeyLabel' + #layout: #(#AlignmentOrigin 98 0 26 0 1 0.5) + #resizeForLabel: true + ) + #(#InputFieldSpec + #name: 'majorKeyField' + #layout: #(#LayoutFrame 100 0 15 0 -5 1.0 37 0) + #activeHelpKey: #majorKey + #tabable: true + #model: #majorKey + #group: #inputGroup + #type: #symbolOrNil + #immediateAccept: true + #acceptOnReturn: false + #acceptOnTab: false + #acceptOnLostFocus: false + #modifiedChannel: #modifiedChannel + #acceptOnPointerLeave: false + ) + #(#LabelSpec + #label: 'Spec. Selector:' + #name: 'minorKeyLabel' + #layout: #(#AlignmentOrigin 98 0 55 0 1 0.5) + #resizeForLabel: true + ) + #(#InputFieldSpec + #name: 'minorKeyField' + #layout: #(#LayoutFrame 100 0 44 0 -5 1.0 66 0) + #activeHelpKey: #minorKey + #tabable: true + #model: #minorKey + #group: #inputGroup + #type: #symbolOrNil + #immediateAccept: true + #acceptOnReturn: false + #acceptOnTab: false + #acceptOnLostFocus: false + #modifiedChannel: #modifiedChannel + #acceptOnPointerLeave: false + ) + #(#FramedBoxSpec + #label: 'Scroll Bars' + #name: 'FramedBox' + #layout: #(#LayoutFrame 0 0.0 119 0.0 0 1.0 214 0) + #labelPosition: #topLeft + #component: + #(#SpecCollection + #collection: #( + #(#HorizontalPanelViewSpec + #name: 'HorizontalPanel1' + #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0) + #horizontalLayout: #fitSpace + #verticalLayout: #fitSpace + #horizontalSpace: 3 + #verticalSpace: 3 + #component: + #(#SpecCollection + #collection: #( + #(#ViewSpec + #name: 'Box1' + #component: + #(#SpecCollection + #collection: #( + #(#CheckBoxSpec + #label: 'Vertical' + #name: 'verticalScrollBarCheckBox' + #layout: #(#LayoutFrame 0 0.0 3 0 0 1.0 27 0) + #activeHelpKey: #verticalScroller + #tabable: true + #model: #hasVerticalScrollBar + ) + #(#CheckBoxSpec + #label: 'Mini' + #name: 'miniScrollerVerticalCheckBox' + #layout: #(#LayoutFrame 0 0.0 32 0 0 1.0 56 0) + #activeHelpKey: #verticalMiniScroller + #tabable: true + #model: #miniScrollerVertical + ) + ) + + ) + #useDefaultExtent: true + ) + #(#ViewSpec + #name: 'Box2' + #component: + #(#SpecCollection + #collection: #( + #(#CheckBoxSpec + #label: 'Horizontal' + #name: 'horizontalScrollBarCheckBox' + #layout: #(#LayoutFrame 0 0.0 3 0 0 1.0 27 0) + #activeHelpKey: #horizontalScroller + #tabable: true + #model: #hasHorizontalScrollBar + ) + #(#CheckBoxSpec + #label: 'Mini' + #name: 'miniScrollerHorizontalCheckBox' + #layout: #(#LayoutFrame 0 0.0 32 0 0 1.0 56 0) + #activeHelpKey: #horizontalMiniScroller + #tabable: true + #model: #miniScrollerHorizontal + ) + ) + + ) + #extent: #(#Point 114 59) + ) + #(#ViewSpec + #name: 'Box3' + #component: + #(#SpecCollection + #collection: #( + #(#LabelSpec + #label: 'Auto Hide:' + #name: 'Label1' + #layout: #(#LayoutFrame 0 0.0 6 0 0 1.0 23 0) + #translateLabel: true + #resizeForLabel: true + #adjust: #left + ) + #(#PopUpListSpec + #label: 'Default' + #name: 'PopUpList1' + #layout: #(#LayoutFrame 0 0.0 32 0 0 1.0 54 0) + #tabable: true + #activeHelpKey: #autoHideScrollBars + #model: #autoHideScrollBars + #menu: + #(#Default + #On #Off + ) + #useIndex: true + #showHandle: true + ) + ) + + ) + #extent: #(#Point 114 59) + ) + ) + + ) + ) + ) + + ) + ) #(#CheckBoxSpec - #attributes: - #(#tabable - true - ) + #label: 'Create New Builder' + #name: 'createNewBuilder' + #layout: #(#Point 97 75) + #model: #createNewBuilder + #activeHelpKey: #createNewBuilder + ) + ) + + ) + ) +! + +detailSpec + "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:TabListEditor andSelector:#detailSpec + TabListEditor new openInterface:#detailSpec + " + + + + ^ + #(#FullSpec + #name: #detailSpec + #window: + #(#WindowSpec + #label: 'Details' + #name: 'Details' + #min: #(#Point 10 10) + #max: #(#Point 1280 1024) + #bounds: #(#Rectangle 12 22 370 129) + ) + #component: + #(#SpecCollection + #collection: #( + #(#CheckBoxSpec #label: 'Can Select' #name: 'enabled' - #layout: #(#Point 96 161) + #layout: #(#Point 46 14) #activeHelpKey: #canSelect #tabable: true #model: #enabled @@ -330,7 +607,7 @@ #(#LabelSpec #label: 'Color:' #name: 'ForegroundLabel' - #layout: #(#AlignmentOrigin 98 0 209 0 1 0.5) + #layout: #(#AlignmentOrigin 46 0 62 0 1 0.5) #resizeForLabel: true #adjust: #right ) @@ -340,7 +617,7 @@ true ) #name: 'ForegroundColorMenu' - #layout: #(#LayoutFrame 100 0 197 0 -5 1.0 219 0) + #layout: #(#LayoutFrame 48 0 50 0 -10 1.0 72 0) #activeHelpKey: #color #model: #labelForegroundColor #labelsAreColored: false @@ -373,10 +650,9 @@ #(#WindowSpec #label: 'Tab List Editor' #name: 'Tab List Editor' - #layout: #(#LayoutFrame 58 0 290 0 659 0 707 0) #min: #(#Point 440 280) #max: #(#Point 1152 900) - #bounds: #(#Rectangle 58 290 660 708) + #bounds: #(#Rectangle 17 449 488 816) #menu: #menu ) #component: @@ -391,19 +667,28 @@ #(#VariableHorizontalPanelSpec #name: 'VariablePanel' #layout: #(#LayoutFrame 0 0.0 36 0.0 0 1.0 -26 1.0) - #handles: #(#Any 0.259875 1.0) #component: #(#SpecCollection #collection: #( - #(#SequenceViewSpec - #name: 'ColumnView' + #(#SelectionInListModelViewSpec + #attributes: + #(#vpext + + #(#Array + #Point 0.264414 + 1.0 + ) + ) + #name: 'ListOfLabels' + #tabable: true #model: #selectionHolder #menu: #menuEdit #hasHorizontalScrollBar: true #hasVerticalScrollBar: true #miniScrollerHorizontal: true - #useIndex: true - #sequenceList: #listOfLabels + #listModel: #listOfTabs + #highlightMode: #line + #selectConditionSelector: #askForItemModification ) #(#ViewSpec #name: 'SpecView' @@ -411,24 +696,13 @@ #component: #(#SpecCollection #collection: #( - #(#ViewSpec - #name: 'TestView' - #layout: #(#LayoutFrame 1 0.0 0 0.0 0 1.0 0 1.0) - #component: - #(#SpecCollection - #collection: #( - #(#TabViewSpec - #name: 'TestTabsView' - #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 0.5) - ) - ) - - ) - ) - #(#SubCanvasSpec - #name: 'specCanvas' + #(#NoteBookViewSpec + #name: 'NoteBook' #layout: #(#LayoutFrame 1 0.0 0 0.0 0 1.0 -30 1.0) - #specHolder: #specChannel + #model: #noteBookModel + #menu: #noteBookTabList + #useIndex: true + #keepCanvasAlive: true ) #(#UISubSpecification #name: 'subSpec' @@ -436,6 +710,13 @@ #majorKey: #ToolApplicationModel #minorKey: #windowSpecForCommit ) + #(#NoteBookViewSpec + #name: 'TestNoteBook' + #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0) + #visibilityChannel: #testMode + #menu: #testItemList + #useIndex: true + ) ) ) @@ -443,6 +724,7 @@ ) ) + #handles: #(#Any 0.24053 1.0) ) #(#UISubSpecification #name: 'infoBarSubSpec' @@ -456,6 +738,42 @@ ) ! ! +!TabListEditor class methodsFor:'list specs'! + +noteBookTabList + "This resource specification was automatically generated + by the TabListEditor of ST/X." + + "Do not manually edit this!! If it is corrupted, + the TabListEditor may not be able to read the specification." + + " + TabListEditor new openOnClass:TabListEditor andSelector:#noteBookTabList + " + + + + ^ #( + #(#TabItem + #label: 'Basic' + #activeHelpKey: #basicTab + #minorKey: #basicSpec + ) + #(#TabItem + #label: 'Details' + #activeHelpKey: #detailTab + #minorKey: #detailSpec + ) + #(#TabItem + #label: 'Canvas' + #activeHelpKey: #canvasTab + #minorKey: #canvasSpec + ) + ) + + collect:[:aTab| TabItem new fromLiteralArrayEncoding:aTab ] +! ! + !TabListEditor class methodsFor:'menu specs'! menu @@ -551,7 +869,7 @@ #( #(#MenuItem #label: 'Tab Item' - #value: #doCreateTabItem + #value: #doCreate #activeHelpKey: #addTabItem #labelImage: #(#ResourceRetriever nil #newTabItemIcon 'Tab Item') ) @@ -586,7 +904,7 @@ #(#MenuItem #label: 'Preview' #activeHelpKey: #testPreview - #enabled: #canShowTestMode + #enabled: #canToggleTestMode #indication: #testMode ) ) nil @@ -690,134 +1008,150 @@ - ^ - - #(#Menu - - #( - #(#MenuItem - #label: 'New' - #isButton: true - #value: #doNew - #activeHelpKey: #fileNew - #labelImage: #(#ResourceRetriever #Icon #newIcon) - ) - #(#MenuItem - #label: 'Load' - #isButton: true - #value: #doLoad - #activeHelpKey: #fileLoad - #labelImage: #(#ResourceRetriever #Icon #loadIcon) - ) - #(#MenuItem - #label: 'Save' - #isButton: true - #value: #doSave - #activeHelpKey: #fileSave - #labelImage: #(#ResourceRetriever #Icon #saveIcon) - ) - #(#MenuItem - #label: '' - ) - #(#MenuItem - #label: 'Cut' - #isButton: true - #value: #doCut - #activeHelpKey: #editCut - #enabled: #valueOfCanCut - #labelImage: #(#ResourceRetriever #Icon #cutIcon) - ) - #(#MenuItem - #label: 'Copy' - #isButton: true - #value: #doCopy - #activeHelpKey: #editCopy - #enabled: #valueOfCanCopy - #labelImage: #(#ResourceRetriever #Icon #copyIcon) - ) - #(#MenuItem - #label: 'Paste' - #isButton: true - #value: #doPaste - #activeHelpKey: #editPaste - #enabled: #valueOfCanPaste - #labelImage: #(#ResourceRetriever #Icon #pasteIcon) - ) - #(#MenuItem - #label: 'Delete' - #isButton: true - #value: #doDelete - #activeHelpKey: #editDelete - #enabled: #valueOfCanCut - #labelImage: #(#ResourceRetriever #Icon #deleteIcon) - ) - #(#MenuItem - #label: '' - ) - #(#MenuItem - #label: 'Add Tab Item' - #isButton: true - #value: #doCreateTabItem - #activeHelpKey: #addTabItem - #labelImage: #(#ResourceRetriever nil #newTabItemIcon) - ) - #(#MenuItem - #label: '' - ) - #(#MenuItem - #label: 'Move Tab Up' - #isButton: true - #value: #doMoveTabUpOrDown: - #activeHelpKey: #editMoveUp - #enabled: #canMoveTabItemUpOrDown - #argument: #up - #labelImage: #(#ResourceRetriever #Icon #upIcon) - ) - #(#MenuItem - #label: 'Move Tab Down' - #isButton: true - #value: #doMoveTabUpOrDown: - #activeHelpKey: #editMoveDown - #enabled: #canMoveTabItemUpOrDown - #argument: #down - #labelImage: #(#ResourceRetriever #Icon #downIcon) - ) - #(#MenuItem - #label: '' - ) - #(#MenuItem - #label: 'Preview' - #activeHelpKey: #testPreview - #enabled: #canShowTestMode - #indication: #testMode - ) - ) nil - nil + ^ + #(#Menu + #( + #(#MenuItem + #label: 'New' + #isButton: true + #value: #doNew + #activeHelpKey: #fileNew + #labelImage: #(#ResourceRetriever #Icon #newIcon) + ) + #(#MenuItem + #label: 'Load' + #isButton: true + #value: #doLoad + #activeHelpKey: #fileLoad + #labelImage: #(#ResourceRetriever #Icon #loadIcon) + ) + #(#MenuItem + #label: 'Save' + #isButton: true + #value: #doSave + #activeHelpKey: #fileSave + #labelImage: #(#ResourceRetriever #Icon #saveIcon) + ) + #(#MenuItem + #label: '' + ) + #(#MenuItem + #label: 'Cut' + #isButton: true + #value: #doCut + #activeHelpKey: #editCut + #enabled: #valueOfCanCut + #labelImage: #(#ResourceRetriever #Icon #cutIcon) + ) + #(#MenuItem + #label: 'Copy' + #isButton: true + #value: #doCopy + #activeHelpKey: #editCopy + #enabled: #valueOfCanCopy + #labelImage: #(#ResourceRetriever #Icon #copyIcon) + ) + #(#MenuItem + #label: 'Paste' + #isButton: true + #value: #doPaste + #activeHelpKey: #editPaste + #enabled: #valueOfCanPaste + #labelImage: #(#ResourceRetriever #Icon #pasteIcon) + ) + #(#MenuItem + #label: 'Delete' + #isButton: true + #value: #doDelete + #activeHelpKey: #editDelete + #enabled: #valueOfCanCut + #labelImage: #(#ResourceRetriever #Icon #deleteIcon) + ) + #(#MenuItem + #label: '' + ) + #(#MenuItem + #label: 'Add Tab Item' + #isButton: true + #value: #doCreate + #activeHelpKey: #addTabItem + #labelImage: #(#ResourceRetriever nil #newTabItemIcon) + ) + #(#MenuItem + #label: '' + ) + #(#MenuItem + #label: 'Move Tab Up' + #isButton: true + #value: #doMoveTabUpOrDown: + #activeHelpKey: #editMoveUp + #enabled: #canMoveTabItemUpOrDown + #argument: #up + #labelImage: #(#ResourceRetriever #Icon #upIcon) + ) + #(#MenuItem + #label: 'Move Tab Down' + #isButton: true + #value: #doMoveTabUpOrDown: + #activeHelpKey: #editMoveDown + #enabled: #canMoveTabItemUpOrDown + #argument: #down + #labelImage: #(#ResourceRetriever #Icon #downIcon) + ) + ) + nil + nil ) ! ! !TabListEditor methodsFor:'aspects'! +autoHideScrollBars + |holder| + + (holder := builder bindingAt:#autoHideScrollBars) isNil ifTrue:[ + builder aspectAt:#autoHideScrollBars put:(holder := 1 asValue). + holder addDependent: self + ]. + ^ holder. +! + canMoveTabItemUpOrDown + ^ builder booleanValueAspectFor:#canMoveTabItemUpOrDown +! + +hasHorizontalScrollBar + "automatically generated by UIPainter ..." + + "*** the code below creates a default model when invoked." + "*** (which may not be the one you wanted)" + "*** Please change as required and accept it in the browser." |holder| - (holder := builder bindingAt:#canMoveTabItemUpOrDown) isNil ifTrue:[ - builder aspectAt:#canMoveTabItemUpOrDown put:(holder := false asValue). + (holder := builder bindingAt:#hasHorizontalScrollBar) isNil ifTrue:[ + holder := true asValue. + builder aspectAt:#hasHorizontalScrollBar put:holder. +"/ holder addDependent:self. ]. - ^ holder - + ^ holder. ! -canShowTestMode +hasVerticalScrollBar + "automatically generated by UIPainter ..." + + "*** the code below creates a default model when invoked." + "*** (which may not be the one you wanted)" + "*** Please change as required and accept it in the browser." |holder| - (holder := builder bindingAt:#canShowTestMode) isNil ifTrue:[ - builder aspectAt:#canShowTestMode put:(holder := false asValue). + (holder := builder bindingAt:#hasVerticalScrollBar) isNil ifTrue:[ + holder := true asValue. + builder aspectAt:#hasVerticalScrollBar put:holder. +"/ holder addDependent:self. ]. - ^ holder - + ^ holder. ! inputGroup @@ -832,11 +1166,97 @@ ! -listOfLabels - "returns a holder which keeps the list of tab labels - " +listOfTabs + ^ listOfTabs +! + +majorKey + "automatically generated by UIPainter ..." + + "*** the code below creates a default model when invoked." + "*** (which may not be the one you wanted)" + "*** Please change as required and accept it in the browser." + + |holder| + + (holder := builder bindingAt:#majorKey) isNil ifTrue:[ + holder := ValueHolder new. + builder aspectAt:#majorKey put:holder. +"/ holder addDependent:self. + ]. + ^ holder. +! + +miniScrollerHorizontal + "automatically generated by UIPainter ..." + + "*** the code below creates a default model when invoked." + "*** (which may not be the one you wanted)" + "*** Please change as required and accept it in the browser." + + |holder| + + (holder := builder bindingAt:#miniScrollerHorizontal) isNil ifTrue:[ + holder := true asValue. + builder aspectAt:#miniScrollerHorizontal put:holder. +"/ holder addDependent:self. + ]. + ^ holder. +! + +miniScrollerVertical + "automatically generated by UIPainter ..." + + "*** the code below creates a default model when invoked." + "*** (which may not be the one you wanted)" + "*** Please change as required and accept it in the browser." - ^ builder listAspectFor:#listOfLabels + |holder| + + (holder := builder bindingAt:#miniScrollerVertical) isNil ifTrue:[ + holder := true asValue. + builder aspectAt:#miniScrollerVertical put:holder. +"/ holder addDependent:self. + ]. + ^ holder. +! + +minorKey + "automatically generated by UIPainter ..." + + "*** the code below creates a default model when invoked." + "*** (which may not be the one you wanted)" + "*** Please change as required and accept it in the browser." + + |holder| + + (holder := builder bindingAt:#minorKey) isNil ifTrue:[ + holder := ValueHolder new. + builder aspectAt:#minorKey put:holder. +"/ holder addDependent:self. + ]. + ^ holder. +! + +noteBookModel + |holder| + + (holder := builder bindingAt:#noteBookModel) isNil ifTrue:[ + holder := 0 asValue. + builder aspectAt:#noteBookModel put:holder. + ]. + ^ holder. +! + +noteBookTabList + "Generated by the TabListEditor" + + |list| + + (list := builder bindingAt:#noteBookTabList) isNil ifTrue:[ + builder aspectAt:#noteBookTabList put:(list := self class noteBookTabList). + ]. + ^ list ! selectionHolder @@ -845,21 +1265,21 @@ |holder| (holder := builder bindingAt:#selectionHolder) isNil ifTrue:[ - holder := AspectAdaptor new subject:self; forAspect:#selectedIndex. + holder := 0 asValue. builder aspectAt:#selectionHolder put:holder. + holder addDependent:self. ]. ^ holder ! -specChannel - "holder which keeps the current tab specification - " +testItemList |holder| - (holder := builder bindingAt:#specChannel) isNil ifTrue:[ - builder aspectAt:#specChannel put:(holder := ValueHolder new). + (holder := builder bindingAt:#testItemList) isNil ifTrue:[ + holder := ValueHolder new. + builder aspectAt:#testItemList put:holder. ]. - ^ holder + ^ holder. ! testMode @@ -879,31 +1299,18 @@ buildFromClass:aClass andSelector:aSelector "build from class and selector " - |cls spec list selectionHolder| + |cls spec| self testMode value: false. - (selectionHolder := self selectionHolder) value:0. + self selection:0. "if opened on a tab list" - (aClass isNil and: [aSelector isNil and: [listOfTabs size > 0]]) - ifTrue:[ - listOfTabs notEmpty ifTrue:[ - selectionHolder value:1 - ]. - ^ nil + (aClass isNil and: [aSelector isNil and: [listOfTabs size > 0]]) ifTrue:[ + listOfTabs notEmpty ifTrue:[self selection:1]. + ^ nil ]. - - self listOfLabels removeAll. listOfTabs removeAll. - testView notNil ifTrue:[ - testView lower - ]. - - rebuildMode := false. - - self canShowTestMode value: false. - cls := self resolveName:aClass. specSelector := aSelector. @@ -912,17 +1319,11 @@ (cls respondsTo:specSelector) ifTrue:[ spec := cls perform:specSelector. - list := self listOfLabels. spec size ~~ 0 ifTrue:[ - - rebuildMode := true. - spec do:[:aTab| - list add:aTab label. listOfTabs add:aTab. ]. - rebuildMode := false. self addToHistory:(cls name, ' ', specSelector) -> #loadFromMessage: ] ] @@ -932,38 +1333,29 @@ modified := false. listOfTabs notEmpty ifTrue:[ - self selectionHolder value:1 + self selection:1 ]. self updateInfoLabel ! -buildFromResourceSpec: aListSpec - - self buildFromTabList: aListSpec +buildFromResourceSpec:aListSpec + self buildFromTabList:aListSpec ! buildFromTabList: aTabList "build from a aTabList" - |selectionHolder listOfLabels| - - rebuildMode := true. - - (selectionHolder := self selectionHolder) value: nil. - (listOfLabels := self listOfLabels) removeAll. + self selection:0. listOfTabs removeAll. aTabList do:[:aTabItem| listOfTabs add: aTabItem. - listOfLabels add: aTabItem label ]. - rebuildMode := false. - modified := false. listOfTabs notEmpty ifTrue:[ - selectionHolder value:1 + self selection:1 ]. self updateInfoLabel @@ -974,63 +1366,96 @@ update:something with:aParameter from:someObject "one of my aspects has changed; update modified channel " - super update:something with:aParameter from:someObject. + |list size index| + + someObject = self selectionHolder ifTrue:[ + ^ self selectionChanged + ]. + + someObject = self testMode ifFalse:[ + ^ super update:something with:aParameter from:someObject. + ]. + + size := listOfTabs size. + + someObject value ifTrue:[ + index := 0. - someObject = self testMode - ifTrue:[ - someObject value - ifTrue: [self doTest] - ifFalse:[testView lower. self selectionHolder value:1]. + size ~~ 0 ifTrue:[ + list := listOfTabs collect:[:aTab| |tab| + tab := aTab copy. + tab setAttributesFromClass:specClass. + tab + ]. + ] + ] ifFalse:[ + index := 1 min:size + ]. + self selectionHolder value:index. + self testItemList value:list. + self updateInfoLabel. - self updateInfoLabel - ] ! ! -!TabListEditor methodsFor:'help'! - -defaultInfoLabel +!TabListEditor methodsFor:'queries'! - ^self testMode value - ifTrue: ['Test mode'] - ifFalse: [super defaultInfoLabel] +canToggleTestMode + "checks whether testMode button is enabled + " + self testMode value ifTrue:[ + ^ true + ]. + + self valueOfEnablingCommitButtons value ifFalse:[ + ^ listOfTabs notEmpty + ]. + ^ false ! ! !TabListEditor methodsFor:'selection'! -selectedIndex - ^ selectedIndex +selectedElement + |idx tab| + + idx := self selection. + + idx ~~ 0 ifTrue:[ + (tab := listOfTabs at:idx ifAbsent:nil) notNil ifTrue:[ + ^ tab + ]. + self selection:0 + ]. + ^ nil +! + +selection + ^ self selectionHolder value ? 0 ! -selectedIndex:anIndex - |oldSel specChannel| +selection:anIndex + self selectionHolder value:(anIndex ? 0). +! - self listOfLabels notEmpty ifTrue: [self canShowTestMode value: true]. - anIndex notNil ifTrue: [self testMode value: false]. - - oldSel := selectedIndex. - selectedIndex := anIndex ? 0. +selectionChanged + |noteBookModel hasSelection| - selectedIndex == oldSel ifTrue:[^ self]. - - specChannel := self specChannel. + hasSelection := self selection ~~ 0. + noteBookModel := self noteBookModel. - oldSel == 0 ifTrue:[ - specChannel value:(self class tabSpec) + hasSelection ifTrue:[ + self testMode value:false. + noteBookModel value == 0 ifTrue:[noteBookModel value:1] ] ifFalse:[ - selectedIndex == 0 ifTrue:[ - specChannel value:nil - ] + noteBookModel value:0 ]. self cancel. - - testView notNil ifTrue:[ - testView lower. - ]. + self valueOfCanCut value:hasSelection. + self valueOfCanCopy value:hasSelection. + self valueOfCanPaste. +! - self valueOfCanCut value: (anIndex ~~ 0). - self valueOfCanCopy value: (anIndex ~~ 0). - self valueOfCanPaste. - +setSelection:anIndex + self selectionHolder value:(anIndex ? 0) withoutNotifying:self ! ! !TabListEditor methodsFor:'startup / release'! @@ -1038,12 +1463,8 @@ initialize "setup aspects used by column description specifications " - super initialize. - - listOfTabs := OrderedCollection new. - selectedIndex := 0. - rebuildMode := false. + listOfTabs := List new. ! openModalOnTabList: aTabList @@ -1051,14 +1472,6 @@ super openModalOnResourceSpec: aTabList -! - -postBuildWith:builder - - super postBuildWith:builder. - - testView := builder componentAt:#TestView. - (builder componentAt:#ColumnView) selectConditionBlock: [:i|self askForItemModification]. ! ! !TabListEditor methodsFor:'user actions'! @@ -1066,48 +1479,53 @@ accept "accept changes " - |label| - - self acceptChannel - value:true; value:false. "/ toggle to force inputFields to accept + |tab idx asb| - selectedIndex ~~ 0 ifTrue:[ - rebuildMode := true. - label := listOfTabs at:selectedIndex. + (tab := self selectedElement) notNil ifTrue:[ + super accept. + aspects keysAndValuesDo:[:k :m| tab perform:(k , ':') asSymbol with:(m value) ]. - aspects keysAndValuesDo:[:aKey :aModel| - label perform:(aKey , ':') asSymbol with:(aModel value). - ]. - self listOfLabels at:selectedIndex put:(label label). - - rebuildMode := false. + asb := self autoHideScrollBars value. + asb := asb ~~ 1 ifTrue:[asb == 2] ifFalse:[nil]. + tab autoHideScrollBars:asb. ]. self cancel. - modified := true. - self valueOfEnablingCommitButtons value: false +! + +addTab:aTab + |idx| + + aTab notNil ifTrue:[ + self testMode value: false. + + (idx := self selection) == 0 ifTrue:[ + listOfTabs add:aTab. + self selection:(listOfTabs size). + ] ifFalse:[ + listOfTabs add:aTab afterIndex:idx + ]. + modified := true. + ]. ! cancel "cancel all changes " - |tab| + |tab idx asb| - selectedIndex ~~ 0 ifTrue:[ - tab := listOfTabs at:selectedIndex. - - rebuildMode := true. + ( (idx := self selection) ~~ 0 + and:[(tab := self selectedElement) notNil] + ) ifTrue:[ + aspects keysAndValuesDo:[:k :m| m value:(tab perform:k) ]. + listOfTabs at:idx put:tab. - aspects keysAndValuesDo:[:aKey :aModel| - aModel value:(tab perform:aKey) - ]. - #( label editAgument ) do:[:aKey| |v| - v := aspects at:aKey. - v value isNil ifTrue:[v value:''] - ]. + asb := tab autoHideScrollBars. + asb notNil ifTrue:[asb := asb == true ifTrue:[2] ifFalse:[3]] + ifFalse:[asb := 1]. - rebuildMode := false. + self autoHideScrollBars value:asb. ]. - self canMoveTabItemUpOrDown value:(selectedIndex ~~ 0 and:[listOfTabs size > 1]). + self canMoveTabItemUpOrDown value:(listOfTabs size > 1 and:[idx ~~ 0]). self valueOfEnablingCommitButtons value: false @@ -1117,53 +1535,26 @@ doCopy "copy selected tab " - selectedIndex ~~ 0 ifTrue:[ - self clipboard:(listOfTabs at:selectedIndex) deepCopy. + |tab| + + (tab := self selectedElement) notNil ifTrue:[ + self clipboard:tab. self updateAllToolInstances. ] ! -doCreateTabItem - - |tab selectionHolder| - - self testMode value: false. - tab := TabItem label:'Tab Item ', (listOfTabs size + 1) printString. - - listOfTabs add:tab afterIndex:selectedIndex. - self listOfLabels add:(tab label) afterIndex:selectedIndex. - - selectionHolder := self selectionHolder. - - selectedIndex == 0 ifTrue:[ - selectionHolder value:1 - ] ifFalse:[ - selectionHolder value:selectedIndex + 1. - self cancel. - ]. - - modified := true. +doCreate + self addTab:(TabItem label:'TAB'). ! doCut - "cut selected tab + "cut the selected tab; put to pasteBuffer " - |listOfLabels index selectionHolder| + |tab| - (index := selectedIndex) ~~ 0 ifTrue:[ - self testMode value: false. - listOfLabels := self listOfLabels. - self clipboard:(listOfTabs at:index) deepCopy. - (selectionHolder := self selectionHolder) value:0. - listOfTabs removeIndex:index. - listOfLabels removeIndex:index. - index > listOfLabels size ifTrue:[ - index := index - 1 - ]. - selectionHolder value:index. - listOfLabels isEmpty ifTrue: [self canShowTestMode value: false]. - self updateAllToolInstances. - modified := true. + (tab := self selectedElement) notNil ifTrue:[ + self clipboard:tab. + self doDelete. ]. ! @@ -1171,19 +1562,18 @@ doDelete "delete selected tab " - |listOfLabels index selectionHolder| + |index| - (index := selectedIndex) ~~ 0 ifTrue:[ + (index := self selection) ~~ 0 ifTrue:[ self testMode value: false. - listOfLabels := self listOfLabels. - (selectionHolder := self selectionHolder) value:0. + self setSelection:0. listOfTabs removeIndex:index. - listOfLabels removeIndex:index. - index > listOfLabels size ifTrue:[index := index - 1]. - selectionHolder value:index. - listOfLabels isEmpty ifTrue: [self canShowTestMode value: false]. + index > listOfTabs size ifTrue:[index := index - 1]. + self selection:index. + self updateAllToolInstances. modified := true. ]. + ! doGenerateAspectMethod @@ -1232,35 +1622,29 @@ doMoveTabUpOrDown:what "step up or down " - |tab listOfLabels index nLabels| + |tab idx sz| - (selectedIndex ~~ 0 and:[listOfTabs size > 1]) ifFalse:[ + (listOfTabs size > 1 and:[(idx := self selection) ~~ 0]) ifFalse:[ ^ self ]. - listOfLabels := self listOfLabels. - tab := listOfTabs at:selectedIndex. + (tab := listOfTabs at:idx ifAbsent:nil) isNil ifTrue:[ + ^ self selection:0 + ]. - listOfLabels removeIndex:selectedIndex. - listOfTabs removeIndex:selectedIndex. + self setSelection:0. + listOfTabs removeIndex:idx. - nLabels := listOfLabels size. + sz := listOfTabs size. what == #down ifTrue:[ - index := selectedIndex > nLabels ifTrue:[1] - ifFalse:[selectedIndex + 1] + idx := idx > sz ifTrue:[1] ifFalse:[idx + 1] ] ifFalse:[ - index := selectedIndex == 1 ifTrue:[nLabels + 1] - ifFalse:[selectedIndex - 1] + idx := idx == 1 ifTrue:[sz + 1] ifFalse:[idx - 1] ]. - listOfLabels add:(tab label) beforeIndex:index. - listOfTabs add:tab beforeIndex:index. - - rebuildMode := true. - self selectionHolder value:index. - rebuildMode := false. - + listOfTabs add:tab beforeIndex:idx. + self setSelection:idx. modified := true. ! @@ -1268,24 +1652,11 @@ doPaste "paste a tab " - |tab selectionHolder| - - self testMode value: false. - (tab := self class clipboard deepCopy) isNil ifTrue: [^nil]. - listOfTabs add:tab afterIndex:selectedIndex. - self listOfLabels add:(tab label) afterIndex:selectedIndex. - - selectionHolder := self selectionHolder. + |tab| - selectedIndex == 0 ifTrue:[ - selectionHolder value:1 - ] ifFalse:[ - selectionHolder value:selectedIndex + 1. - self cancel. - ]. - - modified := true. - + ((tab := self class clipboard) notNil and:[tab isKindOf:TabItem]) ifTrue:[ + self addTab:(tab deepCopy). + ] ! doSave @@ -1352,32 +1723,6 @@ self addToHistory:(cls name, ' ', specSelector) -> #loadFromMessage:. modified := false. hasSaved := true. -! - -doTest - "run a test - " - |tabView list| - - self selectionHolder value:nil. - - listOfTabs size ~~ 0 ifTrue:[ - list := listOfTabs collect:[:aTab||t| - t := aTab copy. - t setAttributesFromClass:specClass. - t - ] - ] ifFalse:[ - list := nil - ]. - tabView := builder componentAt:#TestTabsView. - tabView list:list. - testView raise. - - self valueOfCanCut value: false. - self valueOfCanCopy value: false. - self valueOfCanPaste value: false. - ! ! !TabListEditor class methodsFor:'documentation'!