blob: 7ea7844b387d47892192d0b0ddf5b7341856eb27 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2008 Oracle Corporation and others.
* 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:
* Oracle Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.jsf.ui.internal.tagregistry;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IComponentTagElement;
import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IConverterTagElement;
import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.IValidatorTagElement;
import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
import org.eclipse.jst.jsf.common.ui.internal.form.AbstractMasterForm;
import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigUtils;
import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
import org.eclipse.jst.jsf.ui.internal.JSFUITraceOptions;
import org.eclipse.jst.jsf.ui.internal.tagregistry.ProjectTracker.ProjectAdvisor;
import org.eclipse.jst.jsf.ui.internal.tagregistry.ProjectTracker.ProjectTrackingListener;
import org.eclipse.jst.jsf.ui.internal.tagregistry.TaglibContentProvider.TagRegistryInstance;
import org.eclipse.jst.jsf.ui.internal.tagregistry.TaglibContentProvider.TreePlaceholder;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.model.BaseWorkbenchContentProvider;
import org.eclipse.ui.model.IWorkbenchAdapter;
import org.eclipse.ui.model.WorkbenchAdapter;
import org.eclipse.ui.model.WorkbenchViewerComparator;
/**
* The master form in the master/detail block for tag registry. Used to display
* a tree view of each tag registy on the currently selected project and its
* contents.
*
* @author cbateman
*
*/
public class TagRegistryMasterForm extends AbstractMasterForm
{
private TreeViewer _registryTreeViewer;
// private Action _selectProjectAction;
private Action _refreshAction;
private final ProjectTracker _projectTracker;
private final ProjectAdvisor _advisor;
private GenerateMetadataAction _generateMetadataAction;
/**
* @param toolkit
*/
public TagRegistryMasterForm(final FormToolkit toolkit)
{
super(toolkit);
_advisor = new ProjectAdvisor()
{
@Override
public boolean shouldTrack(final IProject project)
{
return JSFAppConfigUtils.isValidJSFProject(project);
}
};
_projectTracker = new ProjectTracker(ResourcesPlugin.getWorkspace()
.getRoot(), _advisor);
}
/**
* @param parent
* @return the contents main control
*/
@Override
public Control createClientArea(final Composite parent)
{
final Tree tree = getToolkit().createTree(parent,
SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL);
final GridData gridData = new GridData(SWT.FILL, SWT.CENTER, true, true);
tree.setLayoutData(gridData);
_registryTreeViewer = new TreeViewer(tree);
// _drillDownAdapter = new DrillDownAdapter(_viewer);
_registryTreeViewer.setContentProvider(new TaglibContentProvider());
_registryTreeViewer.setLabelProvider(new CommonLabelProvider());
_registryTreeViewer.setSorter(new NameSorter());
PlatformUI.getWorkbench().getHelpSystem()
.setHelp(_registryTreeViewer.getControl(),
"ViewHandlerPrototype.viewer");
_projectTracker.addListener(new ProjectTrackingListener()
{
@Override
protected void projectsChanged(final IProject project,
final Reason reason)
{
switch (reason)
{
case ADDED:
{
// nothing to do, since new project can't be selected
// yet
}
case REMOVED:
{
// if the removed project is the one that is current
// update the treeviewer
if (project.equals(_registryTreeViewer.getInput()))
{
updateProjects();
}
}
}
}
});
_registryTreeViewer
.addSelectionChangedListener(new ISelectionChangedListener()
{
public void selectionChanged(
final SelectionChangedEvent event)
{
getListener().selectionChanged(event);
updateActions(event.getSelection());
}
});
makeActions();
createContextMenuManager(_registryTreeViewer.getControl());
return tree;
}
/**
* dispose of the master form
*/
@Override
public void dispose()
{
_projectTracker.dispose();
}
private void updateProjects()
{
final Set<IProject> projects = _projectTracker.getProjects();
for (final IProject project : projects)
{
new SetInputRunnable(project, _registryTreeViewer).run();
break;
}
}
@Override
protected final void contributeActions(IToolBarManager formManager,
IToolBarManager localManager)
{
// do nothing to the manager; we have our own toolbar
// contribute to local tool bar
localManager.add(_refreshAction);
localManager.update(false);
}
/**
*/
@Override
protected void contributeToHeadArea(final FormToolkit toolkit,
final Composite container)
{
final Label label = new Label(container, SWT.NONE);
label.setText("Project: ");
final ComboViewer combo = new ComboViewer(container, SWT.FLAT
| SWT.READ_ONLY);
getToolkit().adapt(combo.getControl(), true, false);
combo.addSelectionChangedListener(new ISelectionChangedListener()
{
public void selectionChanged(SelectionChangedEvent event)
{
IStructuredSelection selection = (IStructuredSelection) event
.getSelection();
final IProject selectedProject = (IProject) selection
.getFirstElement();
_registryTreeViewer.setInput(selectedProject);
}
});
combo.setLabelProvider(new CommonLabelProvider());
combo.setContentProvider(new ProjectContentProvider());
combo.setComparator(new WorkbenchViewerComparator());
combo.setInput(_projectTracker);
_projectTracker.addListener(new ProjectTrackingListener()
{
@Override
protected void projectsChanged(IProject project, Reason reason)
{
combo.getControl().getDisplay().asyncExec(new Runnable()
{
public void run()
{
combo.refresh();
}
});
}
});
}
/**
*/
@Override
public void doInitialize()
{
_projectTracker.startTracking();
}
private void makeActions()
{
if (_registryTreeViewer == null)
{
throw new IllegalStateException(
"_registryTreeViewer must be initialized before calling makeActions");
}
_refreshAction = new RefreshAction(_registryTreeViewer);
_refreshAction.setText("Refresh Registry");
_refreshAction.setToolTipText("Refresh Registry");
_refreshAction.setImageDescriptor(JSFUICommonPlugin.getDefault()
.getImageDescriptor("refresh_nav_16.gif"));
if (JSFUITraceOptions.TRACE_METADATAGEN)
{
_generateMetadataAction = new GenerateMetadataAction();
}
}
private void createContextMenuManager(final Control control)
{
// Create menu manager.
MenuManager menuMgr = new MenuManager();
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager mgr) {
fillContextMenu(mgr);
}
});
// Create menu.
Menu menu = menuMgr.createContextMenu(control);
control.setMenu(menu);
// Register menu for extension.
//getSite().registerContextMenu(menuMgr, viewer);
}
private void fillContextMenu(IMenuManager mgr)
{
if (JSFUITraceOptions.TRACE_METADATAGEN)
{
mgr.add(_generateMetadataAction);
}
}
private void updateActions(final ISelection selection)
{
if (JSFUITraceOptions.TRACE_METADATAGEN)
{
updateMetadataGenAction(selection);
}
}
private void updateMetadataGenAction(final ISelection selection)
{
if (selection instanceof IStructuredSelection)
{
if (((IStructuredSelection)selection).getFirstElement() instanceof Namespace)
{
Namespace ns = (Namespace) ((IStructuredSelection)selection).getFirstElement();
_generateMetadataAction.setNamespace(ns);
_generateMetadataAction.setEnabled(true);
return;
}
}
_generateMetadataAction.setEnabled(false);
}
private static class RefreshAction extends Action
{
private final StructuredViewer _viewer;
/**
* @param viewer
*/
private RefreshAction(final StructuredViewer viewer)
{
super();
_viewer = viewer;
setEnabled(false);
_viewer.addSelectionChangedListener(new ISelectionChangedListener()
{
public void selectionChanged(SelectionChangedEvent event)
{
boolean enabled = false;
final Object selectedObj = getSelected(event.getSelection());
if (selectedObj instanceof TagRegistryInstance)
{
enabled = true;
}
setEnabled(enabled);
}
});
}
@Override
public void run()
{
MessageDialog dialog = new MessageDialog(_viewer.getControl().getShell(), "Also flush cached data?", null, // accept
// the
// default
// window
// icon
"Flushing cached data may cause some operations to slow until cached information is regenerated. If you answer no, the view will refresh but NOT flush cached data"
, MessageDialog.QUESTION, new String[] { IDialogConstants.YES_LABEL,
IDialogConstants.NO_LABEL }, 1); // no is the
// default
final boolean flushCaches = (dialog.open() == 0);
final Object selectedObj = getSelected(_viewer.getSelection());
if (selectedObj instanceof TagRegistryInstance)
{
final TagRegistryInstance registryInstance = (TagRegistryInstance) selectedObj;
final ITagRegistry registry = registryInstance.getRegistry();
if (registry != null)
{
// need a non-null runnable so that refresh won't block,
// but don't need to fire events, since the registry will
// fire events on change.
final Runnable nullRunnable = new Runnable()
{
public void run()
{/* do nothing */
}
};
registry.refresh(nullRunnable, flushCaches);
}
}
}
private Object getSelected(ISelection selection)
{
if (selection instanceof IStructuredSelection)
{
final IStructuredSelection structuredSel = (IStructuredSelection) selection;
if (structuredSel.size() == 1)
{
return structuredSel.getFirstElement();
}
}
return null;
}
}
private static class ProjectContentProvider extends
BaseWorkbenchContentProvider
{
@Override
protected IWorkbenchAdapter getAdapter(final Object element)
{
return new WorkbenchAdapter()
{
@Override
public Object[] getChildren(final Object object)
{
if (object instanceof ProjectTracker)
{
return ((ProjectTracker) object).getProjects()
.toArray();
}
return new Object[0];
}
};
}
}
private static class CommonLabelProvider extends LabelProvider
{
@Override
public String getText(final Object obj)
{
if (obj instanceof TagRegistryInstance)
{
return ((TagRegistryInstance) obj).getInfo().getDescription();
}
else if (obj instanceof Namespace)
{
if (((Namespace) obj).getDisplayName() != null)
{
return ((Namespace) obj).getDisplayName();
}
return ((Namespace) obj).getNSUri();
}
else if (obj instanceof ITagElement)
{
return ((ITagElement) obj).getName();
}
else if (obj instanceof TreePlaceholder)
{
return ((TreePlaceholder) obj).getText();
}
else if (obj instanceof IProject)
{
return ((IProject) obj).getName();
}
return obj.toString();
}
@Override
public Image getImage(final Object obj)
{
if (obj instanceof Namespace)
{
return JavaUI.getSharedImages().getImage(
org.eclipse.jdt.ui.ISharedImages.IMG_OBJS_LIBRARY);
}
else if (obj instanceof TagRegistryInstance)
{
final String imageKey = ISharedImages.IMG_OBJ_FOLDER;
return PlatformUI.getWorkbench().getSharedImages().getImage(
imageKey);
}
else if (obj instanceof ITagElement)
{
if (obj instanceof IComponentTagElement)
{
return JSFUICommonPlugin.getDefault().getImage(
JSFSharedImages.GENERIC_OBJECT_IMG);
}
else if (obj instanceof IConverterTagElement)
{
return JSFUICommonPlugin.getDefault().getImage(
JSFSharedImages.GENERIC_CONVERTER_IMG);
}
else if (obj instanceof IValidatorTagElement)
{
return JSFUICommonPlugin.getDefault().getImage(
JSFSharedImages.GENERIC_VALIDATOR_IMG);
}
return JSFUICommonPlugin.getDefault().getImage(
JSFSharedImages.DEFAULT_PALETTE_TAG_IMG);
}
else if (obj instanceof TreePlaceholder)
{
return JSFUICommonPlugin.getDefault().getImage("configs.gif");
}
final String imageKey = ISharedImages.IMG_OBJ_ELEMENT;
return PlatformUI.getWorkbench().getSharedImages().getImage(
imageKey);
}
}
class NameSorter extends ViewerSorter
{
// do nothing
}
}