/*******************************************************************************
* Copyright (c) 2009, 2010 Innovation Gate GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Innovation Gate GmbH - initial API and implementation
******************************************************************************/
package de.innovationgate.eclipse.editors.design.wizards;
import java.io.File;
import java.io.IOException;
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.runtime.Path;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IExportWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PartInitException;
import de.innovationgate.eclipse.editors.Plugin;
import de.innovationgate.eclipse.editors.ResourceIDs;
import de.innovationgate.eclipse.editors.design.WGADesignEditor;
import de.innovationgate.eclipse.utils.WorkbenchUtils;
import de.innovationgate.eclipse.utils.ui.CancelWizardPage;
import de.innovationgate.eclipse.utils.wga.WGADesignStructureHelper;
import de.innovationgate.utils.WGUtils;
import de.innovationgate.wga.model.WGADesignConfigurationModel;
/**
* base implementation for design/ plugin export wizards
*
*
*/
public abstract class ExportWGADesignWizardBase extends Wizard implements IExportWizard {
protected IContainer _designContainer;
protected WGADesignConfigurationModel _model;
private boolean _openDesignEditor;
protected List<IWizardPage> _pages = new ArrayList<IWizardPage>();
private WGADesignStructureHelper _designHelper;
public ExportWGADesignWizardBase() {
}
@Override
public boolean performFinish() {
if (_openDesignEditor) {
try {
IEditorPart editor = WorkbenchUtils.openEditor(Plugin.getDefault().getWorkbench(), new WGADesignStructureHelper(_designContainer).getSyncInfo(), WGADesignEditor.ID);
if (editor instanceof WGADesignEditor) {
((WGADesignEditor) editor).setActivePage(ResourceIDs.EDITORPAGE_WGA_DESIGN_PLUGINCONFIGURATION);
}
return true;
} catch (PartInitException e) {
Plugin.getDefault().logError(e);
return false;
}
}
return innerPerformFinish();
}
protected abstract boolean innerPerformFinish();
@Override
public void addPages() {
try {
boolean designEditorOpenAndDirty = false;
Iterator<IEditorPart> editors = WorkbenchUtils.findOpenEditors(Plugin.getDefault().getWorkbench(), ResourceIDs.EDITOR_WGA_DESIGN, _designHelper.getSyncInfo()).iterator();
while (editors.hasNext()) {
IEditorPart editorPart = editors.next();
if (editorPart.isDirty()) {
designEditorOpenAndDirty = true;
break;
}
}
if (designEditorOpenAndDirty) {
addPage(new CancelWizardPage("Design Editor has unsaved changes.", "Design Editor has unsaved changes, please perform a save first."));
_openDesignEditor = true;
} else {
Iterator<IWizardPage> pages = createPages().iterator();
while (pages.hasNext()) {
addPage(pages.next());
}
}
} catch (Exception e) {
Plugin.getDefault().logError(e);
}
}
protected abstract List<IWizardPage> createPages();
public void init(IWorkbench workbench, IStructuredSelection selection) {
_designContainer = null;
// folder based design selected?
if (selection instanceof IStructuredSelection) {
IStructuredSelection structSelection = (IStructuredSelection) selection;
Object selectedElement = structSelection.getFirstElement();
if (selectedElement instanceof IContainer) {
IContainer container = (IContainer) selectedElement;
IFile dirlink = container.getFile(new Path("dirlink.xml"));
if (dirlink.exists()) {
File linkedFile = WGUtils.resolveDirLink(container.getLocation().toFile());
container = (IContainer) container.getWorkspace().getRoot().findContainersForLocationURI(linkedFile.toURI())[0];
}
if (WGADesignStructureHelper.isDesignFolder(container)) {
_designContainer = container;
}
}
}
if (_designContainer == null) {
MessageDialog.openInformation(getShell(), "Illegal selection.", "Please select an WGA design folder.");
return;
}
_designHelper = new WGADesignStructureHelper(_designContainer);
try {
_model = _designHelper.createModel();
} catch (IOException e) {
WorkbenchUtils.showErrorDialog(getShell(), "Illegal selection", "Unable to create configuration model for design '" + _designContainer.getLocation() + "'.", e);
return;
}
}
@Override
public void addPage(IWizardPage page) {
super.addPage(page);
_pages.add(page);
}
public boolean canFinish() {
if (!_openDesignEditor) {
boolean allPagesCompleted = true;
Iterator<IWizardPage> pages = _pages.iterator();
while (pages.hasNext()) {
if (!pages.next().isPageComplete()) {
allPagesCompleted = false;
break;
}
}
return allPagesCompleted || super.canFinish();
}
else {
return super.canFinish();
}
}
protected void setOpenDesignEditor(boolean openDesignEditor) {
_openDesignEditor = openDesignEditor;
}
}