tools/JavaCodeLibraryEditor.st
branchdevelopment
changeset 2388 b5ffedef3995
parent 2380 9195eccdcbd9
child 2391 b4a008ed9bc4
--- a/tools/JavaCodeLibraryEditor.st	Thu Feb 21 16:02:45 2013 +0000
+++ b/tools/JavaCodeLibraryEditor.st	Thu Feb 21 20:06:05 2013 +0000
@@ -1,16 +1,338 @@
 "{ Package: 'stx:libjava/tools' }"
 
-ApplicationModel subclass:#JavaCodeLibraryEditor
-	instanceVariableNames:'libraryHolder readonlyHolder library'
-	classVariableNames:''
+SimpleDialog subclass:#JavaCodeLibraryEditor
+	instanceVariableNames:'readonlyHolder library infoPanel nameHolder classesHolder
+		sourcesHolder acceptEnabledHolder nameIsDefault'
+	classVariableNames:'LastDirectory'
 	poolDictionaries:''
 	category:'Languages-Java-Tools'
 !
 
 
+!JavaCodeLibraryEditor class methodsFor:'help specs'!
+
+helpSpec
+    "This resource specification was automatically generated
+     by the UIHelpTool of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIHelpTool may not be able to read the specification."
+
+    "
+     UIHelpTool openOnClass:JavaCodeLibraryEditor    
+    "
+
+    <resource: #help>
+
+    ^ super helpSpec addPairsFrom:#(
+
+#classes
+'Path to a directory or .jar archive containing classes'
+
+#name
+'Name of the library (optional)'
+
+#sources
+'Path do a directory or .zip achive containing sources'
+
+)
+! !
+
+!JavaCodeLibraryEditor class methodsFor:'interface specs'!
+
+windowSpec
+    "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:JavaCodeLibraryEditor andSelector:#windowSpec
+     JavaCodeLibraryEditor new openInterface:#windowSpec
+     JavaCodeLibraryEditor open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(FullSpec
+        name: windowSpec
+        window: 
+       (WindowSpec
+          label: 'Java Library Definition'
+          name: 'Java Library Definition'
+          min: (Point 10 10)
+          bounds: (Rectangle 0 0 576 200)
+        )
+        component: 
+       (SpecCollection
+          collection: (
+           (SubCanvasSpec
+              name: 'InfoPanel'
+              layout: (LayoutFrame 0 0 0 0 0 1 40 0)
+              level: 0
+              hasHorizontalScrollBar: false
+              hasVerticalScrollBar: false
+              clientKey: infoPanel
+              createNewBuilder: false
+            )
+           (VerticalPanelViewSpec
+              name: 'Content'
+              layout: (LayoutFrame 0 0 40 0 0 1 -30 1)
+              horizontalLayout: fit
+              verticalLayout: top
+              horizontalSpace: 3
+              verticalSpace: 3
+              component: 
+             (SpecCollection
+                collection: (
+                 (ViewSpec
+                    name: 'NameBox'
+                    component: 
+                   (SpecCollection
+                      collection: (
+                       (LabelSpec
+                          label: 'Name:'
+                          name: 'NameLabel'
+                          layout: (LayoutFrame 0 0 0 0 70 0 0 1.0)
+                          activeHelpKey: name
+                          translateLabel: true
+                        )
+                       (InputFieldSpec
+                          name: 'Name'
+                          layout: (LayoutFrame 70 0 4 0 -70 1 26 0)
+                          activeHelpKey: name
+                          model: nameHolder
+                          immediateAccept: true
+                          acceptOnPointerLeave: true
+                          emptyFieldReplacementText: 'Name of the library (optional)'
+                        )
+                       )
+                     
+                    )
+                    extent: (Point 576 28)
+                  )
+                 (ViewSpec
+                    name: 'ClassesBox'
+                    activeHelpKey: classes
+                    component: 
+                   (SpecCollection
+                      collection: (
+                       (LabelSpec
+                          label: 'Classes:'
+                          name: 'ClassesLabel'
+                          layout: (LayoutFrame 0 0 0 0 70 0 0 1.0)
+                          activeHelpKey: classes
+                          translateLabel: true
+                        )
+                       (FilenameInputFieldSpec
+                          name: 'Classes'
+                          layout: (LayoutFrame 70 0 4 0 -70 1 26 0)
+                          activeHelpKey: classes
+                          model: classesHolder
+                          immediateAccept: true
+                          acceptOnPointerLeave: true
+                        )
+                       (ActionButtonSpec
+                          label: 'Browse'
+                          name: 'ClassesBrowse'
+                          layout: (LayoutFrame -70 1 4 0 -3 1 26 0)
+                          translateLabel: true
+                          model: doSelectClasses
+                        )
+                       )
+                     
+                    )
+                    extent: (Point 576 30)
+                  )
+                 (ViewSpec
+                    name: 'SourcesBox'
+                    component: 
+                   (SpecCollection
+                      collection: (
+                       (LabelSpec
+                          label: 'Sources:'
+                          name: 'Label1'
+                          layout: (LayoutFrame 0 0 0 0 70 0 0 1.0)
+                          activeHelpKey: sources
+                          translateLabel: true
+                        )
+                       (FilenameInputFieldSpec
+                          name: 'Sources'
+                          layout: (LayoutFrame 70 0 4 0 -70 1 26 0)
+                          activeHelpKey: sources
+                          model: sourcesHolder
+                          immediateAccept: true
+                          acceptOnPointerLeave: true
+                        )
+                       (ActionButtonSpec
+                          label: 'Browse'
+                          name: 'SourcesBrowse'
+                          layout: (LayoutFrame -70 1 4 0 -3 1 26 0)
+                          translateLabel: true
+                          model: doSelectSources
+                        )
+                       )
+                     
+                    )
+                    extent: (Point 576 29)
+                  )
+                 )
+               
+              )
+            )
+           (HorizontalPanelViewSpec
+              name: 'Buttons'
+              layout: (LayoutFrame 3 0 -30 1 -3 1 0 1)
+              horizontalLayout: right
+              verticalLayout: center
+              horizontalSpace: 3
+              verticalSpace: 3
+              reverseOrderIfOKAtLeft: true
+              component: 
+             (SpecCollection
+                collection: (
+                 (ActionButtonSpec
+                    label: 'Cancel'
+                    name: 'Button2'
+                    translateLabel: true
+                    model: doCancel
+                    extent: (Point 125 22)
+                  )
+                 (ActionButtonSpec
+                    label: 'OK'
+                    name: 'Button1'
+                    translateLabel: true
+                    model: doAccept
+                    enableChannel: acceptEnabledHolder
+                    extent: (Point 125 22)
+                  )
+                 )
+               
+              )
+            )
+           )
+         
+        )
+      )
+! !
+
+!JavaCodeLibraryEditor methodsFor:'accessing'!
+
+library
+    ^ library
+!
+
+library: aJavaCodeLibrary
+    library ~~ aJavaCodeLibrary ifTrue:[
+        library := aJavaCodeLibrary.
+        self nameHolder value: library name.
+        self classesHolder value: library classes.
+        self sourcesHolder value: library sources.
+
+        nameIsDefault := library name = library classes asFilename baseName.
+    ].
+
+    "Modified: / 21-02-2013 / 19:55:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaCodeLibraryEditor methodsFor:'actions'!
+
+doAccept
+    super doAccept
+
+    "Created: / 21-02-2013 / 19:51:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+doSelectClasses
+    <resource: #uiCallback>
+
+    | file |
+
+    file := Dialog 
+                requestFileName:(resources string: 'Select directory or .jar archive') 
+                default:''
+                ifFail:[ ^ self ]
+                pattern:'*.jar'
+                fromDirectory: (LastDirectory ? Filename currentDirectory pathName).
+    (file := file asFilename) exists ifTrue:[
+        LastDirectory := file directory pathName
+    ].
+    self classesHolder value: file pathName
+
+    "Modified: / 21-02-2013 / 19:23:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+doSelectSources
+    <resource: #uiCallback>
+
+    | file |
+
+    file := Dialog 
+                requestFileName:(resources string: 'Select directory or .jar/.zip archive with sources') 
+                default:''
+                ifFail:[ ^ self ]
+                pattern:'*.jar; *.zip'
+                fromDirectory: (LastDirectory ? Filename currentDirectory pathName).
+    (file := file asFilename) exists ifTrue:[
+        LastDirectory := file directory pathName
+    ].
+    self sourcesHolder value: file pathName
+
+    "Modified: / 21-02-2013 / 19:29:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
 
 !JavaCodeLibraryEditor methodsFor:'aspects'!
 
