# HG changeset patch # User Claus Gittinger # Date 1241953164 -7200 # Node ID 3e2feb544801303a541b53d747bbce76d9efba0d # Parent 11be77599ca95fa39802caf5938e0ed857e8bcca cleaned up the code and fixed bugs; menu reorganized, modernized; edit-menu visibility diff -r 11be77599ca9 -r 3e2feb544801 UIPainter.st --- a/UIPainter.st Sun May 10 12:58:19 2009 +0200 +++ b/UIPainter.st Sun May 10 12:59:24 2009 +0200 @@ -14,7 +14,8 @@ ResourceSpecEditor subclass:#UIPainter instanceVariableNames:'specSuperclassName treeView selectionPanel specTool layoutTool helpTool painterView painter lastPort lastPage' - classVariableNames:'SelectionPanelClass UseViewScroller LastPort LastPage' + classVariableNames:'SelectionPanelClass UseViewScroller LastPort LastPage + DefaultEditToolBarVisible DefaultToolBarVisible' poolDictionaries:'' category:'Interface-UIPainter' ! @@ -128,6 +129,16 @@ " ! ! +!UIPainter class methodsFor:'defaults'! + +defaultEditToolbarVisible + ^ DefaultEditToolBarVisible ? true +! + +defaultToolbarVisible + ^ DefaultToolBarVisible ? true +! ! + !UIPainter class methodsFor:'help specs'! flyByHelpSpec @@ -345,7 +356,7 @@ 'Edit this windowSpec.' #moveWidgetDown -'Moves the selected widget one step down.' +'Moves the selected widget down in the list (brings it to the front).' #moveWidgetInto 'Moves the selected widget into next widget as child widget.' @@ -354,7 +365,7 @@ 'Moves the selected widget out of its parent widget.' #moveWidgetUp -'Moves the selected widget one step up.' +'Moves the selected widget up in the list (brings it to the back).' #pasteBuffer 'Pastes the widgets of the clipboard at the current mouse position.' @@ -630,6 +641,12 @@ ^ Icon helpIcon ! +hideToolBarIcon + + + ^ ToolbarIconLibrary hideToolBarIcon +! + iconAlignB "This resource specification was automatically generated by the ImageEditor of ST/X." @@ -1336,23 +1353,73 @@ label: 'GUI Painter' name: 'GUI Painter' min: (Point 560 460) - bounds: (Rectangle 12 22 620 545) + bounds: (Rectangle 0 0 608 523) + menu: menu icon: defaultIcon - menu: menu ) component: (SpecCollection collection: ( - (MenuPanelSpec - name: 'menuToolbarView' - layout: (LayoutFrame 0 0.0 0 0 0 1.0 32 0) - level: 1 - tabable: true - menu: menuToolbar + (ViewSpec + name: 'ToolBar' + layout: (LayoutFrame 0 0 0 0 0 1 32 0) + visibilityChannel: toolBarVisibleHolder + component: + (SpecCollection + collection: ( + (ActionButtonSpec + label: 'hideToolBarIcon' + name: 'HideToolBarButton' + layout: (LayoutFrame 0 0 0 0 13 0 0 1) + activeHelpKey: hideToolBar + hasCharacterOrientedLabel: false + translateLabel: true + model: hideToolbar + postBuildCallback: hideToolBarButtonCreated: + ) + (MenuPanelSpec + name: 'menuToolbarView' + layout: (LayoutFrame 13 0.0 0 0.0 0 1.0 0 1.0) + visibilityChannel: toolBarVisibleHolder + menu: menuToolbar + textDefault: true + ) + ) + ) + ) + + (ViewSpec + name: 'EditToolBar' + layout: (LayoutFrame 0 0 32 0 0 1 64 0) + visibilityChannel: editToolBarVisibleHolder + component: + (SpecCollection + collection: ( + (ActionButtonSpec + label: 'hideToolBarIcon' + name: 'HideEditToolBarButton' + layout: (LayoutFrame 0 0 0 0 13 0 0 1) + activeHelpKey: hideToolBar + hasCharacterOrientedLabel: false + translateLabel: true + model: hideEditToolbar + postBuildCallback: hideToolBarButtonCreated: + ) + (MenuPanelSpec + name: 'EditToolBar1' + layout: (LayoutFrame 13 0.0 0 0.0 0 1.0 0 1.0) + visibilityChannel: editToolBarVisibleHolder + menu: editToolbar + textDefault: true + ) + ) + + ) ) + (VariableHorizontalPanelSpec - name: 'mainPanel' - layout: (LayoutFrame 0 0.0 32 0.0 0 1.0 -24 1.0) + name: 'Painter' + layout: (LayoutFrame 0 0.0 64 0.0 0 1.0 -24 1.0) level: 1 component: (SpecCollection @@ -1445,14 +1512,159 @@ ) ) - ) ) - - "Modified: / 10-02-2007 / 14:45:31 / cg" + ) ! ! !UIPainter class methodsFor:'menu specs'! +cutCopyPasteMenuSlice + "This resource specification was automatically generated + by the MenuEditor of ST/X." + + "Do not manually edit this!! If it is corrupted, + the MenuEditor may not be able to read the specification." + + " + MenuEditor new openOnClass:UIPainter andSelector:#menuToolbar + (Menu new fromLiteralArrayEncoding:(UIPainter menuToolbar)) startUp + " + + + + ^ + #(Menu + ( + (MenuItem + activeHelpKey: editCut + enabled: canCutHolder + label: 'Cut' + itemValue: deleteSelection + translateLabel: true + isButton: true + labelImage: (ResourceRetriever ToolbarIconLibrary cutWidgetIcon) + ) + (MenuItem + activeHelpKey: editCopy + enabled: canCopyHolder + label: 'Copy' + itemValue: copySelection + translateLabel: true + isButton: true + labelImage: (ResourceRetriever ToolbarIconLibrary copyWidgetIcon) + ) + (MenuItem + activeHelpKey: editPaste + enabled: canPasteKeepingLayoutHolder + label: 'Paste with Layout' + itemValue: pasteWithLayout + translateLabel: true + isButton: true + labelImage: (ResourceRetriever ToolbarIconLibrary pasteWidgetIcon) + ) + (MenuItem + activeHelpKey: editDelete + enabled: canCutHolder + label: 'Delete' + itemValue: deleteTotalSelection + translateLabel: true + isButton: true + isVisible: false + labelImage: (ResourceRetriever ToolbarIconLibrary deleteWidgetIcon) + ) + (MenuItem + label: '-' + ) + (MenuItem + activeHelpKey: editUndo + enabled: hasUndoHistoryHolder + label: 'Undo' + itemValue: undoLast + translateLabel: true + isButton: true + labelImage: (ResourceRetriever ToolbarIconLibrary undoIcon) + ) + ) + nil + nil + ) +! + +editToolbar + "This resource specification was automatically generated + by the MenuEditor of ST/X." + + "Do not manually edit this!! If it is corrupted, + the MenuEditor may not be able to read the specification." + + " + MenuEditor new openOnClass:UIPainter andSelector:#editToolbar + (Menu new fromLiteralArrayEncoding:(UIPainter editToolbar)) startUp + " + + + + ^ + #(Menu + ( + (MenuItem + label: 'moveItems' + translateLabel: true + submenuChannel: moveInListMenuSlice + isMenuSlice: true + ) + (MenuItem + label: '-' + ) + (MenuItem + label: 'gridItems' + translateLabel: true + submenuChannel: gridMenuSlice + isMenuSlice: true + ) + ) + nil + nil + ) +! + +gridMenuSlice + "This resource specification was automatically generated + by the MenuEditor of ST/X." + + "Do not manually edit this!! If it is corrupted, + the MenuEditor may not be able to read the specification." + + " + MenuEditor new openOnClass:Workflow::WorksheetEditor andSelector:#zoomMenuSlice + (Menu new fromLiteralArrayEncoding:(Workflow::WorksheetEditor zoomMenuSlice)) startUp + " + + + + ^ + #(Menu + ( + (MenuItem + label: 'ShowGrid' + translateLabel: true + isButton: true + indication: gridShownHolder + labelImage: (ResourceRetriever #'Expecco::ExpeccoIconLibrary' showGridIcon) + ) + (MenuItem + label: 'AlignToGrid' + translateLabel: true + isButton: true + indication: alignToGridHolder + labelImage: (ResourceRetriever #'Expecco::ExpeccoIconLibrary' alignToGridIcon) + ) + ) + nil + nil + ) +! + menu "This resource specification was automatically generated by the MenuEditor of ST/X." @@ -1482,6 +1694,57 @@ submenuChannel: menuEdit ) (MenuItem + label: 'View' + translateLabel: true + submenu: + (Menu + ( + (MenuItem + activeHelpKey: settingsCanvas + label: 'Canvas' + translateLabel: true + indication: painterShown + ) + (MenuItem + activeHelpKey: settingsGallery + label: 'Gallery' + translateLabel: true + indication: galleryShown + ) + (MenuItem + label: '-' + ) + (MenuItem + label: 'Toolbar' + translateLabel: true + hideMenuOnActivated: false + indication: toolBarVisibleHolder + ) + (MenuItem + label: 'Editor Toolbar' + translateLabel: true + hideMenuOnActivated: false + indication: editToolBarVisibleHolder + ) + (MenuItem + label: '-' + ) + (MenuItem + label: 'Load Sketch as Background...' + itemValue: useSketch + translateLabel: true + ) + (MenuItem + label: 'Load Image as Background...' + itemValue: useBackgroundImage + translateLabel: true + ) + ) + nil + nil + ) + ) + (MenuItem label: 'Align' translateLabel: true submenuChannel: menuAlign @@ -1563,21 +1826,6 @@ (Menu ( (MenuItem - activeHelpKey: settingsCanvas - label: 'Canvas' - translateLabel: true - indication: painterShown - ) - (MenuItem - activeHelpKey: settingsGallery - label: 'Gallery' - translateLabel: true - indication: galleryShown - ) - (MenuItem - label: '-' - ) - (MenuItem activeHelpKey: settingsAspectsAsInstances label: 'Aspects as InstanceVariables' translateLabel: true @@ -1619,16 +1867,6 @@ itemValue: doDefineGrid translateLabel: true ) - (MenuItem - label: 'Load Sketch as Background...' - itemValue: useSketch - translateLabel: true - ) - (MenuItem - label: 'Load Image as Background...' - itemValue: useBackgroundImage - translateLabel: true - ) ) nil nil @@ -2098,7 +2336,7 @@ ) (MenuItem activeHelpKey: sortItems - label: 'Sort Selected Items' + label: 'Sort Selected Items by Position' itemValue: doSortItems translateLabel: true ) @@ -2449,92 +2687,10 @@ label: '-' ) (MenuItem - activeHelpKey: editUndo - enabled: hasUndoHistoryHolder - label: 'Undo' - itemValue: undoLast - translateLabel: true - isButton: true - labelImage: (ResourceRetriever ToolbarIconLibrary undoIcon) - ) - (MenuItem - label: '-' - ) - (MenuItem - activeHelpKey: editCut - enabled: canCutHolder - label: 'Cut' - itemValue: deleteSelection - translateLabel: true - isButton: true - labelImage: (ResourceRetriever ToolbarIconLibrary cutWidgetIcon) - ) - (MenuItem - activeHelpKey: editCopy - enabled: canCopyHolder - label: 'Copy' - itemValue: copySelection - translateLabel: true - isButton: true - labelImage: (ResourceRetriever ToolbarIconLibrary copyWidgetIcon) - ) - (MenuItem - activeHelpKey: editPaste - enabled: canPasteKeepingLayoutHolder - label: 'Paste with Layout' - itemValue: pasteWithLayout + label: 'CutCopyPaste' translateLabel: true - isButton: true - labelImage: (ResourceRetriever ToolbarIconLibrary pasteWidgetIcon) - ) - (MenuItem - activeHelpKey: editDelete - enabled: canCutHolder - label: 'Delete' - itemValue: deleteTotalSelection - translateLabel: true - isButton: true - isVisible: false - labelImage: (ResourceRetriever ToolbarIconLibrary deleteWidgetIcon) - ) - (MenuItem - label: '-' - ) - (MenuItem - activeHelpKey: moveWidgetUp - enabled: canChangeOrderInContainer - label: 'Move Up' - itemValue: doStepUp - translateLabel: true - isButton: true - labelImage: (ResourceRetriever ToolbarIconLibrary moveWidgetUpIcon) - ) - (MenuItem - activeHelpKey: moveWidgetDown - enabled: canChangeOrderInContainer - label: 'Move Down' - itemValue: doStepDown - translateLabel: true - isButton: true - labelImage: (ResourceRetriever ToolbarIconLibrary moveWidgetDownIcon) - ) - (MenuItem - activeHelpKey: moveWidgetInto - enabled: canMoveSelectionIntoContainer - label: 'Move Into' - itemValue: doStepIn - translateLabel: true - isButton: true - labelImage: (ResourceRetriever ToolbarIconLibrary moveWidgetDownRightIcon) - ) - (MenuItem - activeHelpKey: moveWidgetOut - enabled: canMoveSelectionOutOfContainer - label: 'Move Out' - itemValue: doStepOut - translateLabel: true - isButton: true - labelImage: (ResourceRetriever ToolbarIconLibrary moveWidgetLeftDownIcon) + submenuChannel: cutCopyPasteMenuSlice + isMenuSlice: true ) (MenuItem label: '-' @@ -2687,10 +2843,80 @@ nil nil ) +! + +moveInListMenuSlice + "This resource specification was automatically generated + by the MenuEditor of ST/X." + + "Do not manually edit this!! If it is corrupted, + the MenuEditor may not be able to read the specification." + + " + MenuEditor new openOnClass:UIPainter andSelector:#editToolbar + (Menu new fromLiteralArrayEncoding:(UIPainter editToolbar)) startUp + " + + + + ^ + #(Menu + ( + (MenuItem + activeHelpKey: moveWidgetUp + enabled: canChangeOrderInContainer + label: 'Move Up' + itemValue: doStepUp + translateLabel: true + isButton: true + labelImage: (ResourceRetriever ToolbarIconLibrary moveWidgetUpIcon) + ) + (MenuItem + activeHelpKey: moveWidgetDown + enabled: canChangeOrderInContainer + label: 'Move Down' + itemValue: doStepDown + translateLabel: true + isButton: true + labelImage: (ResourceRetriever ToolbarIconLibrary moveWidgetDownIcon) + ) + (MenuItem + activeHelpKey: moveWidgetInto + enabled: canMoveSelectionIntoContainer + label: 'Move Into' + itemValue: doStepIn + translateLabel: true + isButton: true + labelImage: (ResourceRetriever ToolbarIconLibrary moveWidgetDownRightIcon) + ) + (MenuItem + activeHelpKey: moveWidgetOut + enabled: canMoveSelectionOutOfContainer + label: 'Move Out' + itemValue: doStepOut + translateLabel: true + isButton: true + labelImage: (ResourceRetriever ToolbarIconLibrary moveWidgetLeftDownIcon) + ) + ) + nil + nil + ) ! ! !UIPainter methodsFor:'aspects'! +alignToGridHolder + |holder| + + (holder := builder bindingAt:#alignToGridHolder) isNil ifTrue:[ + holder := (self class settings at: #GridAlign ifAbsent: [painter gridAlign]) asValue. + builder aspectAt:#alignToGridHolder put: holder. + holder addDependent:self. + ]. + ^ holder +! + aspectFor:aKey "returns the aspect for aKey or nil" @@ -2778,6 +3004,17 @@ ^ true ! +editToolBarVisibleHolder + |holder| + + (holder := builder bindingAt:#editToolBarVisibleHolder) isNil ifTrue:[ + holder := self class defaultEditToolbarVisible asValue. + builder aspectAt:#editToolBarVisibleHolder put: holder. + holder addDependent:self. + ]. + ^ holder +! + enableChannel "true if modifications are allowed otherwise in test mode" @@ -2803,6 +3040,17 @@ ! +gridShownHolder + |holder| + + (holder := builder bindingAt:#gridShownHolder) isNil ifTrue:[ + holder := (self class settings at: #GridShown ifAbsent: [painter gridShown]) asValue. + builder aspectAt:#gridShownHolder put: holder. + holder addDependent:self. + ]. + ^ holder +! + hasOneSelectionOtherThanCanvas "returns a value holder which is true in case that one widget is selected other than the root" @@ -2881,6 +3129,17 @@ ^ holder ! +toolBarVisibleHolder + |holder| + + (holder := builder bindingAt:#toolBarVisibleHolder) isNil ifTrue:[ + holder := self class defaultToolbarVisible asValue. + builder aspectAt:#toolBarVisibleHolder put: holder. + holder addDependent:self. + ]. + ^ holder +! + treeView "returns the tree view which holds all widget" @@ -3131,21 +3390,78 @@ ] ! -update:something with:aParameter from:someObject +toolBarVisibilityChanged + |toolBarVisible editToolBarVisible toolBar editToolBar noteBook topOffset| + + topOffset := 0. + + toolBar := self componentAt:#ToolBar. + toolBar notNil ifTrue:[ + toolBarVisible := self toolBarVisibleHolder value. + DefaultToolBarVisible := toolBarVisible. + toolBarVisible ifTrue:[ + topOffset := topOffset + toolBar height. + ] + ]. + + editToolBar := self componentAt:#EditToolBar. + editToolBar notNil ifTrue:[ + editToolBar layout + topOffset:topOffset bottomOffset:(topOffset + editToolBar height). + "/ force it to recompute its dimension + editToolBar container notNil ifTrue:[ + editToolBar containerChangedSize. + ]. + editToolBarVisible := self editToolBarVisibleHolder value. + DefaultEditToolBarVisible := editToolBarVisible. + editToolBarVisible ifTrue:[ + topOffset := topOffset + editToolBar height. + ] + ]. + + noteBook := self componentAt:#Painter. + noteBook notNil ifTrue:[ + noteBook layout topOffset:topOffset. + "/ force it to recompute its dimension + noteBook container notNil ifTrue:[ + noteBook containerChangedSize. + ]. + ]. + + "Created: / 18-02-2007 / 14:46:22 / cg" +! + +update:something with:aParameter from:changedObject "catches change notifications" |window lbl| - someObject == treeView model ifTrue:[ + ((changedObject == self toolBarVisibleHolder) + or:[ changedObject == self editToolBarVisibleHolder ]) ifTrue:[ + self toolBarVisibilityChanged. + ^ self + ]. + changedObject == self gridShownHolder ifTrue:[ + self class settings at: #GridShown put: changedObject value. + painter gridShown:changedObject value. + ^ self + ]. + changedObject == self alignToGridHolder ifTrue:[ + self class settings at: #GridAlign put: changedObject value. + painter gridAlign:changedObject value. + ^ self + ]. + + changedObject == treeView model ifTrue:[ (something == #selection or:[something == #selectionIndex]) ifTrue:[self treeSelectionChanged]. ^ self ]. - someObject == self galleryShown ifTrue:[ + changedObject == self galleryShown ifTrue:[ "/ galleryShown toggle changed window := selectionPanel window. - (someObject value) ifTrue:[ + (changedObject value) ifTrue:[ self raiseUIView:window ] ifFalse:[ self hideUIView:window @@ -3153,10 +3469,10 @@ ^ self ]. - someObject == self painterShown ifTrue:[ + changedObject == self painterShown ifTrue:[ "/ canvasShown toggle changed window := self painter topView. - (someObject value) ifTrue:[ + (changedObject value) ifTrue:[ self raiseUIView:window ] ifFalse:[ self hideUIView:window @@ -3164,8 +3480,8 @@ ^ self ]. - someObject == self autoAcceptOnSelectionChange ifTrue:[ - lbl := someObject value ifTrue:['Apply'] ifFalse:['OK']. + changedObject == self autoAcceptOnSelectionChange ifTrue:[ + lbl := changedObject value ifTrue:['Apply'] ifFalse:['OK']. (builder componentAt:'acceptButton') label:(resources string:lbl). ^ self ]. @@ -3299,12 +3615,20 @@ !UIPainter methodsFor:'initialization'! +hideToolBarButtonCreated:aButton + aButton passiveLevel:(MenuPanel defaultLevel). +"/ aButton passiveLevel:1. + aButton activeLevel:-1. + aButton backgroundColor:(MenuPanel defaultBackgroundColor). +! + initialize |name scroller viewScroller| super initialize. modified := false. + aspects := IdentityDictionary new. aspects at:#classNameChannel put:'NewApplication' asValue. aspects at:#superclassNameChannel put:'ApplicationModel' asValue. @@ -4167,6 +4491,11 @@ postBuildWith: aBuilder super postBuildWith:aBuilder. + (self toolBarVisibleHolder value + or:[ self editToolBarVisibleHolder value ]) ifTrue:[ self toolBarVisibilityChanged ]. + + "Created: / 18-02-2007 / 15:03:08 / cg" + self setupPainter. "Modified: / 22.8.1998 / 17:41:34 / cg" @@ -4369,6 +4698,7 @@ spec useDynamicPreferredWidth:(layoutTool aspectFor:#useDynamicPreferredWidth) value. spec useDynamicPreferredHeight:(layoutTool aspectFor:#useDynamicPreferredHeight) value. painter setLayout:layout. + spec layout:layout. painter updateFromSpec:spec. ]. ] @@ -5026,8 +5356,9 @@ self askForModification ifFalse: [^nil]. specClass := specClassName := specSelector := nil. self painter removeAll. - treeView canvas topView name: UIPainter defaultNameOfCanvas. - treeView canvas topView label: UIPainter defaultNameOfCanvas. + treeView canvas topView + name: UIPainter defaultNameOfCanvas; + label: UIPainter defaultNameOfCanvas. self helpTool doNew. self treeSelectionChanged. treeView selectedNode changed. @@ -5281,6 +5612,14 @@ ! +hideEditToolbar + self editToolBarVisibleHolder value:false +! + +hideToolbar + self toolBarVisibleHolder value:false +! + replaceWidgetByClass:aSpecOrWidgetClass |specClass oldSpec newSpec painter| @@ -5545,13 +5884,13 @@ lastDrawnMaster := nil. windowSpec := nil. + self canvas components notEmptyOrNil ifTrue:[ self halt ]. self canvas subViews copy do:[:aView| "/ care to not destroy the transparent input view (aView isInputOnly) ifFalse:[aView destroy] ]. model root name: UIPainter defaultNameOfCanvas asBoldText. model removeAllOtherThanRoot. - ! removeView:aView @@ -6089,7 +6428,7 @@ ! doSortItems - "moves child 'anOffset' forward or backward in list of children" + "sort items by their top-left position" |selectedItems parent sortedItems newChildren itemList parentView| @@ -6100,7 +6439,8 @@ parent := selectedItems first parent. (parent isNil or:[(selectedItems conform:[:e| e parent == parent]) not]) ifTrue:[^ self]. - sortedItems := selectedItems sort:[:a :b| a contents view origin isLeftOrAbove:(b contents view origin)]. + sortedItems := selectedItems sort:[:a :b| + a contents view origin isLeftOrAbove:(b contents view origin)]. itemList := selectedItems asIdentitySet. newChildren := parent children collect:[:eachChild| @@ -6122,11 +6462,12 @@ parentView changeSequenceOrderFor:eachItem contents view to:idx. ]. parentView specClass isLayoutContainer ifFalse:[ + parentView components notEmptyOrNil ifTrue:[ self halt ]. parentView subViews do:[:v| v raise ]. ]. self canvas showSelection. - self selectNodes:itemList. + self selectNodes:itemList asOrderedCollection. ! doStepIn @@ -6156,7 +6497,7 @@ ! doStepOver:anIndex - "moves child 'anOffset' forward or backward in list of children" + "moves child 'anIndex' forward or backward in list of children" |item idx size prnt spVw view canvas| @@ -6188,6 +6529,7 @@ spVw changeSequenceOrderFor:view to:idx. spVw specClass isLayoutContainer ifFalse:[ + "/ spVw components notEmptyOrNil ifTrue:[ self halt ]. spVw subViews do:[:v| v raise ]. ]. canvas showSelection.