Andreas Raab uploaded a new version of Morphic to project The Trunk:
http://source.squeak.org/trunk/Morphic-kb.242.mcz ==================== Summary ==================== Name: Morphic-kb.242 Author: kb Time: 20 November 2009, 2:30:38 am UUID: 75fcbe2b-bc23-8f4c-8dcb-ba69f6848820 Ancestors: Morphic-kb.241 - Refactored updating menus: - Removed subMenuUpdater from MenuItemMorph - Hijacked UpdatingMenuMorph - Added #updateMenu to MenuMorph with an empty body - Added updateMenu call to activation methods: - UpdatingMenuMorph >> activate: - DockingBarMorph >> activeSubmenu: - MenuMorph >> activeSubmenu: - Changed MenuItemMorph updating submenu mechanism - Poked with Windows menu =============== Diff against Morphic-kb.241 =============== Item was added: + ----- Method: MenuItemMorph>>addUpdatingSubMenu: (in category 'accessing') ----- + addUpdatingSubMenu: aBlock + + subMenu := UpdatingMenuMorph new. + subMenu updater: aBlock updateSelector: #value:. + self changed. + ! Item was changed: StringMorph subclass: #MenuItemMorph + instanceVariableNames: 'isEnabled subMenu isSelected target selector arguments icon lastMousePosition' - instanceVariableNames: 'isEnabled subMenu isSelected target selector arguments icon lastMousePosition subMenuUpdater' classVariableNames: 'SubMenuMarker' poolDictionaries: '' category: 'Morphic-Menus'! !MenuItemMorph commentStamp: '<historical>' prior: 0! I represent an item in a menu. Instance variables: isEnabled <Boolean> True if the menu item can be executed. subMenu <MenuMorph | nil> The submenu to activate automatically when the user mouses over the item. isSelected <Boolean> True if the item is currently selected. target <Object> The target of the associated action. selector <Symbol> The associated action. arguments <Array> The arguments for the associated action. icon <Form | nil> An optional icon form to be displayed to my left. If I have a dynamic marker, created by strings like <yes> or <no> in my contents, it will be installed as a submorph.! Item was changed: ----- Method: TheWorldMainDockingBar>>windowMenuFor:on: (in category 'submenu - windows') ----- windowMenuFor: window on: menu menu addItem: [ :item | item contents: 'Close'; action: [ window delete ] ]; addItem: [ :item | item + contents: 'Toggle Full Screen'; + action: [ window expandBoxHit ] ]! - contents: 'Full Screen'; - action: [ window fullScreen ] ]! Item was added: + ----- Method: UpdatingMenuMorph>>activate: (in category 'as yet unclassified') ----- + activate: evt + "Receiver should be activated; e.g., so that control passes correctly." + + self updateMenu. + evt hand newMouseFocus: self.! Item was changed: ----- Method: MenuItemMorph>>select: (in category 'selecting') ----- select: evt self isSelected: true. - self updateSubMenu. owner activeSubmenu: subMenu. subMenu ifNotNil: [ subMenu delete. subMenu popUpAdjacentTo: self adjacentTo forHand: evt hand from: self. subMenu selectItem: nil event: evt].! Item was changed: ----- Method: TheWorldMainDockingBar>>jumpToProjectMenuItemOn: (in category 'submenu - projects') ----- jumpToProjectMenuItemOn: menu menu addItem: [ :item | item contents: 'Jump To Project' translated; icon: MenuIcons smallForwardIcon; + addUpdatingSubMenu: [ :subMenu | - subMenuUpdater: [ :subMenu | subMenu defaultTarget: Project. Project buildJumpToMenu: subMenu ] ]! Item was changed: ----- Method: MenuMorph>>activeSubmenu: (in category 'control') ----- activeSubmenu: aSubmenu + activeSubMenu ifNotNil: [ + activeSubMenu delete ]. - activeSubMenu - ifNotNil: [activeSubMenu delete]. activeSubMenu := aSubmenu. + activeSubMenu ifNotNil: [ + activeSubMenu updateMenu. + activeSubMenu activatedFromDockingBar: nil. ]! - aSubmenu - ifNotNil: [ - activeSubMenu activatedFromDockingBar: nil. - ]! Item was added: + ----- Method: MenuMorph>>updateMenu (in category 'update') ----- + updateMenu + " Do nothing "! Item was changed: ----- Method: TheWorldMainDockingBar>>windowsMenuOn: (in category 'construction') ----- windowsMenuOn: aDockingBar aDockingBar addItem: [ :item | item contents: 'Windows' translated; + addUpdatingSubMenu: [ :menu | - subMenuUpdater: [ :menu | self listWindowsOn: menu ] ] ! Item was changed: ----- Method: DockingBarMorph>>activeSubmenu: (in category 'control') ----- activeSubmenu: aSubmenu activeSubMenu isNil ifFalse: [activeSubMenu delete]. activeSubMenu := aSubmenu. aSubmenu isNil ifTrue: [^ self]. + activeSubMenu updateMenu. - "" activeSubMenu selectItem: nil event: nil. MenuIcons decorateMenu: activeSubMenu. activeSubMenu activatedFromDockingBar: self. activeSubMenu borderColor: self borderColor. activeSubMenu beSticky. activeSubMenu resistsRemoval: true. activeSubMenu removeMatchString.! Item was changed: ----- Method: TheWorldMainDockingBar>>listWindowsOn: (in category 'submenu - windows') ----- listWindowsOn: menu | expanded | expanded := SystemWindow windowsIn: World satisfying: [ :w | w isCollapsed not ]. expanded ifEmpty: [ menu addItem: [ :item | item contents: 'No open Windows' translated; isEnabled: false; action: [ ] ] ]. expanded do: [ :each | menu addItem: [ :item | item contents: each label; icon: (self colorIcon: each paneColor); + addUpdatingSubMenu: [ :subMenu | self windowMenuFor: each on: subMenu ]; - subMenuUpdater: [ :subMenu | self windowMenuFor: each on: subMenu ]; action: [ each activateAndForceLabelToShow ] ] ].! Item was removed: - ----- Method: MenuItemMorph>>subMenuUpdater: (in category 'accessing') ----- - subMenuUpdater: aBlock - - subMenuUpdater := aBlock. - self updateSubMenu. - self changed. - ! Item was removed: - ----- Method: MenuItemMorph>>updateSubMenu (in category 'selecting') ----- - updateSubMenu - - | menu | - subMenuUpdater ifNil: [^self ]. - menu := MenuMorph new. - subMenuUpdater value: menu. - self subMenu: menu! |
Free forum by Nabble | Edit this page |