package tk.eclipse.plugin.htmleditor.editors;
import java.io.File;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
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.jface.dialogs.ErrorDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
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.IDE;
import org.eclipse.ui.part.MultiPageEditorPart;
import tk.eclipse.plugin.htmleditor.HTMLPlugin;
/**
* The tabbed style HTML editor.
*
* @author Naoki Takezoe
*/
public class MultiPageHTMLEditor extends MultiPageEditorPart implements IResourceChangeListener, HTMLEditorPart {
/** HTML source editor */
private HTMLSourceEditor _editor;
/** Browser widget for preview */
private Browser _browser;
/** wrapper */
private HTMLEditor _wrapper;
public MultiPageHTMLEditor(HTMLEditor wrapper,HTMLSourceEditor editor) {
super();
this._wrapper = wrapper;
this._editor = editor;
ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
}
public Browser getBrowser() {
return _browser;
}
public HTMLSourceEditor getSourceEditor() {
return _editor;
}
// protected IEditorSite createSite(IEditorPart editor) {
// return new SourceEditorSite(this,editor,getEditorSite());
// }
private void createPage0() {
try {
int index = addPage(_editor, getEditorInput());
setPageText(index, HTMLPlugin.getResourceString("MultiPageHTMLEditor.Source")); //$NON-NLS-1$
setPartName(getEditorInput().getName());
} catch (PartInitException e) {
ErrorDialog.openError(getSite().getShell(),
"Error creating nested text editor",null,e.getStatus()); //$NON-NLS-1$
}
}
private void createPage1() {
if(isFileEditorInput()){
_browser = new Browser(getContainer(),SWT.NONE);
int index = addPage(_browser);
setPageText(index, HTMLPlugin.getResourceString("MultiPageHTMLEditor.Preview")); //$NON-NLS-1$
}
}
@Override
protected void createPages() {
createPage0();
createPage1();
}
@Override
public void dispose() {
if(isFileEditorInput()){
File tmpFile = _editor.getTempFile();
if(tmpFile.exists()){
tmpFile.delete();
}
}
ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
super.dispose();
}
@Override
public void doSave(IProgressMonitor monitor) {
getEditor(0).doSave(monitor);
}
@Override
public void doSaveAs() {
IEditorPart editor = getEditor(0);
editor.doSaveAs();
setInput(editor.getEditorInput());
setPartName(getEditorInput().getName());
}
public void gotoMarker(IMarker marker) {
setActivePage(0);
IDE.gotoMarker(getEditor(0), marker);
}
@Override
public void init(IEditorSite site, IEditorInput editorInput) throws PartInitException {
super.init(site, editorInput);
}
public boolean isFileEditorInput(){
return _editor.isFileEditorInput();
}
@Override
public boolean isSaveAsAllowed() {
return true;
}
@Override
protected void pageChange(int newPageIndex) {
super.pageChange(newPageIndex);
if(newPageIndex==1){
_wrapper.updatePreview();
}
}
/** Change to the source editor, and move calet to the specified offset. */
public void setOffset(int offset){
setActivePage(0);
_editor.selectAndReveal(offset,0);
}
public void resourceChanged(final IResourceChangeEvent event){
if(event.getType() == IResourceChangeEvent.POST_CHANGE){
final IEditorInput input = _editor.getEditorInput();
if(input instanceof IFileEditorInput){
Display.getDefault().asyncExec(new Runnable(){
public void run(){
IFile file = ((IFileEditorInput)input).getFile();
if(!file.exists()){
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
page.closeEditor(MultiPageHTMLEditor.this, false);
} else if(!getPartName().equals(file.getName())){
setPartName(file.getName());
}
}
});
}
}
}
@Override
public Object getAdapter(Class adapter) {
return _editor.getAdapter(adapter);
}
@Override
protected void firePropertyChange(int propertyId) {
super.firePropertyChange(propertyId);
_wrapper.firePropertyChange2(propertyId);
}
// /** IEditorSite for the source editor. */
// private static class SourceEditorSite extends MultiPageEditorSite {
//
// private HTMLSourceEditor editor = null;
// private IEditorSite site;
// private ArrayList menuExtenders;
//
// public SourceEditorSite(MultiPageEditorPart multiPageEditor,IEditorPart editor,IEditorSite site) {
// super(multiPageEditor, editor);
// this.site = site;
// this.editor = (HTMLSourceEditor)editor;
// }
//
// public IEditorActionBarContributor getActionBarContributor() {
// return site.getActionBarContributor();
// }
//
// public void registerContextMenu(String menuId, MenuManager menuManager, ISelectionProvider selectionProvider) {
// if(editor != null){
// if (menuExtenders == null) {
// menuExtenders = new ArrayList(1);
// }
// menuExtenders.add(new PopupMenuExtender(menuId, menuManager, selectionProvider, editor));
// }
// }
//
// public void dispose(){
// if (menuExtenders != null) {
// for (int i = 0; i < menuExtenders.size(); i++) {
// ((PopupMenuExtender)menuExtenders.get(i)).dispose();
// }
// menuExtenders = null;
// }
// super.dispose();
// }
// }
}