+acceptEnabledHolder
+    "return/create the 'acceptEnabledHolder' value holder (automatically generated)"
+
+    acceptEnabledHolder isNil ifTrue:[
+        acceptEnabledHolder := false asValue
+    ].
+    ^ acceptEnabledHolder
+
+    "Modified: / 21-02-2013 / 19:36:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+classesHolder
+    <resource: #uiAspect>
+
+    classesHolder isNil ifTrue:[
+        classesHolder := ValueHolder new.
+        classesHolder addDependent:self.
+
+    ].
+    ^ classesHolder.
+
+    "Modified: / 21-02-2013 / 19:02:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+infoPanel
+    infoPanel isNil ifTrue:[
+        infoPanel := Tools::InlineMessageDialog new.
+        infoPanel changeLayoutUponShowHide: false.
+    ].
+    ^ infoPanel
+
+    "Created: / 09-02-2012 / 19:23:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 21-02-2013 / 19:05:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+nameHolder
+    <resource: #uiAspect>
+
+    nameHolder isNil ifTrue:[
+        nameHolder := ValueHolder new.
+        nameHolder addDependent:self.
+
+    ].
+    ^ nameHolder.
+
+    "Modified: / 21-02-2013 / 20:00:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 readonlyHolder
     "return/create the 'readonlyHolder' value holder (automatically generated)"
 
