package org.objectstyle.wolips.templateeditor;
import jp.aonir.fuzzyxml.FuzzyXMLDocument;
import jp.aonir.fuzzyxml.FuzzyXMLElement;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.content.IContentDescriber;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.revisions.RevisionInformation;
import org.eclipse.jface.text.source.Annotation;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.INavigationLocation;
import org.eclipse.ui.INavigationLocationProvider;
import org.eclipse.ui.IPersistableEditor;
import org.eclipse.ui.IReusableEditor;
import org.eclipse.ui.ISaveablesSource;
import org.eclipse.ui.Saveable;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.IStatusField;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.texteditor.ITextEditorExtension;
import org.eclipse.ui.texteditor.ITextEditorExtension2;
import org.eclipse.ui.texteditor.ITextEditorExtension3;
import org.eclipse.ui.texteditor.ITextEditorExtension4;
import org.objectstyle.wolips.bindings.wod.IWodElement;
import org.objectstyle.wolips.components.editor.ComponentEditorInteraction;
import org.objectstyle.wolips.components.editor.IEmbeddedEditor;
import org.objectstyle.wolips.components.editor.IHtmlDocumentProvider;
import org.objectstyle.wolips.components.editor.IWebobjectTagListener;
import org.objectstyle.wolips.editors.contentdescriber.ContentDescriberWO;
import org.objectstyle.wolips.locate.LocateException;
import org.objectstyle.wolips.wodclipse.core.Activator;
import org.objectstyle.wolips.wodclipse.core.completion.WodParserCache;
import org.objectstyle.wolips.wodclipse.core.document.ITextWOEditor;
import org.objectstyle.wolips.wodclipse.core.util.WodHtmlUtils;
import tk.eclipse.plugin.htmleditor.HTMLPlugin;
import tk.eclipse.plugin.htmleditor.editors.HTMLConfiguration;
import tk.eclipse.plugin.htmleditor.editors.HTMLEditor;
import tk.eclipse.plugin.htmleditor.editors.HTMLEditorPart;
import tk.eclipse.plugin.htmleditor.editors.HTMLSourceEditor;
public class TemplateEditor extends HTMLEditor implements IEmbeddedEditor, IHtmlDocumentProvider, IWebobjectTagListener, ITextEditor, IReusableEditor, ITextEditorExtension, ITextEditorExtension2, ITextEditorExtension3, ITextEditorExtension4, INavigationLocationProvider, ISaveablesSource, IPersistableEditor, ITextWOEditor {
public static final String BINDING_HOVER_ANNOTATION = "org.objectstyle.wolips.tkhtmleditor.bindingHover";
private TemplateConfiguration _configuration;
private ComponentEditorInteraction _editorInteraction;
public TemplateEditor() {
super();
ContentDescriberWO.ANSWER = IContentDescriber.VALID;
}
public WodParserCache getParserCache() throws CoreException, LocateException {
return getSourceEditor().getParserCache();
}
public IWodElement getSelectedElement(boolean resolveWodElement, boolean refreshModel) throws Exception {
return getSourceEditor().getSelectedElement(resolveWodElement, refreshModel);
}
public IWodElement getWodElementAtPoint(Point point, boolean resolveWodElement, boolean refreshModel) throws Exception {
return getSourceEditor().getWodElementAtPoint(point, resolveWodElement, refreshModel);
}
public ISourceViewer getWOSourceViewer() {
return getSourceEditor().getViewer();
}
public StyledText getWOEditorControl() {
return getSourceEditor().getWOEditorControl();
}
@Override
public void createPartControl(Composite parent) {
super.createPartControl(parent);
/*
TemplateTripleClickAdapter tripleClickAdapter = new TemplateTripleClickAdapter(this);
getSourceEditor().getViewer().getTextWidget().addMouseListener(tripleClickAdapter);
getSourceEditor().getViewer().getTextWidget().addMouseMoveListener(tripleClickAdapter);
*/
}
@Override
public void setInput(IEditorInput input) {
super.setInput(input);
updateValidation();
}
public TemplateSourceEditor getSourceEditor() {
TemplateSourceEditor sourceEditor;
if (this._editor instanceof TemplateSourceEditor) {
sourceEditor = (TemplateSourceEditor) this._editor;
}
else {
HTMLEditorPart htmlEditorPart = (HTMLEditorPart) this._editor;
sourceEditor = (TemplateSourceEditor) htmlEditorPart.getSourceEditor();
}
return sourceEditor;
}
public void initEditorInteraction(ComponentEditorInteraction initEditorInteraction) {
this._editorInteraction = initEditorInteraction;
getSourceEditor().getSelectionProvider().addSelectionChangedListener(new TemplateOutlineSelectionHandler(this, _editorInteraction));
getSourceEditor().initEditorInteraction(initEditorInteraction);
_editorInteraction.setHtmlDocumentProvider(this);
_editorInteraction.addWebObjectTagListener(this);
}
public IDocument getHtmlEditDocument() {
IDocument htmlDocument = getSourceEditor().getDocumentProvider().getDocument(getEditorInput());
return htmlDocument;
}
public ComponentEditorInteraction getEditorInteraction() {
return _editorInteraction;
}
@Override
protected HTMLSourceEditor createHTMLSourceEditor(HTMLConfiguration config) {
ContentDescriberWO.ANSWER = IContentDescriber.INVALID;
return new TemplateSourceEditor(config);
}
@Override
protected HTMLConfiguration getSourceViewerConfiguration() {
if (_configuration == null) {
_configuration = new TemplateConfiguration(HTMLPlugin.getDefault().getColorProvider());
}
return _configuration;
}
@Override
public void doSave(IProgressMonitor monitor) {
if (_editorInteraction == null || _editorInteraction.embeddedEditorWillSave(monitor)) {
super.doSave(monitor);
updateValidation();
if (_editorInteraction != null) {
_editorInteraction.fireWebObjectChanged();
}
}
}
protected void updateValidation() {
try {
getParserCache().scheduleValidate(true, true);
}
catch (Throwable e) {
Activator.getDefault().log(e);
}
}
public void webObjectChanged() {
getSourceEditor().getTemplateOutlinePage().update();
}
public void webObjectTagSelected(String name) {
// DO NOTHING
}
/**
* Update preview.
*/
@Override
public void updatePreview() {
// if (!(editor instanceof HTMLEditorPart)) {
// return;
// }
// try {
// if (!((HTMLEditorPart) editor).isFileEditorInput()) {
// return;
// }
// // write to temporary file
// HTMLEditorPart editor = (HTMLEditorPart) this.editor;
// IFileEditorInput input = (IFileEditorInput) this.editor.getEditorInput();
// String charset = input.getFile().getCharset();
// String html = editor.getSourceEditor().getDocumentProvider().getDocument(input).get();
// // replace JSP parts
// html = JSPPreviewConverter.convertJSP((IFileEditorInput) getEditorInput(), html);
//
// File tmpFile = editor.getSourceEditor().getTempFile();
// FileOutputStream out = new FileOutputStream(tmpFile);
// PrintWriter pw = new PrintWriter(new OutputStreamWriter(out, charset), true);
// pw.write(html);
// pw.close();
//
// if (prevTempFile != null && prevTempFile.equals(tmpFile)) {
// editor.getBrowser().refresh();
// }
// else {
// if (prevTempFile != null) {
// prevTempFile.delete();
// }
// prevTempFile = tmpFile;
// editor.getBrowser().setUrl("file://" + tmpFile.getAbsolutePath()); //$NON-NLS-1$
// }
// }
// catch (Exception ex) {
// HTMLPlugin.logException(ex);
// //ex.printStackTrace();
// }
}
public void close(boolean save) {
getSourceEditor().close(save);
}
public void doRevertToSaved() {
updateValidation();
getSourceEditor().doRevertToSaved();
}
public IAction getAction(String actionId) {
return getSourceEditor().getAction(actionId);
}
public IDocumentProvider getDocumentProvider() {
return getSourceEditor().getDocumentProvider();
}
public IRegion getHighlightRange() {
return getSourceEditor().getHighlightRange();
}
public ISelectionProvider getSelectionProvider() {
return getSourceEditor().getSelectionProvider();
}
public boolean isEditable() {
return getSourceEditor().isEditable();
}
public void removeActionActivationCode(String actionId) {
getSourceEditor().removeActionActivationCode(actionId);
}
public void resetHighlightRange() {
getSourceEditor().resetHighlightRange();
}
public void selectAndReveal(int offset, int length) {
getSourceEditor().selectAndReveal(offset, length);
}
public void setAction(String actionID, IAction action) {
getSourceEditor().setAction(actionID, action);
}
public void setActionActivationCode(String actionId, char activationCharacter, int activationKeyCode, int activationStateMask) {
getSourceEditor().setActionActivationCode(actionId, activationCharacter, activationKeyCode, activationStateMask);
}
public void setHighlightRange(int offset, int length, boolean moveCursor) {
getSourceEditor().setHighlightRange(offset, length, moveCursor);
}
public void showHighlightRangeOnly(boolean showHighlightRangeOnly) {
getSourceEditor().showHighlightRangeOnly(showHighlightRangeOnly);
}
public boolean showsHighlightRangeOnly() {
return getSourceEditor().showsHighlightRangeOnly();
}
public void addRulerContextMenuListener(IMenuListener listener) {
getSourceEditor().addRulerContextMenuListener(listener);
}
public boolean isEditorInputReadOnly() {
return getSourceEditor().isEditorInputReadOnly();
}
public void removeRulerContextMenuListener(IMenuListener listener) {
getSourceEditor().removeRulerContextMenuListener(listener);
}
public void setStatusField(IStatusField field, String category) {
getSourceEditor().setStatusField(field, category);
}
public boolean isEditorInputModifiable() {
return getSourceEditor().isEditorInputModifiable();
}
public boolean validateEditorInputState() {
return getSourceEditor().validateEditorInputState();
}
public InsertMode getInsertMode() {
return getSourceEditor().getInsertMode();
}
public boolean isChangeInformationShowing() {
return getSourceEditor().isChangeInformationShowing();
}
public void setInsertMode(InsertMode mode) {
getSourceEditor().setInsertMode(mode);
}
public void showChangeInformation(boolean show) {
getSourceEditor().showChangeInformation(show);
}
public Annotation gotoAnnotation(boolean forward) {
return getSourceEditor().gotoAnnotation(forward);
}
public void showRevisionInformation(RevisionInformation info, String quickDiffProviderId) {
getSourceEditor().showRevisionInformation(info, quickDiffProviderId);
}
public INavigationLocation createEmptyNavigationLocation() {
return getSourceEditor().createEmptyNavigationLocation();
}
public INavigationLocation createNavigationLocation() {
return getSourceEditor().createNavigationLocation();
}
public Saveable[] getActiveSaveables() {
return getSourceEditor().getActiveSaveables();
}
public Saveable[] getSaveables() {
return getSourceEditor().getSaveables();
}
public void restoreState(IMemento memento) {
getSourceEditor().restoreState(memento);
}
public void saveState(IMemento memento) {
getSourceEditor().saveState(memento);
}
public void selectionChangedToOffset(int offset) {
TemplateSourceEditor sourceEditor = getSourceEditor();
if (sourceEditor != null) {
try {
FuzzyXMLDocument xmlDocument = sourceEditor.getHtmlXmlDocument(true);
if (xmlDocument != null) {
FuzzyXMLElement selectedElement = xmlDocument.getElementByOffset(offset);
if (selectedElement != null) {
String tagName = selectedElement.getName();
if (WodHtmlUtils.isWOTag(tagName)) {
String woElementName = selectedElement.getAttributeValue("name");
if (woElementName != null && woElementName.length() > 0) {
_editorInteraction.fireWebObjectTagSelected(woElementName);
}
}
}
}
}
catch (Throwable t) {
t.printStackTrace();
}
}
}
}