001/*
002  GRANITE DATA SERVICES
003  Copyright (C) 2011 GRANITE DATA SERVICES S.A.S.
004
005  This file is part of Granite Data Services.
006
007  Granite Data Services is free software; you can redistribute it and/or modify
008  it under the terms of the GNU Library General Public License as published by
009  the Free Software Foundation; either version 2 of the License, or (at your
010  option) any later version.
011
012  Granite Data Services is distributed in the hope that it will be useful, but
013  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
014  FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
015  for more details.
016
017  You should have received a copy of the GNU Library General Public License
018  along with this library; if not, see <http://www.gnu.org/licenses/>.
019*/
020
021package org.granite.builder.ui;
022
023import java.io.IOException;
024
025import org.eclipse.core.resources.IProject;
026import org.eclipse.core.runtime.CoreException;
027import org.eclipse.jface.resource.ImageDescriptor;
028import org.eclipse.jface.wizard.Wizard;
029import org.eclipse.jface.wizard.WizardDialog;
030import org.eclipse.jface.wizard.WizardPage;
031import org.eclipse.swt.widgets.Composite;
032import org.eclipse.swt.widgets.Display;
033import org.eclipse.swt.widgets.Shell;
034import org.granite.builder.GraniteBuilderContext;
035import org.granite.builder.GraniteNature;
036import org.granite.builder.ToggleNatureAction;
037import org.granite.builder.properties.Gas3Transformer;
038import org.granite.builder.properties.GraniteProperties;
039import org.granite.builder.properties.GranitePropertiesLoader;
040import org.granite.builder.util.ProjectUtil;
041import org.granite.builder.util.SWTUtil;
042
043/**
044 * @author Franck WOLFF
045 */
046public class AddNatureWizard extends Wizard {
047
048        private static final String SOURCES_PANEL = "sourcesPanel";
049        private static final String PROJECTS_PANEL = "projectsPanel";
050        private static final String CLASSPATHS_PANEL = "classpathsPanel";
051        private static final String TEMPLATES_PANEL = "templatesPanel";
052        private static final String OPTIONS_PANEL = "optionsPanel";
053        
054        private final GraniteBuilderContext context;
055        
056        private WizardDialog dialog = null;
057        
058        public AddNatureWizard(IProject project) throws CoreException {
059                this.context = new GraniteBuilderContext(project);
060        }
061
062        @Override
063        public void addPages() {
064                setWindowTitle("Add Granite Nature Wizard");
065                setDefaultPageImageDescriptor(ImageDescriptor.createFromImage(
066                        SWTUtil.getImage(getShell().getDisplay(), "icons/gdswiz.gif"))
067                );
068                
069                addPage(new WizardPage(SOURCES_PANEL) {
070                        @Override
071                        public void createControl(Composite parent) {
072                                try {
073                                        setControl(new SourcesPanel(parent, context));
074                                } catch (Exception e) {
075                                        throw new RuntimeException(e);
076                                }
077                                setTitle("Source Folder Configuration");
078                                setDescription("Step 1: select Java source folders, included/excluded patterns and output folders...");
079                        }
080                });
081                
082                addPage(new WizardPage(PROJECTS_PANEL) {
083                        @Override
084                        public void createControl(Composite parent) {
085                                try {
086                                        setControl(new ProjectsPanel(parent, context));
087                                } catch (Exception e) {
088                                        throw new RuntimeException(e);
089                                }
090                                setTitle("Dependent Projects Configuration");
091                                setDescription("Step 2: select dependent granite projects...");
092                        }
093                });
094                
095                addPage(new WizardPage(CLASSPATHS_PANEL) {
096                        @Override
097                        public void createControl(Composite parent) {
098                                try {
099                                        setControl(new ClasspathsPanel(parent, context));
100                                } catch (Exception e) {
101                                        throw new RuntimeException(e);
102                                }
103                                setTitle("Classpath Configuration");
104                                setDescription("Step 3: select jars or class folders used as classpath...");
105                        }
106                });
107                
108                addPage(new WizardPage(TEMPLATES_PANEL) {
109                        @Override
110                        public void createControl(Composite parent) {
111                                try {
112                                        setControl(new TemplatesPanel(parent, context));
113                                } catch (Exception e) {
114                                        throw new RuntimeException(e);
115                                }
116                                setTitle("Templates Configuration");
117                                setDescription("Step 4: select templates that will be used for generation...");
118                        }
119                });
120                
121                addPage(new WizardPage(OPTIONS_PANEL) {
122                        @Override
123                        public void createControl(Composite parent) {
124                                try {
125                                        setControl(new OptionsPanel(parent, context));
126                                } catch (Exception e) {
127                                        throw new RuntimeException(e);
128                                }
129                                setTitle("Miscanellous Options");
130                                setDescription("Step 5: modify various options that control file generation...");
131                        }
132                });
133        }
134
135        @Override
136        public boolean performFinish() {
137        GraniteProperties properties = GraniteProperties.getDefaultProperties();
138        
139        SourcesPanel sourcesPanel = (SourcesPanel)getPage(SOURCES_PANEL).getControl();
140        properties.getGas3().getSources().addAll(sourcesPanel.getSources());
141
142        ProjectsPanel projectsPanel = (ProjectsPanel)getPage(PROJECTS_PANEL).getControl();
143        properties.getGas3().getProjects().addAll(projectsPanel.getProjects());
144        
145        ClasspathsPanel classpathsPanel = (ClasspathsPanel)getPage(CLASSPATHS_PANEL).getControl();
146        properties.getGas3().getClasspaths().addAll(classpathsPanel.getClasspaths());
147        
148        TemplatesPanel templatesPanel = (TemplatesPanel)getPage(TEMPLATES_PANEL).getControl();
149        properties.getGas3().getTemplates().clear();
150        properties.getGas3().getTemplates().addAll(templatesPanel.getTemplates());
151        
152        OptionsPanel optionsPanel = (OptionsPanel)getPage(OPTIONS_PANEL).getControl();
153        properties.getGas3().setUid(optionsPanel.getUid());
154        properties.getGas3().setAs3TypeFactory(optionsPanel.getAs3TypeFactory());
155        properties.getGas3().setEntityFactory(optionsPanel.getEntityFactory());
156        properties.getGas3().setRemoteDestinationFactory(optionsPanel.getRemoteDestinationFactory());
157        properties.getGas3().getTransformers().clear();
158        properties.getGas3().getTransformers().add(new Gas3Transformer(optionsPanel.getTransformer()));
159        properties.getGas3().getTranslators().clear();
160        properties.getGas3().getTranslators().addAll(optionsPanel.getTranslators());
161        properties.getGas3().setDebugEnabled(optionsPanel.isDebugEnabled());
162        properties.getGas3().setFlexConfig(optionsPanel.isFlexConfig());
163        properties.getGas3().setExternalizeLong(optionsPanel.isExternalizeLong());
164        properties.getGas3().setExternalizeBigInteger(optionsPanel.isExternalizeBigInteger());
165        properties.getGas3().setExternalizeBigDecimal(optionsPanel.isExternalizeBigDecimal());
166        
167        try {
168            GranitePropertiesLoader.save(context.getJavaProject().getProject(), properties);
169        } catch (IOException e) {
170            dialog.setErrorMessage("Could not save Granite properties: " + e.toString());
171            return false;
172        }
173                
174                return true;
175        }
176        
177        @Override
178        public boolean performCancel() {
179                try {
180                        IProject project = context.getJavaProject().getProject();
181                        if (project.getDescription().hasNature(GraniteNature.NATURE_ID))
182                                ToggleNatureAction.toggleNature(project);
183                } catch (CoreException e) {
184                }
185                return true;
186        }
187
188        public static void run(final IProject project) throws CoreException {
189                final Display display = (Display.getCurrent() != null ? Display.getCurrent() : Display.getDefault());
190                try {
191                        display.syncExec(new Runnable() {
192                                @Override
193                                public void run() {
194                                        try {
195                                                Shell shell = new Shell(display);
196                                        AddNatureWizard wizard = new AddNatureWizard(project);
197                                        final WizardDialog dialog = new WizardDialog(shell, wizard);
198                                        wizard.dialog = dialog;
199                                        dialog.setPageSize(640, 589);
200                                        dialog.setHelpAvailable(false);
201                                        dialog.create();
202                                                dialog.open();
203                                        } catch (Exception e) {
204                                                throw new RuntimeException(e);
205                                        }
206                                }
207                        });
208                } catch (Exception e) {
209                        if (e.getCause() instanceof CoreException)
210                                throw (CoreException)e.getCause();
211                        throw new CoreException(ProjectUtil.createErrorStatus("Could not run wizard: " + e.toString(), null));
212                }
213        }
214}