/** * 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 java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; 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.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.WizardResourceImportPage; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard; import org.whole.lang.codebase.IFilePersistenceProvider; import org.whole.lang.codebase.IPersistenceKit; import org.whole.lang.e4.ui.E4CompatibilityPlugin; import org.whole.lang.e4.ui.util.E4Utils; import org.whole.lang.model.IEntity; import org.whole.lang.pojo.reflect.PojoLanguageKit; import org.whole.lang.reflect.ILanguageKit; import org.whole.lang.reflect.ReflectionFactory; import org.whole.lang.util.StringUtils; /** * @author Enrico Persiani */ public abstract class AbstractWizardWholeModelImportPage extends WizardResourceImportPage { private IWorkbench workbench; private Text filenameField; private Combo presistenceTypes; private List<IPersistenceKit> persistenceKits; private static int filenameCount = 1; @Override protected boolean allowNewContainerName() { return super.allowNewContainerName(); } @Override public void handleEvent(Event event) { super.handleEvent(event); } public AbstractWizardWholeModelImportPage(String pageName, IWorkbench workbench, IStructuredSelection selection) { super(pageName, selection); this.workbench = workbench; } @Override protected abstract void createSourceGroup(Composite parent); protected final void createOptionsGroup(Composite parent) { Composite containerGroup = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 2; containerGroup.setLayout(layout); containerGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL)); containerGroup.setFont(parent.getFont()); // resource label Label filenameLabel = new Label(containerGroup, SWT.NONE); filenameLabel.setText("File name: "); filenameLabel.setFont(parent.getFont()); filenameField = new Text(containerGroup, SWT.SINGLE | SWT.BORDER); filenameField.addListener(SWT.Modify, this); GridData data = new GridData(SWT.FILL, SWT.CENTER, true, true); filenameField.setLayoutData(data); filenameField.setFont(parent.getFont()); // presistence label Label presistenceLabel = new Label(containerGroup, SWT.NONE); presistenceLabel.setText("Save as: "); presistenceLabel.setFont(parent.getFont()); presistenceTypes = new Combo(containerGroup, SWT.DROP_DOWN | SWT.READ_ONLY); presistenceTypes.addListener(SWT.Modify, this); presistenceTypes.setLayoutData(data); presistenceTypes.setFont(parent.getFont()); initOptionsGroup(); } private void initOptionsGroup() { ILanguageKit languageKit = ReflectionFactory.getLanguageKit(PojoLanguageKit.URI, false, null); setFilename("ModelExample" + filenameCount + "." + languageKit.getDefaultFileExtension()); persistenceKits = new ArrayList<IPersistenceKit>(languageKit.getPersistenceKits()); Iterator<IPersistenceKit> iterator = persistenceKits.iterator(); presistenceTypes.setItems(new String[0]); while (iterator.hasNext()) presistenceTypes.add(iterator.next().getDescription()); int selectionIndex = persistenceKits.indexOf(languageKit.getDefaultPersistenceKit()); presistenceTypes.select(selectionIndex); presistenceTypes.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { } public void widgetSelected(SelectionEvent e) { String name = getFilename(); name = StringUtils.replaceExtension(name, getPersistenceKit(presistenceTypes).getFileExtension()); setFilename(name); } }); } protected String getFilename() { if (filenameField != null) return filenameField.getText(); else return null; } protected void setFilename(String filename) { filenameField.setText(filename); } @Override protected ITreeContentProvider getFileProvider() { return new WorkbenchContentProvider() { public Object[] getChildren(Object o) { return new Object[0]; } }; } @Override protected ITreeContentProvider getFolderProvider() { return new WorkbenchContentProvider() { public Object[] getChildren(Object o) { return new Object[0]; } }; } protected abstract IEntity buildModel(); protected IPersistenceKit persistenceKit; protected boolean createNewFile(IFile fileHandle) { IEntity model = buildModel(); persistenceKit = getPersistenceKit(presistenceTypes); try { persistenceKit.writeModel(model, new IFilePersistenceProvider(fileHandle)); return true; } catch (Exception e) { IEclipseContext context = (IEclipseContext) PlatformUI.getWorkbench().getService(IEclipseContext.class); E4Utils.reportError(context, "Write Model errors", StringUtils.errorMessage(e), e); return false; } } public boolean importModel() { IFile file = null; IContainer container = getSpecifiedContainer(); switch (container.getType()) { case IContainer.FOLDER: IFolder folder = (IFolder) container; file = folder.getFile(getFilename()); break; case IContainer.PROJECT: IProject project = (IProject) container; file = project.getFile(getFilename()); break; } // create and open in editor if (!createNewFile(file) || !revealAndOpen(file)) return false; filenameCount++; return true; } private boolean revealAndOpen(IFile file) { BasicNewResourceWizard.selectAndReveal(file, getWorkbench().getActiveWorkbenchWindow()); IWorkbenchWindow dw = getWorkbench().getActiveWorkbenchWindow(); try { if (dw != null) { IWorkbenchPage page = dw.getActivePage(); if (page != null) { String editorID = ReflectionFactory.getEditorIdFromPersistenceKit(persistenceKit); IDE.setDefaultEditor(file, editorID); IDE.openEditor(page, file, true); } } } catch (PartInitException e) { E4CompatibilityPlugin.log(e); return false; } return true; } private IPersistenceKit getPersistenceKit(Combo saveAsCombo) { return persistenceKits.get(saveAsCombo.getSelectionIndex()); } private boolean existsFilename() { IContainer container = getSpecifiedContainer(); switch (container.getType()) { case IContainer.FOLDER: IFolder folder = (IFolder) container; return folder.getFile(getFilename()).exists(); case IContainer.PROJECT: IProject project = (IProject) container; return project.getFile(getFilename()).exists(); default: return false; } } protected boolean determinePageCompletion() { if(!super.determinePageCompletion()) return false; else if(getFilename() == null || getFilename().length() == 0) { setErrorMessage("Empty file name specified."); return false; } else if(existsFilename()) { setErrorMessage("The same name exists."); return false; } return true; } public IWorkbench getWorkbench() { return workbench; } }