askings for modifications completed (?)
authortz
Thu, 12 Mar 1998 23:05:33 +0100
changeset 729 12f157d5e017
parent 728 638ae95885e1
child 730 238d796c5da0
askings for modifications completed (?)
UIPainter.st
--- a/UIPainter.st	Thu Mar 12 23:02:28 1998 +0100
+++ b/UIPainter.st	Thu Mar 12 23:05:33 1998 +0100
@@ -14,7 +14,7 @@
 ToolApplicationModel subclass:#UIPainter
 	instanceVariableNames:'treeView selectionPanel tabSelection specClass specSelector
 		specSuperclass aspects layoutCanvas helpCanvas specCanvas
-		transcript'
+		transcript modified'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'Interface-UIPainter'
@@ -267,6 +267,7 @@
 'Starts current application on current window spec.'
 
 )
+
 ! !
 
 !UIPainter class methodsFor:'helpers'!
@@ -1150,7 +1151,7 @@
                 #label: 'Paste With Layout'
                 #value: #pasteWithLayout
                 #activeHelpKey: #pasteWithLayout
-                #enabled: #canKeepLayoutInSelection
+                #enabled: #valueOfCanPasteWithKeepingLayout
             )
              #(#MenuItem
                 #label: '-'
@@ -1363,11 +1364,11 @@
                 #labelImage: #(#ResourceRetriever nil #copyIcon)
             )
              #(#MenuItem
-                #label: 'Paste'
+                #label: 'Paste With Layout'
                 #isButton: true
-                #value: #pasteBuffer
+                #value: #pasteWithLayout
                 #activeHelpKey: #editPaste
-                #enabled: #valueOfCanPaste
+                #enabled: #valueOfCanPasteWithKeepingLayout
                 #labelImage: #(#ResourceRetriever nil #pasteIcon)
             )
              #(#MenuItem
@@ -1617,8 +1618,9 @@
         ] ifFalse:[
             self painter updateFromSpec:spec.
         ]
-    ].
+    ].             
     self modifiedChannel value:false.
+    modified := true.
 !
 
 addWidget: aSpecClass
@@ -1670,6 +1672,7 @@
             view columnDescriptors:(spec columns)
         ].        
         self modifiedChannel value:false.
+        modified := false
     ]
 !
 
@@ -1867,6 +1870,18 @@
     "returns the selection tree view which holds all widget identifiers
     "
     ^ treeView
+!
+
+valueOfCanPasteWithKeepingLayout
+
+    |holder|
+    (holder := builder bindingAt:#valueOfCanPasteWithKeepingLayout) isNil ifTrue:[
+        builder aspectAt:#valueOfCanPasteWithKeepingLayout put:(holder :=  false asValue).
+    ].
+    ^ holder
+
+
+
 ! !
 
 !UIPainter methodsFor:'building editors'!
@@ -1898,7 +1913,7 @@
 openEditMenu
     "opens a menu editor on current widget
     "
-    |cls aspect editor|
+    |cls selectorOrMenu editor selectedSpec|
 
     cls := self resolveName:specClass.
 
