cg@2742: "
cg@2742: COPYRIGHT (c) 2009 by eXept Software AG
cg@2742: All Rights Reserved
cg@2742:
cg@2742: This software is furnished under a license and may be used
cg@2742: only in accordance with the terms of that license and with the
cg@2742: inclusion of the above copyright notice. This software may not
cg@2742: be provided or otherwise made available to, or used by, any
cg@2742: other person. No title to or ownership of the software is
cg@2742: hereby transferred.
cg@2742: "
cg@2636: "{ Package: 'stx:libtool2' }"
cg@2636:
cg@2636: "{ NameSpace: Tools }"
cg@2636:
cg@2636: AssistantApplication subclass:#ProjectBuilderAssistantApplication
cg@2687: instanceVariableNames:'packageToBuildHolder projectType projectTypeHolder
cg@2687: selectedProjectIndexHolder selectedProjectDefinition
cg@2687: listOfMatchingProjects listOfMatchingPackageIds
cg@2687: selectedProjectsComment hasProjectSelectedHolder newProjectsName
cg@2687: hideSTXProjects hideOtherApplicationClasses
cg@2687: hideOtherStartupClasses startMakeButtonEnabled
cg@2687: stopMakeButtonVisible makeOutputHolder newApplicationsName
cg@2687: listOfApplicationsInProject selectedApplicationIndexHolder
cg@2687: selectedApplication hasApplicationSelectedHolder
cg@2687: listOfStartupClassesInProject selectedStartupClassIndexHolder
cg@2687: selectedStartupClass hasStartupClassSelectedHolder
cg@2687: selectedApplicationsComment buildDirectoryHolder makeProcess
cg@2687: listOfClassesInProject makeOutputWindow projectBuilder
fm@2705: newStartupClassName usedCompilerHolder listOfNewProjectsName
cg@2724: newProjectsNameListExtendedComboBox productNameHolder
cg@2724: companyNameHolder compilerWarnMessageHolder
cg@2872: compilerWarnMessageVisibleHolder listOfPrerequisitesInProject'
cg@2687: classVariableNames:''
cg@2687: poolDictionaries:''
cg@2687: category:'System-Support-Projects'
cg@2636: !
cg@2636:
cg@2668: !ProjectBuilderAssistantApplication class methodsFor:'documentation'!
cg@2668:
cg@2742: copyright
cg@2742: "
cg@2742: COPYRIGHT (c) 2009 by eXept Software AG
cg@2742: All Rights Reserved
cg@2742:
cg@2742: This software is furnished under a license and may be used
cg@2742: only in accordance with the terms of that license and with the
cg@2742: inclusion of the above copyright notice. This software may not
cg@2742: be provided or otherwise made available to, or used by, any
cg@2742: other person. No title to or ownership of the software is
cg@2742: hereby transferred.
cg@2742: "
cg@2742: !
cg@2742:
cg@2668: documentation
cg@2668: "
cg@2668: a user friendly interface to the build process.
cg@2668: Simply wraps up existing tools like the CodeGeneratorTool, the browsers
cg@2668: and the ProjetBuilder
cg@2668:
cg@2668: [see also:]
cg@2668: CodeGeneratorTool
cg@2668: ProjectBuilder
cg@2668: ProjectDefinition
cg@2668:
cg@2668: [author:]
cg@2668: Claus Gittinger
cg@2668: "
fm@2721: !
fm@2721:
fm@2721: help
cg@2825: "
cg@2825: Packager - A Standalone-Executable Builder and Packager
fm@2721:
cg@2825: This assistant-application allows for standalone applications to be built very easily.
cg@2825: It will generate all required classes, files, start the compilation process,
cg@2825: generate a self-installable executable with a few mouse clicks.
cg@2825:
cg@2825: A simple demo application like the famous 'Hello World' can be generated in a few minutes.
cg@2825:
cg@2825: Prerequisites
cg@2825:
cg@2825: * Windows Users:
cg@2825: Please install either the 'Borland Free Commandline Compiler Tools (bcc32)'
cg@2825: or the 'Microsoft Visual-C++' package (also free).
cg@2825: In addition, the 'NullSoft NSIS-Installer Package' is required.
cg@2825:
cg@2825: Due to limitations and bugs in the Visual-C++ compiler (limit on the size of
cg@2825: string-constants), some Smalltalk code is still not compilable
cg@2825: (currently, this affects classes which contain image-resource methods for big images).
cg@2825: Although microsoft is doing their best (a relative measure) to make things better
cg@2825: (they increase the string-limit with every new release), they still seem to be unable
cg@2825: to figure out how ti use malloc for string-data).
cg@2825: We are patiently waiting for a real fix and still using bcc in the meanwhile.
cg@2825: Therefore, we recommend using the borland compiler suite.
cg@2825: Please install it at its standard location ('C:\Borland') as our makefiles might
cg@2825: still contain hard-coded pathes (yes, we are ashamed about this).
cg@2825:
cg@2825: * Unix Users:
cg@2825: You should already have the gcc compile suite (including all required header files)
cg@2825: installed and ready to use. For a lack of time on our side, there is currently no
cg@2825: self-installer support for Unix. The packager will generate a zipped tar file,
cg@2825: which must be deployed and unpacked for use. This may change in the near future.
cg@2825:
cg@2825: Packages, Projects, PackageIDs and ProjectDefinitions
cg@2825:
cg@2825: Smalltalk basically uses two objects for packaging:
cg@2825:
cg@2825: * PackageIDs (also called ProjectID's occasionally)
cg@2825: * ProjectDefinitions
cg@2825:
cg@2825: Older ST/X versions used instances of a Project class - this is now obsolete and
cg@2825: removed from the system (although there are still some minor uses of it,
cg@2825: which might remain there for backward compatibility for some time, as some customers
cg@2825: have built their own packaging scheme around it).
cg@2825:
cg@2825: PackageIDs
cg@2825:
cg@2825: These are simple symbols and are attached to classes and methods. If a method has
cg@2825: a packageID different from its class, it is called an extension method.
cg@2825: PackageIDs must have a certain fixed format: they always contain exactly two parts,
cg@2825: which are separated by a colon character: the module and the directory part.
cg@2825: The module is used as main-selector on where and how the source code repository is
cg@2825: accessed. The directory is a path below that repository. If checked out into the local
cg@2825: filesystem, the module defines the top-level directory. Thus, if a packageID is
cg@2825: 'stx:libbasic', the corresponding sources will be found in the repository associated
cg@2825: to the 'stx' module, under the directory 'libbasic'.
cg@2825: In the local file system, it will be found under 'stx/libbasic'.
cg@2825: As another example, if the packageID is 'exept:expecco/plugins/foo',
cg@2825: the repository is whichever is associated with the 'exept' module, and the subdirectory
cg@2825: is 'expecco/plugins/foo'. The local path to the sourcefiles would be
cg@2825: 'exept/expecco/plugins/foo'.
cg@2825:
cg@2825: Please notice that it does make sense to associate different repositories to different
cg@2825: modules: for example, you could setup the sourceCodeManager to use CVS access to the
cg@2825: exept repository for everything under the 'stx' module,
cg@2825: and at the same time, use a local SVN repository for everything under the 'myCompany'
cg@2825: module.
cg@2825:
cg@2825: ProjectDefinitions
cg@2825:
cg@2825: These describe the contents of a project, such as the classes to include,
cg@2825: the set of extension methods, any additional compilation information.
cg@2825: ProjectDefinitions come in 3 flavours:
cg@2825:
cg@2825: * GUI Application Definition
cg@2825: * non-GUI Application Definition
cg@2825: * ClassLibrary Definition
cg@2825:
cg@2825: ProjectDefinitions are stored and managed as class-instances, located as subclasses
cg@2825: of one of ApplicationDefinition or LibraryDefinition.
cg@2825: As classes, they are themself managed, compiled and packaged as part of the project
cg@2825: (and also have the same PackageID as their components).
cg@2825: They are also treated like any other class w.r.t. source code management.
cg@2825:
cg@2825: Packaging
cg@2825:
cg@2825: All classes and extension methods belonging to a single package are supposed to be
cg@2825: loaded (and possibly unloaded) together. They are also usually deployed inside a single
cg@2825: dynamic link library ('dll', for short). In the Unix world, these are called
cg@2825: 'shared object' or 'so'.
cg@2825: Finally, they are stored in a common directory both on the local file system and in a
cg@2825: source code repository (CVS, SVN, etc.).
cg@2825:
cg@2825: Structure of a Project
cg@2825:
cg@2825: The artefacts as manipulated by the packager are:
cg@2825:
cg@2825: * the ProjectDefinition class
cg@2825: This defines the type of application (GUI / non-GUI),
cg@2825: its contents (i.e. the set of classes to be included in the binary itself and
cg@2825: the set of library-dll's to be included in the deployed package),
cg@2825: and some other metadata, such as icon, title etc.
cg@2825:
cg@2825: * the ApplicationModel class
cg@2825: This defines the GUI, and is typically created using the UI-Painter.
cg@2825:
cg@2825: * the Startup class
cg@2825: This is the first class which gets control when the executable is started;
cg@2825: it can analyze the command line arguments, read patches or updates,
cg@2825: start background ptocesses, and will eventually open the applications GUI.
cg@2825:
cg@2825: Build Procedure
cg@2825:
cg@2825: All of the three components above can be generated by the packager to provide an
cg@2825: initial framework for further work.
cg@2825:
cg@2825: After the definition of those classes, all required files are stored in a temporary
cg@2825: build directory. This means that the above classes are filed out,
cg@2825: and make- and other support files are generated.
cg@2825:
cg@2825: Finally, the actual build process is started. This requires an external C-compiler.
cg@2825: Under windows, both Borland-C (free download available via the internet) and Microsoft's
cg@2825: Visual-C++ (also available for free) can be used (the later with some limitations as explained above).
cg@2825:
cg@2825: A self-installing executable is built using the NullSoft NSIS package.
cg@2825: This is also required to be installed before the packager is started.
cg@2825:
cg@2825: After the build, all required files are packaged in a single install-file.
cg@2825: This is called 'MyApplicationSetup.exe' and found in the project-specific subdirectory
cg@2825: of the build directory. For deployment, this single file has to be delivered to a customer
cg@2825: and executed there.
cg@2825:
cg@2825: Summary: It has NEVER been easier to create a GUI application with Smalltalk.
cg@2825: "
cg@2668: ! !
cg@2636:
cg@2703: !ProjectBuilderAssistantApplication class methodsFor:'assistant pages spec'!
cg@2703:
cg@2703: assistantSpec
cg@2703: ^ #(Array
cg@2703: ( AssistantPageSpec
cg@2703: pageTitle: 'Project Type Selection'
cg@2703: windowSpecSelector: page1_projectTypeSelectionSpec
cg@2703: enterCallbackSelector: updateListOfMatchingProjects
cg@2703: infoText: 'Choose the type of project you are about to build.'
cg@2703: )
cg@2703:
cg@2703: (AssistantPageSpec
cg@2703: pageTitle: 'ProjectDefinition Selection'
cg@2703: windowSpecSelector: page2_projectSelectionSpec
cg@2703: enterCallbackSelector: updateListOfMatchingProjects
cg@2825: infoText: 'Choose an existing project definition or create a new one. These are subclasses of ProjectDefinition and define the type and contents of a project.'
cg@2703: )
cg@2703:
cg@2703: (AssistantPageSpec
cg@2703: pageTitle: 'Startup Application Selection'
cg@2703: windowSpecSelector: page3_applicationSelectionSpec
cg@2703: isEnabledQuerySelector: #projectTypeIsGuiApplication
cg@2703: canEnterQuerySelector: #canEnterApplicationSelection
cg@2703: enterCallbackSelector: updateListOfApplicationsInProject
cg@2825: infoText: 'Choose an existing application or create a new one. These are subclasses of ApplicationModel and define the GUI and control flow inside the application. Can also be left blank if the startup class does it all (stx build).'
cg@2703: )
cg@2703:
cg@2703: (AssistantPageSpec
cg@2703: pageTitle: 'Startup Class Selection'
cg@2703: windowSpecSelector: page4_startupClassSelectionSpec
cg@2703: isEnabledQuerySelector: #projectTypeIsNotLibrary
cg@2703: canEnterQuerySelector: #canEnterStartupClassSelection
cg@2703: enterCallbackSelector: updateListOfStartupClassesInProject
cg@2825: infoText: 'Choose an existing startup-class or create a new one. These are subclasses of StandaloneStartup and start the application. Command line arguments can be interpreted there.'
cg@2703: )
cg@2703:
cg@2703: (AssistantPageSpec
cg@2703: pageTitle: 'Specify Contents'
cg@2703: windowSpecSelector: page5_specifyIncludedClasses
cg@2703: enterCallbackSelector: enterContentsSpecification
cg@2703: canEnterQuerySelector: #canEnterContentsSelection
cg@2825: infoText: 'Define which (other) classes are to be included. Press "Scan" to include all classes of the package; browse to edit the contents manually.'
cg@2703: )
cg@2703:
cg@2703: (AssistantPageSpec
cg@2872: pageTitle: 'Specify Prerequisites'
cg@2872: windowSpecSelector: page5b_specifyPrerequisitePackages
cg@2872: enterCallbackSelector: enterPrerequisitesSpecification
cg@2872: canEnterQuerySelector: #canEnterPrerequisitesSelection
cg@2872: infoText: 'Define which (other) packages are needed as prerequisites. Press "Scan" to search for prerequisites; browse to edit the list manually.'
cg@2872: )
cg@2872:
cg@2872: (AssistantPageSpec
cg@2724: pageTitle: 'Specify Project Attributes'
cg@2724: windowSpecSelector: page6a_specifyProjectAttributes
cg@2724: infoText: 'Define additional attributes.'
cg@2724: enterCallbackSelector: updateProjectAttributes
cg@2724: leaveCallbackSelector: #rememberProjectAttributes
cg@2724: )
cg@2724:
cg@2724: (AssistantPageSpec
cg@2703: pageTitle: 'Specify Build Directory'
cg@2724: windowSpecSelector: page6b_specifyBuildDirectorySpec
cg@2825: infoText: 'Define where the build-process is to be performed. All generated files are created below that directory. After deployment, the build directory is no longer needed (but you can keep it for a faster compile the next time).'
cg@2724: enterCallbackSelector: #checkCompilerAvailability
cg@2703: )
cg@2703:
cg@2703: (AssistantPageSpec
cg@2703: pageTitle: 'Build'
cg@2703: windowSpecSelector: page7_buildSpec
cg@2703: canEnterQuerySelector: #canEnterBuild
cg@2703: enterCallbackSelector: #restoreMakeOutputsContents
cg@2703: leaveCallbackSelector: #rememberMakeOutputsContents
cg@2825: infoText: 'Start the build-process. This will run make/bcc to compile all required classes and nsis to generate a self-installable executable. You must have the borland-cc and NullSoft NSIS packages installed for this to work.'
cg@2703: )
cg@2703:
cg@2703: (AssistantPageSpec
cg@2703: pageTitle: 'Deploy'
cg@2703: windowSpecSelector: page8_deploySpec
cg@2703: canEnterQuerySelector: #canEnterDeploy
cg@2825: infoText: 'Find the installer to be deployed (or test-run the binary). You can open a WindowsExplorer there to copy the files for deployment. After that, the build directory is no longer needed (but you can keep it for a faster compile the next time).'
cg@2703: )
cg@2703: ) decodeAsLiteralArray.
cg@2825:
cg@2872: "Modified: / 19-01-2012 / 15:36:05 / cg"
cg@2703: ! !
cg@2703:
cg@2670: !ProjectBuilderAssistantApplication class methodsFor:'defaults'!
cg@2670:
cg@2670: defaultIcon
sv@2838:
sv@2838:
cg@2670: ^ ToolbarIconLibrary projectBuilderIcon
cg@2670: !
cg@2670:
cg@2670: windowLabelTemplate
cg@2670: ^ 'ST/X Packager: %1'
cg@2670: ! !
cg@2670:
cg@2703: !ProjectBuilderAssistantApplication class methodsFor:'help'!
cg@2703:
cg@2703: flyByHelpSpec
cg@2703:
cg@2703:
cg@2703: ^ super flyByHelpSpec addPairsFrom:#(
cg@2703:
cg@2706: #'projectType'
cg@2706: 'Choose the type of Project you are about to deploy.'
cg@2706:
cg@2706: #existingProjects
cg@2706: 'Projects with an existing ProjectDefinition of the chosen type (above).'
cg@2703:
cg@2706: #browseSelectedProject
cg@2706: 'Open a SystemBrowser on the selected Project.'
cg@2706:
cg@2706: #hideSTXBasePackages
cg@2706: 'Only show packages which are not already included in the basic ST/X delivery.'
cg@2703:
cg@2703: #'listOfNewProjectsName'
cg@2706: 'PackageID (module:directory).
cg@2706: The pull-down list contains packageIDs for which no ProjectDefinition exists (yet).'
cg@2706:
cg@2706: #'createNewProject'
cg@2706: 'PackageID (module:directory).
cg@2706: Click to create a new (empty) ProjectDefinition for the given PackageID.'
cg@2703:
cg@2703: )
cg@2703: ! !
cg@2703:
cg@2636: !ProjectBuilderAssistantApplication class methodsFor:'interface specs'!
cg@2636:
cg@2645: page1_projectTypeSelectionSpec
cg@2636: "This resource specification was automatically generated
cg@2636: by the UIPainter of ST/X."
cg@2636:
cg@2636: "Do not manually edit this!! If it is corrupted,
cg@2636: the UIPainter may not be able to read the specification."
cg@2636:
cg@2636: "
cg@2648: UIPainter new openOnClass:Tools::ProjectBuilderAssistantApplication andSelector:#page1_projectTypeSelectionSpec
cg@2648: Tools::ProjectBuilderAssistantApplication new openInterface:#page1_projectTypeSelectionSpec
cg@2636: "
cg@2636:
cg@2636:
cg@2636:
cg@2636: ^
cg@2636: #(FullSpec
cg@2645: name: #'page1_projectTypeSelectionSpec'
cg@2636: window:
cg@2636: (WindowSpec
cg@2636: label: 'Project Selection'
cg@2636: name: 'Project Selection'
cg@2636: min: (Point 0 0)
cg@2636: bounds: (Rectangle 0 0 626 394)
cg@2636: )
cg@2636: component:
cg@2636: (SpecCollection
cg@2636: collection: (
cg@2636: (FramedBoxSpec
cg@2706: label: 'Project Type'
cg@2636: name: 'FramedBox1'
cg@2698: layout: (LayoutFrame 0 0.0 0 0 4 1.0 120 0)
cg@2706: activeHelpKey: projectType
cg@2636: labelPosition: topLeft
cg@2636: translateLabel: true
cg@2636: component:
cg@2636: (SpecCollection
cg@2636: collection: (
cg@2636: (VerticalPanelViewSpec
cg@2636: name: 'VerticalPanel1'
cg@2636: layout: (LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
cg@2636: horizontalLayout: leftSpace
cg@2636: verticalLayout: topSpace
cg@2636: horizontalSpace: 3
cg@2636: verticalSpace: 3
cg@2636: component:
cg@2636: (SpecCollection
cg@2636: collection: (
cg@2636: (ViewSpec
cg@2636: name: 'Box1'
cg@2636: extent: (Point 10 10)
cg@2636: )
cg@2636: (RadioButtonSpec
cg@2636: label: 'GUI Application'
cg@2636: name: 'RadioButton1'
cg@2636: translateLabel: true
cg@2659: model: projectTypeHolder
cg@2636: isTriggerOnDown: true
cg@2636: onCallBackSelector: projectTypeChanged
cg@2897: select: #'GUI-Application'
cg@2636: extent: (Point 136 22)
cg@2636: )
cg@2636: (RadioButtonSpec
cg@2636: label: 'Non-GUI Application'
cg@2636: name: 'RadioButton2'
cg@2636: translateLabel: true
cg@2659: model: projectTypeHolder
cg@2636: isTriggerOnDown: true
cg@2636: onCallBackSelector: projectTypeChanged
cg@2897: select: #'NonGUI-Application'
cg@2636: extent: (Point 136 22)
cg@2636: )
cg@2636: (RadioButtonSpec
cg@2636: label: 'Class Library'
cg@2636: name: 'RadioButton3'
cg@2636: translateLabel: true
cg@2659: model: projectTypeHolder
cg@2636: isTriggerOnDown: true
cg@2636: onCallBackSelector: projectTypeChanged
cg@2897: select: #Library
cg@2636: extent: (Point 136 22)
cg@2636: )
cg@2636: )
cg@2636:
cg@2636: )
cg@2636: )
cg@2636: )
cg@2636:
cg@2636: )
cg@2636: )
cg@2636: (FramedBoxSpec
cg@2726: label: 'Existing Projects of this Type (PackageIDs)'
cg@2636: name: 'FramedBox2'
cg@2698: layout: (LayoutFrame 0 0.0 123 0 4 1.0 0 1)
cg@2706: activeHelpKey: existingProjects
cg@2636: labelPosition: topLeft
cg@2636: translateLabel: true
cg@2636: component:
cg@2636: (SpecCollection
cg@2636: collection: (
cg@2636: (VariableHorizontalPanelSpec
cg@2636: name: 'VariableHorizontalPanel1'
cg@2636: layout: (LayoutFrame 0 0 4 0 0 1 -26 1)
cg@2636: component:
cg@2636: (SpecCollection
cg@2636: collection: (
cg@2636: (SequenceViewSpec
cg@2636: name: 'List1'
cg@2636: model: selectedProjectIndexHolder
cg@2636: hasHorizontalScrollBar: true
cg@2636: hasVerticalScrollBar: true
cg@2636: useIndex: true
cg@2686: sequenceList: listOfMatchingPackageIds
cg@2636: )
cg@2636: (TextEditorSpec
cg@2636: name: 'TextEditor1'
cg@2636: model: selectedProjectsComment
cg@2636: hasHorizontalScrollBar: true
cg@2636: hasVerticalScrollBar: true
cg@2636: isReadOnly: true
cg@2636: hasKeyboardFocusInitially: false
cg@2636: )
cg@2636: )
cg@2636:
cg@2636: )
cg@2636: handles: (Any 0.34560327198364 1.0)
cg@2636: )
cg@2636: (CheckBoxSpec
cg@2636: label: 'Hide ST/X Base Packages'
cg@2636: name: 'CheckBox1'
cg@2659: layout: (LayoutFrame -1 0 -18 1 0 1 4 1)
cg@2706: activeHelpKey: hideSTXBasePackages
cg@2636: model: hideSTXProjects
cg@2636: translateLabel: true
cg@2636: )
cg@2636: )
cg@2636:
cg@2636: )
cg@2636: )
cg@2636: )
cg@2636:
cg@2636: )
cg@2636: )
cg@2897:
cg@2897: "Modified: / 20-07-2012 / 13:27:45 / cg"
cg@2636: !
cg@2636:
cg@2645: page2_projectSelectionSpec
cg@2636: "This resource specification was automatically generated
cg@2636: by the UIPainter of ST/X."
cg@2636:
cg@2636: "Do not manually edit this!! If it is corrupted,
cg@2636: the UIPainter may not be able to read the specification."
cg@2636:
cg@2636: "
cg@2648: UIPainter new openOnClass:Tools::ProjectBuilderAssistantApplication andSelector:#page2_projectSelectionSpec
cg@2648: Tools::ProjectBuilderAssistantApplication new openInterface:#page2_projectSelectionSpec
cg@2636: "
cg@2636:
cg@2636:
cg@2636:
cg@2636: ^
cg@2636: #(FullSpec
cg@2645: name: #'page2_projectSelectionSpec'
cg@2636: window:
cg@2636: (WindowSpec
cg@2636: label: 'Project Selection'
cg@2636: name: 'Project Selection'
cg@2636: min: (Point 0 0)
cg@2636: bounds: (Rectangle 0 0 521 453)
cg@2636: )
cg@2636: component:
cg@2636: (SpecCollection
cg@2636: collection: (
cg@2636: (FramedBoxSpec
cg@2706: label: 'New Project''s PackageID'
cg@2636: name: 'FramedBox3'
cg@2636: layout: (LayoutFrame 0 0.0 5 0 4 1.0 72 0)
cg@2636: labelPosition: topLeft
cg@2636: translateLabel: true
cg@2636: component:
cg@2636: (SpecCollection
cg@2636: collection: (
cg@2706: (ExtendedComboBoxSpec
cg@2706: name: 'NewProjectsNameListExtendedComboBox'
cg@2706: layout: (LayoutFrame 1 0 6 0 -113 1 28 0)
cg@2706: model: newProjectsName
cg@2706: readOnly: false
cg@2706: miniScrollerHorizontal: true
cg@2706: postBuildCallback: postBuildNewProjectsNameListExtendedComboBox:
cg@2706: activeHelpKey: listOfNewProjectsName
cg@2706: )
cg@2636: (ActionButtonSpec
cg@2636: label: 'Create'
cg@2636: name: 'Button1'
cg@2659: layout: (LayoutFrame -100 1 6 0 2 1 28 0)
cg@2636: translateLabel: true
cg@2636: model: createNewProject
cg@2703: activeHelpKey: createNewProject
cg@2706:
cg@2636: )
cg@2706:
cg@2636: )
cg@2636:
cg@2636: )
cg@2636: )
cg@2636: (FramedBoxSpec
cg@2706: label: 'Existing Projects with ProjectDefinition'
cg@2636: name: 'FramedBox4'
cg@2648: layout: (LayoutFrame 0 0.0 70 0 4 1.0 -30 1)
cg@2636: labelPosition: topLeft
cg@2636: translateLabel: true
cg@2636: component:
cg@2636: (SpecCollection
cg@2636: collection: (
cg@2636: (VariableHorizontalPanelSpec
cg@2636: name: 'VariableHorizontalPanel2'
cg@2636: layout: (LayoutFrame 0 0 4 0 0 1 -26 1)
cg@2636: component:
cg@2636: (SpecCollection
cg@2636: collection: (
cg@2636: (SequenceViewSpec
cg@2636: name: 'List2'
cg@2636: model: selectedProjectIndexHolder
cg@2636: hasHorizontalScrollBar: true
cg@2636: hasVerticalScrollBar: true
cg@2636: useIndex: true
cg@2686: sequenceList: listOfMatchingPackageIds
cg@2636: )
cg@2636: (TextEditorSpec
cg@2636: name: 'TextEditor2'
cg@2636: model: selectedProjectsComment
cg@2636: hasHorizontalScrollBar: true
cg@2636: hasVerticalScrollBar: true
cg@2636: isReadOnly: true
cg@2636: hasKeyboardFocusInitially: false
cg@2636: viewClassName: 'TextView'
cg@2636: )
cg@2636: )
cg@2636:
cg@2636: )
cg@2636: handles: (Any 0.34560327198364 1.0)
cg@2636: )
cg@2636: (CheckBoxSpec
cg@2636: label: 'Hide ST/X Base Packages'
cg@2636: name: 'CheckBox1'
cg@2659: layout: (LayoutFrame -1 0 -17 1 0 1 5 1)
cg@2636: model: hideSTXProjects
cg@2636: translateLabel: true
cg@2706: activeHelpKey: hideSTXBasePackages
cg@2636: )
cg@2636: )
cg@2636:
cg@2636: )
cg@2636: )
cg@2648: (HorizontalPanelViewSpec
cg@2648: name: 'HorizontalPanel1'
cg@2648: layout: (LayoutFrame 0 0 -30 1 0 1 0 1)
cg@2648: horizontalLayout: leftSpace
cg@2648: verticalLayout: center
cg@2648: horizontalSpace: 3
cg@2648: verticalSpace: 3
cg@2648: component:
cg@2648: (SpecCollection
cg@2648: collection: (
cg@2648: (ActionButtonSpec
cg@2648: label: 'Browse Selected Project'
cg@2648: name: 'Button3'
cg@2648: translateLabel: true
cg@2648: model: doBrowseProject
cg@2659: enableChannel: hasProjectSelectedHolder
cg@2648: extent: (Point 180 22)
cg@2706: activeHelpKey: browseSelectedProject
cg@2648: )
cg@2648: )
cg@2648:
cg@2648: )
cg@2636: )
cg@2636: )
cg@2636:
cg@2636: )
cg@2636: )
cg@2636: !
cg@2636:
cg@2645: page3_applicationSelectionSpec
cg@2636: "This resource specification was automatically generated
cg@2636: by the UIPainter of ST/X."
cg@2636:
cg@2636: "Do not manually edit this!! If it is corrupted,
cg@2636: the UIPainter may not be able to read the specification."
cg@2636:
cg@2636: "
cg@2648: UIPainter new openOnClass:Tools::ProjectBuilderAssistantApplication andSelector:#page3_applicationSelectionSpec
cg@2648: Tools::ProjectBuilderAssistantApplication new openInterface:#page3_applicationSelectionSpec
cg@2636: "
cg@2636:
cg@2636:
cg@2636:
cg@2636: ^
cg@2636: #(FullSpec
cg@2645: name: #'page3_applicationSelectionSpec'
cg@2636: window:
cg@2636: (WindowSpec
cg@2636: label: 'Application Selection'
cg@2636: name: 'Application Selection'
cg@2636: min: (Point 0 0)
cg@2671: bounds: (Rectangle 0 0 519 406)
cg@2636: )
cg@2636: component:
cg@2636: (SpecCollection
cg@2636: collection: (
cg@2636: (FramedBoxSpec
cg@2725: label: 'New Application Class'
cg@2636: name: 'FramedBox3'
cg@2725: layout: (LayoutFrame 0 0.0 5 0 4 1.0 70 0)
cg@2636: labelPosition: topLeft
cg@2636: translateLabel: true
cg@2636: component:
cg@2636: (SpecCollection
cg@2636: collection: (
cg@2636: (InputFieldSpec
cg@2636: name: 'EntryField1'
cg@2659: layout: (LayoutFrame 1 0 6 0 -113 1 28 0)
cg@2636: model: newApplicationsName
cg@2636: acceptOnReturn: true
cg@2636: acceptOnTab: true
cg@2693: acceptOnLostFocus: true
cg@2636: acceptOnPointerLeave: true
cg@2636: emptyFieldReplacementText: 'MyApplication'
cg@2636: )
cg@2636: (ActionButtonSpec
cg@2636: label: 'Create'
cg@2636: name: 'Button1'
cg@2659: layout: (LayoutFrame -100 1 6 0 1 1 28 0)
cg@2636: translateLabel: true
cg@2636: model: createNewApplication
cg@2636: )
cg@2636: )
cg@2636:
cg@2636: )
cg@2636: )
cg@2636: (FramedBoxSpec
cg@2636: label: 'Existing Applications'
cg@2636: name: 'FramedBox4'
cg@2725: layout: (LayoutFrame 0 0.0 72 0 4 1.0 -30 1)
cg@2636: labelPosition: topLeft
cg@2636: translateLabel: true
cg@2636: component:
cg@2636: (SpecCollection
cg@2636: collection: (
cg@2636: (VariableHorizontalPanelSpec
cg@2636: name: 'VariableHorizontalPanel2'
cg@2671: layout: (LayoutFrame 0 0 4 0 0 1 -26 1)
cg@2636: component:
cg@2636: (SpecCollection
cg@2636: collection: (
cg@2636: (SequenceViewSpec
cg@2636: name: 'List2'
cg@2636: model: selectedApplicationIndexHolder
cg@2636: hasHorizontalScrollBar: true
cg@2636: hasVerticalScrollBar: true
cg@2636: useIndex: true
cg@2636: sequenceList: listOfApplicationsInProject
cg@2671: ignoreReselect: false
cg@2636: )
cg@2636: (TextEditorSpec
cg@2636: name: 'TextEditor2'
cg@2636: model: selectedApplicationsComment
cg@2636: hasHorizontalScrollBar: true
cg@2636: hasVerticalScrollBar: true
cg@2636: isReadOnly: true
cg@2636: hasKeyboardFocusInitially: false
cg@2636: viewClassName: 'TextView'
cg@2636: )
cg@2636: )
cg@2636:
cg@2636: )
cg@2636: handles: (Any 0.34560327198364 1.0)
cg@2636: )
cg@2671: (CheckBoxSpec
cg@2671: label: 'Hide other Application Classes'
cg@2671: name: 'CheckBox1'
cg@2671: layout: (LayoutFrame -1 0 -18 1 0 1 4 1)
cg@2671: model: hideOtherApplicationClasses
cg@2671: translateLabel: true
cg@2671: )
cg@2636: )
cg@2636:
cg@2636: )
cg@2636: )
cg@2648: (HorizontalPanelViewSpec
cg@2648: name: 'HorizontalPanel1'
cg@2648: layout: (LayoutFrame 0 0 -30 1 0 1 0 1)
cg@2648: horizontalLayout: leftSpace
cg@2648: verticalLayout: center
cg@2648: horizontalSpace: 3
cg@2648: verticalSpace: 3
cg@2648: component:
cg@2648: (SpecCollection
cg@2648: collection: (
cg@2648: (ActionButtonSpec
cg@2648: label: 'Browse Selected Application'
cg@2648: name: 'Button3'
cg@2648: translateLabel: true
cg@2648: model: doBrowseApplication
cg@2659: enableChannel: hasApplicationSelectedHolder
cg@2659: extent: (Point 180 22)
cg@2659: )
cg@2659: (ActionButtonSpec
cg@2659: label: 'Launch Selected Application'
cg@2659: name: 'Button4'
cg@2659: translateLabel: true
cg@2659: model: doLaunchApplication
cg@2659: enableChannel: hasApplicationSelectedHolder
cg@2648: extent: (Point 180 22)
cg@2648: )
cg@2648: )
cg@2648:
cg@2648: )
cg@2636: )
cg@2636: )
cg@2636:
cg@2636: )
cg@2636: )
cg@2636: !
cg@2636:
cg@2656: page4_startupClassSelectionSpec
cg@2636: "This resource specification was automatically generated
cg@2636: by the UIPainter of ST/X."
cg@2636:
cg@2636: "Do not manually edit this!! If it is corrupted,
cg@2636: the UIPainter may not be able to read the specification."
cg@2636:
cg@2636: "
cg@2656: UIPainter new openOnClass:Tools::ProjectBuilderAssistantApplication andSelector:#page4_startupClassSelectionSpec
cg@2656: Tools::ProjectBuilderAssistantApplication new openInterface:#page4_startupClassSelectionSpec
cg@2636: "
cg@2636:
cg@2636:
cg@2636:
cg@2636: ^
cg@2636: #(FullSpec
cg@2656: name: #'page4_startupClassSelectionSpec'
cg@2656: window:
cg@2656: (WindowSpec
cg@2656: label: 'Startup Class Selection'
cg@2656: name: 'Startup Class Selection'
cg@2656: min: (Point 0 0)
cg@2656: bounds: (Rectangle 0 0 521 408)
cg@2656: )
cg@2656: component:
cg@2656: (SpecCollection
cg@2656: collection: (
cg@2656: (FramedBoxSpec
cg@2725: label: 'New Startup Class'
cg@2656: name: 'FramedBox3'
cg@2725: layout: (LayoutFrame 0 0.0 5 0 4 1.0 70 0)
cg@2656: labelPosition: topLeft
cg@2656: translateLabel: true
cg@2656: component:
cg@2656: (SpecCollection
cg@2656: collection: (
cg@2656: (InputFieldSpec
cg@2656: name: 'EntryField1'
cg@2659: layout: (LayoutFrame 1 0 6 0 -113 1 28 0)
cg@2656: model: newStartupClassName
cg@2656: acceptOnReturn: true
cg@2656: acceptOnTab: true
cg@2693: acceptOnLostFocus: true
cg@2656: acceptOnPointerLeave: true
cg@2656: emptyFieldReplacementText: 'MyStandAloneStartup'
cg@2656: )
cg@2656: (ActionButtonSpec
cg@2656: label: 'Create'
cg@2656: name: 'Button1'
cg@2659: layout: (LayoutFrame -100 1 6 0 1 1 28 0)
cg@2656: translateLabel: true
cg@2656: model: createNewStartupClass
cg@2656: )
cg@2656: )
cg@2656:
cg@2656: )
cg@2656: )
cg@2656: (FramedBoxSpec
cg@2725: label: 'Existing Startup Classes'
cg@2656: name: 'FramedBox4'
cg@2725: layout: (LayoutFrame 0 0.0 72 0 4 1.0 -30 1)
cg@2656: labelPosition: topLeft
cg@2656: translateLabel: true
cg@2656: component:
cg@2656: (SpecCollection
cg@2656: collection: (
cg@2656: (VariableHorizontalPanelSpec
cg@2656: name: 'VariableHorizontalPanel2'
cg@2671: layout: (LayoutFrame 0 0 4 0 0 1 -26 1)
cg@2656: component:
cg@2656: (SpecCollection
cg@2656: collection: (
cg@2656: (SequenceViewSpec
cg@2656: name: 'List2'
cg@2656: model: selectedStartupClassIndexHolder
cg@2656: hasHorizontalScrollBar: true
cg@2656: hasVerticalScrollBar: true
cg@2656: useIndex: true
cg@2656: sequenceList: listOfStartupClassesInProject
cg@2656: )
cg@2656: (TextEditorSpec
cg@2656: name: 'TextEditor2'
cg@2656: model: selectedStartupClassesComment
cg@2656: hasHorizontalScrollBar: true
cg@2656: hasVerticalScrollBar: true
cg@2656: isReadOnly: true
cg@2656: hasKeyboardFocusInitially: false
cg@2656: viewClassName: 'TextView'
cg@2656: )
cg@2656: )
cg@2656:
cg@2656: )
cg@2656: handles: (Any 0.34560327198364 1.0)
cg@2656: )
cg@2671: (CheckBoxSpec
cg@2671: label: 'Hide other Startup Classes'
cg@2671: name: 'CheckBox1'
cg@2671: layout: (LayoutFrame -1 0 -20 1 0 1 2 1)
cg@2671: model: hideOtherStartupClasses
cg@2671: translateLabel: true
cg@2671: )
cg@2656: )
cg@2656:
cg@2656: )
cg@2656: )
cg@2656: (HorizontalPanelViewSpec
cg@2656: name: 'HorizontalPanel1'
cg@2656: layout: (LayoutFrame 0 0 -30 1 0 1 0 1)
cg@2656: horizontalLayout: leftSpace
cg@2656: verticalLayout: center
cg@2656: horizontalSpace: 3
cg@2656: verticalSpace: 3
cg@2656: component:
cg@2656: (SpecCollection
cg@2656: collection: (
cg@2656: (ActionButtonSpec
cg@2656: label: 'Browse Selected StartupClass'
cg@2656: name: 'Button3'
cg@2656: translateLabel: true
cg@2656: model: doBrowseStartupClass
cg@2659: enableChannel: hasStartupClassSelectedHolder
cg@2656: extent: (Point 180 22)
cg@2656: )
cg@2656: )
cg@2656:
cg@2656: )
cg@2656: )
cg@2656: )
cg@2656:
cg@2656: )
cg@2656: )
cg@2656: !
cg@2656:
cg@2656: page5_specifyIncludedClasses
cg@2656: "This resource specification was automatically generated
cg@2656: by the UIPainter of ST/X."
cg@2656:
cg@2656: "Do not manually edit this!! If it is corrupted,
cg@2656: the UIPainter may not be able to read the specification."
cg@2656:
cg@2656: "
cg@2656: UIPainter new openOnClass:Tools::ProjectBuilderAssistantApplication andSelector:#page5_specifyIncludedClasses
cg@2656: Tools::ProjectBuilderAssistantApplication new openInterface:#page5_specifyIncludedClasses
cg@2656: "
cg@2656:
cg@2656:
cg@2656:
cg@2656: ^
cg@2656: #(FullSpec
cg@2656: name: #'page5_specifyIncludedClasses'
cg@2636: window:
cg@2636: (WindowSpec
cg@2636: label: 'Project Selection'
cg@2636: name: 'Project Selection'
cg@2636: min: (Point 0 0)
cg@2636: bounds: (Rectangle 0 0 521 400)
cg@2636: )
cg@2636: component:
cg@2636: (SpecCollection
cg@2636: collection: (
cg@2636: (FramedBoxSpec
cg@2636: label: 'Project Contents'
cg@2636: name: 'FramedBox3'
cg@2648: layout: (LayoutFrame 0 0.0 5 0 4 1.0 -30 1)
cg@2636: labelPosition: topLeft
cg@2636: translateLabel: true
cg@2636: component:
cg@2636: (SpecCollection
cg@2636: collection: (
cg@2636: (SequenceViewSpec
cg@2636: name: 'List1'
cg@2636: layout: (LayoutFrame 0 0 0 0 0 1 0 1)
cg@2636: initiallyDisabled: true
cg@2636: hasHorizontalScrollBar: true
cg@2636: hasVerticalScrollBar: true
cg@2636: useIndex: false
cg@2636: sequenceList: listOfClassesInProject
cg@2636: )
cg@2636: )
cg@2636:
cg@2636: )
cg@2636: )
cg@2648: (HorizontalPanelViewSpec
cg@2648: name: 'HorizontalPanel1'
cg@2648: layout: (LayoutFrame 0 0 -30 1 0 1 0 1)
cg@2648: horizontalLayout: center
cg@2648: verticalLayout: center
cg@2648: horizontalSpace: 3
cg@2648: verticalSpace: 3
cg@2648: component:
cg@2648: (SpecCollection
cg@2648: collection: (
cg@2648: (ActionButtonSpec
cg@2648: label: 'Browse Project Definition'
cg@2648: name: 'Button3'
cg@2648: translateLabel: true
cg@2659: model: doBrowseProjectDefinitionClass
cg@2648: extent: (Point 180 22)
cg@2648: )
cg@2648: (ActionButtonSpec
cg@2648: label: 'Update Contents (Scan)'
cg@2648: name: 'Button4'
cg@2648: translateLabel: true
cg@2648: model: doGenerateProjectContentsDefinition
cg@2648: extent: (Point 180 22)
cg@2648: )
cg@2648: )
cg@2648:
cg@2648: )
cg@2636: )
cg@2636: )
cg@2636:
cg@2636: )
cg@2636: )
cg@2636: !
cg@2636:
cg@2872: page5b_specifyPrerequisitePackages
cg@2872: "This resource specification was automatically generated
cg@2872: by the UIPainter of ST/X."
cg@2872:
cg@2872: "Do not manually edit this!! If it is corrupted,
cg@2872: the UIPainter may not be able to read the specification."
cg@2872:
cg@2872: "
cg@2872: UIPainter new openOnClass:Tools::ProjectBuilderAssistantApplication andSelector:#page5b_specifyPrerequisitePackages
cg@2872: Tools::ProjectBuilderAssistantApplication new openInterface:#page5b_specifyPrerequisitePackages
cg@2872: "
cg@2872:
cg@2872:
cg@2872:
cg@2872: ^
cg@2872: #(FullSpec
cg@2872: name: #'page5b_specifyPrerequisitePackages'
cg@2872: window:
cg@2872: (WindowSpec
cg@2872: label: 'Project Selection'
cg@2872: name: 'Project Selection'
cg@2872: min: (Point 0 0)
cg@2872: bounds: (Rectangle 0 0 521 400)
cg@2872: )
cg@2872: component:
cg@2872: (SpecCollection
cg@2872: collection: (
cg@2872: (FramedBoxSpec
cg@2872: label: 'Prerequisite Packages'
cg@2872: name: 'FramedBox3'
cg@2872: layout: (LayoutFrame 0 0.0 5 0 4 1.0 -30 1)
cg@2872: labelPosition: topLeft
cg@2872: translateLabel: true
cg@2872: component:
cg@2872: (SpecCollection
cg@2872: collection: (
cg@2872: (SequenceViewSpec
cg@2872: name: 'List1'
cg@2872: layout: (LayoutFrame 0 0 0 0 0 1 0 1)
cg@2872: initiallyDisabled: true
cg@2872: hasHorizontalScrollBar: true
cg@2872: hasVerticalScrollBar: true
cg@2872: useIndex: false
cg@2872: sequenceList: listOfPrerequisitesInProject
cg@2872: )
cg@2872: )
cg@2872:
cg@2872: )
cg@2872: )
cg@2872: (HorizontalPanelViewSpec
cg@2872: name: 'HorizontalPanel1'
cg@2872: layout: (LayoutFrame 0 0 -30 1 0 1 0 1)
cg@2872: horizontalLayout: center
cg@2872: verticalLayout: center
cg@2872: horizontalSpace: 3
cg@2872: verticalSpace: 3
cg@2872: component:
cg@2872: (SpecCollection
cg@2872: collection: (
cg@2872: (ActionButtonSpec
cg@2872: label: 'Browse Project Definition'
cg@2872: name: 'Button3'
cg@2872: translateLabel: true
cg@2872: model: doBrowseProjectDefinitionClass
cg@2872: extent: (Point 180 22)
cg@2872: )
cg@2872: (ActionButtonSpec
cg@2872: label: 'Update Prerequisites (Scan)'
cg@2872: name: 'Button4'
cg@2872: translateLabel: true
cg@2872: model: doGenerateProjectPrerequisitesDefinition
cg@2872: extent: (Point 180 22)
cg@2872: )
cg@2872: )
cg@2872:
cg@2872: )
cg@2872: )
cg@2872: )
cg@2872:
cg@2872: )
cg@2872: )
cg@2872:
cg@2872: "Modified: / 19-01-2012 / 15:45:14 / cg"
cg@2872: !
cg@2872:
cg@2724: page6a_specifyProjectAttributes
cg@2636: "This resource specification was automatically generated
cg@2636: by the UIPainter of ST/X."
cg@2636:
cg@2636: "Do not manually edit this!! If it is corrupted,
cg@2636: the UIPainter may not be able to read the specification."
cg@2636:
cg@2636: "
cg@2724: UIPainter new openOnClass:Tools::ProjectBuilderAssistantApplication andSelector:#page6a_specifyProjectAttributes
cg@2724: Tools::ProjectBuilderAssistantApplication new openInterface:#page6a_specifyProjectAttributes
cg@2636: "
cg@2636:
cg@2636:
cg@2636:
cg@2636: ^
cg@2636: #(FullSpec
cg@2724: name: #'page6a_specifyProjectAttributes'
cg@2636: window:
cg@2636: (WindowSpec
cg@2636: label: 'Project Selection'
cg@2636: name: 'Project Selection'
cg@2636: min: (Point 0 0)
cg@2681: bounds: (Rectangle 0 0 521 239)
cg@2636: )
cg@2636: component:
cg@2636: (SpecCollection
cg@2636: collection: (
cg@2636: (FramedBoxSpec
cg@2724: label: 'Product Information'
cg@2724: name: 'FramedBox3'
cg@2724: layout: (LayoutFrame 0 0.0 5 0 4 1.0 101 0)
cg@2724: labelPosition: topLeft
cg@2724: translateLabel: true
cg@2724: component:
cg@2724: (SpecCollection
cg@2724: collection: (
cg@2724: (LabelSpec
cg@2724: label: 'Product Name:'
cg@2724: name: 'Label1'
cg@2724: layout: (LayoutFrame 0 0 10 0 148 0 32 0)
cg@2724: translateLabel: true
cg@2724: adjust: right
cg@2724: )
cg@2724: (InputFieldSpec
cg@2724: name: 'EntryField4'
cg@2724: layout: (LayoutFrame 150 0.0 10 0 0 1.0 32 0)
cg@2724: model: productNameHolder
cg@2724: acceptOnLostFocus: true
cg@2724: acceptOnPointerLeave: true
cg@2724: viewClassName: ''
cg@2724: )
cg@2724: (LabelSpec
cg@2724: label: 'Company Name:'
cg@2724: name: 'Label2'
cg@2724: layout: (LayoutFrame 0 0 39 0 148 0 61 0)
cg@2724: translateLabel: true
cg@2724: adjust: right
cg@2724: )
cg@2724: (InputFieldSpec
cg@2724: name: 'EntryField3'
cg@2724: layout: (LayoutFrame 150 0.0 39 0 0 1.0 61 0)
cg@2724: model: companyNameHolder
cg@2724: acceptOnLostFocus: true
cg@2724: acceptOnPointerLeave: true
cg@2724: viewClassName: ''
cg@2724: )
cg@2724: )
cg@2724:
cg@2724: )
cg@2724: )
cg@2724: )
cg@2724:
cg@2724: )
cg@2724: )
cg@2724: !
cg@2724:
cg@2724: page6b_specifyBuildDirectorySpec
cg@2724: "This resource specification was automatically generated
cg@2724: by the UIPainter of ST/X."
cg@2724:
cg@2724: "Do not manually edit this!! If it is corrupted,
cg@2724: the UIPainter may not be able to read the specification."
cg@2724:
cg@2724: "
cg@2724: UIPainter new openOnClass:Tools::ProjectBuilderAssistantApplication andSelector:#page6b_specifyBuildDirectorySpec
cg@2724: Tools::ProjectBuilderAssistantApplication new openInterface:#page6b_specifyBuildDirectorySpec
cg@2724: "
cg@2724:
cg@2724:
cg@2724:
cg@2724: ^
cg@2724: #(FullSpec
cg@2724: name: #'page6b_specifyBuildDirectorySpec'
cg@2724: window:
cg@2724: (WindowSpec
cg@2724: label: 'Project Selection'
cg@2724: name: 'Project Selection'
cg@2724: min: (Point 0 0)
cg@2724: bounds: (Rectangle 0 0 521 361)
cg@2724: )
cg@2724: component:
cg@2724: (SpecCollection
cg@2724: collection: (
cg@2724: (FramedBoxSpec
cg@2636: label: 'Build Directory'
cg@2636: name: 'FramedBox3'
cg@2636: layout: (LayoutFrame 0 0.0 5 0 4 1.0 79 0)
cg@2636: labelPosition: topLeft
cg@2636: translateLabel: true
cg@2636: component:
cg@2636: (SpecCollection
cg@2636: collection: (
cg@2636: (FilenameInputFieldSpec
cg@2636: name: 'FilenameEntryField1'
cg@2636: layout: (LayoutFrame 0 0.0 10 0 0 1.0 32 0)
cg@2636: model: buildDirectoryHolder
cg@2636: acceptOnPointerLeave: true
cg@2636: viewClassName: FilenameWidgetWithHistory
cg@2636: )
cg@2636: )
cg@2636:
cg@2636: )
cg@2636: )
cg@2681: (FramedBoxSpec
cg@2681: label: 'Compiler / Toolchain'
cg@2681: name: 'FramedBox4'
cg@2681: layout: (LayoutFrame 0 0.0 81 0 4 1.0 155 0)
cg@2681: labelPosition: topLeft
cg@2681: translateLabel: true
cg@2681: component:
cg@2681: (SpecCollection
cg@2681: collection: (
cg@2681: (ComboListSpec
cg@2681: name: 'ComboList1'
cg@2681: layout: (LayoutFrame 0 0 10 0 137 0 32 0)
cg@2681: model: usedCompilerHolder
cg@2681: comboList: listOfPossibleCompilers
cg@2681: useIndex: false
cg@2681: )
cg@2681: )
cg@2681:
cg@2681: )
cg@2681: )
cg@2724: (LabelSpec
cg@2724: label: 'Compiler Warn-Label'
cg@2724: name: 'Label1'
cg@2724: layout: (LayoutFrame 2 0.0 158 0 -2 1.0 303 0)
cg@2724: level: -1
cg@2724: visibilityChannel: compilerWarnMessageVisibleHolder
cg@2724: backgroundColor: (Color 100.0 49.999237048905 49.999237048905)
cg@2724: translateLabel: true
cg@2724: labelChannel: compilerWarnMessageHolder
cg@2724: adjust: left
cg@2724: )
cg@2636: )
cg@2636:
cg@2636: )
cg@2636: )
cg@2636: !
cg@2636:
cg@2656: page7_buildSpec
cg@2636: "This resource specification was automatically generated
cg@2636: by the UIPainter of ST/X."
cg@2636:
cg@2636: "Do not manually edit this!! If it is corrupted,
cg@2636: the UIPainter may not be able to read the specification."
cg@2636:
cg@2636: "
cg@2656: UIPainter new openOnClass:Tools::ProjectBuilderAssistantApplication andSelector:#page7_buildSpec
cg@2656: Tools::ProjectBuilderAssistantApplication new openInterface:#page7_buildSpec
cg@2636: "
cg@2636:
cg@2636:
cg@2636:
cg@2636: ^
cg@2636: #(FullSpec
cg@2656: name: #'page7_buildSpec'
cg@2636: window:
cg@2636: (WindowSpec
cg@2636: label: 'Project Selection'
cg@2636: name: 'Project Selection'
cg@2636: min: (Point 0 0)
cg@2636: bounds: (Rectangle 0 0 521 472)
cg@2636: )
cg@2636: component:
cg@2636: (SpecCollection
cg@2636: collection: (
cg@2636: (FramedBoxSpec
cg@2636: label: 'Make Output'
cg@2636: name: 'FramedBox3'
cg@2648: layout: (LayoutFrame 0 0.0 5 0 4 1.0 -30 1)
cg@2636: labelPosition: topLeft
cg@2636: translateLabel: true
cg@2636: component:
cg@2636: (SpecCollection
cg@2636: collection: (
cg@2636: (TextEditorSpec
cg@2646: name: 'MakeOutputWindow'
cg@2636: layout: (LayoutFrame 0 0 0 0 0 1 0 1)
cg@2636: model: makeOutputHolder
cg@2636: hasHorizontalScrollBar: true
cg@2636: hasVerticalScrollBar: true
cg@2636: hasKeyboardFocusInitially: false
cg@2636: viewClassName: 'TextCollector'
cg@2646: postBuildCallback: postBuildMakeOutputWindow:
cg@2636: )
cg@2636: )
cg@2636:
cg@2636: )
cg@2636: )
cg@2648: (HorizontalPanelViewSpec
cg@2648: name: 'HorizontalPanel1'
cg@2648: layout: (LayoutFrame 0 0 -30 1 0 1 0 1)
cg@2648: horizontalLayout: leftSpace
cg@2648: verticalLayout: center
cg@2648: horizontalSpace: 3
cg@2648: verticalSpace: 3
cg@2648: component:
cg@2648: (SpecCollection
cg@2648: collection: (
cg@2648: (ActionButtonSpec
cg@2674: label: 'Make All'
cg@2648: name: 'Button3'
cg@2648: translateLabel: true
cg@2674: model: doStartMakeAll
cg@2648: enableChannel: startMakeButtonEnabled
cg@2648: extent: (Point 107 22)
cg@2648: )
cg@2648: (ActionButtonSpec
cg@2674: label: 'Make EXE only'
cg@2674: name: 'Button5'
cg@2674: translateLabel: true
cg@2674: model: doStartMakeExe
cg@2674: enableChannel: startMakeButtonEnabled
cg@2674: extent: (Point 107 22)
cg@2674: )
cg@2674: (ViewSpec
cg@2674: name: 'Box1'
cg@2674: extent: (Point 20 10)
cg@2674: )
cg@2674: (ActionButtonSpec
cg@2648: label: 'Stop Make'
cg@2648: name: 'Button4'
cg@2648: visibilityChannel: stopMakeButtonVisible
cg@2648: translateLabel: true
cg@2648: model: doStopMake
cg@2648: extent: (Point 107 22)
cg@2648: )
cg@2648: )
cg@2648:
cg@2648: )
cg@2636: )
cg@2636: )
cg@2636:
cg@2636: )
cg@2636: )
cg@2636: !
cg@2636:
cg@2676: page8_deploySpec
cg@2676: "This resource specification was automatically generated
cg@2676: by the UIPainter of ST/X."
cg@2676:
cg@2676: "Do not manually edit this!! If it is corrupted,
cg@2676: the UIPainter may not be able to read the specification."
cg@2676:
cg@2676: "
cg@2676: UIPainter new openOnClass:Tools::ProjectBuilderAssistantApplication andSelector:#page8_deploySpec
cg@2676: Tools::ProjectBuilderAssistantApplication new openInterface:#page8_deploySpec
cg@2676: "
cg@2676:
cg@2676:
cg@2676:
cg@2676: ^
cg@2676: #(FullSpec
cg@2676: name: #'page8_deploySpec'
cg@2676: window:
cg@2676: (WindowSpec
cg@2676: label: 'Project Selection'
cg@2676: name: 'Project Selection'
cg@2676: min: (Point 0 0)
cg@2676: bounds: (Rectangle 0 0 521 472)
cg@2676: )
cg@2676: component:
cg@2676: (SpecCollection
cg@2676: collection: (
cg@2676: (FramedBoxSpec
cg@2676: label: 'Files for Deployment'
cg@2676: name: 'FramedBox3'
cg@2676: layout: (LayoutFrame 0 0.0 5 0 4 1.0 0 1)
cg@2676: labelPosition: topLeft
cg@2676: translateLabel: true
cg@2676: component:
cg@2676: (SpecCollection
cg@2676: collection: (
cg@2676: (SubCanvasSpec
cg@2676: name: 'SubCanvas1'
cg@2676: layout: (LayoutFrame 0 0 0 0 0 1 -30 1)
cg@2676: hasHorizontalScrollBar: false
cg@2676: hasVerticalScrollBar: false
cg@2676: clientHolder: fileBrowserInstance
cg@2676: createNewApplication: true
cg@2676: createNewBuilder: true
cg@2675: )
cg@2676: (HorizontalPanelViewSpec
cg@2676: name: 'HorizontalPanel1'
cg@2676: layout: (LayoutFrame 0 0 -30 1 0 1 0 1)
cg@2679: horizontalLayout: centerMax
cg@2676: verticalLayout: center
cg@2676: horizontalSpace: 3
cg@2676: verticalSpace: 3
cg@2676: component:
cg@2676: (SpecCollection
cg@2676: collection: (
cg@2676: (ActionButtonSpec
cg@2676: label: 'Open Windows Explorer'
cg@2676: name: 'Button1'
cg@2720: visibilityChannel: isWindowsOS
cg@2676: translateLabel: true
cg@2649: resizeForLabel: true
cg@2649: model: doOpenExplorer
cg@2649: extent: (Point 172 22)
cg@2649: )
cg@2679: (ActionButtonSpec
cg@2679: label: 'Open Console'
cg@2679: name: 'Button2'
cg@2724: visibilityChannel: isUnixOS
cg@2679: translateLabel: true
cg@2679: resizeForLabel: true
cg@2679: model: doOpenConsoleTerminal
cg@2679: extent: (Point 172 22)
cg@2679: )
cg@2649: )
cg@2649:
cg@2649: )
cg@2649: )
cg@2636: )
cg@2636:
cg@2636: )
cg@2636: )
cg@2636: )
cg@2636:
cg@2636: )
cg@2636: )
cg@2676: ! !
cg@2676:
fm@2697: !ProjectBuilderAssistantApplication class methodsFor:'misc specs'!
fm@2697:
fm@2697: newProjectsNameListSpec
fm@2697: "This resource specification was automatically generated
fm@2697: by the UIPainter of ST/X."
fm@2697:
fm@2697: "Do not manually edit this!! If it is corrupted,
fm@2697: the UIPainter may not be able to read the specification."
fm@2697:
fm@2697: "
fm@2697: UIPainter new openOnClass:Tools::ProjectBuilderAssistantApplication andSelector:#newProjectsNameListSpec
fm@2697: Tools::ProjectBuilderAssistantApplication new openInterface:#newProjectsNameListSpec
fm@2697: "
fm@2697:
fm@2697:
fm@2697:
fm@2697: ^
fm@2697: #(FullSpec
fm@2697: name: newProjectsNameListSpec
fm@2697: window:
fm@2697: (WindowSpec
fm@2697: label: 'NewApplication'
fm@2697: name: 'NewApplication'
fm@2697: min: (Point 0 0)
fm@2697: bounds: (Rectangle 0 0 131 207)
fm@2697: )
fm@2697: component:
fm@2697: (SpecCollection
fm@2697: collection: (
fm@2697: (SequenceViewSpec
fm@2697: name: 'ReferencePoint2'
fm@2697: layout: (LayoutFrame 0 0 0 0 0 1 0 1)
fm@2705: activeHelpKey: listOfNewProjectsName
fm@2697: model: newProjectsName
fm@2697: hasHorizontalScrollBar: true
fm@2697: hasVerticalScrollBar: true
fm@2697: miniScrollerHorizontal: true
fm@2697: miniScrollerVertical: false
fm@2697: useIndex: false
fm@2697: sequenceList: listOfNewProjectsName
fm@2705: doubleClickChannel: newProjectsNameListDoubleClickChannel
fm@2697: )
fm@2697: )
fm@2697:
fm@2697: )
fm@2697: )
fm@2697: ! !
fm@2697:
cg@2897: !ProjectBuilderAssistantApplication class methodsFor:'startup'!
cg@2897:
cg@2897: openOn:aProjectDefinitionClass
cg@2897: ^ self new openOn:aProjectDefinitionClass
cg@2897:
cg@2897: "Created: / 20-07-2012 / 12:33:25 / cg"
cg@2897: !
cg@2897:
cg@2897: openOnPackage:aPackageId
cg@2897: ^ self new openOnPackage:aPackageId
cg@2897:
cg@2897: "Created: / 20-07-2012 / 13:22:50 / cg"
cg@2897: ! !
cg@2897:
cg@2676: !ProjectBuilderAssistantApplication methodsFor:'actions'!
cg@2676:
cg@2676: buildDirectoryChanged
cg@2676: self updateButtonEnableState.
cg@2636: !
cg@2636:
cg@2676: createNewApplication
cg@2676:
cg@2676:
cg@2676: |newAppName newAppClass|
cg@2636:
cg@2676: newAppName := self newApplicationsName value.
cg@2676: newAppName isEmptyOrNil ifTrue:[
cg@2676: Dialog warn:'Please enter the name of the Application-Class first.'.
cg@2676: ^ self
cg@2676: ].
cg@2676:
cg@2676: self withWaitCursorDo:[
cg@2676: Class packageQuerySignal answer:(selectedProjectDefinition package)
cg@2676: do:[
cg@2659: newAppClass := ApplicationModel
cg@2659: subclass:newAppName asSymbol
cg@2659: instanceVariableNames:''
cg@2659: classVariableNames:''
cg@2659: poolDictionaries:''
cg@2659: category:'Applications'.
cg@2832: SmalltalkCodeGeneratorTool createApplicationCodeFor:newAppClass.
cg@2659: ].
cg@2724: self updateListOfApplicationsInProject.
cg@2724: self selectedApplicationIndexHolder value:(listOfApplicationsInProject value indexOf:newAppClass).
cg@2636: ].
cg@2832:
cg@2832: "Modified: / 31-01-2011 / 18:29:50 / cg"
cg@2636: !
cg@2636:
cg@2676: createNewProject
cg@2676:
cg@2676:
cg@2676: |newProjectID projectDefinitionType projectDefinitionClass projectClasses|
cg@2676:
cg@2676: newProjectID := self newProjectsName value.
cg@2676: newProjectID isEmptyOrNil ifTrue:[
cg@2686: Dialog warn:(resources string:'Please enter a packageID first.').
cg@2676: ^ self
cg@2676: ].
cg@2676: newProjectID asPackageId isModuleId ifTrue:[
cg@2686: Dialog warn:(resources stringWithCRs:
cg@2686: 'Please enter a corrent packageID.
cg@2686:
cg@2686: All packages must be named like "%1:%2"
cg@2686: (%2 can be a path like "dir/dir/...").' with:(resources string:'module')allItalic
cg@2686: with:(resources string:'directory')allItalic).
cg@2676: ^ self
cg@2676: ].
cg@2676:
cg@2709: self withWaitCursorDo:[
cg@2709: projectDefinitionType := ProjectDefinition perform:(self projectTypeHolder value).
cg@2676:
cg@2709: projectDefinitionClass := ProjectDefinition
cg@2709: definitionClassForPackage:newProjectID
cg@2709: projectType: projectDefinitionType
cg@2709: createIfAbsent:true.
cg@2676:
cg@2709: projectDefinitionClass compileDescriptionMethods.
cg@2709: self updateListOfMatchingProjects.
cg@2709: self updateListOfNewProjectsName.
cg@2676:
cg@2709: self selectedProjectIndexHolder value:( self listOfMatchingProjects value indexOf:projectDefinitionClass).
cg@2676:
cg@2851: projectClasses := projectDefinitionClass allClasses.
cg@2676:
cg@2676: "/ projectDefinitionClass isGUIApplication ifTrue:[
cg@2676: "/ "/ see if it has an AppModel class
cg@2659: "/ (projectClasses contains:[:cls | cls isVisualStartable]) ifFalse:[
cg@2659: "/ (Dialog confirm:'Create an Application Class ?') ifTrue:[
cg@2659: "/ self halt.
cg@2659: "/ ].
cg@2659: "/ ].
cg@2659: "/ ].
cg@2636:
cg@2636: "/ projectDefinitionClass isLibrary ifFalse:[
cg@2636: "/ "/ see if it has a Startup class
cg@2636: "/ (projectClasses contains:[:cls | cls isStartable]) ifFalse:[
cg@2636: "/ ].
cg@2636: "/ ].
cg@2709:
cg@2709: ].
cg@2851:
cg@2851: "Modified: / 06-08-2011 / 15:48:01 / cg"
cg@2636: !
cg@2636:
cg@2676: createNewStartupClass
cg@2676:
cg@2676:
fm@2696: |newClassName newStartupClass startupApplication|
cg@2676:
cg@2676: newClassName := self newStartupClassName value.
cg@2676: newClassName isEmptyOrNil ifTrue:[
cg@2676: Dialog warn:'Please enter the name of the Startup-Class first.'.
cg@2676: ^ self
cg@2676: ].
cg@2676:
cg@2719: self withWaitCursorDo:[
cg@2719: |pkg|
cg@2719:
cg@2719: pkg := selectedProjectDefinition notNil
cg@2719: ifTrue:[selectedProjectDefinition package]
cg@2719: ifFalse:[newProjectsName value].
cg@2719: Class packageQuerySignal answer:pkg
cg@2676: do:[
cg@2676: newStartupClass := StandaloneStartup
cg@2659: subclass:newClassName asSymbol
cg@2659: instanceVariableNames:''
cg@2659: classVariableNames:''
cg@2659: poolDictionaries:''
fm@2696: category:'Applications'.
fm@2696:
fm@2696: self projectTypeIsGuiApplication ifTrue: [startupApplication := selectedApplication].
cg@2832: SmalltalkCodeGeneratorTool createStartupCodeFor:newStartupClass forStartOf:startupApplication.
cg@2659: ].
cg@2724: self updateListOfStartupClassesInProject.
cg@2724: self selectedStartupClassIndexHolder value:(listOfStartupClassesInProject value indexOf:newStartupClass).
cg@2659: ].
cg@2832:
cg@2832: "Modified: / 31-01-2011 / 18:29:47 / cg"
cg@2659: !
cg@2659:
cg@2676: doAddClassToProject
cg@2676:
cg@2636:
cg@2636: Transcript showCR:self class name, ': action for doAddClassToProject ...'.
cg@2636: self halt.
cg@2636: !
cg@2636:
cg@2676: doBrowseApplication
cg@2676:
cg@2636:
cg@2636: |appClass|
cg@2636:
cg@2659: self hasApplicationSelected ifTrue:[
cg@2659: appClass := self listOfApplicationsInProject value at:(self selectedApplicationIndexHolder value).
cg@2659: UserPreferences systemBrowserClass
cg@2668: openInClass:appClass class selector:#windowSpec.
cg@2659: ].
cg@2636: !
cg@2636:
cg@2676: doBrowseProject
cg@2676:
cg@2676:
cg@2676: UserPreferences systemBrowserClass openOnPackage:selectedProjectDefinition package.
cg@2636: !
cg@2636:
cg@2676: doBrowseProjectDefinitionClass
cg@2676:
cg@2676:
cg@2676: |defClass|
cg@2676:
cg@2676: self hasProjectSelected ifTrue:[
cg@2676: defClass := self selectedProjectDefinition.
cg@2676: UserPreferences systemBrowserClass
cg@2659: openInClass:defClass class selector:#classNamesAndAttributes.
cg@2659: ].
cg@2659: !
cg@2659:
cg@2676: doBrowseStartupClass
cg@2676:
cg@2676:
cg@2676: |startupClass|
cg@2676:
cg@2676: self hasStartupClassSelected ifTrue:[
cg@2676: startupClass := self listOfStartupClassesInProject value at:(self selectedStartupClassIndexHolder value).
cg@2676: UserPreferences systemBrowserClass
cg@2676: openInClass:startupClass class selector:#main:.
cg@2659: ].
cg@2659: !
cg@2659:
cg@2676: doGenerateProjectContentsDefinition
cg@2676: self generatePackageContentsMethods
cg@2676: !
cg@2676:
cg@2872: doGenerateProjectPrerequisitesDefinition
cg@2872: self generatePackageContentsMethods
cg@2872:
cg@2872: "Created: / 19-01-2012 / 15:44:23 / cg"
cg@2872: !
cg@2872:
cg@2676: doLaunchApplication
cg@2676:
cg@2676:
cg@2676: |appClass|
cg@2676:
cg@2676: self hasApplicationSelected ifTrue:[
cg@2676: appClass := self listOfApplicationsInProject value at:(self selectedApplicationIndexHolder value).
cg@2676: appClass open.
cg@2659: ].
cg@2659: !
cg@2659:
cg@2679: doOpenConsoleTerminal
cg@2679: "/ OperatingSystem
cg@2679: "/ executeCommand:'cmd.exe'
cg@2679: "/ inDirectory:(projectBuilder packageBuildDirectory)
cg@2724: OperatingSystem isUNIXlike ifTrue:[
cg@2724: VT100TerminalView openShellIn:(projectBuilder packageBuildDirectory)
cg@2724: ] ifFalse:[
cg@2724: OperatingSystem
cg@2724: executeCommand:'c:\windows\System32\cmd.exe'
cg@2724: inDirectory:(projectBuilder packageBuildDirectory)
cg@2724: ]
cg@2679: !
cg@2679:
cg@2676: doOpenExplorer
cg@2676: OperatingSystem
cg@2756: openApplicationForDocument:(projectBuilder packageBuildDirectory)
cg@2756: operation:#explore.
cg@2676: !
cg@2676:
cg@2674: doStartMakeAll
cg@2636:
cg@2636:
cg@2636: self stopMakeButtonVisible value:true.
cg@2636: self startMakeButtonEnabled value:false.
cg@2636:
cg@2724: self infoHolder value:'Building (make) - please wait...'.
cg@2646: makeOutputWindow clear.
cg@2646:
cg@2636: makeProcess :=
cg@2636: [
cg@2636: [
cg@2674: self runBuildProcess:'all'
cg@2674: ] ensure:[
cg@2674: self stopMakeButtonVisible value:false.
cg@2674: self startMakeButtonEnabled value:true.
cg@2674: makeProcess := nil.
cg@2674: self updateButtonEnableState.
cg@2724: self infoHolder value:''.
cg@2674: ].
cg@2674: ] newProcess.
cg@2674:
cg@2674: makeProcess priority:4.
cg@2674: makeProcess priorityRange:(4 to:8).
cg@2674: makeProcess resume.
cg@2674: !
cg@2674:
cg@2675: doStartMakeExe
cg@2674:
cg@2674:
cg@2674: self stopMakeButtonVisible value:true.
cg@2674: self startMakeButtonEnabled value:false.
cg@2674:
cg@2724: self infoHolder value:'Building (make) - please wait...'.
cg@2674: makeOutputWindow clear.
cg@2674:
cg@2674: makeProcess :=
cg@2674: [
cg@2674: [
cg@2674: self runBuildProcess:'exe'
cg@2636: ] ensure:[
cg@2636: self stopMakeButtonVisible value:false.
cg@2636: self startMakeButtonEnabled value:true.
cg@2646: makeProcess := nil.
cg@2648: self updateButtonEnableState.
cg@2724: self infoHolder value:''.
cg@2636: ].
cg@2636: ] newProcess.
cg@2636:
cg@2636: makeProcess priority:4.
cg@2636: makeProcess priorityRange:(4 to:8).
cg@2636: makeProcess resume.
cg@2636: !
cg@2636:
cg@2676: doStopMake
cg@2676:
cg@2676:
cg@2676: |p|
cg@2646:
cg@2676: (p := makeProcess) notNil ifTrue:[
cg@2676: makeProcess := nil.
cg@2676: p terminate.
cg@2676: p waitUntilTerminated.
cg@2676:
cg@2676: makeOutputWindow endEntry.
cg@2676: makeOutputWindow cr.
cg@2676: makeOutputWindow nextPutLine:('Make Cancelled' colorizeAllWith:Color white on:Color red).
cg@2676: makeOutputWindow endEntry.
cg@2676: ].
cg@2646: !
cg@2646:
cg@2676: projectTypeChanged
cg@2676:
cg@2676:
cg@2676: self updateListOfMatchingProjects
cg@2636: !
cg@2636:
cg@2674: runBuildProcess:what
cg@2636:
cg@2636:
cg@2646: self assert:makeOutputWindow notNil.
cg@2646: self assert:makeOutputWindow model == self makeOutputHolder.
cg@2646:
cg@2646: ActivityNotification handle:[:ex |
cg@2646: ex messageText notNil ifTrue:[
cg@2646: makeOutputWindow endEntry.
cg@2646: makeOutputWindow cr.
cg@2659: makeOutputWindow nextPutLine:(ex messageText colorizeAllWith:Color white on:Color blue).
cg@2646: makeOutputWindow endEntry.
cg@2687: ].
cg@2646: ex proceed.
cg@2646: ] do:[
cg@2646: projectBuilder := ProjectBuilder new.
cg@2646: projectBuilder package:(selectedProjectDefinition package).
cg@2874: projectBuilder usedCompilerForBuild:(usedCompilerHolder value).
cg@2674: what = 'exe' ifTrue:[
cg@2674: projectBuilder makeExeOnly:true
cg@2674: ] ifFalse:[
cg@2674: projectBuilder makeExeOnly:false
cg@2674: ].
cg@2674:
cg@2674: Error handle:[:ex |
cg@2674: makeOutputWindow endEntry.
cg@2674: makeOutputWindow cr.
sr@2682: makeOutputWindow nextPutLine:(ex description colorizeAllWith:Color white on:Color red).
cg@2674: makeOutputWindow endEntry.
sr@2682: ex proceed.
cg@2674: ] do:[
cg@2674: projectBuilder buildWithColorizedOutputTo:makeOutputWindow.
cg@2674: ].
cg@2646: ].
cg@2874:
cg@2874: "Modified: / 22-01-2012 / 10:51:01 / cg"
cg@2636: !
cg@2636:
cg@2676: selectedApplicationChanged
cg@2676: |idx|
cg@2671:
cg@2676: ((idx := self selectedApplicationIndexHolder value) isNil
cg@2676: or:[idx == 0]) ifTrue:[
cg@2676: selectedApplication := nil.
cg@2676: ] ifFalse:[
cg@2676: selectedApplication := self listOfApplicationsInProject value at:idx.
cg@2636: ].
cg@2676: self hasApplicationSelectedHolder value:(selectedApplication notNil).
cg@2659:
cg@2676: "/ selectedApplication notNil ifTrue:[
cg@2676: "/ "/ generate startupClass code
cg@2676: "/ CodeGeneratorTool
cg@2656: "/ compile:(selectedProjectDefinition startupClassName_codeFor:(selectedApplication name))
cg@2656: "/ forClass:selectedProjectDefinition theMetaclass
cg@2656: "/ inCategory:'description - startup'.
cg@2656: "/ ].
cg@2636: self updateApplicationComment.
cg@2636: self updateButtonEnableState.
cg@2636: !
cg@2636:
cg@2676: selectedProjectChanged
fm@2694:
fm@2694: |selectedProjectIndex|
fm@2694:
fm@2694: selectedProjectIndex := self selectedProjectIndexHolder value.
fm@2694: (selectedProjectIndex ? 0) == 0 ifTrue:[
cg@2676: selectedProjectDefinition := nil.
cg@2676: ] ifFalse:[
fm@2694: selectedProjectDefinition := self listOfMatchingProjects value at:(selectedProjectIndex).
cg@2676: ].
cg@2676: self hasProjectSelectedHolder value:(selectedProjectDefinition notNil).
cg@2676:
cg@2676: self updateComment.
cg@2676: self updateListOfApplicationsInProject.
cg@2636: self updateButtonEnableState.
cg@2656: !
cg@2656:
cg@2676: selectedStartupClassChanged
cg@2676: self selectedStartupClassIndexHolder value isNil ifTrue:[
cg@2676: selectedStartupClass := nil.
cg@2676: ] ifFalse:[
cg@2676: selectedStartupClass := self listOfStartupClassesInProject value at:(self selectedStartupClassIndexHolder value).
cg@2656: ].
cg@2659: self hasStartupClassSelectedHolder value:(selectedStartupClass notNil).
cg@2659:
cg@2656: selectedStartupClass notNil ifTrue:[
cg@2656: "/ generate startupClass code
cg@2832: SmalltalkCodeGeneratorTool
cg@2656: compile:(selectedProjectDefinition startupClassName_codeFor:(selectedStartupClass name))
cg@2656: forClass:selectedProjectDefinition theMetaclass
cg@2656: inCategory:'description - startup'.
cg@2656: ].
cg@2656: self updateButtonEnableState.
cg@2832:
cg@2832: "Modified: / 31-01-2011 / 18:29:42 / cg"
cg@2676: ! !
cg@2636:
cg@2676: !ProjectBuilderAssistantApplication methodsFor:'aspects'!
cg@2636:
cg@2676: buildDirectoryHolder
cg@2676:
cg@2636:
cg@2636: |buildDirectory|
cg@2636:
cg@2636: buildDirectoryHolder isNil ifTrue:[
cg@2636: buildDirectoryHolder := nil asValue.
cg@2636: buildDirectoryHolder onChangeSend:#buildDirectoryChanged to:self.
cg@2636: ].
cg@2636: buildDirectoryHolder value isEmptyOrNil ifTrue:[
cg@2686: buildDirectory := ProjectBuilder previousBuildDirectory.
cg@2636: buildDirectory isNil ifTrue:[
cg@2636: buildDirectory := UserPreferences current buildDirectory.
cg@2636: buildDirectory isNil ifTrue:[
cg@2636: buildDirectory := Filename tempDirectory construct:'stx_build'.
cg@2636: ].
cg@2636: ].
cg@2636: buildDirectoryHolder value: buildDirectory.
cg@2636: ].
cg@2636: ^ buildDirectoryHolder.
cg@2636: !
cg@2636:
cg@2724: companyNameHolder
cg@2724:
cg@2724:
cg@2724: companyNameHolder isNil ifTrue:[
cg@2724: companyNameHolder := 'MyCompany' asValue.
cg@2724: ].
cg@2724: ^ companyNameHolder.
cg@2724: !
cg@2724:
cg@2724: compilerWarnMessageHolder
cg@2724:
cg@2724:
cg@2724: compilerWarnMessageHolder isNil ifTrue:[
cg@2724: compilerWarnMessageHolder := '' asValue.
cg@2724: ].
cg@2724: ^ compilerWarnMessageHolder.
cg@2724: !
cg@2724:
cg@2724: compilerWarnMessageVisibleHolder
cg@2724:
cg@2724:
cg@2724: compilerWarnMessageVisibleHolder isNil ifTrue:[
cg@2724: compilerWarnMessageVisibleHolder := false asValue.
cg@2724: ].
cg@2724: ^ compilerWarnMessageVisibleHolder.
cg@2724: !
cg@2724:
cg@2676: hasApplicationSelectedHolder
cg@2676:
cg@2676:
cg@2676: hasApplicationSelectedHolder isNil ifTrue:[
cg@2659: hasApplicationSelectedHolder := nil asValue.
cg@2659: ].
cg@2659: ^ hasApplicationSelectedHolder.
cg@2636: !
cg@2636:
cg@2676: hasProjectSelectedHolder
cg@2676:
cg@2676:
cg@2676: hasProjectSelectedHolder isNil ifTrue:[
cg@2659: hasProjectSelectedHolder := nil asValue.
cg@2659: ].
cg@2659: ^ hasProjectSelectedHolder.
cg@2648: !
cg@2648:
cg@2676: hasStartupClassSelectedHolder
cg@2676:
cg@2676:
cg@2676: hasStartupClassSelectedHolder isNil ifTrue:[
cg@2659: hasStartupClassSelectedHolder := nil asValue.
cg@2659: ].
cg@2659: ^ hasStartupClassSelectedHolder.
cg@2636: !
cg@2636:
cg@2676: hideOtherApplicationClasses
cg@2676:
cg@2676:
cg@2676: hideOtherApplicationClasses isNil ifTrue:[
cg@2671: hideOtherApplicationClasses := true asValue.
cg@2671: hideOtherApplicationClasses onChangeSend:#updateListOfApplicationsInProject to:self.
cg@2671: ].
cg@2671: ^ hideOtherApplicationClasses.
cg@2671: !
cg@2671:
cg@2676: hideOtherStartupClasses
cg@2676:
cg@2676:
cg@2676: hideOtherStartupClasses isNil ifTrue:[
cg@2676: hideOtherStartupClasses := true asValue.
cg@2676: hideOtherStartupClasses onChangeSend:#updateListOfStartupClassesInProject to:self.
cg@2671: ].
cg@2676: ^ hideOtherStartupClasses.
cg@2671: !
cg@2671:
cg@2676: hideSTXProjects
cg@2676:
cg@2676:
cg@2676: hideSTXProjects isNil ifTrue:[
cg@2676: hideSTXProjects := true asValue.
cg@2676: hideSTXProjects onChangeSend:#updateListOfMatchingProjects to:self.
cg@2676: ].
cg@2676: ^ hideSTXProjects.
cg@2676: !
cg@2676:
cg@2676: listOfApplicationsInProject
cg@2676:
cg@2676:
cg@2676: listOfApplicationsInProject isNil ifTrue:[
cg@2636: listOfApplicationsInProject := ValueHolder new.
cg@2636: ].
cg@2636: ^ listOfApplicationsInProject.
cg@2636: !
cg@2636:
cg@2676: listOfClassesInProject
cg@2676:
cg@2676:
cg@2676: listOfClassesInProject isNil ifTrue:[
cg@2636: listOfClassesInProject := ValueHolder new.
cg@2636: ].
cg@2636: ^ listOfClassesInProject.
cg@2636: !
cg@2636:
cg@2686: listOfMatchingPackageIds
cg@2686:
cg@2686:
cg@2686: listOfMatchingPackageIds isNil ifTrue:[
cg@2686: listOfMatchingPackageIds := ValueHolder new.
cg@2686: ].
cg@2686: ^ listOfMatchingPackageIds.
cg@2686: !
cg@2686:
cg@2676: listOfMatchingProjects
cg@2676:
cg@2636:
cg@2636: listOfMatchingProjects isNil ifTrue:[
cg@2636: listOfMatchingProjects := ValueHolder new.
cg@2636: ].
cg@2636: ^ listOfMatchingProjects.
cg@2636: !
cg@2636:
fm@2697: listOfNewProjectsName
fm@2697:
fm@2697:
fm@2697:
fm@2697: listOfNewProjectsName isNil ifTrue:[
fm@2697: listOfNewProjectsName := ValueHolder new.
fm@2697: ].
fm@2697: ^ listOfNewProjectsName.
fm@2697: !
fm@2697:
cg@2681: listOfPossibleCompilers
cg@2874: ^ Tools::ProjectBuilder listOfPossibleCompilers
cg@2874:
cg@2874: "Modified: / 21-01-2012 / 14:05:52 / cg"
cg@2681: !
cg@2681:
cg@2872: listOfPrerequisitesInProject
cg@2872:
cg@2872:
cg@2872: listOfPrerequisitesInProject isNil ifTrue:[
cg@2872: listOfPrerequisitesInProject := ValueHolder new.
cg@2872: ].
cg@2872: ^ listOfPrerequisitesInProject.
cg@2872:
cg@2872: "Created: / 19-01-2012 / 15:39:34 / cg"
cg@2872: !
cg@2872:
cg@2676: listOfStartupClassesInProject
cg@2676:
cg@2676:
cg@2676: listOfStartupClassesInProject isNil ifTrue:[
cg@2676: listOfStartupClassesInProject := ValueHolder new.
cg@2676: ].
cg@2676: ^ listOfStartupClassesInProject.
cg@2676: !
cg@2676:
cg@2676: makeOutputHolder
cg@2676:
cg@2636:
cg@2636: makeOutputHolder isNil ifTrue:[
cg@2646: makeOutputHolder := ValueHolder new.
cg@2636: ].
cg@2636: ^ makeOutputHolder.
cg@2636: !
cg@2636:
cg@2676: newApplicationsName
cg@2676:
cg@2676:
cg@2676: "automatically generated by UIPainter ..."
cg@2676:
cg@2676: "*** the code below creates a default model when invoked."
cg@2676: "*** (which may not be the one you wanted)"
cg@2676: "*** Please change as required and accept it in the browser."
cg@2676: "*** (and replace this comment by something more useful ;-)"
cg@2676:
cg@2676: newApplicationsName isNil ifTrue:[
cg@2676: newApplicationsName := ValueHolder new.
cg@2676: "/ if your app needs to be notified of changes, uncomment one of the lines below:
cg@2636: "/ newApplicationsName addDependent:self.
cg@2636: "/ newApplicationsName onChangeSend:#newApplicationsNameChanged to:self.
cg@2636: ].
cg@2636: ^ newApplicationsName.
cg@2636: !
cg@2636:
cg@2676: newProjectsName
cg@2676:
cg@2676:
cg@2676: newProjectsName isNil ifTrue:[
cg@2636: newProjectsName := nil asValue.
cg@2636: ].
cg@2636: ^ newProjectsName.
cg@2636: !
cg@2636:
fm@2705: newProjectsNameListDoubleClickChannel
fm@2705: "automatically generated by UIPainter ..."
fm@2705:
fm@2705: "*** the code below creates a default model when invoked."
fm@2705: "*** (which may not be the one you wanted)"
fm@2705: "*** Please change as required and accept it in the browser."
fm@2705:
fm@2705: |holder|
fm@2705:
fm@2705: (holder := builder bindingAt:#newProjectsNameListDoubleClickChannel) isNil ifTrue:[
fm@2705: holder := TriggerValue new.
fm@2705: builder aspectAt:#newProjectsNameListDoubleClickChannel put:holder.
fm@2705: holder onChangeEvaluate:[
fm@2705: newProjectsNameListExtendedComboBox notNil ifTrue: [
fm@2705: newProjectsNameListExtendedComboBox closeMenu.
fm@2705: ]
fm@2705: ]
fm@2705: ].
fm@2705: ^ holder.
fm@2705: !
fm@2705:
cg@2676: newStartupClassName
cg@2676:
cg@2676:
cg@2676: newStartupClassName isNil ifTrue:[
cg@2676: newStartupClassName := ValueHolder new.
cg@2676: ].
cg@2676: ^ newStartupClassName.
cg@2659: !
cg@2659:
cg@2724: productNameHolder
cg@2724:
cg@2724:
cg@2724: productNameHolder isNil ifTrue:[
cg@2724: productNameHolder := 'MyProduct' asValue.
cg@2724: ].
cg@2724: ^ productNameHolder.
cg@2724: !
cg@2724:
cg@2676: projectType
cg@2897: ^ self projectTypeHolder value
cg@2897:
cg@2897: "Modified: / 20-07-2012 / 13:28:46 / cg"
cg@2659: !
cg@2659:
cg@2676: projectType:aProjectTypeSymbol
cg@2676: self assert:(ProjectDefinition projectTypes includes:aProjectTypeSymbol).
cg@2659: self projectTypeHolder value:aProjectTypeSymbol
cg@2897:
cg@2897: "Modified: / 20-07-2012 / 13:28:25 / cg"
cg@2659: !
cg@2659:
cg@2676: projectTypeHolder
cg@2676:
cg@2659:
cg@2676: projectTypeHolder isNil ifTrue:[
cg@2676: projectTypeHolder := RadioButtonGroup new.
cg@2897: projectTypeHolder value:ProjectDefinition guiApplicationType.
cg@2659: ].
cg@2659: ^ projectTypeHolder.
cg@2897:
cg@2897: "Modified: / 20-07-2012 / 13:30:16 / cg"
cg@2636: !
cg@2636:
cg@2676: selectedApplicationIndexHolder
cg@2676:
cg@2676:
cg@2676: selectedApplicationIndexHolder isNil ifTrue:[
cg@2636: selectedApplicationIndexHolder := ValueHolder new.
cg@2636: selectedApplicationIndexHolder onChangeSend:#selectedApplicationChanged to:self.
cg@2636: ].
cg@2636: ^ selectedApplicationIndexHolder.
cg@2636: !
cg@2636:
cg@2676: selectedApplicationsComment
cg@2676:
cg@2676:
cg@2676: "automatically generated by UIPainter ..."
cg@2636:
cg@2636: "*** the code below creates a default model when invoked."
cg@2636: "*** (which may not be the one you wanted)"
cg@2636: "*** Please change as required and accept it in the browser."
cg@2636: "*** (and replace this comment by something more useful ;-)"
cg@2636:
cg@2636: selectedApplicationsComment isNil ifTrue:[
cg@2636: selectedApplicationsComment := '' asValue.
cg@2636: "/ if your app needs to be notified of changes, uncomment one of the lines below:
cg@2636: "/ selectedApplicationsComment addDependent:self.
cg@2636: "/ selectedApplicationsComment onChangeSend:#selectedApplicationsCommentChanged to:self.
cg@2636: ].
cg@2636: ^ selectedApplicationsComment.
cg@2636: !
cg@2636:
cg@2676: selectedProjectDefinition
cg@2676:
cg@2636:
cg@2676: ^ selectedProjectDefinition.
cg@2636: !
cg@2636:
cg@2676: selectedProjectIndexHolder
cg@2676:
cg@2636:
cg@2636: selectedProjectIndexHolder isNil ifTrue:[
cg@2636: selectedProjectIndexHolder := ValueHolder new.
cg@2636: selectedProjectIndexHolder onChangeSend:#selectedProjectChanged to:self.
cg@2636: ].
cg@2636: ^ selectedProjectIndexHolder.
cg@2676: !
cg@2676:
cg@2676: selectedProjectsComment
cg@2676:
cg@2676:
cg@2676: selectedProjectsComment isNil ifTrue:[
cg@2676: selectedProjectsComment := '' asValue.
cg@2676: ].
cg@2676: ^ selectedProjectsComment.
cg@2676: !
cg@2676:
cg@2676: selectedStartupClassIndexHolder
cg@2676:
cg@2676:
cg@2676: selectedStartupClassIndexHolder isNil ifTrue:[
cg@2676: selectedStartupClassIndexHolder := ValueHolder new.
cg@2676: selectedStartupClassIndexHolder onChangeSend:#selectedStartupClassChanged to:self.
cg@2676: ].
cg@2676: ^ selectedStartupClassIndexHolder.
cg@2676: !
cg@2676:
cg@2676: startMakeButtonEnabled
cg@2676:
cg@2676:
cg@2676: startMakeButtonEnabled isNil ifTrue:[
cg@2676: startMakeButtonEnabled := true asValue.
cg@2676: ].
cg@2676: ^ startMakeButtonEnabled.
cg@2676: !
cg@2676:
cg@2676: stopMakeButtonVisible
cg@2676:
cg@2676:
cg@2676: stopMakeButtonVisible isNil ifTrue:[
cg@2676: stopMakeButtonVisible := false asValue.
cg@2676: ].
cg@2676: ^ stopMakeButtonVisible.
cg@2681: !
cg@2681:
cg@2681: usedCompilerHolder
cg@2681:
cg@2681:
cg@2681: usedCompilerHolder isNil ifTrue:[
cg@2681: usedCompilerHolder := ValueHolder new.
cg@2874: usedCompilerHolder value:(ProjectBuilder defaultUsedCompiler).
cg@2724: usedCompilerHolder onChangeSend:#checkCompilerAvailability to:self.
cg@2681: ].
cg@2681: ^ usedCompilerHolder.
cg@2874:
cg@2874: "Modified: / 21-01-2012 / 14:07:16 / cg"
cg@2676: ! !
cg@2676:
cg@2676: !ProjectBuilderAssistantApplication methodsFor:'initialization & release'!
cg@2676:
cg@2687: fileBrowserInstance
cg@2687: "setup the embedded fileBrowser (in the last page)"
cg@2687:
cg@2687: |targetDirectory browser|
cg@2687:
cg@2687: targetDirectory := projectBuilder packageBuildDirectory.
cg@2687:
cg@2687: browser := FileBrowserV2 new.
cg@2687: browser onDirectory:targetDirectory.
cg@2724: OperatingSystem isMSWINDOWSlike ifTrue:[
cg@2724: browser filter:'*.exe;*.com'.
cg@2724: ] ifFalse:[
cg@2724: browser filter:'*'.
cg@2724: ].
cg@2687: ^ browser.
cg@2687: !
cg@2687:
cg@2897: openOn:aProjectDefinitionClass
cg@2897: |type apps startupClass|
cg@2897:
cg@2897: self allButOpen.
cg@2897: aProjectDefinitionClass isLibraryDefinition ifTrue:[
cg@2897: type := ProjectDefinition libraryType
cg@2897: ] ifFalse:[
cg@2897: aProjectDefinitionClass isGUIApplication ifTrue:[
cg@2897: type := ProjectDefinition guiApplicationType
cg@2897: ] ifFalse:[
cg@2897: type := ProjectDefinition nonGuiApplicationType
cg@2897: ]
cg@2897: ].
cg@2897: self projectTypeHolder value:type.
cg@2897: self hideSTXProjects value:false.
cg@2897: selectedProjectDefinition := aProjectDefinitionClass.
cg@2897: self selectedProjectIndexHolder value:(self listOfMatchingPackageIds value indexOf:aProjectDefinitionClass package).
cg@2897: self hasProjectSelectedHolder value:true.
cg@2897:
cg@2897: self gotoPage:3.
cg@2897: type == ProjectDefinition guiApplicationType ifTrue:[
cg@2897: (startupClass := aProjectDefinitionClass startupClass) notNil ifTrue:[
cg@2897: selectedStartupClass := startupClass.
cg@2897: self gotoPage:4.
cg@2897: ].
cg@2897: "/ apps := (aProjectDefinitionClass classes select:[:cls | cls isKindOf:ApplicationModel])
cg@2897: ].
cg@2897: self openWindow.
cg@2897:
cg@2897: "Created: / 20-07-2012 / 12:34:02 / cg"
cg@2897: !
cg@2897:
cg@2897: openOnPackage:aPackageId
cg@2897: self allButOpen.
cg@2897: self projectTypeHolder value:(ProjectDefinition guiApplicationType).
cg@2897: self hideSTXProjects value:false.
cg@2897: self selectedProjectIndexHolder value:(self listOfMatchingPackageIds indexOf:aPackageId).
cg@2897: self hasProjectSelectedHolder value:true.
cg@2897: self gotoPage:2.
cg@2897: self openWindow.
cg@2897:
cg@2897: "Created: / 20-07-2012 / 13:24:38 / cg"
cg@2897: !
cg@2897:
cg@2676: postBuildMakeOutputWindow:aView
cg@2676: makeOutputWindow := aView
cg@2676: !
cg@2676:
fm@2705: postBuildNewProjectsNameListExtendedComboBox:anExtendedComboBox
fm@2697:
fm@2697: |menu|
fm@2697:
fm@2697: menu := SubCanvas new.
fm@2697: menu client:self spec:#newProjectsNameListSpec builder:nil.
fm@2705: anExtendedComboBox closeOnSelect: false.
fm@2705: anExtendedComboBox menuWidget:menu.
fm@2697:
fm@2705: anExtendedComboBox editor
fm@2697: immediateAccept:true;
fm@2697: acceptOnLeave:true;
fm@2697: acceptOnLostFocus:true;
fm@2697: acceptOnPointerLeave:true;
fm@2697: acceptOnReturn:true;
fm@2697: acceptOnTab:true.
fm@2705:
fm@2705: newProjectsNameListExtendedComboBox := anExtendedComboBox.
fm@2697: !
fm@2697:
cg@2676: postBuildWith:aBuilder
cg@2676: super postBuildWith:aBuilder.
cg@2676: self updateListOfMatchingProjects.
fm@2697: self updateListOfNewProjectsName.
cg@2676:
cg@2676: Smalltalk addDependent:self.
cg@2676: !
cg@2676:
cg@2676: release
cg@2676: Smalltalk removeDependent:self.
cg@2676: super release
cg@2676: ! !
cg@2676:
cg@2676: !ProjectBuilderAssistantApplication methodsFor:'menu actions'!
cg@2676:
cg@2676: openDocumentation
cg@2676: self openHTMLDocument:'tools/misc/TOP.html#PACKAGER'.
cg@2659: ! !
cg@2659:
cg@2636: !ProjectBuilderAssistantApplication methodsFor:'private'!
cg@2636:
cg@2676: commentFromClass:aClass
cg@2676: |docMethod comment indents minIndent maxLineLength|
cg@2636:
cg@2636: docMethod := aClass class compiledMethodAt:#documentation.
cg@2636: docMethod notNil ifTrue:[
cg@2636: comment := docMethod comment.
cg@2636: comment := comment asStringCollection
cg@2636: collect:[:line | line withoutTrailingSeparators].
cg@2636: [comment notEmpty and:[comment first isBlank]] whileTrue:[ comment removeFirst ].
cg@2636: maxLineLength := (comment collect:[:line | line size]) max.
cg@2636: indents := comment collect:[:line |
cg@2636: line isEmptyOrNil
cg@2636: ifTrue:[maxLineLength]
cg@2636: ifFalse:[ line findFirst:[:ch | ch isSeparator not]]].
cg@2636: (minIndent := indents min) > 1 ifTrue:[
cg@2636: comment := comment collect:[:line | line copyFrom:minIndent].
cg@2636: ].
cg@2636: comment := comment asString.
cg@2636: ].
cg@2636: ^ comment
cg@2659: !
cg@2659:
cg@2676: generatePackageContentsMethods
cg@2676:
cg@2676:
cg@2676: Class packageQuerySignal answer:(selectedProjectDefinition package)
cg@2676: do:[
cg@2676: selectedProjectDefinition
cg@2676: forEachContentsMethodsCodeToCompileDo:[:code :category |
cg@2832: SmalltalkCodeGeneratorTool
cg@2676: compile:code
cg@2676: forClass:selectedProjectDefinition theMetaclass
cg@2676: inCategory:category.
cg@2676: ]
cg@2676: ignoreOldDefinition:true
cg@2659: ].
cg@2676: self updateListOfClassesInProject
cg@2832:
cg@2832: "Modified: / 31-01-2011 / 18:29:44 / cg"
cg@2659: !
cg@2659:
cg@2676: hasApplicationSelected
cg@2676: ^ self selectedApplicationIndexHolder value notNil
cg@2676: !
cg@2676:
cg@2676: hasBuildDirectorySpecified
cg@2676: ^ self buildDirectoryHolder value notEmptyOrNil
cg@2659: !
cg@2659:
cg@2676: hasProjectBuilder
cg@2676: ^ projectBuilder notNil
cg@2676: !
cg@2676:
cg@2676: hasProjectSelected
cg@2676: ^ self selectedProjectIndexHolder value notNil
cg@2676: !
cg@2676:
cg@2676: hasStartupClassSelected
cg@2676: ^ self selectedStartupClassIndexHolder value notNil
cg@2636: ! !
cg@2636:
cg@2656: !ProjectBuilderAssistantApplication methodsFor:'queries'!
cg@2656:
cg@2676: canEnterApplicationSelection
cg@2857: self hasProjectSelected ifFalse:[
cg@2857: self infoHolder value:'no project selected'.
cg@2857: ^ false
cg@2857: ].
cg@2857: ^ true
cg@2857:
cg@2857: "Modified: / 23-08-2011 / 12:12:35 / cg"
cg@2656: !
cg@2656:
cg@2676: canEnterBuild
cg@2857: self hasBuildDirectorySpecified ifFalse:[
cg@2857: self infoHolder value:'no build directory specified'.
cg@2857: ^ false
cg@2857: ].
cg@2857: ^ true
cg@2857:
cg@2857: "Modified: / 23-08-2011 / 12:13:29 / cg"
cg@2656: !
cg@2656:
cg@2659: canEnterContentsSelection
cg@2897: |prj cls impl mthd|
cg@2857:
cg@2857: self hasProjectSelected ifFalse:[
cg@2857: self infoHolder value:'no project selected'.
cg@2857: ^ false
cg@2857: ].
cg@2857: "self hasApplicationSelected ifFalse:[^ false]."
cg@2857: (self projectTypeIsLibrary or:[self hasStartupClassSelected]) ifFalse:[
cg@2857: self infoHolder value:'must be either library or have a startup class'.
cg@2857: ^ false
cg@2857: ].
cg@2857: prj := self selectedProjectDefinition.
cg@2857: ([prj startupClassName] on:Error do:nil) notNil ifFalse:[
cg@2857: self infoHolder value:'must have a startup class'.
cg@2857: ^ false
cg@2857: ].
cg@2857: ([prj startupSelector] on:Error do:nil) notNil ifFalse:[
cg@2857: self infoHolder value:'must have a startup selector'.
cg@2857: ^ false
cg@2857: ].
cg@2857: (prj class compiledMethodAt:#startupSelector) isNil ifTrue:[
cg@2857: self infoHolder value:('inherited startup selector is "%1"' bindWith:prj startupSelector).
cg@2864: impl := prj class whichClassImplements:#startupSelector.
cg@2865: impl isNil ifTrue:[
cg@2865: self infoHolder value:('inherited startup selector (%1) not implemented in %2'
cg@2865: bindWith:prj startupSelector
cg@2865: with:prj class name).
cg@2864: ^ false
cg@2864: ].
cg@2857: ].
cg@2897: (mthd := prj class compiledMethodAt:#startupClassName) package == prj package ifFalse:[
cg@2897: mthd package == PackageId noProjectID ifFalse:[
cg@2872: self infoHolder value:('startup class method (#startupClassName) of %3 must be in package "%1" (is in "%2")'
cg@2872: bindWith:prj package
cg@2872: with:(prj class compiledMethodAt:#startupClassName) package
cg@2872: with:prj class name).
cg@2872: ^ false
cg@2872: ].
cg@2857: ].
cg@2897: (mthd := prj class compiledMethodAt:#startupSelector) notNil ifTrue:[
cg@2897: mthd package == prj package ifFalse:[
cg@2897: mthd package == PackageId noProjectID ifFalse:[
cg@2872: self infoHolder value:('startup class method (#startupSelector) of %3 must be in package "%1" (is in "%2")'
cg@2872: bindWith:prj package
cg@2897: with:mthd package
cg@2872: with:prj class name).
cg@2872: ^ false
cg@2872: ]
cg@2857: ].
cg@2857: ].
cg@2864: cls := Smalltalk classNamed:prj startupClassName.
cg@2864: cls isNil ifTrue:[
cg@2864: self infoHolder value:('startup class "%1" does not exist' bindWith:prj startupClassName).
cg@2864: ^ false.
cg@2864: ].
cg@2864: (cls implements:(prj startupSelector)) ifFalse:[
cg@2865: (cls respondsTo:(prj startupSelector)) ifFalse:[
cg@2865: self infoHolder value:('startup class "%1" does not implement startup selector "%2"'
cg@2865: bindWith:cls name
cg@2865: with:prj startupSelector).
cg@2865: ^ false
cg@2865: ].
cg@2864: ].
cg@2857: ^ true.
cg@2857:
cg@2897: "Modified: / 20-07-2012 / 19:21:34 / cg"
cg@2659: !
cg@2659:
cg@2676: canEnterDeploy
cg@2857: self hasProjectBuilder ifFalse:[
cg@2857: self infoHolder value:'no project builder specified'.
cg@2857: ^ false
cg@2857: ].
cg@2857: ^ true
cg@2857:
cg@2857: "Modified: / 23-08-2011 / 12:13:23 / cg"
cg@2656: !
cg@2656:
cg@2872: canEnterPrerequisitesSelection
cg@2872: |prj cls impl|
cg@2872:
cg@2872: self hasProjectSelected ifFalse:[
cg@2872: self infoHolder value:'no project selected'.
cg@2872: ^ false
cg@2872: ].
cg@2872: ^ true.
cg@2872:
cg@2872: "Created: / 19-01-2012 / 15:37:30 / cg"
cg@2872: !
cg@2872:
cg@2676: canEnterStartupClassSelection
cg@2857: self hasProjectSelected ifFalse:[
cg@2857: self infoHolder value:'no project selected'.
cg@2857: ^ false
cg@2857: ].
cg@2676: ^ self hasProjectSelected "and:[ self hasApplicationSelected ]"
cg@2857:
cg@2857: "Modified: / 23-08-2011 / 12:16:35 / cg"
fm@2696: !
fm@2696:
cg@2724: isUnixOS
cg@2724: ^ OperatingSystem isUNIXlike
cg@2724: !
cg@2724:
cg@2720: isWindowsOS
cg@2720: ^ OperatingSystem isMSWINDOWSlike
cg@2720: !
cg@2720:
fm@2696: projectTypeIsGuiApplication
cg@2897: ^ self projectTypeHolder value == ProjectDefinition guiApplicationType
cg@2897:
cg@2897: "Modified: / 20-07-2012 / 13:29:59 / cg"
fm@2696: !
fm@2696:
fm@2696: projectTypeIsLibrary
cg@2897: ^ self projectTypeHolder value == ProjectDefinition libraryType
cg@2897:
cg@2897: "Modified: / 20-07-2012 / 13:29:24 / cg"
fm@2696: !
fm@2696:
fm@2696: projectTypeIsNotLibrary
fm@2696: ^ self projectTypeIsLibrary not
cg@2656: ! !
cg@2656:
cg@2636: !ProjectBuilderAssistantApplication methodsFor:'specs'!
cg@2636:
cg@2676: assistantSpec
cg@2703: ^ self class assistantSpec
cg@2676: ! !
cg@2676:
cg@2676: !ProjectBuilderAssistantApplication methodsFor:'update'!
cg@2676:
cg@2724: checkCompilerAvailability
cg@2724: |cmd suite warnMsg1 warnMsg2 sep|
cg@2724:
cg@2724: cmd := 'cc'.
cg@2724: suite := 'C-Compiler'.
cg@2724: warnMsg1 := warnMsg2 := ''.
cg@2724:
cg@2724: self usedCompilerHolder value = 'bcc' ifTrue:[
cg@2724: cmd := 'bcc32'.
cg@2724: suite := 'Borland C-Compiler'.
cg@2724: ].
cg@2724: self usedCompilerHolder value = 'vc' ifTrue:[
cg@2724: cmd := 'cl'.
cg@2724: suite := 'Microsoft Visual C C-Compiler'.
cg@2724: warnMsg2 := 'Due to bugs in this C-compiler, some classes may not be compilable.'.
cg@2724: ].
cg@2724: self usedCompilerHolder value = 'lcc' ifTrue:[
cg@2724: cmd := 'lcc'.
cg@2724: suite := 'LCC C-Compiler'.
cg@2724: warnMsg2 := 'The LCC C-compiler suite is not yet supported (linkage).'.
cg@2724: ].
cg@2724: self usedCompilerHolder value = 'gcc' ifTrue:[
cg@2724: cmd := 'gcc'.
cg@2724: suite := 'GNU C-Compiler'.
cg@2724: OperatingSystem isMSWINDOWSlike ifTrue:[
cg@2724: warnMsg2 := 'The GNU C-compiler suite is not yet supported on MSDOS systems.'.
cg@2724: ].
cg@2724: ].
cg@2724:
cg@2724: (OperatingSystem canExecuteCommand:cmd) ifFalse:[
cg@2724: warnMsg1 :=
cg@2724: 'The "%1"-command seems to be not in your path.
cg@2724: Please ensure that you installed the
cg@2724: "%2" compiler suite correctly.' bindWith:cmd with:suite.
cg@2724: ].
cg@2724:
cg@2724: (warnMsg1 notEmpty or:[warnMsg2 notEmpty]) ifTrue:[
cg@2724: sep := ''.
cg@2724: (warnMsg2 notEmpty) ifTrue:[ sep := '\\' withCRs ].
cg@2724:
cg@2724: self compilerWarnMessageHolder value:('Warning:
cg@2724:
cg@2724: ',warnMsg1,sep,warnMsg2).
cg@2724: self compilerWarnMessageVisibleHolder value:true.
cg@2724: ] ifFalse:[
cg@2724: self compilerWarnMessageVisibleHolder value:false
cg@2724: ].
cg@2724: !
cg@2724:
cg@2686: enterContentsSpecification
cg@2686: |toAdd|
cg@2686:
cg@2686: self updateListOfClassesInProject.
cg@2686:
cg@2686: toAdd := OrderedCollection new.
cg@2686:
cg@2686: "/ ensure that startup & app-class are in the list
cg@2686: selectedApplication notNil ifTrue:[
cg@2686: (selectedProjectDefinition classNames includes:selectedApplication name) ifFalse:[
cg@2686: toAdd add:selectedApplication.
cg@2686: ].
cg@2686: ].
cg@2686: selectedStartupClass notNil ifTrue:[
cg@2686: (selectedProjectDefinition classNames includes:selectedStartupClass name) ifFalse:[
cg@2686: toAdd add:selectedStartupClass.
cg@2686: ].
cg@2686: ].
cg@2686:
cg@2686: selectedProjectDefinition includeClasses:toAdd usingCompiler:nil.
cg@2686:
cg@2686: self updateListOfClassesInProject.
cg@2686: !
cg@2686:
cg@2872: enterPrerequisitesSpecification
cg@2872: |toAdd|
cg@2872:
cg@2872: self updateListOfPrerequisitesInProject.
cg@2872:
cg@2872: "/ toAdd := OrderedCollection new.
cg@2872: "/
cg@2872: "/ "/ ensure that startup & app-class are in the list
cg@2872: "/ selectedApplication notNil ifTrue:[
cg@2872: "/ (selectedProjectDefinition classNames includes:selectedApplication name) ifFalse:[
cg@2872: "/ toAdd add:selectedApplication.
cg@2872: "/ ].
cg@2872: "/ ].
cg@2872: "/ selectedStartupClass notNil ifTrue:[
cg@2872: "/ (selectedProjectDefinition classNames includes:selectedStartupClass name) ifFalse:[
cg@2872: "/ toAdd add:selectedStartupClass.
cg@2872: "/ ].
cg@2872: "/ ].
cg@2872: "/
cg@2872: "/ selectedProjectDefinition includeClasses:toAdd usingCompiler:nil.
cg@2872: "/
cg@2872: "/ self updateListOfClassesInProject.
cg@2872:
cg@2872: "Created: / 19-01-2012 / 15:36:47 / cg"
cg@2872: !
cg@2872:
cg@2676: rememberMakeOutputsContents
cg@2676: makeOutputHolder value:(makeOutputWindow contents)
cg@2676: !
cg@2676:
cg@2724: rememberProjectAttributes
cg@2724: self assert:selectedProjectDefinition notNil.
cg@2724: Class withoutUpdatingChangesDo:[
cg@2724: self productNameHolder value ~= selectedProjectDefinition productName ifTrue:[
cg@2724: selectedProjectDefinition class compile:(selectedProjectDefinition
cg@2724: productName_codeFor:(self productNameHolder value)).
cg@2724: ].
cg@2724: self companyNameHolder value ~= selectedProjectDefinition companyName ifTrue:[
cg@2724: selectedProjectDefinition class compile:(selectedProjectDefinition
cg@2724: companyName_codeFor:(self companyNameHolder value)).
cg@2724: ]
cg@2724: ].
cg@2724: !
cg@2724:
cg@2676: restoreMakeOutputsContents
cg@2676: makeOutputWindow contents:makeOutputHolder value
cg@2646: !
cg@2646:
cg@2676: update:something with:anArgument from:changedObject
cg@2676: changedObject == Smalltalk ifTrue:[
cg@2676: (something == #newClass
cg@2676: or:[something == #classRemove
cg@2676: or:[something == #projectOrganization]]) ifTrue:[
cg@2676: self updateListOfMatchingProjects.
fm@2697: self updateListOfNewProjectsName.
cg@2676: ^ self.
cg@2676: ].
cg@2676: ^ self.
cg@2676: ].
cg@2676: super update:something with:anArgument from:changedObject
cg@2636: !
cg@2636:
cg@2676: updateApplicationComment
cg@2676: |comment|
cg@2636:
cg@2676: self selectedApplicationIndexHolder value notNil ifTrue:[
cg@2676: comment := self commentFromClass:selectedApplication.
cg@2676: comment isNil ifTrue:[
cg@2676: comment := 'Application has no comment' allItalic colorizeAllWith:Color lightGrey.
cg@2676: ].
cg@2676: ] ifFalse:[
cg@2676: comment := 'Please select an Application' allItalic colorizeAllWith:Color lightGrey.
cg@2676: ].
cg@2676: self selectedApplicationsComment value:comment.
cg@2636: !
cg@2636:
cg@2676: updateComment
cg@2676: |comment|
cg@2636:
cg@2676: self selectedProjectIndexHolder value notNil ifTrue:[
cg@2676: comment := self commentFromClass:selectedProjectDefinition.
cg@2676: comment isNil ifTrue:[
cg@2676: comment := 'Project has no comment' allItalic colorizeAllWith:Color lightGrey.
cg@2676: ].
cg@2676: ] ifFalse:[
cg@2676: comment := 'Please select a Project' allItalic colorizeAllWith:Color lightGrey.
cg@2676: ].
cg@2676: self selectedProjectsComment value:comment.
cg@2636: !
cg@2636:
cg@2676: updateListOfApplicationsInProject
cg@2676: |oldList applicationClasses package appClass appClassIndex|
cg@2636:
cg@2649: appClassIndex := nil.
cg@2649:
cg@2636: selectedProjectDefinition isNil ifTrue:[
cg@2636: applicationClasses := #()
cg@2636: ] ifFalse:[
cg@2636: package := selectedProjectDefinition package.
cg@2636:
cg@2636: applicationClasses := Smalltalk allClasses
cg@2636: select:[:cls |
cg@2671: ((cls isSubclassOf:ApplicationModel)
cg@2671: and:[ self hideOtherApplicationClasses value not
cg@2671: or:[ cls package = package ]])
cg@2636: ].
cg@2636: applicationClasses := applicationClasses asOrderedCollection.
cg@2636: applicationClasses sort:[:a :b | a name < b name].
cg@2649:
cg@2668: "/ startUpClassName := [ selectedProjectDefinition startupClassName ] ifError:[ nil ].
cg@2668: "/ startUpClassName notNil ifTrue:[
cg@2668: "/ startUpClass := Smalltalk classNamed:startUpClassName.
cg@2668: "/ startUpClass notNil ifTrue:[
cg@2668: "/ appClassIndex := applicationClasses indexOf:startUpClass.
cg@2668: "/ appClassIndex == 0 ifTrue:[ appClassIndex := nil ].
cg@2668: "/ ].
cg@2668: "/ ].
cg@2636: ].
cg@2649:
cg@2668: oldList := self listOfApplicationsInProject value.
cg@2668: oldList = applicationClasses ifFalse:[
cg@2668: appClass := selectedApplication.
cg@2668: appClassIndex := applicationClasses indexOf:appClass.
cg@2668: appClassIndex == 0 ifTrue:[ appClassIndex := nil ].
cg@2668:
cg@2668: self listOfApplicationsInProject value:applicationClasses.
cg@2668: self selectedApplicationIndexHolder value:appClassIndex.
cg@2668: ].
cg@2636: !
cg@2636:
cg@2676: updateListOfClassesInProject
cg@2676: self listOfClassesInProject value:(selectedProjectDefinition classNames).
cg@2676: !
cg@2636:
cg@2676: updateListOfMatchingProjects
cg@2719: |query matching projectType idx|
cg@2676:
cg@2676: projectType := self projectType.
cg@2863: projectType = ProjectDefinition libraryType ifTrue:[
cg@2719: query := #isLibraryDefinition
cg@2719: ] ifFalse:[
cg@2863: projectType = ProjectDefinition guiApplicationType ifTrue:[
cg@2719: query := #isGUIApplication
cg@2719: ] ifFalse:[
cg@2863: projectType = ProjectDefinition nonGuiApplicationType ifTrue:[
cg@2719: query := #isConsoleApplication
cg@2719: ] ifFalse:[
cg@2897: self halt:'oops'.
cg@2897: projectType := ProjectDefinition guiApplicationType.
cg@2719: ].
cg@2719: ].
cg@2719: ].
cg@2719:
cg@2719: Class flushSubclassInfo.
cg@2719:
cg@2676: matching := ProjectDefinition allSubclasses
cg@2676: select:[:defClass |
cg@2676: |match|
cg@2636:
cg@2676: match := false.
cg@2863:
cg@2676: defClass isAbstract ifFalse:[
cg@2676: (self hideSTXProjects value not
cg@2676: or:[ defClass package asPackageId module ~= 'stx' ])
cg@2676: ifTrue:[
cg@2719: match := defClass perform:query
cg@2676: ].
cg@2676: ].
cg@2863: match
cg@2863: ].
cg@2719:
cg@2676: matching sort:[:a :b | a name < b name].
cg@2676: self listOfMatchingProjects value:matching.
cg@2686: self listOfMatchingPackageIds value:(matching collect:[:def | def package]).
cg@2636:
cg@2676: idx := matching indexOf:selectedProjectDefinition.
cg@2676: idx == 0 ifTrue:[
cg@2676: self selectedProjectIndexHolder value:nil.
cg@2676: ] ifFalse:[
cg@2676: self selectedProjectIndexHolder value:idx.
cg@2636: ].
cg@2863:
cg@2897: "Modified: / 20-07-2012 / 15:04:15 / cg"
cg@2659: !
cg@2659:
fm@2697: updateListOfNewProjectsName
fm@2697:
fm@2697: |loadedProjectIDsWithoutProjectDefinition|
fm@2697:
fm@2697: loadedProjectIDsWithoutProjectDefinition := Smalltalk allLoadedProjectIDs
fm@2697: select:[:eachProjectID |
fm@2697: eachProjectID ~= PackageId noProjectID
fm@2697: and:[ (ProjectDefinition definitionClassForPackage: eachProjectID) isNil ].
fm@2697: ].
fm@2697: self listOfNewProjectsName value:loadedProjectIDsWithoutProjectDefinition.
fm@2697: !
fm@2697:
cg@2872: updateListOfPrerequisitesInProject
cg@2872: self listOfPrerequisitesInProject value:(selectedProjectDefinition preRequisites).
cg@2872:
cg@2872: "Created: / 19-01-2012 / 15:39:15 / cg"
cg@2872: !
cg@2872:
cg@2659: updateListOfStartupClassesInProject
cg@2659: |startupClasses package startUpClassName startUpClass startupClassIndex|
cg@2659:
cg@2659: startupClassIndex := nil.
cg@2659: self selectedStartupClassIndexHolder value:nil.
cg@2659:
cg@2659: selectedProjectDefinition isNil ifTrue:[
cg@2659: startupClasses := #()
cg@2659: ] ifFalse:[
cg@2659: package := selectedProjectDefinition package.
cg@2659:
cg@2659: startupClasses := Smalltalk allClasses
cg@2659: select:[:cls |
cg@2671: ((cls includesBehavior:StandaloneStartup)
cg@2671: and:[ self hideOtherStartupClasses value not
cg@2671: or:[ cls package = package ]])
cg@2674: or:[ cls == Smalltalk
cg@2674: and:[ self hideOtherStartupClasses value not ] ]
cg@2659: ].
cg@2659: startupClasses := startupClasses asOrderedCollection.
cg@2659: startupClasses sort:[:a :b | a name < b name].
cg@2659:
cg@2659: startUpClassName := [ selectedProjectDefinition startupClassName ] ifError:[ nil ].
cg@2659: startUpClassName notNil ifTrue:[
cg@2659: startUpClass := Smalltalk classNamed:startUpClassName.
cg@2659: startUpClass notNil ifTrue:[
cg@2659: startupClassIndex := startupClasses indexOf:startUpClass.
cg@2659: startupClassIndex == 0 ifTrue:[ startupClassIndex := nil ].
cg@2659: ].
cg@2659: ].
cg@2659: ].
cg@2674:
cg@2659: self listOfStartupClassesInProject value:startupClasses.
cg@2659: self selectedStartupClassIndexHolder value:startupClassIndex.
cg@2724: !
cg@2724:
cg@2724: updateProjectAttributes
cg@2724: self assert:selectedProjectDefinition notNil.
cg@2724: self productNameHolder value:(selectedProjectDefinition productName).
cg@2724: self companyNameHolder value:(selectedProjectDefinition companyName).
cg@2636: ! !
cg@2636:
cg@2636: !ProjectBuilderAssistantApplication class methodsFor:'documentation'!
cg@2636:
cg@2864: version
cg@2864: ^ '$Header$'
cg@2864: !
cg@2864:
cg@2636: version_CVS
cg@2636: ^ '$Header$'
cg@2636: ! !