/**
* Copyright 2004-2016 Riccardo Solmi. All rights reserved.
* This file is part of the Whole Platform.
*
* The Whole Platform is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Whole Platform is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the Whole Platform. If not, see <http://www.gnu.org/licenses/>.
*/
package org.whole.lang.ui.wizards;
import static org.whole.lang.ui.util.ResourceUtils.defineResourceBindings;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
import org.eclipse.ui.ide.IDE;
import org.whole.lang.codebase.IPersistenceKit;
import org.whole.lang.codebase.IPersistenceProvider;
import org.whole.lang.codebase.StringPersistenceProvider;
import org.whole.lang.e4.ui.E4CompatibilityPlugin;
import org.whole.lang.model.IEntity;
import org.whole.lang.reflect.ILanguageKit;
import org.whole.lang.reflect.ReflectionFactory;
import org.whole.lang.resources.IResourceRegistry;
import org.whole.lang.templates.ITemplateManager;
import org.whole.lang.util.ResourceUtils;
import org.whole.lang.util.StringUtils;
/**
* @author Riccardo Solmi
*/
public class WholeModelWizardPage1 extends WizardNewFileCreationPage {
private List<ILanguageKit> languageKits;
private ITemplateManager templateFactory;
private String[] templates;
private List<IPersistenceKit> persistenceKits;
private IWorkbench workbench;
private static int exampleCount = 1;
private Combo languageCombo;
private Combo templateCombo;
private Combo saveAsCombo;
public WholeModelWizardPage1(IWorkbench aWorkbench, IStructuredSelection selection) {
super("sampleModelPage1", selection);
this.setTitle("Whole Model");
this.setDescription("Create a new Whole Model");
this.setImageDescriptor(ImageDescriptor.createFromFile(E4CompatibilityPlugin.class,"images/banner.png"));
this.workbench = aWorkbench;
}
public void createControl(Composite parent) {
super.createControl(parent);
Composite composite = (Composite)getControl();
Group group = new Group(composite, SWT.NONE);
group.setLayout(new GridLayout());
group.setText("Choose options");
group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 2;
group.setLayout(gridLayout);
new Label(group, SWT.LEFT).setText("Language:");
languageCombo = new Combo(group, SWT.DROP_DOWN | SWT.READ_ONLY);
languageCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
new Label(group, SWT.LEFT).setText("Template:");
templateCombo = new Combo(group, SWT.DROP_DOWN | SWT.READ_ONLY);
templateCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
new Label(group, SWT.LEFT).setText("Save As:");
saveAsCombo = new Combo(group, SWT.DROP_DOWN | SWT.READ_ONLY);
saveAsCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
IResourceRegistry<ILanguageKit> registry = ReflectionFactory.getLanguageKitRegistry();
languageKits = new ArrayList<ILanguageKit>(
registry.getResources(false, ResourceUtils.SIMPLE_COMPARATOR));
for (ILanguageKit languageKit : languageKits)
languageCombo.add(ResourceUtils.SIMPLE_NAME_PROVIDER.toString(registry, languageKit));
languageCombo.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
ILanguageKit languageKit = languageKits.get(languageCombo.getSelectionIndex());
fireLanguageSelected(languageKit);
}
});
languageCombo.select(0);
ILanguageKit languageKit = languageKits.get(0);
fireLanguageSelected(languageKit);
saveAsCombo.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
String name = getFileName();
name = StringUtils.replaceExtension(name,
getPersistenceKit(saveAsCombo).getFileExtension());
//TODO mediated by languageKit
setFileName(name);
}
});
setPageComplete(validatePage());
}
protected void fireLanguageSelected(ILanguageKit languageKit) {
String name = getFileName();
if (name == null || name.isEmpty())
name = "ModelExample" + exampleCount;
setFileName(StringUtils.replaceExtension(name, languageKit.getDefaultFileExtension()));
templateFactory = languageKit.getTemplateManager();
templates = templateFactory.names().toArray(new String[0]);
templateCombo.setItems(templates);
templateCombo.select(templates.length-1);
persistenceKits = new ArrayList<IPersistenceKit>(languageKit.getPersistenceKits());
saveAsCombo.setItems(new String[0]);
for (IPersistenceKit persistenceKit : persistenceKits)
saveAsCombo.add(persistenceKit.getDescription());
int selectionIndex = persistenceKits.indexOf(languageKit.getDefaultPersistenceKit());
saveAsCombo.select(selectionIndex);
}
protected IFile fileHandle;
protected IFile createFileHandle(IPath filePath) {
return fileHandle = super.createFileHandle(filePath);
}
protected IPersistenceKit persistenceKit;
protected InputStream getInitialContents() {
IEntity model = templateFactory.create(templates[templateCombo.getSelectionIndex()]);
persistenceKit = getPersistenceKit(saveAsCombo);
try {
IPersistenceProvider pp = new StringPersistenceProvider();
defineResourceBindings(pp.getBindings(), fileHandle);
persistenceKit.writeModel(model, pp);
return pp.openInputStream();
} catch (Exception e) {
throw new IllegalStateException("error writing file contents", e);
}
}
private IPersistenceKit getPersistenceKit(Combo saveAsCombo) {
return persistenceKits.get(saveAsCombo.getSelectionIndex());
}
public boolean finish() {
try {
IFile newFile = createNewFile();
String editorID = ReflectionFactory.getEditorIdFromPersistenceKit(persistenceKit);
IDE.setDefaultEditor(newFile, editorID);
IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
IWorkbenchPage page = window.getActivePage();
IDE.openEditor(page, newFile, true);
exampleCount++;
return true;
} catch (Exception e) {
E4CompatibilityPlugin.reportError(getShell(), "Create model error", "Unable to create a new model.", e);
return false;
}
}
}