@@ -1907,29 +1922,30 @@
     ].
 
     cls notNil ifTrue:[
-        (aspect := self specTool specification menuSelector) notNil ifTrue:[
-            aspect := aspect asSymbol
+        (selectorOrMenu := self specTool specification menuSelector) notNil ifTrue:[
+            selectorOrMenu := selectorOrMenu asSymbol
         ] ifFalse:[
             "/ cg: q&d hack ...
 
-            aspect := treeView propertySelected.
-            aspect notNil ifTrue:[
+            (selectedSpec := treeView propertySelected) notNil ifTrue:[
                 Object errorSignal handle:[:ex |
-                    aspect := nil.
+                    selectorOrMenu := nil.
                 ] do:[
-                    aspect := aspect view asMenu.
+                    selectorOrMenu := selectedSpec view asMenu.
                 ]
             ].
         ].
-        
+
         editor := MenuEditor new.
         editor masterApplication:self.
         editor specClass: cls.
-        editor useHelpTool: self helpTool.
-        editor openModalOnClass:cls andSelector:aspect.
+        editor useHelpTool: self helpTool. 
+        selectorOrMenu class ~~ Menu
+            ifTrue:  [editor openModalOnClass:cls andSelector:selectorOrMenu]
+            ifFalse: [editor openModalOnMenu:selectorOrMenu].
         self helpTool updateList.
 
-        editor selectorName ~= aspect ifTrue:[
+        editor selectorName ~= selectorOrMenu ifTrue:[
             editor didInstall ifTrue:[
                 self specTool specification menuSelector:editor selectorName asSymbol.
                 self modifiedChannel value:true.
@@ -1980,7 +1996,7 @@
     ]
 !
 
-openSubSpecGuiPainter
+openSubSpecGUIPainter
     "opens a GUI Painter on the current subspecification"
 
     |spec cls meta sel|
@@ -1988,7 +2004,7 @@
     spec := self specTool specification.
     cls := spec majorKey.
     cls isNil ifTrue:[
-        cls := self specClass.
+        cls := specClass.
     ].
     (cls isNil or:[(cls := self resolveName:cls) isNil]) ifTrue:[
         spec majorKey isNil ifTrue:[
@@ -2146,10 +2162,30 @@
 
 !UIPainter methodsFor:'private'!
 
+askForModification
+    "check interface modification
+    " 
+
+    self treeSelection. "accept modifications"    
+
+    (modified or: [self painter isModified or: [self helpTool isModified]])
+    ifTrue:
+    [
+        ((YesNoBox title:'Window Spec was modified!!')        
+            noText:'Cancel';
+            yesText:'Waste it and proceed';
+            showAtPointer;
+            accepted) ifFalse: [^false].
+        modified := false.
+        self painter resetModification
+    ].
+    ^true
+!
+
 checkModified
     "check interface modification
-    "                 
-    (self painter isModified or: [self helpTool isModified])
+    "               
+    (self isModified and: [self isModified or: [self helpTool isModified]])
     ifTrue:
     [
         ((YesNoBox title:'Window Spec was modified!!')        
@@ -2192,7 +2228,7 @@
 
 resourceMessage: aString
 
-    aString notNil "and: [self askForModification])" 
+    (aString notNil and: [self askForModification]) 
     ifTrue:
     [            
         |msg cls sel|
@@ -2330,7 +2366,7 @@
 !
 
 isModified
-    "returns true if current specification or layout is modified
+    "return true if current specification or layout is modified
     "
     ^ self modifiedChannel value
 !
@@ -2457,8 +2493,8 @@
 
     self valueOfCanCut value: canCutOrCopy.
     self valueOfCanCopy value: canCutOrCopy.
-    self valueOfCanPaste value: canPaste
-
+    self valueOfCanPaste value: canPaste.             
+    self valueOfCanPasteWithKeepingLayout value: (canPaste &  self canKeepLayoutInSelection)
 ! !
 
 !UIPainter methodsFor:'startup / release'!
@@ -2467,7 +2503,7 @@
     "close all windows open by builder
     "
 
-    self checkModified ifFalse:[^self].
+    self askForModification ifFalse:[^self].
 
     treeView model removeDependent:self.
     self painter release.
@@ -2515,6 +2551,8 @@
     "
     |painterView painter cls topView|
 
+    modified := false.
+
     aspects := IdentityDictionary new.
 
     aspects at:#classNameChannel put:(
@@ -2679,6 +2717,8 @@
     "
     |code|
 
+    self treeSelection. "accept modifications"
+
     self hasSpecClassAndSelector ifFalse:[
         self defineClassAndSelector
     ].
@@ -2701,6 +2741,8 @@
     "
     |code|
 
+    self treeSelection. "accept modifications"
+
     self hasSpecClassAndSelector ifFalse:[
         self defineClassAndSelector
     ].
@@ -2721,6 +2763,8 @@
 
 doLoad
 
+    self askForModification ifFalse: [^nil].
+
     self loadFromMessage: 
         (ResourceSelectionBrowser
             request: 'Load Window Spec From Class'
@@ -2733,6 +2777,9 @@
 doLoadSubspec
 
     |subSpecMessage|
+
+    self treeSelection. "ask for modification"
+
     (subSpecMessage := ResourceSelectionBrowser
             request: 'Load Subspec From Class'
             onSuperclass: nil
@@ -2760,12 +2807,15 @@
 doNew
     "remove all components and associated resources
     "
-    self painter isModified ifTrue:[
-        (self confirm:'Edit a new window spec without saving current?') ifFalse:[
-            ^ self
-        ]
-    ].
+
+    self askForModification ifFalse: [^nil].
+    specClass := specSelector := nil.
     self painter removeAll.
+    treeView canvas topView name:  UIPainter defaultNameOfCanvas.
+    treeView canvas topView label: UIPainter defaultNameOfCanvas.
+    treeView selection:#(1).
+    self treeSelection.
+    self updateInfoLabel.
 !
 
 doPickAView
@@ -2773,11 +2823,7 @@
     "
     |painter view cls spec app|
 
-    self painter isModified ifTrue:[
-        (self confirm:'Pick another window spec without saving your modifications?') ifFalse:[
-            ^ self
-        ]
-    ].
+    self askForModification ifFalse: [^nil].
 
     (view := Screen current viewFromUser) notNil ifTrue:[
         view == Screen current rootView ifFalse:[
@@ -2786,18 +2832,19 @@
 
          "/ ok, got it
 
-            (app := view application) notNil ifTrue:[
+         "   (app := view application) notNil ifTrue:[
                 cls := app class
             ] ifFalse:[
                 cls := view class
-            ].
+            ].            
             self setClass:cls selector:nil.
-
+         "
             painter setupFromSpec:spec.
         ]
-    ]
-
-    "Modified: / 1.11.1997 / 13:47:49 / cg"
+    ].
+
+    self updateInfoLabel
+
 !
 
 doRedefineMethods
@@ -2823,8 +2870,10 @@
     "
     |code painter|
 
+    self treeSelection. "ask for modification"
+
     self hasSpecClassAndSelector ifFalse:[
-         self defineClassAndSelector
+         (self defineClassAndSelector) isNil ifTrue: [^nil]
     ].
 
     (specClass notNil and: [(Smalltalk at: specClass asSymbol) isClass])
@@ -2856,6 +2905,7 @@
     self helpTool installHelpSpecsOnClass:specClass.
 
     self updateInfoLabel.
+    modified := false.
     self painter resetModification.
 
     ((Smalltalk at: specClass asSymbol) class implements: specSelector) 
@@ -2872,6 +2922,8 @@
 
     |resourceMessage|
 
+    self treeSelection. "ask for modification"
+
     (resourceMessage := ResourceSelectionBrowser
             request: 'Save In Class'
             onSuperclass: #Object
@@ -2895,6 +2947,8 @@
     "
     |cls app infoMessage|
 
+    self treeSelection. "accept modifications"
+
     (specClass isNil or:[specSelector size < 2]) ifTrue:[
         self painter isModified ifTrue:[
             infoMessage := 'Class and selector must be defined,\and the window spec must be saved first!!' withCRs.
@@ -2951,6 +3005,8 @@
    "
    |code v|
 
+   self treeSelection. "accept modifications"
+
    code := self painter generateWindowSpecMethodSource.
 
    v := CodeView open.
@@ -2961,7 +3017,7 @@
 
 loadFromMessage: aMessage
 
-    ((aMessage size > 0) and: [self checkModified])
+    ((aMessage size > 0) and: [self askForModification])
     ifTrue:
     [
         |readStream aClass aSelector|
@@ -2999,7 +3055,7 @@
             self warn:'No class named ' , specSuperclass , ' exists!!'.
             ^ false.
         ].
-        (self confirm:'Create ' , specClass , '?') ifTrue:[
+        (self confirm:'Create class ' , specClass asBoldText, '?') ifTrue:[
             superclass subclass:(specClass asSymbol)
                        instanceVariableNames:''
                        classVariableNames:''
@@ -3078,6 +3134,10 @@
                               selector:specSelector.
             ]
         ]
+        ifFalse:
+        [
+            ^nil
+        ]
 
     ] doWhile:[again].
 
@@ -3294,9 +3354,7 @@
     ].
     model root name: UIPainter defaultNameOfCanvas asBoldText.
     model root children:(OrderedCollection new).
-    model recomputeList.
-    self selection:nil.
-
+    model recomputeList.                
 
 !