| /******************************************************************************* |
| * Copyright (c) 2006 Oracle Corporation. |
| * 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: |
| * Cameron Bateman/Oracle - initial API and implementation |
| * |
| ********************************************************************************/ |
| |
| package org.eclipse.jst.jsf.designtime.internal.jsp; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.jst.jsf.common.internal.JSPUtil; |
| import org.eclipse.jst.jsf.core.internal.JSFCorePlugin; |
| import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigUtils; |
| import org.eclipse.ui.IEditorInput; |
| import org.eclipse.ui.IEditorReference; |
| import org.eclipse.ui.IPartListener2; |
| import org.eclipse.ui.IStartup; |
| import org.eclipse.ui.IWindowListener; |
| import org.eclipse.ui.IWorkbenchPage; |
| import org.eclipse.ui.IWorkbenchPartReference; |
| import org.eclipse.ui.IWorkbenchWindow; |
| import org.eclipse.ui.PartInitException; |
| import org.eclipse.ui.PlatformUI; |
| |
| /** |
| * On workbench startup, registers a part listener that triggers when |
| * a JSP editor opens. |
| * |
| * @author cbateman |
| * |
| */ |
| public class StartupHandler implements IStartup |
| { |
| private final JSPEditorListener _partListener = new JSPEditorListener(); |
| |
| public void earlyStartup() |
| { |
| PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() |
| { |
| public void run() |
| { |
| IWorkbenchWindow windows[] = |
| PlatformUI.getWorkbench().getWorkbenchWindows(); |
| |
| for (int i = 0; i < windows.length; i++) |
| { |
| IWorkbenchPage pages[] = windows[i].getPages(); |
| for (int j = 0; j < pages.length; j++) |
| { |
| IEditorReference[] editorReferences = |
| pages[j].getEditorReferences(); |
| |
| for (int k = 0; k < editorReferences.length; k++) |
| { |
| if (_partListener.isValidJSPEditor(editorReferences[k])) |
| { |
| _partListener.setJSPModelListener(editorReferences[k]); |
| } |
| } |
| } |
| windows[i].getPartService().addPartListener(_partListener); |
| } |
| |
| // TODO: register with all windows? |
| PlatformUI.getWorkbench().addWindowListener(new IWindowListener() |
| { |
| public void windowActivated(IWorkbenchWindow window) { |
| // do nothing |
| } |
| |
| public void windowDeactivated(IWorkbenchWindow window) { |
| // do nothing |
| } |
| |
| public void windowClosed(IWorkbenchWindow window) { |
| window.getPartService().removePartListener(_partListener); |
| } |
| |
| public void windowOpened(IWorkbenchWindow window) { |
| window.getPartService().addPartListener(_partListener); |
| } |
| }); |
| } |
| }); |
| } |
| |
| private static class JSPEditorListener implements IPartListener2 |
| { |
| private JSPModelProcessor _processor; |
| |
| public void partActivated(IWorkbenchPartReference partRef) { |
| // do nothing |
| } |
| |
| public void partBroughtToTop(IWorkbenchPartReference partRef) { |
| // do nothing |
| } |
| |
| public void partClosed(IWorkbenchPartReference partRef) { |
| // do nothing |
| } |
| |
| public void partDeactivated(IWorkbenchPartReference partRef) { |
| // do nothing |
| } |
| |
| public void partOpened(IWorkbenchPartReference partRef) { |
| if (isValidJSPEditor(partRef)) |
| { |
| setJSPModelListener((IEditorReference)partRef); |
| } |
| } |
| |
| public void partHidden(IWorkbenchPartReference partRef) { |
| // do nothing |
| } |
| |
| public void partVisible(IWorkbenchPartReference partRef) { |
| // do nothing |
| } |
| |
| public void partInputChanged(IWorkbenchPartReference partRef) { |
| // do nothing |
| } |
| |
| private boolean isJSPEditor(IEditorReference editorRef) |
| { |
| IFile file = getIFile(editorRef); |
| |
| if (file != null) |
| { |
| return JSPUtil.isJSPContentType(file); |
| } |
| |
| return false; |
| } |
| |
| /** |
| * @param editorRef |
| * @return true if the editor is editing the JSP content type and |
| * the owning project is a JSF project |
| */ |
| boolean isValidJSPEditor(IEditorReference editorRef) |
| { |
| final IFile file = getIFile(editorRef); |
| |
| return file != null && |
| JSFAppConfigUtils.isValidJSFProject(file.getProject()) && |
| isJSPEditor(editorRef); |
| } |
| |
| boolean isValidJSPEditor(IWorkbenchPartReference partRef) |
| { |
| if (partRef instanceof IEditorReference) |
| { |
| return isValidJSPEditor((IEditorReference)partRef); |
| } |
| |
| return false; |
| } |
| |
| void setJSPModelListener(IEditorReference editorRef) |
| { |
| IFile file = getIFile(editorRef); |
| |
| if (file != null) |
| { |
| try |
| { |
| // implicitly creates if not present |
| _processor = JSPModelProcessor.get(file); |
| _processor.refresh(false); |
| } |
| catch (Exception e) |
| { |
| JSFCorePlugin.getDefault().getLog().log(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, 0, "Error acquiring model processor",e)); //$NON-NLS-1$ |
| } |
| } |
| } |
| |
| IFile getIFile(IEditorReference editorRef) |
| { |
| try |
| { |
| IEditorInput editorInput = editorRef.getEditorInput(); |
| Object adapt = editorInput.getAdapter(IFile.class); |
| |
| if (adapt instanceof IFile) |
| { |
| return (IFile) adapt; |
| } |
| } |
| catch (PartInitException excp) |
| { |
| JSFCorePlugin.getDefault().getLog().log(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, 0, "Error acquiring editor input",excp)); //$NON-NLS-1$ |
| } |
| |
| return null; |
| } |
| } |
| } |