package tk.eclipse.plugin.htmleditor.editors; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.IPropertyListener; import org.eclipse.ui.IWorkbenchPartSite; import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.EditorPart; import tk.eclipse.plugin.htmleditor.HTMLPlugin; import tk.eclipse.plugin.htmleditor.views.IPaletteTarget; /** * This is the HTML editor that supports tabbed and split style. * <p> * In the tabbed style, this editor uses MultiPageHTMLEditor, * and in the split style, uses SplitPageHTMLEditor. * And this class transfers the call of most methods to them. * * @see tk.eclipse.plugin.htmleditor.editors.MultiPageHTMLEditor * @see tk.eclipse.plugin.htmleditor.editors.SplitPageHTMLEditor */ public class HTMLEditor extends EditorPart implements IPaletteTarget { protected EditorPart _editor; protected File _prevTempFile = null; public HTMLEditor() { super(); IPreferenceStore store = HTMLPlugin.getDefault().getPreferenceStore(); String type = store.getString(HTMLPlugin.PREF_EDITOR_TYPE); if (type.equals("horizontal")) { _editor = new SplitPageHTMLEditor(this, true, createHTMLSourceEditor(getSourceViewerConfiguration())); } else if (type.equals("vertical")) { _editor = new SplitPageHTMLEditor(this, false, createHTMLSourceEditor(getSourceViewerConfiguration())); } else if (type.equals("tab")) { _editor = new MultiPageHTMLEditor(this, createHTMLSourceEditor(getSourceViewerConfiguration())); } else { _editor = createHTMLSourceEditor(getSourceViewerConfiguration()); _editor.addPropertyListener(new IPropertyListener() { public void propertyChanged(Object source, int propertyId) { firePropertyChange(propertyId); } }); } } protected HTMLConfiguration getSourceViewerConfiguration() { return new HTMLConfiguration(HTMLPlugin.getDefault().getColorProvider()); } protected HTMLSourceEditor createHTMLSourceEditor(HTMLConfiguration config) { return new HTMLSourceEditor(config); } public HTMLSourceEditor getPaletteTarget() { if (_editor instanceof HTMLSourceEditor) { return (HTMLSourceEditor) _editor; } else { return ((HTMLEditorPart) _editor).getSourceEditor(); } } /** * Update preview */ 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 part //html = HTMLUtil.convertJSP(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); } } @Override public void createPartControl(Composite parent) { _editor.createPartControl(parent); } @Override public void dispose() { _editor.dispose(); super.dispose(); } @Override public void doSave(IProgressMonitor monitor) { _editor.doSave(monitor); //updateFlag = true; } @Override public void doSaveAs() { _editor.doSaveAs(); //updateFlag = true; } // public boolean equals(Object arg0) { // return editor.equals(arg0); // } @Override public Object getAdapter(Class adapter) { return _editor.getAdapter(adapter); } @Override public String getContentDescription() { return _editor.getContentDescription(); } @Override public IEditorInput getEditorInput() { return _editor.getEditorInput(); } @Override public IEditorSite getEditorSite() { return _editor.getEditorSite(); } @Override public String getPartName() { return _editor.getPartName(); } @Override public IWorkbenchPartSite getSite() { return _editor.getSite(); } @Override public String getTitle() { return _editor.getTitle(); } @Override public Image getTitleImage() { return _editor.getTitleImage(); } @Override public String getTitleToolTip() { return _editor.getTitleToolTip(); } @Override public void init(IEditorSite site, IEditorInput input) throws PartInitException { _editor.init(site, input); } @Override public boolean isDirty() { return _editor.isDirty(); } @Override public boolean isSaveAsAllowed() { return _editor.isSaveAsAllowed(); } @Override public boolean isSaveOnCloseNeeded() { return _editor.isSaveOnCloseNeeded(); } @Override public void setFocus() { _editor.setFocus(); } @Override public void setInitializationData(IConfigurationElement config, String propertyName, Object data) { _editor.setInitializationData(config, propertyName, data); } @Override public void showBusy(boolean busy) { _editor.showBusy(busy); } /** change to the source editor, and move calet to the specified offset. */ public void setOffset(int offset) { if (_editor instanceof SplitPageHTMLEditor) { ((SplitPageHTMLEditor) _editor).setOffset(offset); } else if (_editor instanceof MultiPageHTMLEditor) { ((MultiPageHTMLEditor) _editor).setOffset(offset); } else if (_editor instanceof HTMLSourceEditor) { ((HTMLSourceEditor) _editor).selectAndReveal(offset, 0); } } public void firePropertyChange2(int propertyId) { super.firePropertyChange(propertyId); } }