package tk.eclipse.plugin.htmleditor.editors;
import java.util.ArrayList;
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.e4.core.contexts.IEclipseContext;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorActionBarContributor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IKeyBindingService;
import org.eclipse.ui.IPropertyListener;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.internal.PopupMenuExtender;
import org.eclipse.ui.part.EditorPart;
import tk.eclipse.plugin.htmleditor.HTMLPlugin;
/** The split style HTML editor. */
public class SplitPageHTMLEditor extends EditorPart implements IResourceChangeListener,HTMLEditorPart {
/** HTML source editor */
private HTMLSourceEditor _editor;
/** Browser widget for preview */
private Browser _browser;
/** wrapper */
private HTMLEditor _wrapper;
/** horizontal split or vertical split */
private boolean _isHorizontal;
/** EditorSite */
private SplitEditorSite _site;
public SplitPageHTMLEditor(HTMLEditor wrapper,boolean isHorizontal,HTMLSourceEditor editor) {
super();
this._wrapper = wrapper;
this._isHorizontal = isHorizontal;
this._editor = editor;
ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
}
public Browser getBrowser() {
return _browser;
}
public HTMLSourceEditor getSourceEditor() {
return _editor;
}
@Override
public void doSave(IProgressMonitor monitor) {
_editor.doSave(monitor);
_wrapper.updatePreview();
}
@Override
public void doSaveAs() {
_editor.doSaveAs();
setInput(_editor.getEditorInput());
setPartName(getEditorInput().getName());
_wrapper.updatePreview();
}
@Override
public void init(IEditorSite site, IEditorInput editorInput) throws PartInitException {
setSite(site);
setInput(editorInput);
setPartName(editorInput.getName());
}
@Override
public boolean isDirty() {
if(_editor!=null){
return _editor.isDirty();
}
return false;
}
@Override
public boolean isSaveAsAllowed() {
return true;
}
@Override
public void dispose() {
ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
_site.dispose();
super.dispose();
}
@Override
public void createPartControl(Composite parent) {
try {
// Don't split when EditorInput isn't IFileEditorInput
if(!(getEditorInput() instanceof IFileEditorInput)){
_editor.init(getEditorSite(), getEditorInput());
_editor.addPropertyListener(new IPropertyListener() {
public void propertyChanged(Object source, int propertyId) {
firePropertyChange(propertyId);
}
});
_editor.createPartControl(parent);
return;
}
SashForm sash = null;
if(_isHorizontal){
sash = new SashForm(parent,SWT.VERTICAL);
} else {
sash = new SashForm(parent,SWT.HORIZONTAL);
}
_site = new SplitEditorSite(_editor, getEditorSite());
_editor.init(_site, getEditorInput());
_editor.addPropertyListener(new IPropertyListener() {
public void propertyChanged(Object source, int propertyId) {
firePropertyChange(propertyId);
}
});
_editor.createPartControl(sash);
_browser = new Browser(sash,SWT.NONE);
_wrapper.updatePreview();
} catch (PartInitException e) {
HTMLPlugin.logException(e);
ErrorDialog.openError(getSite().getShell(),
"Error creating nested text editor",null,e.getStatus()); //$NON-NLS-1$
}
}
@Override
public void setFocus() {
_editor.setFocus();
}
public void gotoMarker(IMarker marker) {
IDE.gotoMarker(_editor, marker);
}
public void setOffset(int offset){
_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(SplitPageHTMLEditor.this, false);
} else if(!getPartName().equals(file.getName())){
setPartName(file.getName());
}
}
});
}
}
}
public boolean isFileEditorInput(){
return _editor.isFileEditorInput();
}
@Override
public Object getAdapter(Class adapter) {
return _editor.getAdapter(adapter);
}
@Override
protected void firePropertyChange(int propertyId) {
super.firePropertyChange(propertyId);
_wrapper.firePropertyChange2(propertyId);
}
/**
* An implementaion of IEditorSite for the split editor.
*/
private static class SplitEditorSite implements IEditorSite {
private HTMLSourceEditor editor;
private IEditorSite site;
private ArrayList<PopupMenuExtender> menuExtenders;
public SplitEditorSite(HTMLSourceEditor editor, IEditorSite site){
this.editor = editor;
this.site = site;
}
public IEditorActionBarContributor getActionBarContributor() {
return site.getActionBarContributor();
}
public IActionBars getActionBars() {
return site.getActionBars();
}
public String getId() {
return site.getId();
}
public IKeyBindingService getKeyBindingService() {
return site.getKeyBindingService();
}
public String getPluginId() {
return site.getPluginId();
}
public String getRegisteredName() {
return site.getRegisteredName();
}
public void registerContextMenu(MenuManager menuManager, ISelectionProvider selectionProvider) {
site.registerContextMenu(menuManager, selectionProvider);
}
public void registerContextMenu(String menuId, MenuManager menuManager, ISelectionProvider selectionProvider) {
if (menuExtenders == null) {
menuExtenders = new ArrayList<PopupMenuExtender>(1);
}
menuExtenders.add(new PopupMenuExtender(menuId, menuManager, selectionProvider, editor, (IEclipseContext) site.getService(IEclipseContext.class)));
}
public IWorkbenchPage getPage() {
return site.getPage();
}
public ISelectionProvider getSelectionProvider() {
return site.getSelectionProvider();
}
public Shell getShell() {
return site.getShell();
}
public IWorkbenchWindow getWorkbenchWindow() {
return site.getWorkbenchWindow();
}
public void setSelectionProvider(ISelectionProvider provider) {
site.setSelectionProvider(provider);
}
public Object getAdapter(Class adapter) {
return site.getAdapter(adapter);
}
public void dispose() {
if (menuExtenders != null) {
for (int i = 0; i < menuExtenders.size(); i++) {
menuExtenders.get(i).dispose();
}
menuExtenders = null;
}
}
// for Eclipse 3.1
public IWorkbenchPart getPart() {
return editor;
}
public void registerContextMenu(MenuManager menuManager, ISelectionProvider selectionProvider, boolean includeEditorInput) {
this.registerContextMenu(menuManager, selectionProvider);
}
public void registerContextMenu(String menuId, MenuManager menuManager, ISelectionProvider selectionProvider, boolean includeEditorInput) {
this.registerContextMenu(menuId, menuManager, selectionProvider);
}
// for Eclipse 3.2
public Object getService(Class api) {
return null;
}
public boolean hasService(Class api) {
return false;
}
}
}