blob: 5f58b57cc5e2b8499d9f9b7ee48eadec8d690a86 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.click.eclipse.ui.editor;
import org.apache.click.eclipse.ClickPlugin;
import org.apache.click.eclipse.ui.editor.forms.ClickControlsEditor;
import org.apache.click.eclipse.ui.editor.forms.ClickGeneralEditor;
import org.apache.click.eclipse.ui.editor.forms.ClickHeadersEditor;
import org.apache.click.eclipse.ui.editor.forms.ClickInterceptorEditor;
import org.apache.click.eclipse.ui.editor.forms.ClickPagesEditor;
import org.apache.click.eclipse.ui.editor.forms.ClickServiceEditor;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IGotoMarker;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.part.MultiPageEditorPart;
import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
import org.eclipse.wst.sse.core.internal.provisional.IModelStateListener;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.sse.ui.StructuredTextEditor;
/**
* The editor for click.xml.
* <p>
* This editor provides the tree editor and the source editor
* as the multi-page editor. They can be toggled using tabs.
* </p>
*
* @author Naoki Takezoe
*/
public class ClickEditor extends MultiPageEditorPart implements IResourceChangeListener {
private StructuredTextEditor sourceEditor;
private ClickGeneralEditor generalEditor;
private ClickHeadersEditor headerEditor;
private ClickPagesEditor pageEditor;
private ClickControlsEditor controlEditor;
private ClickServiceEditor serviceEditor;
private ClickInterceptorEditor interceptorEditor;
// private int generalEditorIndex;
// private int headerEditorIndex;
// private int pageEditorIndex;
// private int controlEditorIndex;
private int sourceEditorIndex = 0;
private IModelStateListener listener = new IModelStateListener(){
public void modelAboutToBeChanged(IStructuredModel model) {
modelUpdated(model);
}
public void modelAboutToBeReinitialized(IStructuredModel structuredModel) {
modelUpdated(structuredModel);
}
public void modelChanged(IStructuredModel model) {
modelUpdated(model);
}
public void modelDirtyStateChanged(IStructuredModel model, boolean isDirty) {
modelUpdated(model);
}
public void modelReinitialized(IStructuredModel structuredModel) {
modelUpdated(structuredModel);
}
public void modelResourceDeleted(IStructuredModel model) {
modelUpdated(model);
}
public void modelResourceMoved(IStructuredModel oldModel, IStructuredModel newModel) {
modelUpdated(newModel);
}
};
public ClickEditor() {
super();
ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
}
public void createPages() {
try {
sourceEditor = new StructuredTextEditor();
addPage(0, sourceEditor, getEditorInput());
setPageText(0, ClickPlugin.getString("editor.clickXML.source"));
} catch(Exception ex){
ClickPlugin.log(ex);
}
IStructuredModel model = (IStructuredModel)sourceEditor.getAdapter(IStructuredModel.class);
try {
interceptorEditor = new ClickInterceptorEditor();
addPage(0, interceptorEditor, getEditorInput());
interceptorEditor.initModel(model);
setPageText(0, ClickPlugin.getString("editor.clickXML.pageInterceptor"));
sourceEditorIndex++;
} catch(Exception ex){
removePage(0);
}
try {
serviceEditor = new ClickServiceEditor();
addPage(0, serviceEditor, getEditorInput());
serviceEditor.initModel(model);
setPageText(0, ClickPlugin.getString("editor.clickXML.service"));
sourceEditorIndex++;
} catch(Exception ex){
removePage(0);
}
try {
controlEditor = new ClickControlsEditor();
addPage(0, controlEditor, getEditorInput());
controlEditor.initModel(model);
setPageText(0, ClickPlugin.getString("editor.clickXML.controls"));
sourceEditorIndex++;
} catch(Exception ex){
removePage(0);
}
try {
pageEditor = new ClickPagesEditor();
addPage(0, pageEditor, getEditorInput());
pageEditor.initModel(model);
setPageText(0, ClickPlugin.getString("editor.clickXML.pages"));
sourceEditorIndex++;
} catch(Exception ex){
removePage(0);
}
try {
headerEditor = new ClickHeadersEditor();
addPage(0, headerEditor, getEditorInput());
headerEditor.initModel(model);
setPageText(0, ClickPlugin.getString("editor.clickXML.headers"));
sourceEditorIndex++;
} catch(Exception ex){
removePage(0);
}
try {
generalEditor = new ClickGeneralEditor();
addPage(0, generalEditor, getEditorInput());
generalEditor.initModel(model);
setPageText(0, ClickPlugin.getString("editor.clickXML.general"));
sourceEditorIndex++;
} catch(Exception ex){
removePage(0);
}
model.addModelStateListener(listener);
// IContentOutlinePage outline
// = (IContentOutlinePage)sourceEditor.getAdapter(IContentOutlinePage.class);
// outline.addSelectionChangedListener(new ISelectionChangedListener(){
// public void selectionChanged(SelectionChangedEvent event){
// setActivePage(4);
// }
// });
// ConfigurableContentOutlinePage page = (ConfigurableContentOutlinePage)outline;
// System.out.println(page.getControl());
setActivePage(0);
}
@SuppressWarnings("rawtypes")
public Object getAdapter(Class key) {
if (key.equals(IContentOutlinePage.class)) {
return sourceEditor.getAdapter(IContentOutlinePage.class);
} else if (key.equals(IGotoMarker.class)) {
setActivePage(sourceEditorIndex);
return sourceEditor.getAdapter(IGotoMarker.class);
} else {
return super.getAdapter(key);
}
}
public void doSave(IProgressMonitor progressMonitor) {
sourceEditor.doSave(progressMonitor);
}
public void doSaveAs() {
sourceEditor.doSaveAs();
}
public boolean isSaveAsAllowed() {
return true;
}
public void init(IEditorSite site, IEditorInput editorInput) throws PartInitException {
if (!(editorInput instanceof IFileEditorInput)){
throw new PartInitException("Unsupported editor input.");
}
super.init(site, editorInput);
setPartName(editorInput.getName());
}
public void setFocus() {
getControl(getActivePage()).setFocus();
}
public void dispose() {
ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
IStructuredModel model = (IStructuredModel)sourceEditor.getAdapter(IStructuredModel.class);
model.removeModelStateListener(listener);
super.dispose();
}
public void resourceChanged(final IResourceChangeEvent event){
Display.getDefault().asyncExec(new Runnable(){
public void run(){
if(!((FileEditorInput)sourceEditor.getEditorInput()).getFile().exists()){
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
page.closeEditor(ClickEditor.this, false);
}
}
});
}
private void modelUpdated(IStructuredModel model){
if(getActivePage()==4){
generalEditor.modelUpdated(model);
controlEditor.modelUpdated(model);
headerEditor.modelUpdated(model);
pageEditor.modelUpdated(model);
}
}
// protected IEditorSite createSite(IEditorPart editor) {
// if(editor instanceof StructuredTextEditor){
// return new SourceEditorSite(this, editor, getEditorSite());
// } else {
// return super.createSite(editor);
// }
// }
//
// private class SourceEditorSite extends MultiPageEditorSite {
//
// private IEditorSite site;
//
// public SourceEditorSite(MultiPageEditorPart multiPageEditor,IEditorPart editor,IEditorSite site) {
// super(multiPageEditor, editor);
// this.site = site;
// }
//
// public IEditorActionBarContributor getActionBarContributor() {
// return site.getActionBarContributor();
// }
// }
}