cg@3520: "{ Encoding: utf8 }" cg@3520: 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@2910: compilerWarnMessageVisibleHolder listOfPrerequisitesInProject cg@2919: nameOfUsedCompilerSuiteHolder usedCompilerIndexHolder' cg@2959: classVariableNames:'LastUsedCompiler Debugging' 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: mawalch@3320: This assistant-application allows for standalone applications to be built very easily. mawalch@3320: It will generate all required classes, files, start the compilation process, mawalch@3320: 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: mawalch@3320: Please install either the 'Borland Free Commandline Compiler Tools (bcc32)' mawalch@3320: or the 'Microsoft Visual-C++' package (also free). cg@2825: In addition, the 'NullSoft NSIS-Installer Package' is required. cg@2825: mawalch@3320: Due to limitations and bugs in the Visual-C++ compiler (limit on the size of mawalch@3320: string-constants), some Smalltalk code is still not compilable mawalch@3320: (currently, this affects classes which contain image-resource methods for big images). mawalch@3320: Although microsoft is doing their best (a relative measure) to make things better mawalch@3320: (they increase the string-limit with every new release), they still seem to be unable mawalch@3320: to figure out how ti use malloc for string-data). mawalch@3320: We are patiently waiting for a real fix and still using bcc in the meanwhile. mawalch@3320: Therefore, we recommend using the borland compiler suite. mawalch@3320: Please install it at its standard location ('C:\Borland') as our makefiles might mawalch@3320: still contain hard-coded paths (yes, we are ashamed about this). cg@2825: cg@2825: * Unix Users: mawalch@3320: You should already have the gcc compile suite (including all required header files) mawalch@3320: installed and ready to use. For a lack of time on our side, there is currently no mawalch@3320: 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) mawalch@3320: * ProjectDefinitions mawalch@3320: mawalch@3320: Older ST/X versions used instances of a Project class - this is now obsolete and mawalch@3320: removed from the system (although there are still some minor uses of it, mawalch@3320: 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: mawalch@3320: 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. mawalch@3320: PackageIDs must have a certain fixed format: they always contain exactly two parts, mawalch@3320: which are separated by a colon character: the module and the directory part. mawalch@3320: The module is used as main-selector on where and how the source code repository is mawalch@3320: accessed. The directory is a path below that repository. If checked out into the local mawalch@3320: filesystem, the module defines the top-level directory. Thus, if a packageID is mawalch@3320: 'stx:libbasic', the corresponding sources will be found in the repository associated mawalch@3320: to the 'stx' module, under the directory 'libbasic'. mawalch@3320: In the local file system, it will be found under 'stx/libbasic'. mawalch@3320: As another example, if the packageID is 'exept:expecco/plugins/foo', mawalch@3320: the repository is whichever is associated with the 'exept' module, and the subdirectory mawalch@3320: is 'expecco/plugins/foo'. The local path to the sourcefiles would be cg@2825: 'exept/expecco/plugins/foo'. cg@2825: mawalch@3320: Please notice that it does make sense to associate different repositories to different mawalch@3320: modules: for example, you could setup the sourceCodeManager to use CVS access to the mawalch@3320: exept repository for everything under the 'stx' module, mawalch@3320: 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: mawalch@3320: These describe the contents of a project, such as the classes to include, mawalch@3320: 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 mawalch@3320: * ClassLibrary Definition mawalch@3320: mawalch@3320: ProjectDefinitions are stored and managed as class-instances, located as subclasses mawalch@3320: of one of ApplicationDefinition or LibraryDefinition. mawalch@3320: As classes, they are themself managed, compiled and packaged as part of the project mawalch@3320: (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: mawalch@3320: All classes and extension methods belonging to a single package are supposed to be mawalch@3320: loaded (and possibly unloaded) together. They are also usually deployed inside a single mawalch@3320: dynamic link library ('dll', for short). In the Unix world, these are called mawalch@3320: 'shared object' or 'so'. mawalch@3320: 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 mawalch@3320: This defines the type of application (GUI / non-GUI), mawalch@3320: its contents (i.e. the set of classes to be included in the binary itself and mawalch@3320: 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 mawalch@3320: This is the first class which gets control when the executable is started; mawalch@3320: it can analyze the command line arguments, read patches or updates, mawalch@3320: start background ptocesses, and will eventually open the applications GUI. cg@2825: cg@2825: Build Procedure cg@2825: mawalch@3320: All of the three components above can be generated by the packager to provide an cg@2825: initial framework for further work. cg@2825: mawalch@3320: After the definition of those classes, all required files are stored in a temporary mawalch@3320: build directory. This means that the above classes are filed out, cg@2825: and make- and other support files are generated. cg@2825: mawalch@3320: Finally, the actual build process is started. This requires an external C-compiler. mawalch@3320: 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: mawalch@3320: 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: mawalch@3320: After the build, all required files are packaged in a single install-file. mawalch@3320: This is called 'MyApplicationSetup.exe' and found in the project-specific subdirectory mawalch@3320: of the build directory. For deployment, this single file has to be delivered to a customer cg@2825: and executed there. cg@2825: mawalch@3320: Summary: It has NEVER been easier to create a GUI application with Smalltalk. cg@2825: " cg@2668: ! ! cg@2636: 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@3520: helpSpec cg@2703: cg@2703: cg@3520: ^ super helpSpec addPairsFrom:#( cg@2703: cg@2706: #'projectType' cg@3126: 'Choose the type of Project you are about to deploy' cg@2706: cg@2706: #existingProjects cg@3126: 'Projects with an existing ProjectDefinition of the chosen type (above)' cg@2703: cg@2968: #nameOfApplicationClass cg@2968: 'For GUI applications: the name of your application class (subclass of ApplicationModel). cg@3004: This will be opened by the startup sequence and defines the UI. cg@3004: (Usually, these are named "XXXApplication" or "XXXApp") cg@3126: Click on the "Create"-button to create a simple helloWorld app to start with' cg@2968: cg@2968: #createNewApplication cg@2968: 'Create a new simple dummy application (HelloWorld-like). cg@3126: Press this button to get some template code to play with - but enter a name first' cg@2968: cg@2968: #nameOfStartupClass cg@2968: 'This class contains the main method, in which the show starts when the executable runs. cg@2968: Its main task is to parse command line arguments (if any) and fire up the real application. cg@3004: It should inherit from StandaloneStartup. cg@3004: (Usually, these are named "XXXStart" or "XXXStartup") cg@3004: Click on the "Create"-button to create something to start with (will launch your application)' cg@2968: cg@2968: #createNewStartupClass cg@2968: 'Create a new simple startup class which fires up the defined application. cg@2968: Press this button to get a standard startup class which does not care for command line args. cg@3126: But enter a name first' cg@2968: cg@2706: #browseSelectedProject cg@3126: 'Open a SystemBrowser on the selected Project' cg@2706: cg@2706: #hideSTXBasePackages cg@3126: '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@3126: The pull-down list contains packageIDs for which no ProjectDefinition exists (yet)' cg@2706: cg@2706: #'createNewProject' cg@2706: 'PackageID (module:directory). cg@3126: Click to create a new (empty) ProjectDefinition for the given PackageID' cg@2703: cg@2922: #clearBuildDirectory cg@3126: 'Clear the build directory' cg@2922: cg@2922: #makeAll cg@3126: 'Build a self-installing deployable package' cg@3126: cg@3126: #makeApp cg@3126: 'Build the app only (for test-running)' cg@2922: cg@2922: #makeExe cg@3126: 'Build the executable only (for test-running)' cg@2922: cg@2973: #makeExeQuick cg@2973: 'Quick build the executable only (for test-running). cg@3126: Does not regenerate the header files. Only the target package files are recreated' cg@2973: cg@2922: #makeOutput cg@3126: 'Displays the output of the build process (make command)' cg@2922: cg@2922: #openExplorer cg@3126: 'Open a Windows Explorer on the build directory. You can double-click on the built executable there' cg@3126: cg@3126: #openFinder cg@3126: 'Open a Finder on the build directory. You can double-click on the built executable there' cg@2922: cg@2922: #openFileBrowser cg@3126: 'Open a Filebrowser on the build directory' cg@3126: cg@3126: #openTerminal cg@3126: 'Open a terminal (console) in the build directory' cg@2922: cg@2922: #stopMake cg@3126: 'Abort the ongoing build process. Please clear the build directory afterwards to remove any leftover garbage' cg@2922: cg@2994: #hideOtherStartupClasses cg@2994: 'Hide startup classes from other packages. Uncheck to see them.\(Notice: the startup class really should be in the same package)' cg@2994: cg@2703: ) cg@2922: cg@2922: "Modified: / 06-09-2012 / 16:09:10 / cg" 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@2990: extent: (Point 294 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@2990: extent: (Point 294 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@2990: select: Library cg@2990: extent: (Point 294 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@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@3337: #(FullSpec cg@3337: name: #'page2_projectSelectionSpec' cg@3337: window: cg@3337: (WindowSpec cg@3337: label: 'Project Selection' cg@3337: name: 'Project Selection' cg@3337: min: (Point 0 0) cg@3337: bounds: (Rectangle 0 0 521 453) cg@3337: ) cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (FramedBoxSpec cg@3337: label: 'New Project''s PackageID' cg@3337: name: 'FramedBox3' cg@3337: layout: (LayoutFrame 0 0.0 5 0 4 1.0 72 0) cg@3337: labelPosition: topLeft cg@3337: translateLabel: true cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (ExtendedComboBoxSpec cg@3337: name: 'NewProjectsNameListExtendedComboBox' cg@3337: layout: (LayoutFrame 1 0 6 0 -113 1 34 0) cg@3337: activeHelpKey: listOfNewProjectsName cg@3337: model: newProjectsName cg@3337: readOnly: false cg@3337: miniScrollerHorizontal: true cg@3337: postBuildCallback: postBuildNewProjectsNameListExtendedComboBox: cg@3337: ) cg@3337: (ActionButtonSpec cg@3337: label: 'Create' cg@3337: name: 'Button1' cg@3337: layout: (LayoutFrame -100 1 6 0 2 1 34 0) cg@3337: activeHelpKey: createNewProject cg@3337: translateLabel: true cg@3337: model: createNewProject cg@2636: ) cg@3337: ) cg@3337: cg@3337: ) cg@3337: ) cg@3337: (FramedBoxSpec cg@3337: label: 'Existing Projects with ProjectDefinition' cg@3337: name: 'FramedBox4' cg@3337: layout: (LayoutFrame 0 0.0 70 0 4 1.0 -34 1) cg@3337: labelPosition: topLeft cg@3337: translateLabel: true cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (VariableHorizontalPanelSpec cg@3337: name: 'VariableHorizontalPanel2' cg@3337: layout: (LayoutFrame 0 0 4 0 0 1 -26 1) cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (SequenceViewSpec cg@3337: name: 'List2' cg@3337: model: selectedProjectIndexHolder cg@3337: hasHorizontalScrollBar: true cg@3337: hasVerticalScrollBar: true cg@3337: useIndex: true cg@3337: sequenceList: listOfMatchingPackageIds cg@3337: ) cg@3337: (TextEditorSpec cg@3337: name: 'TextEditor2' cg@3337: model: selectedProjectsComment cg@3337: hasHorizontalScrollBar: true cg@3337: hasVerticalScrollBar: true cg@3337: isReadOnly: true cg@3337: hasKeyboardFocusInitially: false cg@3337: viewClassName: 'TextView' cg@2636: ) cg@3337: ) cg@3337: cg@3337: ) cg@3337: handles: (Any 0.35000000000000003 1.0) cg@3337: ) cg@3337: (CheckBoxSpec cg@3337: label: 'Hide ST/X Base Packages' cg@3337: name: 'CheckBox1' cg@3337: layout: (LayoutFrame -1 0 -17 1 0 1 5 1) cg@3337: activeHelpKey: hideSTXBasePackages cg@3337: model: hideSTXProjects cg@3337: translateLabel: true cg@2636: ) cg@3337: ) cg@3337: cg@3337: ) cg@3337: ) cg@3337: (HorizontalPanelViewSpec cg@3337: name: 'HorizontalPanel1' cg@3337: layout: (LayoutFrame 0 0 -34 1 0 1 0 1) cg@3337: horizontalLayout: leftSpace cg@3337: verticalLayout: center cg@3337: horizontalSpace: 3 cg@3337: verticalSpace: 3 cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (ActionButtonSpec cg@3337: label: 'Browse Selected Project' cg@3337: name: 'Button3' cg@3337: activeHelpKey: browseSelectedProject cg@3337: translateLabel: true cg@3337: model: doBrowseProject cg@3337: enableChannel: hasProjectSelectedHolder cg@3337: useDefaultExtent: true cg@2648: ) cg@3337: ) cg@3337: cg@3337: ) cg@2636: ) cg@3337: ) cg@3337: cg@3337: ) cg@3337: ) 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@3337: #(FullSpec cg@3337: name: #'page3_applicationSelectionSpec' cg@3337: window: cg@3337: (WindowSpec cg@3337: label: 'Application Selection' cg@3337: name: 'Application Selection' cg@3337: min: (Point 0 0) cg@3337: bounds: (Rectangle 0 0 519 406) cg@3337: ) cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (FramedBoxSpec cg@3337: label: 'New Application Class' cg@3337: name: 'FramedBox3' cg@3337: layout: (LayoutFrame 0 0.0 5 0 4 1.0 70 0) cg@3337: labelPosition: topLeft cg@3337: translateLabel: true cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (InputFieldSpec cg@3337: name: 'EntryField1' cg@3337: layout: (LayoutFrame 1 0 6 0 -113 1 34 0) cg@3337: activeHelpKey: nameOfApplicationClass cg@3337: model: newApplicationsName cg@3337: acceptOnReturn: true cg@3337: acceptOnTab: true cg@3337: acceptOnLostFocus: true cg@3337: acceptOnPointerLeave: true cg@3337: emptyFieldReplacementText: 'MyApplication' cg@3337: ) cg@3337: (ActionButtonSpec cg@3337: label: 'Create' cg@3337: name: 'Button1' cg@3337: layout: (LayoutFrame -100 1 6 0 1 1 34 0) cg@3337: activeHelpKey: createNewApplication cg@3337: translateLabel: true cg@3337: model: createNewApplication cg@2636: ) cg@3337: ) cg@3337: cg@3337: ) cg@3337: ) cg@3337: (FramedBoxSpec cg@3337: label: 'Existing Applications' cg@3337: name: 'FramedBox4' cg@3337: layout: (LayoutFrame 0 0.0 72 0 4 1.0 -34 1) cg@3337: labelPosition: topLeft cg@3337: translateLabel: true cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (VariableHorizontalPanelSpec cg@3337: name: 'VariableHorizontalPanel2' cg@3337: layout: (LayoutFrame 0 0 4 0 0 1 -26 1) cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (SequenceViewSpec cg@3337: name: 'List2' cg@3337: model: selectedApplicationIndexHolder cg@3337: hasHorizontalScrollBar: true cg@3337: hasVerticalScrollBar: true cg@3337: useIndex: true cg@3337: sequenceList: listOfApplicationsInProject cg@3337: ignoreReselect: false cg@3337: ) cg@3337: (TextEditorSpec cg@3337: name: 'TextEditor2' cg@3337: model: selectedApplicationsComment cg@3337: hasHorizontalScrollBar: true cg@3337: hasVerticalScrollBar: true cg@3337: isReadOnly: true cg@3337: hasKeyboardFocusInitially: false cg@3337: viewClassName: 'TextView' cg@2636: ) cg@3337: ) cg@3337: cg@3337: ) cg@3337: handles: (Any 0.35000000000000003 1.0) cg@3337: ) cg@3337: (CheckBoxSpec cg@3337: label: 'Hide other Application Classes' cg@3337: name: 'CheckBox1' cg@3337: layout: (LayoutFrame -1 0 -18 1 0 1 4 1) cg@3337: model: hideOtherApplicationClasses cg@3337: translateLabel: true cg@2636: ) cg@3337: ) cg@3337: cg@3337: ) cg@3337: ) cg@3337: (HorizontalPanelViewSpec cg@3337: name: 'HorizontalPanel1' cg@3337: layout: (LayoutFrame 0 0 -34 1 0 1 0 1) cg@3337: horizontalLayout: leftSpace cg@3337: verticalLayout: center cg@3337: horizontalSpace: 3 cg@3337: verticalSpace: 3 cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (ActionButtonSpec cg@3337: label: 'Browse Selected App' cg@3337: name: 'Button3' cg@3337: translateLabel: true cg@3337: model: doBrowseApplication cg@3337: enableChannel: hasApplicationSelectedHolder cg@3337: useDefaultExtent: true cg@2648: ) cg@3337: (ActionButtonSpec cg@3337: label: 'Launch Selected App' cg@3337: name: 'Button4' cg@3337: translateLabel: true cg@3337: model: doLaunchApplication cg@3337: enableChannel: hasApplicationSelectedHolder cg@3337: useDefaultExtent: true cg@3337: ) cg@3337: ) cg@3337: cg@3337: ) cg@2636: ) cg@3337: ) cg@3337: cg@3337: ) cg@3337: ) 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@3337: #(FullSpec cg@3337: name: #'page4_startupClassSelectionSpec' cg@3337: window: cg@3337: (WindowSpec cg@3337: label: 'Startup Class Selection' cg@3337: name: 'Startup Class Selection' cg@3337: min: (Point 0 0) cg@3337: bounds: (Rectangle 0 0 521 408) cg@3337: ) cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (FramedBoxSpec cg@3337: label: 'New Startup Class' cg@3337: name: 'FramedBox3' cg@3337: layout: (LayoutFrame 0 0.0 5 0 4 1.0 70 0) cg@3337: labelPosition: topLeft cg@3337: translateLabel: true cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (InputFieldSpec cg@3337: name: 'EntryField1' cg@3337: layout: (LayoutFrame 1 0 6 0 -113 1 34 0) cg@3337: activeHelpKey: nameOfStartupClass cg@3337: model: newStartupClassName cg@3337: acceptOnReturn: true cg@3337: acceptOnTab: true cg@3337: acceptOnLostFocus: true cg@3337: acceptOnPointerLeave: true cg@3337: emptyFieldReplacementText: 'MyStandAloneStartup' cg@3337: ) cg@3337: (ActionButtonSpec cg@3337: label: 'Create' cg@3337: name: 'Button1' cg@3337: layout: (LayoutFrame -100 1 6 0 1 1 34 0) cg@3337: activeHelpKey: createNewStartupClass cg@3337: translateLabel: true cg@3337: model: createNewStartupClass cg@2656: ) cg@3337: ) cg@3337: cg@3337: ) cg@3337: ) cg@3337: (FramedBoxSpec cg@3337: label: 'Existing Startup Classes' cg@3337: name: 'FramedBox4' cg@3337: layout: (LayoutFrame 0 0.0 72 0 4 1.0 -34 1) cg@3337: labelPosition: topLeft cg@3337: translateLabel: true cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (VariableHorizontalPanelSpec cg@3337: name: 'VariableHorizontalPanel2' cg@3337: layout: (LayoutFrame 0 0 4 0 0 1 -26 1) cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (SequenceViewSpec cg@3337: name: 'List2' cg@3337: model: selectedStartupClassIndexHolder cg@3337: hasHorizontalScrollBar: true cg@3337: hasVerticalScrollBar: true cg@3337: useIndex: true cg@3337: sequenceList: listOfStartupClassesInProject cg@3337: ) cg@3337: (TextEditorSpec cg@3337: name: 'TextEditor2' cg@3337: model: selectedStartupClassesComment cg@3337: hasHorizontalScrollBar: true cg@3337: hasVerticalScrollBar: true cg@3337: isReadOnly: true cg@3337: hasKeyboardFocusInitially: false cg@3337: viewClassName: 'TextView' cg@2656: ) cg@3337: ) cg@3337: cg@3337: ) cg@3337: handles: (Any 0.35000000000000003 1.0) cg@3337: ) cg@3337: (CheckBoxSpec cg@3337: label: 'Hide other Startup Classes' cg@3337: name: 'CheckBox1' cg@3337: layout: (LayoutFrame -1 0 -20 1 0 1 2 1) cg@3337: activeHelpKey: hideOtherStartupClasses cg@3337: model: hideOtherStartupClasses cg@3337: translateLabel: true cg@2656: ) cg@3337: ) cg@3337: cg@3337: ) cg@3337: ) cg@3337: (HorizontalPanelViewSpec cg@3337: name: 'HorizontalPanel1' cg@3337: layout: (LayoutFrame 0 0 -34 1 0 1 0 1) cg@3337: horizontalLayout: leftSpace cg@3337: verticalLayout: center cg@3337: horizontalSpace: 3 cg@3337: verticalSpace: 3 cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (ActionButtonSpec cg@3337: label: 'Browse Selected StartupClass' cg@3337: name: 'Button3' cg@3337: translateLabel: true cg@3337: model: doBrowseStartupClass cg@3337: enableChannel: hasStartupClassSelectedHolder cg@3337: useDefaultExtent: true cg@2656: ) cg@3337: ) cg@3337: cg@3337: ) cg@2656: ) cg@3337: ) cg@3337: cg@3337: ) cg@3337: ) 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@3337: #(FullSpec cg@3337: name: #'page5_specifyIncludedClasses' cg@3337: window: cg@3337: (WindowSpec cg@3337: label: 'Project Selection' cg@3337: name: 'Project Selection' cg@3337: min: (Point 0 0) cg@3337: bounds: (Rectangle 0 0 521 400) cg@3337: ) cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (FramedBoxSpec cg@3337: label: 'Project Contents' cg@3337: name: 'FramedBox3' cg@3337: layout: (LayoutFrame 0 0.0 5 0 4 1.0 -34 1) cg@3337: labelPosition: topLeft cg@3337: translateLabel: true cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (SequenceViewSpec cg@3337: name: 'List1' cg@3337: layout: (LayoutFrame 0 0 0 0 0 1 0 1) cg@3337: initiallyDisabled: true cg@3337: hasHorizontalScrollBar: true cg@3337: hasVerticalScrollBar: true cg@3337: useIndex: false cg@3337: sequenceList: listOfClassesInProject cg@2636: ) cg@3337: ) cg@3337: cg@3337: ) cg@3337: ) cg@3337: (HorizontalPanelViewSpec cg@3337: name: 'HorizontalPanel1' cg@3337: layout: (LayoutFrame 0 0 -34 1 0 1 0 1) cg@3337: horizontalLayout: center cg@3337: verticalLayout: center cg@3337: horizontalSpace: 3 cg@3337: verticalSpace: 3 cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (ActionButtonSpec cg@3337: label: 'Browse Project Definition' cg@3337: name: 'Button3' cg@3337: translateLabel: true cg@3337: model: doBrowseProjectDefinitionClass cg@3337: useDefaultExtent: true cg@2648: ) cg@3337: (ActionButtonSpec cg@3337: label: 'Update Contents (Scan)' cg@3337: name: 'Button4' cg@3337: translateLabel: true cg@3337: model: doGenerateProjectContentsDefinition cg@3337: useDefaultExtent: true cg@3337: ) cg@3337: ) cg@3337: cg@3337: ) cg@2636: ) cg@3337: ) cg@3337: cg@3337: ) cg@3337: ) 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@3337: #(FullSpec cg@3337: name: #'page5b_specifyPrerequisitePackages' cg@3337: window: cg@3337: (WindowSpec cg@3337: label: 'Project Selection' cg@3337: name: 'Project Selection' cg@3337: min: (Point 0 0) cg@3337: bounds: (Rectangle 0 0 521 400) cg@3337: ) cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (FramedBoxSpec cg@3337: label: 'Prerequisite Packages' cg@3337: name: 'FramedBox3' cg@3337: layout: (LayoutFrame 0 0.0 5 0 4 1.0 -34 1) cg@3337: labelPosition: topLeft cg@3337: translateLabel: true cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (SequenceViewSpec cg@3337: name: 'List1' cg@3337: layout: (LayoutFrame 0 0 0 0 0 1 0 1) cg@3337: initiallyDisabled: true cg@3337: hasHorizontalScrollBar: true cg@3337: hasVerticalScrollBar: true cg@3337: useIndex: false cg@3337: sequenceList: listOfPrerequisitesInProject cg@2872: ) cg@3337: ) cg@3337: cg@3337: ) cg@3337: ) cg@3337: (HorizontalPanelViewSpec cg@3337: name: 'HorizontalPanel1' cg@3337: layout: (LayoutFrame 0 0 -34 1 0 1 0 1) cg@3337: horizontalLayout: center cg@3337: verticalLayout: center cg@3337: horizontalSpace: 3 cg@3337: verticalSpace: 3 cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (ActionButtonSpec cg@3337: label: 'Browse Project Definition' cg@3337: name: 'Button3' cg@3337: translateLabel: true cg@3337: model: doBrowseProjectDefinitionClassForPrereqs cg@3337: useDefaultExtent: true cg@2872: ) cg@3337: (ActionButtonSpec cg@3337: label: 'Update Prerequisites (Scan)' cg@3337: name: 'Button4' cg@3337: translateLabel: true cg@3337: model: doGenerateProjectPrerequisitesDefinition cg@3337: useDefaultExtent: true cg@3337: ) cg@3337: ) cg@3337: cg@3337: ) cg@2872: ) cg@3337: ) cg@3337: cg@3337: ) cg@3337: ) 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@3337: #(FullSpec cg@3337: name: #'page6a_specifyProjectAttributes' cg@3337: window: cg@3337: (WindowSpec cg@3337: label: 'Project Selection' cg@3337: name: 'Project Selection' cg@3337: min: (Point 0 0) cg@3337: bounds: (Rectangle 0 0 521 239) cg@3337: ) cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (FramedBoxSpec cg@3337: label: 'Product Information' cg@3337: name: 'FramedBox3' cg@3337: layout: (LayoutFrame 0 0.0 5 0 4 1.0 116 0) cg@3337: labelPosition: topLeft cg@3337: translateLabel: true cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (LabelSpec cg@3337: label: 'Product Name:' cg@3337: name: 'Label1' cg@3337: layout: (LayoutFrame 0 0 10 0 148 0 40 0) cg@3339: activeHelpKey: productName cg@3337: translateLabel: true cg@3339: adjust: left cg@2724: ) cg@3337: (InputFieldSpec cg@3337: name: 'EntryField4' cg@3337: layout: (LayoutFrame 150 0.0 10 0 0 1.0 40 0) cg@3339: activeHelpKey: productName cg@3337: model: productNameHolder cg@3337: acceptOnLostFocus: true cg@3337: acceptOnPointerLeave: true cg@3337: viewClassName: '' cg@3337: ) cg@3337: (LabelSpec cg@3337: label: 'Company Name:' cg@3337: name: 'Label2' cg@3337: layout: (LayoutFrame 0 0 45 0 148 0 75 0) cg@3339: activeHelpKey: companyName cg@3337: translateLabel: true cg@3339: adjust: left cg@3337: ) cg@3337: (InputFieldSpec cg@3337: name: 'EntryField3' cg@3337: layout: (LayoutFrame 150 0.0 45 0 0 1.0 75 0) cg@3339: activeHelpKey: companyName cg@3337: model: companyNameHolder cg@3337: acceptOnLostFocus: true cg@3337: acceptOnPointerLeave: true cg@3337: viewClassName: '' cg@3337: ) cg@3337: ) cg@3337: cg@3337: ) cg@2724: ) cg@3339: (FramedBoxSpec cg@3339: label: 'Executable' cg@3339: name: 'FramedBox4' cg@3339: layout: (LayoutFrame 0 0.0 124 0 4 1.0 200 0) cg@3340: visibilityChannel: executableNameVisible cg@3339: labelPosition: topLeft cg@3339: translateLabel: true cg@3339: component: cg@3339: (SpecCollection cg@3339: collection: ( cg@3339: (LabelSpec cg@3339: label: 'Name:' cg@3339: name: 'Label3' cg@3339: layout: (LayoutFrame 0 0 10 0 148 0 40 0) cg@3339: activeHelpKey: programName cg@3339: translateLabel: true cg@3339: adjust: left cg@3339: ) cg@3339: (InputFieldSpec cg@3339: name: 'EntryField5' cg@3339: layout: (LayoutFrame 150 0.0 10 0 0 1.0 40 0) cg@3339: activeHelpKey: programName cg@3339: model: executableNameHolder cg@3339: isReadOnly: true cg@3339: acceptOnLostFocus: true cg@3339: acceptOnPointerLeave: true cg@3339: viewClassName: '' cg@3339: ) cg@3339: ) cg@3339: cg@3339: ) cg@3339: ) cg@3337: ) cg@3337: cg@3337: ) cg@3337: ) 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@3337: #(FullSpec cg@3337: name: #'page6b_specifyBuildDirectorySpec' cg@3337: window: cg@3337: (WindowSpec cg@3337: label: 'Project Selection' cg@3337: name: 'Project Selection' cg@3337: min: (Point 0 0) cg@3337: bounds: (Rectangle 0 0 521 361) cg@3337: ) cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (FramedBoxSpec cg@3337: label: 'Build Directory' cg@3337: name: 'FramedBox3' cg@3339: layout: (LayoutFrame 0 0.0 5 0 4 1.0 115 0) cg@3337: labelPosition: topLeft cg@3337: translateLabel: true cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (FilenameInputFieldSpec cg@3337: name: 'FilenameEntryField1' cg@3337: layout: (LayoutFrame 0 0.0 10 0 0 1.0 40 0) cg@3337: model: buildDirectoryHolder cg@3337: acceptOnPointerLeave: true cg@3337: viewClassName: FilenameWidgetWithHistory cg@2636: ) cg@3339: (ActionButtonSpec cg@3339: label: 'Clear' cg@3339: name: 'Button1' cg@3339: layout: (LayoutFrame -127 1 50 0 -2 1 72 0) cg@3339: translateLabel: true cg@3339: model: clearBuildDirectory cg@3339: ) cg@3337: ) cg@3337: cg@3337: ) cg@3337: ) cg@3337: (FramedBoxSpec cg@3337: label: 'Compiler / Toolchain' cg@3337: name: 'FramedBox4' cg@3339: layout: (LayoutFrame 0 0.0 116 0 4 1.0 190 0) cg@3337: labelPosition: topLeft cg@3337: translateLabel: true cg@3337: component: cg@3337: (SpecCollection cg@3337: collection: ( cg@3337: (ComboListSpec cg@3337: name: 'ComboList1' cg@3337: layout: (LayoutFrame 0 0 10 0 137 0 40 0) cg@3337: model: usedCompilerHolder cg@3337: comboList: listOfPossibleCompilers cg@3337: useIndex: false cg@2681: ) cg@3337: (LabelSpec cg@3337: label: 'Compiler Suite' cg@3337: name: 'Label2' cg@3337: layout: (LayoutFrame 163 0 10 0 0 1 40 0) cg@3337: translateLabel: true cg@3337: labelChannel: nameOfUsedCompilerSuiteHolder cg@3337: adjust: left cg@3337: ) cg@3337: ) cg@3337: cg@3337: ) cg@2636: ) cg@3337: (TextEditorSpec cg@3337: name: 'TextEditor1' cg@3339: layout: (LayoutFrame 2 0.0 190 0 -2 1.0 303 0) cg@3337: level: -1 cg@3337: visibilityChannel: compilerWarnMessageVisibleHolder cg@3337: model: compilerWarnMessageHolder cg@3337: hasHorizontalScrollBar: true cg@3337: hasVerticalScrollBar: true cg@3337: miniScrollerHorizontal: true cg@3337: backgroundColor: (Color 100.0 50.0 50.0) cg@3337: hasKeyboardFocusInitially: false cg@3337: postBuildCallback: postBuildWarnMessageView: cg@3337: ) cg@3337: ) cg@3337: cg@3337: ) cg@3337: ) 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@3126: #(FullSpec cg@3126: name: #'page7_buildSpec' cg@3126: window: cg@3126: (WindowSpec cg@3126: label: 'Project Selection' cg@3126: name: 'Project Selection' cg@3126: min: (Point 0 0) cg@3126: bounds: (Rectangle 0 0 679 492) cg@3126: ) cg@3126: component: cg@3126: (SpecCollection cg@3126: collection: ( cg@3126: (FramedBoxSpec cg@3126: label: 'Make Output' cg@3126: name: 'FramedBox3' cg@3337: layout: (LayoutFrame 0 0.0 5 0 4 1.0 -106 1) cg@3126: labelPosition: topLeft cg@3126: translateLabel: true cg@3126: component: cg@3126: (SpecCollection cg@3126: collection: ( cg@3126: (TextEditorSpec cg@3126: name: 'MakeOutputWindow' cg@3126: layout: (LayoutFrame 0 0 0 0 0 1 0 1) cg@3126: activeHelpKey: makeOutput cg@3126: model: makeOutputHolder cg@3126: hasHorizontalScrollBar: true cg@3126: hasVerticalScrollBar: true cg@3126: hasKeyboardFocusInitially: false cg@3337: postBuildCallback: postBuildMakeOutputWindow: cg@3126: viewClassName: 'TextCollector' cg@3126: ) cg@3126: ) cg@3126: cg@3126: ) cg@3126: ) cg@3126: (HorizontalPanelViewSpec cg@3126: name: 'HorizontalPanel1' cg@3337: layout: (LayoutFrame 0 0 -106 1 0 1 -72 1) cg@3126: horizontalLayout: leftSpace cg@3126: verticalLayout: center cg@3126: horizontalSpace: 3 cg@3126: verticalSpace: 3 cg@3126: component: cg@3126: (SpecCollection cg@3126: collection: ( cg@3126: (ActionButtonSpec cg@3126: label: 'Make All' cg@3126: name: 'Button3' cg@3126: activeHelpKey: makeAll cg@3126: translateLabel: true cg@3126: model: doStartMakeAll cg@3126: enableChannel: startMakeButtonEnabled cg@3126: useDefaultExtent: true cg@3126: ) cg@3126: (ActionButtonSpec cg@3126: label: 'Make App' cg@3126: name: 'Button17' cg@3126: activeHelpKey: makeAll cg@3126: visibilityChannel: osIsOSX cg@3126: translateLabel: true cg@3126: model: doStartMakeApp cg@3126: enableChannel: startMakeButtonEnabled cg@3126: useDefaultExtent: true cg@3126: ) cg@3126: (ActionButtonSpec cg@3126: label: 'Make EXE only' cg@3126: name: 'Button5' cg@3126: activeHelpKey: makeExe cg@3126: translateLabel: true cg@3126: model: doStartMakeExe cg@3126: enableChannel: startMakeButtonEnabled cg@3126: useDefaultExtent: true cg@3126: ) cg@3126: (ActionButtonSpec cg@3126: label: 'Quick Make EXE' cg@3126: name: 'Button16' cg@3126: activeHelpKey: makeExeQuick cg@3126: translateLabel: true cg@3126: model: doStartMakeExeQuick cg@3126: enableChannel: startMakeButtonEnabled cg@3126: useDefaultExtent: true cg@3126: ) cg@3126: (ViewSpec cg@3126: name: 'Box1' cg@3126: extent: (Point 20 10) cg@2636: ) cg@3126: (ActionButtonSpec cg@3126: label: 'Stop Make' cg@3126: name: 'Button4' cg@3126: activeHelpKey: stopMake cg@3126: visibilityChannel: stopMakeButtonVisible cg@3126: translateLabel: true cg@3126: model: doStopMake cg@3126: useDefaultExtent: true cg@3126: ) cg@3126: ) cg@3126: cg@3126: ) cg@3126: ) cg@3126: (HorizontalPanelViewSpec cg@3126: name: 'HorizontalPanel2' cg@3337: layout: (LayoutFrame 0 0 -70 1 0 1 -36 1) cg@3126: horizontalLayout: leftSpace cg@3126: verticalLayout: center cg@3126: horizontalSpace: 3 cg@3126: verticalSpace: 3 cg@3126: component: cg@3126: (SpecCollection cg@3126: collection: ( cg@3337: (LabelSpec cg@3337: label: 'Build Directory' cg@3337: name: 'Label1' cg@3337: translateLabel: true cg@3337: useDefaultExtent: true cg@3337: ) cg@3126: (ActionButtonSpec cg@3337: label: 'Finder' cg@3126: name: 'Button13' cg@3126: activeHelpKey: openFinder cg@3126: visibilityChannel: osIsOSX cg@3126: translateLabel: true cg@3126: model: doOpenFinder cg@3126: useDefaultExtent: true cg@3126: ) cg@3126: (ActionButtonSpec cg@3337: label: 'Explorer' cg@3126: name: 'Button14' cg@3126: activeHelpKey: openExplorer cg@3126: visibilityChannel: osIsWindows cg@3126: translateLabel: true cg@3126: model: doOpenExplorer cg@3126: useDefaultExtent: true cg@2917: ) cg@3126: (ActionButtonSpec cg@3337: label: 'Browser' cg@3126: name: 'Button11' cg@3126: activeHelpKey: openFileBrowser cg@3126: translateLabel: true cg@3126: model: doBrowseBuildDirectory cg@3126: useDefaultExtent: true cg@3126: ) cg@3126: (ViewSpec cg@3126: name: 'Box2' cg@3126: extent: (Point 20 10) cg@3126: ) cg@3126: (ActionButtonSpec cg@3337: label: 'Clear' cg@3126: name: 'Button12' cg@3126: activeHelpKey: clearBuildDirectory cg@3126: translateLabel: true cg@3126: model: doClearBuildDirectory cg@3126: useDefaultExtent: true cg@2648: ) cg@3126: ) cg@3126: cg@3126: ) cg@3126: ) cg@3126: (HorizontalPanelViewSpec cg@3126: name: 'HorizontalPanel3' cg@3337: layout: (LayoutFrame 0 0 -34 1 0 1 0 1) cg@3126: horizontalLayout: leftSpace cg@3126: verticalLayout: center cg@3126: horizontalSpace: 3 cg@3126: verticalSpace: 3 cg@3126: component: cg@3126: (SpecCollection cg@3126: collection: ( cg@3126: (ActionButtonSpec cg@3126: label: 'Terminal in Build Directory' cg@3126: name: 'Button15' cg@3126: activeHelpKey: openTerminal cg@3126: translateLabel: true cg@3126: model: doOpenTerminal cg@3126: useDefaultExtent: true cg@2960: ) cg@3126: ) cg@3126: cg@3126: ) cg@2636: ) cg@3126: ) cg@3126: cg@3126: ) cg@3126: ) cg@2636: ! cg@2636: cg@3068: page7a_checkinSpec cg@3068: "This resource specification was automatically generated cg@3068: by the UIPainter of ST/X." cg@3068: cg@3068: "Do not manually edit this!! If it is corrupted, cg@3068: the UIPainter may not be able to read the specification." cg@3068: cg@3068: " cg@3068: UIPainter new openOnClass:Tools::ProjectBuilderAssistantApplication andSelector:#page7a_checkinSpec cg@3068: Tools::ProjectBuilderAssistantApplication new openInterface:#page7a_checkinSpec cg@3068: " cg@3068: cg@3068: cg@3068: cg@3068: ^ cg@3068: #(FullSpec cg@3068: name: #'page7a_checkinSpec' cg@3068: window: cg@3068: (WindowSpec cg@3068: label: 'Check Into Repository' cg@3068: name: 'Check Into Repository' cg@3068: min: (Point 0 0) cg@3068: bounds: (Rectangle 0 0 679 492) cg@3068: ) cg@3068: component: cg@3068: (SpecCollection cg@3068: collection: ( cg@3068: (HorizontalPanelViewSpec cg@3068: name: 'HorizontalPanel2' cg@3337: layout: (LayoutFrame 10 0 10 0 0 1 44 0) cg@3068: horizontalLayout: leftSpace cg@3068: verticalLayout: center cg@3068: horizontalSpace: 3 cg@3068: verticalSpace: 3 cg@3068: component: cg@3068: (SpecCollection cg@3068: collection: ( cg@3068: (ActionButtonSpec cg@3068: label: 'Checkin...' cg@3126: name: 'CheckinButton' cg@3068: activeHelpKey: openFinder cg@3068: visibilityChannel: osIsOSX cg@3068: translateLabel: true cg@3126: resizeForLabel: true cg@3068: model: doCheckin cg@3068: useDefaultExtent: true cg@3068: ) cg@3068: ) cg@3068: cg@3068: ) cg@3068: ) cg@3068: ) cg@3068: cg@3068: ) cg@3068: ) cg@3068: ! cg@3068: cg@3068: page7b_buildSpec cg@3068: "This resource specification was automatically generated cg@3068: by the UIPainter of ST/X." cg@3068: cg@3068: "Do not manually edit this!! If it is corrupted, cg@3068: the UIPainter may not be able to read the specification." cg@3068: cg@3068: " cg@3126: UIPainter new openOnClass:Tools::ProjectBuilderAssistantApplication andSelector:#page7b_buildSpec cg@3126: Tools::ProjectBuilderAssistantApplication new openInterface:#page7b_buildSpec cg@3068: " cg@3068: cg@3068: cg@3068: cg@3068: ^ cg@3126: #(FullSpec cg@3126: name: #'page7b_buildSpec' cg@3126: window: cg@3126: (WindowSpec cg@3126: label: 'Project Selection' cg@3126: name: 'Project Selection' cg@3126: min: (Point 0 0) cg@3126: bounds: (Rectangle 0 0 679 492) cg@3126: ) cg@3126: component: cg@3126: (SpecCollection cg@3126: collection: ( cg@3126: (FramedBoxSpec cg@3126: label: 'Make Output' cg@3126: name: 'FramedBox3' cg@3337: layout: (LayoutFrame 0 0.0 5 0 4 1.0 -106 1) cg@3126: labelPosition: topLeft cg@3126: translateLabel: true cg@3126: component: cg@3126: (SpecCollection cg@3126: collection: ( cg@3126: (TextEditorSpec cg@3126: name: 'MakeOutputWindow' cg@3126: layout: (LayoutFrame 0 0 0 0 0 1 0 1) cg@3126: activeHelpKey: makeOutput cg@3126: model: makeOutputHolder cg@3126: hasHorizontalScrollBar: true cg@3126: hasVerticalScrollBar: true cg@3126: hasKeyboardFocusInitially: false cg@3337: postBuildCallback: postBuildMakeOutputWindow: cg@3126: viewClassName: 'TextCollector' cg@3126: ) cg@3126: ) cg@3126: cg@3126: ) cg@3126: ) cg@3126: (HorizontalPanelViewSpec cg@3126: name: 'HorizontalPanel1' cg@3337: layout: (LayoutFrame 0 0 -106 1 -2 1 -72 1) cg@3126: horizontalLayout: leftSpace cg@3126: verticalLayout: center cg@3126: horizontalSpace: 3 cg@3126: verticalSpace: 3 cg@3126: component: cg@3126: (SpecCollection cg@3126: collection: ( cg@3126: (ActionButtonSpec cg@3126: label: 'Make All' cg@3126: name: 'Button3' cg@3126: activeHelpKey: makeAll cg@3126: translateLabel: true cg@3126: model: doStartMakeAll cg@3126: enableChannel: startMakeButtonEnabled cg@3126: useDefaultExtent: true cg@3126: ) cg@3126: (ActionButtonSpec cg@3126: label: 'Make APP only' cg@3126: name: 'Button17' cg@3126: activeHelpKey: makeApp cg@3126: visibilityChannel: osIsOSX cg@3126: translateLabel: true cg@3126: model: doStartMakeApp cg@3126: enableChannel: startMakeButtonEnabled cg@3126: useDefaultExtent: true cg@3126: ) cg@3126: (ActionButtonSpec cg@3126: label: 'Make EXE only' cg@3126: name: 'Button5' cg@3126: activeHelpKey: makeExe cg@3126: translateLabel: true cg@3126: model: doStartMakeExe cg@3126: enableChannel: startMakeButtonEnabled cg@3126: useDefaultExtent: true cg@3126: ) cg@3126: (ActionButtonSpec cg@3126: label: 'Quick Make EXE' cg@3126: name: 'Button16' cg@3126: activeHelpKey: makeExeQuick cg@3126: translateLabel: true cg@3126: model: doStartMakeExeQuick cg@3126: enableChannel: startMakeButtonEnabled cg@3126: useDefaultExtent: true cg@3126: ) cg@3126: (ViewSpec cg@3126: name: 'Box1' cg@3126: extent: (Point 20 10) cg@3068: ) cg@3126: (ActionButtonSpec cg@3126: label: 'Stop Make' cg@3126: name: 'Button4' cg@3126: activeHelpKey: stopMake cg@3126: visibilityChannel: stopMakeButtonVisible cg@3126: translateLabel: true cg@3126: model: doStopMake cg@3126: useDefaultExtent: true cg@3126: ) cg@3126: ) cg@3126: cg@3126: ) cg@3126: ) cg@3126: (HorizontalPanelViewSpec cg@3126: name: 'HorizontalPanel2' cg@3337: layout: (LayoutFrame 0 0 -70 1 -2 1 -36 1) cg@3126: horizontalLayout: leftSpace cg@3126: verticalLayout: center cg@3126: horizontalSpace: 3 cg@3126: verticalSpace: 3 cg@3126: component: cg@3126: (SpecCollection cg@3126: collection: ( cg@3337: (LabelSpec cg@3337: label: 'Build Directory:' cg@3337: name: 'Label1' cg@3337: translateLabel: true cg@3337: useDefaultExtent: true cg@3337: ) cg@3126: (ActionButtonSpec cg@3337: label: 'Finder' cg@3126: name: 'Button13' cg@3126: activeHelpKey: openFinder cg@3126: visibilityChannel: osIsOSX cg@3126: translateLabel: true cg@3126: model: doOpenFinder cg@3126: useDefaultExtent: true cg@3126: ) cg@3126: (ActionButtonSpec cg@3337: label: 'Explorer' cg@3126: name: 'Button14' cg@3126: activeHelpKey: openExplorer cg@3126: visibilityChannel: osIsWindows cg@3126: translateLabel: true cg@3126: model: doOpenExplorer cg@3126: useDefaultExtent: true cg@3068: ) cg@3126: (ActionButtonSpec cg@3337: label: 'Browser' cg@3126: name: 'Button11' cg@3126: activeHelpKey: openFileBrowser cg@3126: translateLabel: true cg@3126: model: doBrowseBuildDirectory cg@3126: useDefaultExtent: true cg@3126: ) cg@3126: (ViewSpec cg@3126: name: 'Box2' cg@3126: extent: (Point 20 10) cg@3126: ) cg@3126: (ActionButtonSpec cg@3337: label: 'Clear' cg@3126: name: 'Button12' cg@3126: activeHelpKey: clearBuildDirectory cg@3126: translateLabel: true cg@3126: model: doClearBuildDirectory cg@3126: useDefaultExtent: true cg@3068: ) cg@3126: ) cg@3126: cg@3126: ) cg@3126: ) cg@3126: (HorizontalPanelViewSpec cg@3126: name: 'HorizontalPanel3' cg@3337: layout: (LayoutFrame 0 0 -34 1 -2 1 0 1) cg@3126: horizontalLayout: leftSpace cg@3126: verticalLayout: center cg@3126: horizontalSpace: 3 cg@3126: verticalSpace: 3 cg@3126: component: cg@3126: (SpecCollection cg@3126: collection: ( cg@3126: (ActionButtonSpec cg@3126: label: 'Terminal in Build Directory' cg@3126: name: 'Button15' cg@3126: activeHelpKey: openTerminal cg@3126: translateLabel: true cg@3126: model: doOpenTerminal cg@3126: useDefaultExtent: true cg@3068: ) cg@3126: ) cg@3126: cg@3126: ) cg@3068: ) cg@3126: ) cg@3126: cg@3126: ) cg@3126: ) cg@3068: ! cg@3068: 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@3126: #(FullSpec cg@3126: name: #'page8_deploySpec' cg@3126: window: cg@3126: (WindowSpec cg@3126: label: 'Project Selection' cg@3126: name: 'Project Selection' cg@3126: min: (Point 0 0) cg@3337: bounds: (Rectangle 0 0 520 478) cg@3126: ) cg@3126: component: cg@3126: (SpecCollection cg@3126: collection: ( cg@3126: (FramedBoxSpec cg@3126: label: 'Files for Deployment' cg@3126: name: 'FramedBox3' cg@3126: layout: (LayoutFrame 0 0.0 5 0 4 1.0 0 1) cg@3126: labelPosition: topLeft cg@3126: translateLabel: true cg@3126: component: cg@3126: (SpecCollection cg@3126: collection: ( cg@3126: (SubCanvasSpec cg@3335: name: 'FileBrowserSubCanvas' cg@3337: layout: (LayoutFrame 0 0 0 0 0 1 -34 1) cg@3126: hasHorizontalScrollBar: false cg@3126: hasVerticalScrollBar: false cg@3126: clientHolder: fileBrowserInstance cg@3126: createNewApplication: true cg@3126: createNewBuilder: true cg@3126: ) cg@3126: (HorizontalPanelViewSpec cg@3126: name: 'HorizontalPanel1' cg@3337: layout: (LayoutFrame 0 0 -34 1 -2 1 0 1) cg@3126: horizontalLayout: centerMax cg@3126: verticalLayout: center cg@3126: horizontalSpace: 3 cg@3126: verticalSpace: 3 cg@3126: component: cg@3126: (SpecCollection cg@3126: collection: ( cg@3126: (ActionButtonSpec cg@3337: label: 'Windows Explorer' cg@3126: name: 'Button1' cg@3126: visibilityChannel: osIsWindows cg@3126: translateLabel: true cg@3126: resizeForLabel: true cg@3126: model: doOpenExplorer cg@3337: useDefaultExtent: true cg@2649: ) cg@3126: (ActionButtonSpec cg@3337: label: ' Finder' cg@3126: name: 'Button3' cg@3126: visibilityChannel: osIsOSX cg@3126: translateLabel: true cg@3126: resizeForLabel: true cg@3126: model: doOpenFinder cg@3337: useDefaultExtent: true cg@3126: ) cg@3126: (ActionButtonSpec cg@3337: label: 'Terminal' cg@3126: name: 'Button2' cg@3126: translateLabel: true cg@3126: resizeForLabel: true cg@3126: model: doOpenTerminal cg@3337: useDefaultExtent: true cg@3126: ) cg@3126: ) cg@3126: cg@3126: ) cg@2636: ) cg@3126: ) cg@3126: cg@3126: ) cg@2636: ) cg@3126: ) cg@3126: cg@3126: ) cg@3126: ) 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) cg@2990: usePreferredExtent: true 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 cg@2990: usePreferredHeight: true cg@2990: useDynamicPreferredHeight: true fm@2697: ) fm@2697: ) fm@2697: fm@2697: ) fm@2697: ) fm@2697: ! ! fm@2697: cg@2897: !ProjectBuilderAssistantApplication class methodsFor:'startup'! cg@2897: cg@3337: openOn:aProjectDefinitionOrStartupClass cg@3337: ^ self new openOn:aProjectDefinitionOrStartupClass 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@3339: clearBuildDirectory cg@3339: self halt. cg@3339: ! cg@3339: 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@3004: newAppName isUppercaseFirst ifFalse:[ cg@3004: (Dialog confirm:(resources cg@3004: stringWithCRs:'Class names must start with an uppercase character.\\Change to "%1"?' cg@3004: with:newAppName asUppercaseFirst)) cg@3004: ifFalse:[ cg@3004: ^ self cg@3004: ]. cg@3004: newAppName := newAppName asUppercaseFirst. cg@3004: self newApplicationsName value:newAppName. cg@3004: ]. 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@2900: projectDefinitionType := self projectType. "/ 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@2900: "Modified: / 06-08-2012 / 16:55:54 / 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@3004: newClassName isUppercaseFirst ifFalse:[ cg@3004: (Dialog confirm:(resources cg@3004: stringWithCRs:'Class names must start with an uppercase character.\\Change to "%1"?' cg@3004: with:newClassName asUppercaseFirst)) cg@3004: ifFalse:[ cg@3004: ^ self cg@3004: ]. cg@3004: newClassName := newClassName asUppercaseFirst. cg@3004: self newStartupClassName value:newClassName. cg@3004: ]. 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@3337: |startupClass| cg@3337: cg@3337: startupClass := self projectTypeIsNonGuiApplication cg@3337: ifTrue:[ StandaloneStartupHeadless ] cg@3337: ifFalse:[ StandaloneStartup ]. cg@3337: newStartupClass := startupClass 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@2962: self halt:'unimplemented'. 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@3485: SystemBrowser default cg@2668: openInClass:appClass class selector:#windowSpec. cg@2659: ]. cg@3485: cg@3485: "Modified: / 01-09-2017 / 14:23:06 / cg" cg@2636: ! cg@2636: cg@2906: doBrowseBuildDirectory cg@2906: cg@2906: cg@2959: projectBuilder isNil ifTrue:[ self getProjectBuilder ]. cg@2959: projectBuilder buildDirectory isNil ifTrue:[ cg@2959: Dialog information:'No build directory yet'. cg@2959: ^ self cg@2959: ]. cg@3480: FileBrowser default cg@2906: openIn:projectBuilder packageBuildDirectory asFilename cg@2906: "/ projectBuilder packageBuildDirectory asFilename openExplorer cg@2906: cg@2906: "Created: / 20-08-2012 / 17:05:54 / cg" cg@3480: "Modified: / 01-09-2017 / 14:06:28 / cg" cg@2906: ! cg@2906: cg@2676: doBrowseProject cg@2676: cg@2676: cg@3485: SystemBrowser default openOnPackage:selectedProjectDefinition package. cg@3485: cg@3485: "Modified: / 01-09-2017 / 14:23:09 / cg" 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@3485: SystemBrowser default cg@2659: openInClass:defClass class selector:#classNamesAndAttributes. cg@2659: ]. cg@3485: cg@3485: "Modified: / 01-09-2017 / 14:23:12 / cg" cg@2659: ! cg@2659: cg@2959: doBrowseProjectDefinitionClassForPrereqs cg@2959: cg@2959: cg@2959: |defClass| cg@2959: cg@2959: self hasProjectSelected ifTrue:[ cg@2959: defClass := self selectedProjectDefinition. cg@3485: SystemBrowser default cg@3342: openInClass:defClass class selector:#referencedPreRequisites "/ #mandatoryPreRequisites. cg@2959: ]. cg@3485: cg@3485: "Modified: / 01-09-2017 / 14:23:15 / cg" cg@2959: ! cg@2959: 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@3485: SystemBrowser default cg@2676: openInClass:startupClass class selector:#main:. cg@2659: ]. cg@3485: cg@3485: "Modified: / 01-09-2017 / 14:23:18 / cg" cg@2659: ! cg@2659: cg@3068: doCheckin cg@3068: cg@3068: cg@3068: |package utilities| cg@3068: cg@3068: package := selectedProjectDefinition package. cg@3068: utilities := (AbstractSourceCodeManager managerForPackage:package) utilities. cg@3068: cg@3068: AbortAllOperationRequest catch:[ cg@3068: self withWaitCursorDo:[ cg@3068: utilities cg@3068: checkinPackage:package cg@3068: classes:true cg@3068: extensions:true cg@3068: buildSupport:true cg@3068: askForMethodsInOtherPackages:true cg@3068: ] cg@3068: ] cg@3068: ! cg@3068: cg@2917: doClearBuildDirectory cg@2917: cg@2917: cg@2928: projectBuilder isNil ifTrue:[ self getProjectBuilder ]. cg@2928: projectBuilder buildDirectory notNil ifTrue:[ cg@2929: self withWaitCursorDo:[ cg@2929: projectBuilder packageBuildDirectory asFilename recursiveRemove cg@2929: ] cg@2928: ]. cg@2917: cg@2917: "Created: / 05-09-2012 / 10:35:54 / cg" cg@2917: ! cg@2917: 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@2676: doOpenExplorer cg@2959: projectBuilder isNil ifTrue:[ self getProjectBuilder ]. cg@2959: projectBuilder buildDirectory isNil ifTrue:[ cg@2959: Dialog information:'No build directory yet'. cg@2959: ^ self cg@2959: ]. cg@2899: projectBuilder packageBuildDirectory asFilename openExplorer cg@2899: cg@2899: "Modified: / 21-07-2012 / 12:29:21 / cg" cg@2676: ! cg@2676: cg@2959: doOpenFinder cg@2959: projectBuilder isNil ifTrue:[ self getProjectBuilder ]. cg@2959: projectBuilder buildDirectory isNil ifTrue:[ cg@2959: Dialog information:'No build directory yet'. cg@2959: ^ self cg@2959: ]. cg@2959: projectBuilder packageBuildDirectory asFilename openFinder cg@2959: cg@2959: "Modified: / 21-07-2012 / 12:29:21 / cg" cg@2674: ! cg@2674: cg@2960: doOpenTerminal cg@2960: projectBuilder isNil ifTrue:[ self getProjectBuilder ]. cg@2960: projectBuilder buildDirectory isNil ifTrue:[ cg@2960: Dialog information:'No build directory yet'. cg@2960: ^ self cg@2960: ]. cg@2960: projectBuilder packageBuildDirectory asFilename openTerminal cg@2960: ! cg@2960: cg@2959: doStartMake:whichTarget 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@2968: self runBuildProcess:whichTarget 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@2959: doStartMakeAll cg@2959: cg@2959: cg@2959: self doStartMake:'all' cg@2959: ! cg@2959: cg@3126: doStartMakeApp cg@3126: cg@3126: cg@3126: self doStartMake:'app' cg@3126: ! cg@3126: cg@2959: doStartMakeExe cg@2959: cg@2959: cg@2959: self doStartMake:'exe' cg@2959: ! cg@2959: cg@2973: doStartMakeExeQuick cg@2973: cg@2973: cg@2973: self doStartMake:'exeQuick' cg@2973: ! cg@2973: cg@2676: doStopMake cg@2676: cg@2676: cg@2676: |p| cg@2646: cg@2676: (p := makeProcess) notNil ifTrue:[ cg@2676: makeProcess := nil. cg@2929: self withWaitCursorDo:[ cg@2929: p terminate. cg@2929: p waitUntilTerminated. cg@2929: ]. cg@2676: makeOutputWindow endEntry. cg@2676: makeOutputWindow cr. cg@3558: makeOutputWindow nextPutLine:('Make Canceled' withColor:Color white on:Color red). cg@2676: makeOutputWindow endEntry. cg@2676: ]. cg@2929: cg@3508: "Modified: / 28-11-2017 / 17:10:15 / cg" cg@2646: ! cg@2646: cg@2913: fetchSelectedProject cg@2913: |selectedProjectIndex| cg@2913: cg@2913: selectedProjectIndex := self selectedProjectIndexHolder value. cg@2913: (selectedProjectIndex ? 0) == 0 ifTrue:[ cg@2913: selectedProjectDefinition := nil. cg@2913: ] ifFalse:[ cg@2913: selectedProjectDefinition := self listOfMatchingProjects value at:(selectedProjectIndex). cg@2913: ]. cg@2913: self hasProjectSelectedHolder value:(selectedProjectDefinition notNil). cg@2913: cg@2913: "Created: / 04-09-2012 / 09:52:32 / cg" cg@2913: ! cg@2913: cg@2928: getProjectBuilder cg@2928: projectBuilder := ProjectBuilder new. cg@2928: projectBuilder package:(selectedProjectDefinition package). cg@2928: projectBuilder usedCompilerForBuild:(usedCompilerHolder value). cg@2928: ^ projectBuilder cg@2928: cg@2928: "Created: / 26-09-2012 / 20:57:32 / cg" cg@2928: ! cg@2928: 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@3631: |msg| cg@3631: cg@3631: (msg := ex messageText) notNil ifTrue:[ cg@2646: makeOutputWindow endEntry. cg@2646: makeOutputWindow cr. cg@3631: makeOutputWindow nextPutLine:( cg@3631: "/ msg withColor:Color white on:Color blue cg@3631: msg withColor:Color blue cg@3631: ). cg@2646: makeOutputWindow endEntry. cg@2687: ]. cg@2646: ex proceed. cg@2646: ] do:[ cg@2928: self getProjectBuilder. cg@2973: projectBuilder makeExeOnly:((what = 'exe') or:[what = 'exeQuick']). cg@3126: projectBuilder makeAppOnly:(what = 'app'). cg@2973: projectBuilder makeQuick:(what = 'exeQuick'). cg@2674: cg@2674: Error handle:[:ex | cg@3309: ex creator = MessageNotUnderstood ifTrue:[ex reject]. cg@3309: cg@2674: makeOutputWindow endEntry. cg@2674: makeOutputWindow cr. cg@3631: makeOutputWindow nextPutLine:( cg@3631: ex description withColor:Color white on:Color red cg@3631: "/ ex description withColor:Color red darkened cg@3631: ). cg@2674: makeOutputWindow endEntry. cg@2959: Debugging == true ifTrue:[ ex reject ]. sr@2682: ex proceed. cg@2674: ] do:[ cg@2674: projectBuilder buildWithColorizedOutputTo:makeOutputWindow. cg@2674: ]. cg@2646: ]. cg@2874: cg@2959: " cg@2959: Debugging := true. cg@2959: Debugging := false. cg@2959: " cg@2959: cg@3309: "Modified: / 07-06-2016 / 11:00:01 / cg" cg@3631: "Modified (comment): / 29-12-2018 / 12:51:51 / Claus Gittinger" 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 cg@2913: self fetchSelectedProject. cg@2676: cg@2676: self updateComment. cg@2676: self updateListOfApplicationsInProject. cg@2636: self updateButtonEnableState. cg@2913: cg@2913: "Modified: / 04-09-2012 / 09:52:43 / cg" 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@3008: Class packageQuerySignal cg@3008: answer:selectedProjectDefinition package cg@3008: do:[ cg@3008: SmalltalkCodeGeneratorTool cg@3008: compile:(selectedProjectDefinition startupClassName_codeFor:(selectedStartupClass name)) cg@3008: forClass:selectedProjectDefinition theMetaclass cg@3008: inCategory:'description - startup'. cg@3008: ] 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@3339: execuableNameVisible cg@3339: ^ self projectTypeIsNonGuiApplication cg@3339: ! cg@3339: cg@3339: executableNameHolder cg@3651: ^ builder nilValueAspectFor:#executableNameHolder cg@3651: cg@3651: "Modified: / 09-03-2019 / 22:00:43 / Claus Gittinger" cg@3339: ! cg@3339: 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@2919: "Modified: / 05-09-2012 / 19:10:24 / 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@2910: nameOfUsedCompilerSuiteHolder cg@2910: cg@2910: cg@2910: nameOfUsedCompilerSuiteHolder isNil ifTrue:[ cg@2910: nameOfUsedCompilerSuiteHolder := nil asValue. cg@2910: ]. cg@2910: ^ nameOfUsedCompilerSuiteHolder. cg@2910: cg@2910: "Created: / 03-09-2012 / 19:32:27 / cg" cg@2910: ! cg@2910: cg@2676: newApplicationsName cg@2676: cg@2676: cg@2676: "automatically generated by UIPainter ..." cg@2676: cg@2676: newApplicationsName isNil ifTrue:[ cg@2676: newApplicationsName := ValueHolder new. 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: |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@2959: osIsOSX cg@2968: ^ OperatingSystem isOSXlike cg@2959: ! cg@2959: cg@3126: osIsUnix cg@3126: ^ OperatingSystem isUNIXlike cg@3126: ! cg@3126: cg@2959: osIsWindows cg@2959: ^ OperatingSystem isMSWINDOWSlike cg@2959: ! cg@2959: 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: selectedApplicationsComment isNil ifTrue:[ cg@2636: selectedApplicationsComment := '' asValue. 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@2913: usedCompilerHolder value:(LastUsedCompiler ? ProjectBuilder defaultUsedCompiler). cg@2724: usedCompilerHolder onChangeSend:#checkCompilerAvailability to:self. cg@2681: ]. cg@2681: ^ usedCompilerHolder. cg@2874: cg@2913: "Modified: / 04-09-2012 / 09:43:20 / 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@3337: openOn:aProjectDefinitionOrStartupClass cg@3337: |type "apps" projectDefinitionClass startupClass pageToGo| cg@2897: cg@2897: self allButOpen. cg@3337: (aProjectDefinitionOrStartupClass inheritsFrom:StandaloneStartup) ifTrue:[ cg@3337: startupClass := aProjectDefinitionOrStartupClass. cg@3337: type := ProjectDefinition nonGuiApplicationType. cg@3337: projectDefinitionClass := startupClass projectDefinitionClass. cg@3337: (projectDefinitionClass startupClass == startupClass) ifFalse:[ cg@3337: self halt. cg@3337: ]. cg@3337: ] ifFalse:[ cg@3337: projectDefinitionClass := aProjectDefinitionOrStartupClass. cg@3337: projectDefinitionClass isFolderForProjectsDefinition ifFalse:[ cg@3337: projectDefinitionClass isLibraryDefinition ifTrue:[ cg@3337: type := ProjectDefinition libraryType cg@3337: ] ifFalse:[ cg@3337: projectDefinitionClass isGUIApplication ifTrue:[ cg@3337: type := ProjectDefinition guiApplicationType. cg@3337: startupClass := projectDefinitionClass startupClass cg@3337: ] ifFalse:[ cg@3337: type := ProjectDefinition nonGuiApplicationType. cg@3337: startupClass := projectDefinitionClass startupClass cg@3337: ] cg@3337: ]. cg@3337: ]. cg@2897: ]. cg@2897: self projectTypeHolder value:type. cg@2897: self hideSTXProjects value:false. cg@3337: selectedProjectDefinition := projectDefinitionClass. cg@3337: self selectedProjectIndexHolder value:(self listOfMatchingPackageIds value indexOf:projectDefinitionClass package). cg@2897: self hasProjectSelectedHolder value:true. cg@2897: cg@2988: pageToGo := 2. cg@3335: (type == ProjectDefinition guiApplicationType) ifTrue:[ cg@2988: pageToGo := 3. cg@3337: startupClass notNil ifTrue:[ cg@2899: self updateListOfStartupClassesInProject. cg@2897: selectedStartupClass := startupClass. cg@2899: self selectedStartupClassIndexHolder value:(self listOfStartupClassesInProject value indexOf:startupClass). cg@2899: pageToGo := 5. cg@2897: ]. cg@3335: "/ apps := (aProjectDefinitionClass classes select:[:cls | cls isKindOf:ApplicationModel]) cg@2897: ]. cg@3335: (type == ProjectDefinition nonGuiApplicationType) ifTrue:[ cg@2988: pageToGo := 4. cg@3337: startupClass notNil ifTrue:[ cg@2988: self updateListOfStartupClassesInProject. cg@2988: selectedStartupClass := startupClass. cg@2988: self selectedStartupClassIndexHolder value:(self listOfStartupClassesInProject value indexOf:startupClass). cg@2988: pageToGo := 5. cg@2988: ]. cg@2988: ]. cg@2899: self gotoPage:pageToGo. 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@3437: self selectedProjectIndexHolder value:(self listOfMatchingPackageIds value 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@3437: "Modified: / 11-04-2017 / 09:40:15 / cg" cg@2897: ! cg@2897: cg@2676: postBuildMakeOutputWindow:aView cg@2917: makeOutputWindow := aView. cg@2917: makeOutputWindow lineLimit:10000. cg@2917: cg@2917: "Modified: / 05-09-2012 / 11:11:45 / cg" 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@2919: postBuildWarnMessageView:aView cg@2919: aView font:(Label defaultFont). cg@2919: cg@2919: "Created: / 05-09-2012 / 19:34:29 / cg" cg@2919: ! cg@2919: 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@2993: selectedProjectDefinition cg@2993: updateContentsMethodsCodeUsingCompiler:SmalltalkCodeGeneratorTool cg@2993: ignoreOldDefinition:true. cg@2993: cg@2993: "/ Class packageQuerySignal answer:(selectedProjectDefinition package) cg@2993: "/ do:[ cg@2993: "/ selectedProjectDefinition cg@2993: "/ forEachContentsMethodsCodeToCompileDo:[:code :category | cg@2993: "/ SmalltalkCodeGeneratorTool cg@2993: "/ compile:code cg@2993: "/ forClass:selectedProjectDefinition theMetaclass cg@2993: "/ inCategory:category. cg@2993: "/ ] cg@2993: "/ ignoreOldDefinition:true cg@2993: "/ ]. 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@2915: self infoHolder value:'Must be either library or have a startup class'. cg@2857: ^ false cg@2857: ]. cg@2857: prj := self selectedProjectDefinition. cg@2975: prj isLibraryDefinition ifFalse:[ cg@2975: ([prj startupClassName] on:Error do:nil) notNil ifFalse:[ cg@2975: self infoHolder value:'Must have a startup class'. cg@2975: ^ false cg@2975: ]. cg@2975: ([prj startupSelector] on:Error do:nil) notNil ifFalse:[ cg@2975: self infoHolder value:'Must have a startup selector'. cg@2864: ^ false cg@2864: ]. cg@2975: (prj class compiledMethodAt:#startupSelector) isNil ifTrue:[ cg@2975: self infoHolder value:('Inherited startup selector is "%1"' bindWith:prj startupSelector). cg@2975: impl := prj class whichClassImplements:#startupSelector. cg@2975: impl isNil ifTrue:[ cg@2975: self infoHolder value:('Inherited startup selector (%1) not implemented in %2' cg@2975: bindWith:prj startupSelector cg@2975: with:prj class name). cg@2975: ^ false cg@2975: ]. cg@2872: ]. cg@2975: (mthd := prj class compiledMethodAt:#startupClassName) package == prj package ifFalse:[ cg@2897: mthd package == PackageId noProjectID ifFalse:[ cg@2975: self infoHolder value:('Startup class method (#startupClassName) of %3 must be in package "%1" (is in "%2")' cg@2872: bindWith:prj package cg@2975: with:(prj class compiledMethodAt:#startupClassName) package cg@2872: with:prj class name). cg@2872: ^ false cg@2975: ]. cg@2975: ]. cg@2975: (mthd := prj class compiledMethodAt:#startupSelector) notNil ifTrue:[ cg@2975: mthd package == prj package ifFalse:[ cg@2975: mthd package == PackageId noProjectID ifFalse:[ cg@2975: self infoHolder value:('Startup class method (#startupSelector) of %3 must be in package "%1" (is in "%2")' cg@2975: bindWith:prj package cg@2975: with:mthd package cg@2975: with:prj class name). cg@2975: ^ false cg@2975: ] cg@2975: ]. cg@2857: ]. cg@2975: cls := Smalltalk classNamed:prj startupClassName. cg@2975: cls isNil ifTrue:[ cg@2975: self infoHolder value:('Startup class "%1" does not exist' bindWith:prj startupClassName). cg@2975: ^ false. cg@2975: ]. cg@2975: (cls implements:(prj startupSelector)) ifFalse:[ cg@2975: (cls respondsTo:(prj startupSelector)) ifFalse:[ cg@2975: self infoHolder value:('Startup class "%1" does not implement startup selector "%2"' cg@2975: bindWith:cls name cg@2975: with:prj startupSelector). cg@2975: ^ false cg@2975: ]. cg@2865: ]. cg@2864: ]. cg@2915: self infoHolder value:nil. cg@2857: ^ true. cg@2857: cg@2915: "Modified: / 04-09-2012 / 10:29:43 / cg" cg@2659: ! cg@2659: cg@2676: canEnterDeploy cg@2857: self hasProjectBuilder ifFalse:[ cg@2915: self infoHolder value:'Nothing to deploy (please build first)'. cg@2857: ^ false cg@2857: ]. cg@2915: self infoHolder value:nil. cg@2857: ^ true cg@2857: cg@2915: "Modified: / 04-09-2012 / 10:30:18 / 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: fm@2696: projectTypeIsGuiApplication cg@3337: ^ self projectType == ProjectDefinition guiApplicationType cg@2897: cg@2897: "Modified: / 20-07-2012 / 13:29:59 / cg" fm@2696: ! fm@2696: fm@2696: projectTypeIsLibrary cg@3337: ^ self projectType == ProjectDefinition libraryType cg@2897: cg@2897: "Modified: / 20-07-2012 / 13:29:24 / cg" fm@2696: ! fm@2696: cg@3337: projectTypeIsNonGuiApplication cg@3337: ^ self projectType == ProjectDefinition nonGuiApplicationType cg@3337: ! cg@3337: fm@2696: projectTypeIsNotLibrary fm@2696: ^ self projectTypeIsLibrary not cg@2656: ! ! cg@2656: cg@2636: !ProjectBuilderAssistantApplication methodsFor:'specs'! cg@2636: cg@2676: assistantSpec cg@3335: |specs| cg@3335: cg@3335: specs := OrderedCollection new. cg@3335: specs add: cg@3335: #( AssistantPageSpec cg@3335: pageTitle: 'Project Type Selection' cg@3335: windowSpecSelector: page1_projectTypeSelectionSpec cg@3335: enterCallbackSelector: updateListOfMatchingProjects cg@3342: infoText: 'Define the type of project you are about to build.

cg@3342: Choose GUI-application for a program which will show a graphical user interface, cg@3342:
non-GUI-program for a console program, cg@3342:
and library, for a framework to be cg@3342: used by other programs (a loadable shared binary class library).' cg@3335: ) decodeAsLiteralArray. cg@3335: cg@3335: specs add: cg@3335: #(AssistantPageSpec cg@3335: pageTitle: 'ProjectDefinition Selection' cg@3335: windowSpecSelector: page2_projectSelectionSpec cg@3335: enterCallbackSelector: updateListOfMatchingProjectsAndProjectIDs cg@3335: leaveCallbackSelector: fetchAttributesFromProjectDefinition cg@3342: infoText: 'Choose either an existing project definition or create a new one. cg@3342: These are subclasses of ProjectDefinition and define the type, name and contents of a project. cg@3336:

cg@3342: Please enter a project-identifier which must have a well defined format in Smalltalk/X. cg@3342: Notice that the ID directly reflects the project''s location within the source code repository cg@3342: (module:directoryPath). cg@3621:
If in doubt, use "<yourname>:demos/xxx_n". cg@3621:
Press "Create" to generate a typical definition.' cg@3335: ) decodeAsLiteralArray. cg@3335: cg@3335: specs add: cg@3335: #(AssistantPageSpec cg@3335: pageTitle: 'Startup Application Selection' cg@3335: windowSpecSelector: page3_applicationSelectionSpec cg@3335: isEnabledQuerySelector: #projectTypeIsGuiApplication cg@3335: canEnterQuerySelector: #canEnterApplicationSelection cg@3335: enterCallbackSelector: updateListOfApplicationsInProject cg@3336: infoText: 'Choose an existing application or create a new one. cg@3336: These are subclasses of ApplicationModel and define the GUI and control flow inside the application. cg@3621: Can also be left blank if the startup class does it all (stx build). cg@3621:
Press "Create" to get a simple hello-world application to start with.' cg@3335: ) decodeAsLiteralArray. cg@3335: cg@3335: specs add: cg@3335: #(AssistantPageSpec cg@3335: pageTitle: 'Startup Class Selection' cg@3335: windowSpecSelector: page4_startupClassSelectionSpec cg@3335: isEnabledQuerySelector: #projectTypeIsNotLibrary cg@3335: canEnterQuerySelector: #canEnterStartupClassSelection cg@3335: enterCallbackSelector: updateListOfStartupClassesInProject cg@3336: infoText: 'Choose an existing startup-class or create a new one. cg@3342:

These are subclasses of StandaloneStartup and contain the main function, cg@3342: which either starts the application (in case of a GUI application) cg@3342: or directly performs the program''s task (in case of a non-GUI console program).
cg@3342: Command line arguments are usually interpreted there. cg@3342:

Do not use one of the "StandAloneStartup"-classes, which you may find in the system: cg@3342: these are abstract, and to be used as superclass of your concrete startup. cg@3342:

For a quick demo, enter a reasonable name, and press the "Create" button.' cg@3335: ) decodeAsLiteralArray. cg@3335: cg@3335: specs add: cg@3335: #(AssistantPageSpec cg@3335: pageTitle: 'Specify Contents' cg@3335: windowSpecSelector: page5_specifyIncludedClasses cg@3335: enterCallbackSelector: enterContentsSpecification cg@3335: canEnterQuerySelector: #canEnterContentsSelection cg@3342: infoText: 'Check the list of other classes which are to be included. cg@3342: These are the classes which comprise your application cg@3342: (excluding any libraries, which are specified in the next step). cg@3336:

cg@3342: Press "Update List" to search for and include all classes of the package. cg@3342:

cg@3342: Press "Browse" to edit the contents manually (this opens an editor on the defining method cg@3342: in your project definition class).' cg@3335: ) decodeAsLiteralArray. cg@3335: cg@3335: specs add: cg@3335: #(AssistantPageSpec cg@3335: pageTitle: 'Specify Prerequisites' cg@3335: windowSpecSelector: page5b_specifyPrerequisitePackages cg@3335: enterCallbackSelector: enterPrerequisitesSpecification cg@3335: canEnterQuerySelector: #canEnterPrerequisitesSelection cg@3342: infoText: 'Check the list of packages/libraries which are needed as prerequisites. cg@3342: These are required class libraries which should be packaged together with the application, cg@3342: and will be present in the deployed binary. cg@3342:

cg@3342: Non-GUI programs will typically only require the basic class library cg@3342: and libcomp (the parser and bytecode compiler) to be read startup scripts and patches. cg@3336:

cg@3342: GUI programs will require a number of view- and widget support classes, which contain the cg@3342: graphical user interface support classes. cg@3342:

cg@3342: Press "Update" to search for and include prerequisites. cg@3342:

cg@3342: "Browse" to edit the list manually.' cg@3335: ) decodeAsLiteralArray. cg@3335: cg@3335: specs add: cg@3335: #(AssistantPageSpec cg@3335: pageTitle: 'Specify Project Attributes' cg@3335: windowSpecSelector: page6a_specifyProjectAttributes cg@3336: infoText: 'Define additional attributes. cg@3336: These will be shown during the installation of the deployed package and affect the name of the deployed self-installable file.' cg@3335: enterCallbackSelector: updateProjectAttributes cg@3335: leaveCallbackSelector: #rememberProjectAttributes cg@3335: ) decodeAsLiteralArray. cg@3335: cg@3335: specs add: cg@3335: #(AssistantPageSpec cg@3335: pageTitle: 'Specify Build Directory' cg@3335: windowSpecSelector: page6b_specifyBuildDirectorySpec cg@3342: infoText: 'Define where the build-process is to be performed and which compiler to use. cg@3342:

All generated files are created below that directory. cg@3342:

After deployment, the build directory is no longer needed cg@3342: (but you can keep it for a faster compile the next time). cg@3342:

Normally, the default values are ok, and there is no need to change anything here.' cg@3335: enterCallbackSelector: #checkCompilerAvailability cg@3335: leaveCallbackSelector: #rememberUsedCompiler cg@3335: ) decodeAsLiteralArray. cg@3335: cg@3335: specs add: cg@3335: #(AssistantPageSpec cg@3335: pageTitle: 'Check Into Source Repository' cg@3335: windowSpecSelector: page7a_checkinSpec cg@3335: enterCallbackSelector: #checkSourceCodeManagerType cg@3342: infoText: 'Optionally check the package''s source and build-support files into the cg@3342: source code repository. cg@3342:

You can skip this for a quick test (a local build), cg@3342: or if you do not have/want a central repository.' cg@3335: ) decodeAsLiteralArray. cg@3335: cg@3335: specs add: cg@3335: #(AssistantPageSpec cg@3335: pageTitle: 'Build' cg@3335: windowSpecSelector: page7b_buildSpec cg@3335: canEnterQuerySelector: #canEnterBuild cg@3335: enterCallbackSelector: #restoreMakeOutputsContents cg@3335: leaveCallbackSelector: #rememberMakeOutputsContents cg@3335: infoText: 'Start the build-process. This will create an isolated build directory, cg@3342: and run "make" there to compile all required classes. cg@3335:

cg@3342: On Windows, it will use "nsis" to generate a self-installable executable, cg@3335: and you must have the compiler (borland-bcc, visual-c or mingw) and NullSoft NSIS packages installed for this to work. cg@3342: Without NSIS, you can "zip" the folder where the "exe" is generated cg@3342: and unzip on a target machine. cg@3335:

cg@3335: On OS X, it will generate a "dmg" for deployment. You should have XCode or the "gcc" tool chain installed. cg@3335:

cg@3335: On Linux, an installable package will be generated. You should have the development support packages installed (gcc, Xlib etc.). cg@3335:

cg@3335: To try the application, open an Explorer/Finder on the directory and double click on the executable. cg@3335: Alternatively, open a command window and type the name of the executable there. cg@3335: Sorry, but double-click in the ST/X file browser does not work.' cg@3335: ) decodeAsLiteralArray. cg@3335: cg@3335: self projectTypeIsLibrary ifTrue:[ cg@3335: specs add: cg@3335: #(AssistantPageSpec cg@3335: pageTitle: 'Deploy' cg@3335: windowSpecSelector: page8_deploySpec cg@3335: canEnterQuerySelector: #canEnterDeploy cg@3335: enterCallbackSelector: enterDeploySpecification cg@3335: infoText: 'Find the generated binary class library file here. cg@3335: Because this is a library package (i.e. no application package), cg@3335: there is no deployable installer generated, just the binary (.so / .dll).' cg@3335: ) decodeAsLiteralArray. cg@3335: ] ifFalse:[ cg@3335: specs add: cg@3335: #(AssistantPageSpec cg@3335: pageTitle: 'Deploy' cg@3335: windowSpecSelector: page8_deploySpec cg@3335: canEnterQuerySelector: #canEnterDeploy cg@3335: enterCallbackSelector: enterDeploySpecification cg@3335: infoText: 'Find the installer-file to be deployed (or test-run the executable). cg@3335: You can open an Explorer/Finder there to copy the files for deployment. cg@3335: After that, the build directory is no longer needed. cg@3335: However, you can keep it for a faster compile the next time.' cg@3335: ) decodeAsLiteralArray. cg@3335: ]. cg@3335: ^ specs. cg@3335: cg@3335: "Modified: / 04-09-2012 / 09:49:50 / cg" cg@2676: ! ! cg@2676: cg@2676: !ProjectBuilderAssistantApplication methodsFor:'update'! cg@2676: cg@2724: checkCompilerAvailability cg@2919: |cmd suite warnMsg1 warnMsg2 sep usedCompiler| cg@2724: cg@2724: cmd := 'cc'. cg@2724: warnMsg1 := warnMsg2 := ''. cg@2724: cg@2919: usedCompiler := self usedCompilerHolder value. cg@2919: usedCompiler = 'bcc' ifTrue:[ cg@2724: cmd := 'bcc32'. cg@3005: ] ifFalse:[ cg@3005: usedCompiler = 'vc' ifTrue:[ cg@3005: cmd := 'cl'. cg@3005: warnMsg1 := 'Due to bugs in this C-compiler, some classes may not be compilable.'. cg@3005: ] ifFalse:[ cg@3005: usedCompiler = 'lcc' ifTrue:[ cg@3005: cmd := 'lcc'. cg@3005: warnMsg1 := 'The LCC C-compiler suite is not officially supported.'. cg@3005: ] ifFalse:[ cg@3005: usedCompiler = 'tcc' ifTrue:[ cg@3005: cmd := 'tcc'. cg@3005: OperatingSystem isMSWINDOWSlike ifTrue:[ cg@3005: warnMsg1 := 'The Tiny C-compiler suite is not yet supported (linkage).'. cg@3005: ]. cg@3005: ] ifFalse:[ cg@3005: usedCompiler = 'gcc' ifTrue:[ cg@3005: cmd := 'gcc'. cg@3005: ] ifFalse:[ cg@3005: cmd := usedCompiler. cg@3005: ]. cg@3005: ] cg@3005: ] cg@3005: ] cg@2724: ]. cg@2919: cg@2922: suite := ProjectBuilder suiteNameOfCompiler:(self usedCompilerHolder value). cg@2910: self nameOfUsedCompilerSuiteHolder value:suite. cg@2724: cg@2724: (OperatingSystem canExecuteCommand:cmd) ifFalse:[ cg@2913: warnMsg2 := cg@2724: 'The "%1"-command seems to be not in your path. cg@2724: Please ensure that you installed the cg@2910: "%2" compiler suite correctly. cg@3007: (However, the makefiles might know where to find the compiler) cg@3007: ' 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@2910: cg@2922: "Modified: / 06-09-2012 / 15:58:58 / cg" cg@2724: ! cg@2724: cg@3126: checkSourceCodeManagerType cg@3126: |button scm package| cg@3126: cg@3126: button := self builder componentAt:'CheckinButton'. cg@3126: cg@3126: package := selectedProjectDefinition package. cg@3126: scm := AbstractSourceCodeManager managerForPackage:package. cg@3126: scm isNil ifTrue:[ cg@3126: scm := selectedApplication sourceCodeManager. cg@3126: scm isNil ifTrue:[ cg@3126: scm := SourceCodeManager cg@3126: ]. cg@3126: ]. cg@3126: scm isNil ifTrue:[ cg@3126: button disable cg@3126: ] ifFalse:[ cg@3126: button label:(resources string:'Checkin (%1)...' with:scm managerTypeName) cg@3126: ]. cg@3126: ! cg@3126: cg@2926: delayedUpdate:something with:anArgument from:changedObject cg@2926: changedObject == Smalltalk ifTrue:[ cg@2926: (something == #newClass cg@2926: or:[something == #classRemove cg@2926: or:[something == #projectOrganization]]) ifTrue:[ cg@2926: self updateListOfMatchingProjects. cg@2926: self updateListOfNewProjectsName. cg@2926: ^ self. cg@2926: ]. cg@2926: ^ self. cg@2926: ]. cg@2926: cg@2926: "Created: / 10-09-2012 / 14:07:47 / cg" cg@2926: ! cg@2926: 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@3335: enterDeploySpecification cg@3335: |fileBrowserCanvas fileBrowser| cg@3335: cg@3336: self projectTypeIsLibrary ifTrue:[ cg@3336: fileBrowserCanvas := self builder componentAt:'FileBrowserSubCanvas'. cg@3336: fileBrowser := fileBrowserCanvas application. sv@3559: fileBrowser filterModel value:('*.' , ObjectFileLoader sharedLibrarySuffix). cg@3336: ]. cg@3335: ! cg@3335: 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@2913: fetchAttributesFromProjectDefinition cg@2913: self fetchSelectedProject. cg@2913: selectedProjectDefinition notNil ifTrue:[ cg@2913: self productNameHolder value: selectedProjectDefinition productName. cg@2913: self companyNameHolder value: selectedProjectDefinition companyName. cg@2913: ]. cg@2913: cg@2913: "Created: / 04-09-2012 / 09:50:46 / cg" cg@2913: ! cg@2913: 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@2913: rememberUsedCompiler cg@2913: LastUsedCompiler := self usedCompilerHolder value. cg@2913: cg@2913: "Created: / 04-09-2012 / 09:45:42 / cg" cg@2913: ! cg@2913: 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@2926: self enqueueDelayedUpdate:something with:anArgument from:changedObject. cg@2676: ^ self. cg@2676: ]. cg@2676: ^ self. cg@2676: ]. cg@2676: super update:something with:anArgument from:changedObject cg@2926: cg@2926: "Modified: / 10-09-2012 / 14:08:17 / cg" 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@3295: comment := 'Application has no comment' allItalic withColor:Color lightGray. cg@2676: ]. cg@2676: ] ifFalse:[ cg@3295: comment := 'Please select an Application' allItalic withColor:Color lightGray. 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@3295: comment := 'Project has no comment' allItalic withColor:Color lightGray. cg@2676: ]. cg@2676: ] ifFalse:[ cg@3295: comment := 'Please select a Project' allItalic withColor:Color lightGray. 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@3002: cg@3002: "/ auto select first application cg@3002: applicationClasses size == 1 ifTrue:[ cg@3002: self selectedApplicationIndexHolder value:1. cg@3002: ]. 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@2962: self halt:'oops - unknown projectType'. 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: cg@2907: updateListOfMatchingProjectsAndProjectIDs cg@2907: self updateListOfMatchingProjects. cg@2907: self updateListOfNewProjectsName. cg@2907: cg@2907: "Created: / 20-08-2012 / 19:33:12 / cg" cg@2907: ! cg@2907: fm@2697: updateListOfNewProjectsName fm@2697: |loadedProjectIDsWithoutProjectDefinition| fm@2697: cg@3257: loadedProjectIDsWithoutProjectDefinition := cg@3257: Smalltalk allLoadedPackageIDs cg@3257: select:[:eachPackageID | cg@3257: eachPackageID ~= PackageId noProjectID cg@3257: and:[ (ProjectDefinition definitionClassForPackage: eachPackageID) isNil ]. cg@3257: ]. cg@2907: loadedProjectIDsWithoutProjectDefinition := loadedProjectIDsWithoutProjectDefinition asOrderedCollection. cg@3232: loadedProjectIDsWithoutProjectDefinition cg@3232: addFirst:(UserPreferences current usersModuleName "OperatingSystem getLoginName",':','demos','/','demo1'). fm@2697: self listOfNewProjectsName value:loadedProjectIDsWithoutProjectDefinition. cg@2907: cg@2907: "Modified: / 20-08-2012 / 19:31:35 / cg" fm@2697: ! fm@2697: cg@2872: updateListOfPrerequisitesInProject sv@2965: self listOfPrerequisitesInProject value:(selectedProjectDefinition effectivePreRequisites). 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: sv@3429: startUpClassName := [ selectedProjectDefinition startupClassName ] on:Error do: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. sv@3429: sv@3429: "Modified: / 18-03-2017 / 18:42:52 / stefan" 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@3340: self executableNameHolder value:(selectedProjectDefinition applicationName). 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: ! ! cg@2959: