/*******************************************************************************
* 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.wgadesigner.editors;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.editor.IFormPage;
import de.innovationgate.eclipse.utils.WorkbenchUtils;
import de.innovationgate.eclipse.utils.ui.GenesisBoundFormPage;
import de.innovationgate.eclipse.wgadesigner.WGADesignerPlugin;
import de.innovationgate.eclipse.wgadesigner.models.WGARuntimeConfigurationModel;
import de.innovationgate.eclipse.wgadesigner.natures.IncompatibleWGAConfigVersion;
import de.innovationgate.eclipse.wgadesigner.natures.WGARuntime;
import de.innovationgate.eclipse.wgadesigner.pages.WGARuntimeConfigurationPage;
import de.innovationgate.eclipse.wgadesigner.pages.WGARuntimeStatusPage;
import de.innovationgate.wga.model.ModelListener;
public class WGARuntimeEditor extends FormEditor implements ModelListener, IResourceChangeListener {
private WGARuntimeConfigurationModel _model;
private boolean _dirty;
private WGARuntime _wgaRuntime;
private Map<String, GenesisBoundFormPage> _pages = new HashMap<String, GenesisBoundFormPage>();
public WGARuntimeEditor() {
ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
}
@Override
protected void addPages() {
try {
WGARuntimeStatusPage status = new WGARuntimeStatusPage(this);
status.setModel(_model);
addPage(status);
WGARuntimeConfigurationPage general = new WGARuntimeConfigurationPage(this);
general.setModel(_model);
addPage(general);
} catch (PartInitException e) {
WGADesignerPlugin.getDefault().logError("Unable to init runtime editor pages.", e);
}
}
@Override
public void init(IEditorSite site, IEditorInput input) throws PartInitException {
super.init(site, input);
IProject project = ((IFileEditorInput)input).getFile().getProject();
try {
if (project.hasNature(WGADesignerPlugin.NATURE_WGA_RUNTIME)) {
_wgaRuntime = (WGARuntime) project.getNature(WGADesignerPlugin.NATURE_WGA_RUNTIME);
setPartName("Runtime (" + _wgaRuntime.getName() + ")");
_model = new WGARuntimeConfigurationModel();
try {
_model.init(_wgaRuntime);
} catch (IncompatibleWGAConfigVersion e) {
MessageDialog.openWarning(getSite().getShell(), "Warning", "The configured WGA distribution seams to be incompatible. Please ensure that your are using the latest version of WGADevelopmentStudio. Some config features may not work properly.");
WGADesignerPlugin.getDefault().logError(e.getMessage(), e);
}
_model.addListener(this);
} else {
throw new PartInitException("This is no wga runtime project.");
}
} catch (PartInitException e) {
throw e;
} catch (CoreException e) {
throw new PartInitException(e.getMessage(), e);
}
}
@Override
public void doSave(IProgressMonitor monitor) {
try {
_model.saveChanges();
_dirty = false;
firePropertyChange(IEditorPart.PROP_DIRTY);
} catch (IOException e) {
WorkbenchUtils.showErrorDialog(WGADesignerPlugin.getDefault(), getSite().getShell(), "Unable to perform save on runtime editor", e);
}
}
@Override
public boolean isSaveAsAllowed() {
return false;
}
public void modelChanged() {
_dirty = true;
firePropertyChange(IEditorPart.PROP_DIRTY);
}
@Override
public boolean isDirty() {
return _dirty;
}
@Override
public void doSaveAs() {
}
public void resourceChanged(IResourceChangeEvent event) {
try {
final IFile fRuntimeConfigFile = ((IFileEditorInput)getEditorInput()).getFile();
final IFile fWGAConfigFile = _wgaRuntime.getWGAConfigFile();
event.getDelta().accept(new IResourceDeltaVisitor() {
public boolean visit(IResourceDelta delta) throws CoreException {
if (delta.getResource().equals(fRuntimeConfigFile)) {
if (delta.getResource().exists()) {
refresh();
return false;
} else {
// runtime has been deleted
close(false);
}
} else if (delta.getResource().equals(fWGAConfigFile)) {
refresh();
return false;
}
return true;
}
});
} catch (CoreException e) {
WGADesignerPlugin.getDefault().logError("Unable to handle resource change event.", e);
}
}
/**
* refresh the editor and all pages with the model state in the filesystem
*/
public void refresh() {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
Iterator<GenesisBoundFormPage> pages = _pages.values().iterator();
while (pages.hasNext()) {
GenesisBoundFormPage page = pages.next();
try {
page.refresh();
} catch (Exception e) {
WGADesignerPlugin.getDefault().logError("Unable to refresh editor page '" + page.getId() + "'.", e);
}
}
_dirty = false;
firePropertyChange(IEditorPart.PROP_DIRTY);
}
});
}
@Override
public int addPage(IFormPage page) throws PartInitException {
if (page instanceof GenesisBoundFormPage) {
_pages.put(page.getId(), (GenesisBoundFormPage)page);
}
return super.addPage(page);
}
@Override
public void addPage(int index, IFormPage page) throws PartInitException {
if (page instanceof GenesisBoundFormPage) {
_pages.put(page.getId(), (GenesisBoundFormPage)page);
}
super.addPage(index, page);
}
@Override
public void dispose() {
super.dispose();
ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
}
}