blob: b540e29d9c15b42922d21d9a1dd7c0b52e6d5090 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2010 Soyatec (http://www.soyatec.com) and others.
* 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:
* Soyatec - initial API and implementation
*******************************************************************************/
package org.eclipse.xwt.ui.editor;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.xwt.XWT;
import org.eclipse.jdt.core.ElementChangedEvent;
import org.eclipse.jdt.core.IElementChangedListener;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.core.JavaModelManager;
import org.eclipse.jdt.internal.ui.JavaPluginImages;
import org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor;
import org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceAdapter;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.DropTargetListener;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.progress.ProgressManager;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
import org.eclipse.wst.xml.ui.internal.tabletree.IDesignViewer;
import org.eclipse.wst.xml.ui.internal.tabletree.XMLTableTreeHelpContextIds;
import org.eclipse.xwt.ui.ExceptionHandle;
import org.eclipse.xwt.ui.XWTUIPlugin;
import org.eclipse.xwt.ui.editor.dnd.ImageDnDAdapter;
import org.eclipse.xwt.ui.editor.dnd.PaletteDnDAdapter;
import org.eclipse.xwt.ui.editor.dnd.UserDefinedDnDAdapter;
import org.eclipse.xwt.ui.editor.render.XWTRender;
import org.eclipse.xwt.ui.editor.treeviewer.XWTTableTreeViewer;
import org.eclipse.xwt.ui.utils.DisplayUtil;
import org.eclipse.xwt.ui.utils.ImageManager;
import org.eclipse.xwt.ui.utils.ProjectContext;
import org.eclipse.xwt.ui.views.XWTView;
import org.eclipse.xwt.vex.VEXCodeSynchronizer;
import org.eclipse.xwt.vex.VEXEditor;
import org.eclipse.xwt.vex.VEXFileChecker;
import org.eclipse.xwt.vex.VEXFileFormator;
import org.eclipse.xwt.vex.VEXRenderer;
public class XWTEditor extends VEXEditor {
/** The Java editor. */
private CompilationUnitEditor javaEditor;
private IFile javaFile;
private String className;
private DropTargetListener dropTargetAdapter;
private ToolItem previewTool;
private ToolItem generateTool;
private long modificationStamp;
private IElementChangedListener elementChangedListener = new IElementChangedListener() {
public void elementChanged(ElementChangedEvent event) {
if (getFileChecker() != null) {
long timeStamp = javaFile.getModificationStamp();
if (modificationStamp == timeStamp) {
getFileChecker().doCheck(render.getHostClassName());
} else {
modificationStamp = timeStamp;
}
}
}
};
public XWTEditor() {
super(new XWTUIContext());
}
public CompilationUnitEditor getJavaEditor() {
return javaEditor;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.xwt.vex.VEXEditor#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
*/
public void init(IEditorSite site, IEditorInput input) throws PartInitException {
super.init(site, input);
XWTUIPlugin.getDefault().openXWTPerspective();
}
@Override
protected IDesignViewer createDesignPage() {
XWTTableTreeViewer tableTreeViewer = new XWTTableTreeViewer(getContainer());
// Set the default info pop for XML design viewer.
XMLUIPlugin.getInstance().getWorkbench().getHelpSystem().setHelp(tableTreeViewer.getControl(), XMLTableTreeHelpContextIds.XML_DESIGN_VIEW_HELPID);
return tableTreeViewer;
}
protected VEXRenderer createRender(Canvas container) {
return new XWTRender(container, changeListener);
}
protected void createToolBar(CTabFolder tabFolder) {
tabFolder.setTabPosition(SWT.TOP);
tabFolder.setSimple(false);
ToolBar toolBar = new ToolBar(tabFolder, SWT.FLAT | SWT.WRAP | SWT.RIGHT);
// toolBar.setLayoutData(new GridData(GridData.FILL_BOTH));
previewTool = new ToolItem(toolBar, SWT.PUSH);
previewTool.setImage(ImageManager.get(ImageManager.IMG_PREVIEW));
previewTool.setToolTipText("Preview");
previewTool.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
handlePreview();
}
public void widgetSelected(SelectionEvent e) {
handlePreview();
}
});
generateTool = new ToolItem(toolBar, SWT.PUSH);
generateTool.setImage(JavaPluginImages.get(JavaPluginImages.IMG_OBJS_CLASS));
generateTool.setToolTipText("Generate Java codes");
generateTool.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
generateCLRCodeAction();
}
public void widgetSelected(SelectionEvent e) {
generateCLRCodeAction();
}
});
generateTool.setEnabled(false);
tabFolder.setTopRight(toolBar);
tabFolder.setTabHeight(Math.max(toolBar.computeSize(SWT.DEFAULT, SWT.DEFAULT).y, tabFolder.getTabHeight()));
}
void handlePreview() {
IFile file = (IFile) getEditorInput().getAdapter(IFile.class);
IJavaProject javaProject = JavaCore.create(file.getProject());
if (!javaProject.exists()) {
return;
}
try {
XWT.setLoadingContext(ProjectContext.getContext(javaProject));
DisplayUtil.open(file);
} catch (Exception e) {
e.printStackTrace();
}
}
protected void setJavaEditor(String fullyQualifiedName) {
IJavaProject javaProject = getJavaProject();
removeElementChangedListener(javaProject);
try {
if (fullyQualifiedName == null) {
return;
}
IType type = javaProject.findType(fullyQualifiedName);
if (type == null || !type.exists()) {
return;
}
javaFile = (IFile) type.getResource();
FileEditorInput editorInput = new FileEditorInput(javaFile);
if (javaEditor == null) {
javaEditor = new CompilationUnitEditor();
int javaPageIndex = addPage(javaEditor, editorInput);
setPageText(javaPageIndex, "Java");
setPageImage(javaPageIndex, JavaPluginImages.get(JavaPluginImages.IMG_OBJS_CLASS));
} else {
javaEditor.setInput(editorInput);
}
this.className = fullyQualifiedName;
if (generateTool != null) {
generateTool.setEnabled(true);
}
addElementChangedListener(javaProject);
XWTCodeSynchronizer codeSynchronizer = (XWTCodeSynchronizer) getCodeSynchronizer();
codeSynchronizer.setType(type);
} catch (PartInitException e) {
e.printStackTrace();
} catch (JavaModelException e) {
e.printStackTrace();
}
}
protected IJavaProject getJavaProject() {
IFile file = (IFile) getEditorInput().getAdapter(IFile.class);
IJavaProject javaProject = JavaCore.create(file.getProject());
if (!javaProject.exists()) {
return null;
}
return javaProject;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor )
*/
@Override
public void doSave(IProgressMonitor monitor) {
super.doSave(monitor);
if (javaEditor != null) {
javaEditor.doSave(monitor);
}
}
protected boolean handleInputChanged(IDocument newInput) {
String value = newInput.get();
if (newInput == null) {
return false;
}
boolean handling = super.handleInputChanged(newInput);
if (handling) {
String className = render.getHostClassName();
if (this.className == null || !this.className.equals(className)) {
setJavaEditor(className);
}
}
refreshXWTView(value);
return handling;
}
private void refreshXWTView(String value) {
IFile file = (IFile) getEditorInput().getAdapter(IFile.class);
if (file != null) {
XWTUIPlugin.checkStartup();
try {
XWTView view = (XWTView) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().findView(XWTView.ID);
if (view != null) {
view.setContentWithException(value, file);
}
} catch (Exception e) {
// No need to handle the refresh.s
// ExceptionHandle.handle(e, "");
}
}
}
@Override
protected VEXFileChecker createFileChecker() {
return new XWTFileChecker(getTextEditor());
}
protected VEXCodeSynchronizer createCodeSynchronizer() {
try {
IJavaProject javaProject = getJavaProject();
if (javaProject == null || className == null) {
return null;
}
IType findType = javaProject.findType(className);
if (findType != null) {
return new XWTCodeSynchronizer(this, findType);
}
} catch (JavaModelException e) {
}
return null;
}
public void addElementChangedListener(IJavaProject javaProject) {
int eventMask = ElementChangedEvent.POST_CHANGE | ElementChangedEvent.POST_RECONCILE;
JavaModelManager.getDeltaState().addElementChangedListener(elementChangedListener, eventMask);
}
public void removeElementChangedListener(IJavaProject javaProject) {
int eventMask = ElementChangedEvent.POST_CHANGE | ElementChangedEvent.POST_RECONCILE;
JavaModelManager.getDeltaState().removeElementChangedListener(elementChangedListener);
}
public void initializeDND(VEXEditor editor) {
if (dropTargetAdapter == null) {
dropTargetAdapter = createDropTargetListener();
}
update(editor);
}
private void update(VEXEditor vexEditor) {
// clear up old
StyledText styledText = vexEditor.getTextWidget();
if (styledText != null) {
DropTarget dropTarget = (DropTarget) styledText.getData(DND.DROP_TARGET_KEY);
if (dropTarget != null) {
dropTarget.removeDropListener(dropTargetAdapter);
}
}
// setup new
vexEditor.getTextWidget().addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
StyledText styledText = (StyledText) e.widget;
DropTarget dropTarget = (DropTarget) styledText.getData(DND.DROP_TARGET_KEY);
if (dropTarget != null) {
dropTarget.removeDropListener(dropTargetAdapter);
}
}
});
DropTarget dropTarget = (DropTarget) styledText.getData(DND.DROP_TARGET_KEY);
if (dropTarget == null) {
dropTarget = new DropTarget(styledText, DND.DROP_MOVE | DND.DROP_COPY);
dropTarget.setTransfer(new Transfer[] { LocalSelectionTransfer.getTransfer() });
}
dropTarget.addDropListener(dropTargetAdapter);
DragSource dragSource = (DragSource) styledText.getData(DND.DRAG_SOURCE_KEY);
if (dragSource == null) {
dragSource = new DragSource(styledText, DND.DROP_COPY | DND.DROP_MOVE);
Transfer[] types = new Transfer[] { TextTransfer.getInstance() };
dragSource.setTransfer(types);
}
dragSource.addDragListener(dragSourceAdapter);
// if (dropProxy == null) {
// dropProxy = new XWTEditorDropProxy(this);
// }
final PackageExplorerPart part = PackageExplorerPart.getFromActivePerspective();
if (part != null) {
TreeViewer treeViewer = part.getTreeViewer();
dragSource = (DragSource) treeViewer.getControl().getData(DND.DRAG_SOURCE_KEY);
if (dragSource != null) {
dragSource.addDragListener(new DragSourceAdapter() {
public void dragStart(DragSourceEvent event) {
part.setLinkingEnabled(false);
}
});
}
}
}
private IProgressMonitor getProgressMonitor() {
ProgressManager progresManager = (ProgressManager) getSite().getWorkbenchWindow().getWorkbench().getProgressService();
IProgressMonitor monitor = progresManager.getDefaultMonitor();
return monitor;
}
private XWTDropTargetListener createDropTargetListener() {
XWTDropTargetListener dropTargetListener = new XWTDropTargetListener() {
/*
* (non-Javadoc)
*
* @see org.eclipse.swt.dnd.DropTargetAdapter#drop(org.eclipse.swt.dnd.DropTargetEvent)
*/
public void drop(DropTargetEvent event) {
super.drop(event);
IFile file = (IFile) getTextEditor().getEditorInput().getAdapter(IFile.class);
VEXFileFormator formator = new VEXFileFormator();
IDocument document = getTextEditor().getTextViewer().getDocument();
try {
formator.format(document, file.getContentDescription().getContentType().getId());
} catch (CoreException e) {
e.printStackTrace();
}
PackageExplorerPart part = PackageExplorerPart.getFromActivePerspective();
if (part != null) {
part.setLinkingEnabled(true);
}
}
};
dropTargetListener.addDnDAdapter(new PaletteDnDAdapter(this));
dropTargetListener.addDnDAdapter(new UserDefinedDnDAdapter(this));
dropTargetListener.addDnDAdapter(new ImageDnDAdapter(this));
return dropTargetListener;
}
@Override
public void setFocus() {
super.setFocus();
refreshXWTView(super.getTextEditor().getTextViewer().getDocument().get());
}
}