@@ -24,8 +346,178 @@
     "set the 'readonlyHolder' value holder (automatically generated)"
 
     readonlyHolder := something.
+!
+
+sourcesHolder
+    <resource: #uiAspect>
+
+    sourcesHolder isNil ifTrue:[
+        sourcesHolder := ValueHolder new.
+        sourcesHolder addDependent:self.
+
+    ].
+    ^ sourcesHolder.
+
+    "Modified: / 21-02-2013 / 19:02:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaCodeLibraryEditor methodsFor:'change & update'!
+
+update:something with:aParameter from:changedObject
+    "Invoked when an object that I depend upon sends a change notification."
+
+    "stub code automatically generated - please change as required"
+
+    changedObject == nameHolder ifTrue:[
+         nameIsDefault := false.
+         ^ self.
+    ].
+
+    changedObject == classesHolder ifTrue:[
+         self validate.
+         ^ self.
+    ].
+    changedObject == sourcesHolder ifTrue:[
+         self validate.
+         ^ self.
+    ].
+    changedObject == accept ifTrue:[
+        library isNil ifTrue:[
+            library := JavaCodeLibrary new.
+        ].
+        library name: self nameHolder value.
+        library classes: self classesHolder value.
+        library sources: self sourcesHolder value.
+        self acceptValue: library.
+        ^self
+    ].
+
+    super update:something with:aParameter from:changedObject
+
+    "Modified: / 21-02-2013 / 19:59:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaCodeLibraryEditor methodsFor:'hooks'!
+
+commonPostOpen
+    self validate
+
+    "Created: / 21-02-2013 / 19:06:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaCodeLibraryEditor methodsFor:'initialization'!
+
+initialize
+    super initialize.
+    accept addDependent: self.
+    nameIsDefault := true.
+
+    "Created: / 21-02-2013 / 19:52:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!JavaCodeLibraryEditor methodsFor:'private'!
+
+validate
+    | classes sources |
+    classes := self classesHolder value.
+    classes isNil ifTrue:[
+        self validationError: 'Selected class path does not exist'.
+        ^self.
+    ].
+    classes := classes asFilename.
+    classes exists ifFalse:[
+        classes suffix = 'jar' ifTrue:[
+            self validationError: 'Selected .jar archive does not exist'.
+        ] ifFalse:[
+            self validationError: 'Selected class path does not exist'.
+        ].
+        ^self.
+    ].
+    classes isReadable ifFalse:[
+        classes suffix = 'jar' ifTrue:[
+            self validationError: 'Selected .jar archive is not readable'.
+        ] ifFalse:[
+            self validationError: 'Selected class path is not readable'.
+        ].
+        ^self.
+    ].
+    classes isDirectory ifFalse:[
+        (ZipArchive isZipArchive: classes) ifFalse:[
+            self validationError: 'Selected .jar file is not a valid zip archive'.
+            ^self
+        ].
+    ].
+    nameIsDefault ifTrue:[
+        self nameHolder value: classes baseName.
+        nameIsDefault := true
+    ].
+
+    sources := self sourcesHolder value.
+    sources isEmptyOrNil ifTrue:[
+        "/Sources optional
+        ^self validationOK.
+    ].
+    sources := sources asFilename.
+    sources exists ifFalse:[
+        (#('jar' 'zip') includes: sources suffix) ifTrue:[
+            self validationWarning: 'Selected source archive does not exist'.
+        ] ifFalse:[
+            self validationWarning: 'Selected source directory does not exist'.
+        ].
+        ^self.
+    ].
+    sources isReadable ifFalse:[
+        sources suffix = 'jar' ifTrue:[
+            self validationWarning: 'Selected source archive is not readable'.
+        ] ifFalse:[
+            self validationWarning: 'Selected source directory is not readable'.
+        ].
+        ^self.
+    ].
+    sources isDirectory ifFalse:[
+        (ZipArchive isZipArchive: sources) ifFalse:[
+            self validationWarning: 'Selected source archive is not a valid zip archive'.
+            ^self
+        ].
+    ].
+    self validationOK.
+
+    "Created: / 21-02-2013 / 19:04:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+validationError: msg
+
+    self acceptEnabledHolder value: false.
+    self infoPanel 
+        reset;
+        beWarning;
+        message: (resources string: msg);
+        show
+
+    "Created: / 21-02-2013 / 19:14:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+validationOK
+
+    self acceptEnabledHolder value: true.
+    self infoPanel 
+        reset;
+        hide
+
+    "Created: / 21-02-2013 / 19:16:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+validationWarning: msg
+
+    self acceptEnabledHolder value: true.
+    self infoPanel 
+        reset;
+        beInformation;
+        message: (resources string: msg);
+        show
+
+    "Created: / 21-02-2013 / 19:16:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
 
 !JavaCodeLibraryEditor class methodsFor:'documentation'!