blob: 40b8fc2164cc501c3af97fdd361f29e463c33f6b [file] [log] [blame]
/*******************************************************************************
* 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();
private final static boolean DISABLE_EDITOR_OPEN_REFRESH = System
.getProperty("org.eclipse.jst.jsf.jspmodelprocessor.disable.editor.open.refresh") != null; //$NON-NLS-1$
public void earlyStartup()
{
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable()
{
public void run()
{
final IWorkbenchWindow windows[] =
PlatformUI.getWorkbench().getWorkbenchWindows();
for (final IWorkbenchWindow window : windows)
{
final IWorkbenchPage pages[] = window.getPages();
for (final IWorkbenchPage page : pages)
{
final IEditorReference[] editorReferences =
page.getEditorReferences();
for (final IEditorReference editorReference : editorReferences)
{
if (_partListener.isValidJSPEditor(editorReference))
{
_partListener.setJSPModelListener(editorReference);
}
}
}
window.getPartService().addPartListener(_partListener);
}
// TODO: register with all windows?
PlatformUI.getWorkbench().addWindowListener(new IWindowListener()
{
public void windowActivated(final IWorkbenchWindow window) {
// do nothing
}
public void windowDeactivated(final IWorkbenchWindow window) {
// do nothing
}
public void windowClosed(final IWorkbenchWindow window) {
window.getPartService().removePartListener(_partListener);
}
public void windowOpened(final IWorkbenchWindow window) {
window.getPartService().addPartListener(_partListener);
}
});
}
});
}
private static class JSPEditorListener implements IPartListener2
{
private JSPModelProcessor _processor;
public void partActivated(final IWorkbenchPartReference partRef) {
// do nothing
}
public void partBroughtToTop(final IWorkbenchPartReference partRef) {
// do nothing
}
public void partClosed(final IWorkbenchPartReference partRef) {
// do nothing
}
public void partDeactivated(final IWorkbenchPartReference partRef) {
// do nothing
}
public void partOpened(final IWorkbenchPartReference partRef) {
if (isValidJSPEditor(partRef))
{
setJSPModelListener((IEditorReference)partRef);
}
}
public void partHidden(final IWorkbenchPartReference partRef) {
// do nothing
}
public void partVisible(final IWorkbenchPartReference partRef) {
// do nothing
}
public void partInputChanged(final IWorkbenchPartReference partRef) {
// do nothing
}
private boolean isJSPEditor(final IEditorReference editorRef)
{
final 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(final IEditorReference editorRef)
{
final IFile file = getIFile(editorRef);
return file != null &&
JSFAppConfigUtils.isValidJSFProject(file.getProject()) &&
isJSPEditor(editorRef);
}
boolean isValidJSPEditor(final IWorkbenchPartReference partRef)
{
if (partRef instanceof IEditorReference)
{
return isValidJSPEditor((IEditorReference)partRef);
}
return false;
}
void setJSPModelListener(final IEditorReference editorRef)
{
final IFile file = getIFile(editorRef);
if (file != null)
{
try
{
if (!DISABLE_EDITOR_OPEN_REFRESH)
{
// implicitly creates if not present
_processor = JSPModelProcessor.get(file);
_processor.refresh(!JSPModelProcessor.FORCE_REFRESH,
JSPModelProcessor.RUN_ON_CURRENT_THREAD);
}
} catch (final Exception e)
{
JSFCorePlugin.getDefault().getLog().log(
new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID,
0, "Error acquiring model processor", e)); //$NON-NLS-1$
}
}
}
IFile getIFile(final IEditorReference editorRef)
{
try
{
final IEditorInput editorInput = editorRef.getEditorInput();
final Object adapt = editorInput.getAdapter(IFile.class);
if (adapt instanceof IFile)
{
return (IFile) adapt;
}
}
catch (final PartInitException excp)
{
JSFCorePlugin.getDefault().getLog().log(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, 0, "Error acquiring editor input",excp)); //$NON-NLS-1$
}
return null;
}
}
}