/*******************************************************************************
* Copyright (c) 2013, 2014 Red Hat, Inc.
* 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:
* Red Hat Inc. - initial API and implementation and/or initial documentation
* Zend Technologies Ltd. - [447351] synchronization between Overview and Source page
*******************************************************************************/
package org.eclipse.thym.ui.config.internal;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
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.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.thym.core.HybridCore;
import org.eclipse.thym.core.HybridProject;
import org.eclipse.thym.core.config.Widget;
import org.eclipse.thym.core.config.WidgetModel;
import org.eclipse.ui.IEditorInput;
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.part.FileEditorInput;
public class ConfigEditor extends FormEditor {
public static final String ID = "org.eclipse.thym.ui.config.internal.ConfigEditor"; //$NON-NLS-1$
private SourceEditor sourceEditor;
private Widget widget;
private WidgetModel model;
@Override
public void init(IEditorSite site, IEditorInput input)
throws PartInitException {
super.init(site, input);
setTitle(input);
}
private void setTitle(IEditorInput input) {
String title = null;
Widget w = getWidget();
if(w != null ){
title = getWidget().getName();
}
if(title == null || title.isEmpty() ){
IResource res = (IResource)input.getAdapter(IResource.class);
if(res != null ){
title = res.getProject().getName();
}
}
setPartName(title);
}
@Override
public Object getAdapter(Class adapter) {
Object object = super.getAdapter(adapter);
if (object != null) {
return object;
}
return (sourceEditor != null) ? sourceEditor.getAdapter(adapter) : null;
}
@Override
public void doSave(IProgressMonitor monitor) {
sourceEditor.doSave(monitor);
}
@Override
public void doSaveAs() {
//Not supported
}
@Override
public boolean isSaveAsAllowed() {
return false;
}
@Override
protected void addPages() {
sourceEditor = new SourceEditor();
try {
addPage(new EssentialsPage(this));
addPage(new PropertiesPage(this));
// addPage(new IconsPage(this)); disabled until JBIDE-15746 is resolved.
int sourcePageIndex = addPage(sourceEditor, getEditorInput());
setPageText(sourcePageIndex, "config.xml");
firePropertyChange(PROP_TITLE);
IFile f = getFile();
if (f != null && f.exists()) {
new ResourceChangeListener(this, getContainer());
}
} catch (PartInitException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public Widget getWidget() {
if (widget == null) {
IFile file = (IFile) getEditorInput().getAdapter(IFile.class);
if (file != null) {
HybridProject prj = HybridProject.getHybridProject(file
.getProject());
WidgetModel model = WidgetModel.getModel(prj);
try {
widget = model.getWidgetForEdit();
} catch (CoreException e) {
HybridCore.log(IStatus.ERROR, "Error when retrieving the widget model", e);
}
}
}
return widget;
}
@Override
public void dispose() {
super.dispose();
if(model != null ){
model.dispose();
}
}
public WidgetModel getWidgetModel() {
if (model == null) {
IFile file = (IFile) getEditorInput().getAdapter(IFile.class);
if (file != null) {
HybridProject prj = HybridProject.getHybridProject(file
.getProject());
model = WidgetModel.getModel(prj);
}
}
return model;
}
private IFile getFile() {
IEditorInput input = getEditorInput();
return (input instanceof IFileEditorInput) ? ((IFileEditorInput) input)
.getFile() : null;
}
class ResourceChangeListener implements IResourceChangeListener, IResourceDeltaVisitor {
ConfigEditor editorPart;
ResourceChangeListener(ConfigEditor editorPart, Composite container) {
this.editorPart = editorPart;
final IWorkspace workspace = ResourcesPlugin.getWorkspace();
workspace.addResourceChangeListener(this);
container.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
workspace.removeResourceChangeListener(ResourceChangeListener.this);
}
});
}
public void resourceChanged(IResourceChangeEvent event) {
IResourceDelta delta = event.getDelta();
try {
if (delta != null){
delta.accept(this);
}
} catch (CoreException exception) {
HybridCore.log(IStatus.ERROR, "Error when retrieving IResourceDelta", exception);
}
}
public boolean visit(IResourceDelta delta) {
if (delta == null
|| !delta.getResource().equals(
((FileEditorInput) getEditorInput()).getFile())){
return true;
}
if (delta.getKind() == IResourceDelta.REMOVED) {
if ((IResourceDelta.MOVED_TO & delta.getFlags()) == 0) {
if (!isDirty())
closeEditor();
} else {
final IFile newFile = ResourcesPlugin.getWorkspace()
.getRoot().getFile(delta.getMovedToPath());
Display display = getSite().getShell().getDisplay();
display.asyncExec(new Runnable() {
public void run() {
editorPart.setInput(new FileEditorInput(newFile));
}
});
}
}
return false;
}
private void closeEditor() {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
editorPart.getSite().getPage().closeEditor(editorPart, false);
}
});
}
}
}