blob: c8468c2f7c9673a8341d3e4d8409c18d23409246 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 2007 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:
* Gerry Kessler - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.jsf.ui.internal.classpath;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.ui.wizards.IClasspathContainerPage;
import org.eclipse.jdt.ui.wizards.IClasspathContainerPageExtension;
import org.eclipse.jdt.ui.wizards.IClasspathContainerPageExtension2;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigUtils;
import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryConfigurationHelper;
import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
import org.eclipse.jst.jsf.ui.internal.Messages;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWizard;
import org.eclipse.ui.PlatformUI;
/**
* Provides a classpath container wizard page for JSF Libraries.
*
* @author Gerry Kessler - Oracle
* @deprecated
*/
public class JSFLibraryContainerWizardPage extends WizardPage implements
IClasspathContainerPage, IClasspathContainerPageExtension, IClasspathContainerPageExtension2{
private CheckboxTableViewer lv;
private JSFLibrariesTableViewerAdapter lvAdapter;
private JSFLibrariesListLabelProvider lvLabelProvider;
private boolean isJSFProject = false;
private IClasspathEntry containerEntry;
private IClasspathEntry[] currentEntries;
private Map _currentLibs;
private JSFLibrary currentLib;
private IProject _iproject;
/**
* Zero arg constructor
*/
public JSFLibraryContainerWizardPage(){
super(Messages.JSFLibraryContainerWizardPage_PageName);
setTitle(Messages.JSFLibraryContainerWizardPage_Title);
setDescription(Messages.JSFLibraryContainerWizardPage_Description);
// TODO: Replace with a custom image.
setImageDescriptor( JSFUiPlugin.getImageDescriptor("full/wizban/addlibrary_wiz.gif")); //$NON-NLS-1$
}
/* (non-Javadoc)
* @see org.eclipse.jdt.ui.wizards.IClasspathContainerPageExtension#initialize(org.eclipse.jdt.core.IJavaProject, org.eclipse.jdt.core.IClasspathEntry[])
*/
public void initialize(IJavaProject project, IClasspathEntry[] currentEntries_) {
this.currentEntries = currentEntries_;
_iproject = project.getProject();
this.isJSFProject = JSFAppConfigUtils.isValidJSFProject(_iproject);
}
/* (non-Javadoc)
* @see org.eclipse.jdt.ui.wizards.IClasspathContainerPage#finish()
*/
public boolean finish() {
return true;
}
/* (non-Javadoc)
* @see org.eclipse.jdt.ui.wizards.IClasspathContainerPageExtension2#getNewContainers()
*/
public IClasspathEntry[] getNewContainers() {
IPath cp = new Path(JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID);
List res = new ArrayList();
Object[] items = lv.getCheckedElements();
for (int i=0;i<items.length;i++){
JSFLibrary jsfLib = (JSFLibrary)items[i];
if (getSelectedJSFLibariesForProject().get(jsfLib.getID()) == null){
IPath path = cp.append(new Path(jsfLib.getID()));
IClasspathEntry entry = JavaCore.newContainerEntry(path);
// need to update wtp dependency in j2ee mod dependency ui
res.add(entry);
}
}
return (IClasspathEntry[])res.toArray(new IClasspathEntry[]{});
}
/* (non-Javadoc)
* @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
*/
public boolean isPageComplete() {
if (!isJSFProject) {
return false;
}
if (isEditReference() && ! selectionHasChanged())
return false;
return isValid();
}
private boolean isValid() {
return isCheckedItems() && getErrorMessage() == null;
}
//to be used to know whether the selected library has changed when in "edit" mode
private boolean selectionHasChanged() {
JSFLibrary lib = getCurrentLibrarySelection();
if (lib == null)
return false;
return (getJSFLibraryForEdit(containerEntry) != lib) ;
}
private JSFLibrary getCurrentLibrarySelection() {
JSFLibrary lib = null;
StructuredSelection ssel = (StructuredSelection)lv.getSelection();
if (ssel != null && !ssel.isEmpty()){
lib = (JSFLibrary)ssel.getFirstElement();
}
return lib;
}
private boolean isCheckedItems() {
return lv.getCheckedElements().length > 0;
}
/* (non-Javadoc)
* @see org.eclipse.jdt.ui.wizards.IClasspathContainerPage#getSelection()
*/
public IClasspathEntry getSelection() {
IClasspathEntry entry = null;
if (isEditReference()){
if (lv.getCheckedElements().length == 0)
return containerEntry;
JSFLibrary lib = (JSFLibrary)lv.getCheckedElements()[0];
if (lib != null){
if (lib == getJSFLibraryForEdit(containerEntry))
{
return containerEntry;
}
IPath path = new Path(JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID).append(new Path(lib.getID()));
entry = JavaCore.newContainerEntry(path, containerEntry.getAccessRules(), containerEntry.getExtraAttributes(),containerEntry.isExported());
}
}
return entry;
}
/* (non-Javadoc)
* @see org.eclipse.jdt.ui.wizards.IClasspathContainerPage#setSelection(org.eclipse.jdt.core.IClasspathEntry)
*/
public void setSelection(IClasspathEntry containerEntry) {
//this is signalling that this is an "edit"
this.containerEntry = containerEntry;
}
public void createControl(Composite parent) {
//Build UI to display JSF Lib components from registry
Composite c = new Composite(parent, SWT.NONE);
c.setLayout(new GridLayout(2, false));
c.setLayoutData(new GridData(GridData.FILL_BOTH));
//disable wizard if this is not a valid JSF project
if (!isJSFProject){
Label warning = new Label(c , SWT.NONE);
warning.setText(Messages.JSFLibraryContainerWizardPage_WarningNoJSFFacet);
setControl(c);
return;
}
Label lblViewer = new Label(c, SWT.NONE);
lblViewer.setText(Messages.JSFLibraryContainerWizardPage_JSFLibraries);
GridData gd1 = new GridData(GridData.BEGINNING);
gd1.horizontalSpan = 2;
lblViewer.setLayoutData(gd1);
lv = createTableViewer(c);
lv.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
lvAdapter = new JSFLibrariesTableViewerAdapter();
lvLabelProvider = new JSFLibrariesListLabelProvider();
lv.setContentProvider(lvAdapter);
lv.setLabelProvider(lvLabelProvider);
lv.addSelectionChangedListener(lvAdapter);
lv.addDoubleClickListener(lvAdapter);
lv.setComparator(lvAdapter);
Composite buttons = new Composite(c, SWT.NONE);
buttons.setLayout(new GridLayout(1, false));
buttons.setLayoutData(new GridData(GridData.FILL_VERTICAL));
final Button addButton = new Button(buttons, SWT.NONE);
addButton.setText(Messages.JSFLibraryContainerWizardPage_Add);
addButton.setLayoutData(new GridData(GridData.END | GridData.VERTICAL_ALIGN_BEGINNING));
addButton.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
openJSFLibraryWizard(null);
}
});
final Button editButton = new Button(buttons, SWT.NONE);
editButton.setText(Messages.JSFLibraryContainerWizardPage_Edit);
editButton.setLayoutData(new GridData(GridData.END | GridData.VERTICAL_ALIGN_BEGINNING));
editButton.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
StructuredSelection sel = (StructuredSelection)lv.getSelection();
if ((sel == null || sel.isEmpty()) && containerEntry != null){
JSFLibrary jsfLib = getJSFLibraryForEdit(containerEntry);
sel = new StructuredSelection(jsfLib);
}
openJSFLibraryWizard(sel);
}
});
editButton.setVisible(false);
lv.addSelectionChangedListener(new ISelectionChangedListener(){
public void selectionChanged(SelectionChangedEvent event) {
setEditButton(event.getSelection());
}
private void setEditButton(final ISelection selection) {
IStructuredSelection sel = (IStructuredSelection)selection;
editButton.setVisible(sel.size()==1);
if (sel.size() == 1){
JSFLibrary lib = (JSFLibrary)sel.getFirstElement();
boolean pp = lib instanceof PluginProvidedJSFLibrary;
editButton.setEnabled(! pp);
if (isEditReference()){
lv.setAllChecked(false);
lv.setChecked(lib, true);
}
}
}
});
setControl(c);
if (isEditReference()){
JSFLibrary lib = getJSFLibraryForEdit(containerEntry);
lv.setInput(getAllUnselectedJSFLibrariesExceptReferencedLib(lib));
selectAndCheckCurrentLib(lib);
setDescription(Messages.JSFLibraryContainerWizardPage_EditLibrary_DescriptionText);
}
else {
lv.setInput(getAllJSFLibraries());
lv.setCheckedElements(getSelectedJSFLibariesForProject().values().toArray(new Object[0]));
}
}
private void selectAndCheckCurrentLib(final JSFLibrary lib) {
if (lib != null){
StructuredSelection ssel = new StructuredSelection(lib);
lv.setSelection(ssel);
lv.setChecked(lib, true);
}
}
private Object getAllUnselectedJSFLibrariesExceptReferencedLib(JSFLibrary referenceLib) {
List allLibs = getAllJSFLibraries();
Collection selLibs = getSelectedJSFLibariesForProject().values();
for (Iterator it=selLibs.iterator();it.hasNext();){
JSFLibrary aLib = (JSFLibrary)it.next();
int i= allLibs.indexOf(aLib);
//remove from allLibs unless it is the selected reference
if (i >= 0 && ((referenceLib == null) || (aLib != null && ! aLib.getID().equals(referenceLib.getID())))){
allLibs.remove(i);
}
}
return allLibs;
}
private List getJSFLibraryEntries(IClasspathEntry[] entries) {
List jsfLibs = new ArrayList();
for (int i=0;i<entries.length;i++){
IClasspathEntry entry = entries[i];
if (JSFLibraryConfigurationHelper.isJSFLibraryContainer(entry)){
JSFLibrary lib = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry(). getJSFLibraryByID(getLibraryId(entry));
if (lib != null){
jsfLibs.add(lib);
}
}
}
return jsfLibs;
}
private String getLibraryId(IClasspathEntry entry) {
return entry.getPath().segment(1);
}
private void openJSFLibraryWizard(IStructuredSelection element){
IWorkbenchWizard wizard = new JSFLibraryWizard();
IWorkbench wb = PlatformUI.getWorkbench();
wizard.init(wb, element);
WizardDialog dialog = new WizardDialog(wb.getActiveWorkbenchWindow().getShell(), wizard);
int ret = dialog.open();
if (ret == Window.OK){
//FIXME: select returned object
if (containerEntry == null){
lv.setInput(getAllJSFLibraries());
}
else {
lv.setInput(getAllUnselectedJSFLibrariesExceptReferencedLib(getJSFLibraryForEdit(containerEntry)));
lv.refresh(true);
}
lv.refresh();
}
}
private CheckboxTableViewer createTableViewer(Composite parent) {
Table table= new Table(parent, SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
table.setFont(parent.getFont());
CheckboxTableViewer tableViewer= new CheckboxTableViewer(table);
tableViewer.addCheckStateListener(new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent e) {
if (! isEditReference()){
//ensure that existing CP entries cannot be unchecked
if (getSelectedJSFLibariesForProject().get(((JSFLibrary)e.getElement()).getID()) != null){
if (containerEntry == null)
e.getCheckable().setChecked(e.getElement(), true);
else
lv.setAllChecked(true);
}
}
else {
//select only one
lv.setAllChecked(false);
lv.setChecked(e.getElement(), true);
if (isEditReference())
lv.setSelection(new StructuredSelection(e.getElement()));
}
validate();
}
});
return tableViewer;
}
private Map getSelectedJSFLibariesForProject(){
if (_currentLibs == null){
List allLibs = getAllJSFLibraries();
List curLibs = getJSFLibraryEntries(currentEntries);
_currentLibs = new HashMap(curLibs.size());
for (Iterator it=curLibs.iterator();it.hasNext();){
JSFLibrary lib = (JSFLibrary)it.next();
int index = getIndex(allLibs, lib);
if (index >=0)
_currentLibs.put(lib.getID(), allLibs.get(index));
}
}
return _currentLibs;
}
private List getAllJSFLibraries() {
List allLibs = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getAllJSFLibraries();
return allLibs;
}
private JSFLibrary getJSFLibraryForEdit(
IClasspathEntry containerEntry_) {
if (currentLib == null){
String id = getLibraryId(containerEntry_);
currentLib = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getJSFLibraryByID(id);
}
return currentLib;
}
private int getIndex(List libs, JSFLibrary lib) {
for (int i=0;i<libs.size();i++){
if (lib.getID().equals(((JSFLibrary)libs.get(i)).getID()))
return i;
}
return -1;
}
private class JSFLibrariesTableViewerAdapter extends ViewerComparator implements IStructuredContentProvider, ISelectionChangedListener, IDoubleClickListener {
private Object input;
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
input = newInput;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
public void dispose() {
// do nothing
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
*/
public Object[] getElements(Object inputElement) {
return ((List)input).toArray();
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
public void selectionChanged(SelectionChangedEvent event) {
if (isEditReference()){
setPageComplete(isPageComplete());
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
*/
public void doubleClick(DoubleClickEvent event) {
doDoubleClick(event);
}
public int compare(Viewer viewer, Object e1, Object e2) {
JSFLibrary lib1 = (JSFLibrary)e1;
JSFLibrary lib2 = (JSFLibrary)e2;
//sort first by in selection already and then by name
boolean lib1Sel = getSelectedJSFLibariesForProject().get(lib1.getID())!=null;
boolean lib2Sel = getSelectedJSFLibariesForProject().get(lib2.getID())!= null;
if ((lib1Sel && lib2Sel) || (!lib1Sel && !lib2Sel) ){
return getComparator().compare(lib1.getLabel(), lib2.getLabel());
}
else if (lib1Sel)
return -1;
else
return 1;
}
}
private static class JSFLibrariesListLabelProvider implements ILabelProvider{
Image libImg;
public Image getImage(Object element) {
if (libImg == null){
ImageDescriptor libImgDesc = JSFUiPlugin.getImageDescriptor("obj16/library_obj.gif"); //$NON-NLS-1$
libImg = libImgDesc.createImage();
}
return libImg;
}
public String getText(Object element) {
if (element instanceof JSFLibrary) {
JSFLibrary lib = (JSFLibrary)element;
if (lib.isImplementation()) {
return lib.getLabel() + " " + Messages.JSFLibrariesPreferencePage_IMPL_DESC; //$NON-NLS-1$
}
return lib.getLabel();
}
return null;
}
public void dispose() {
if (libImg != null)
libImg.dispose();
}
public void addListener(ILabelProviderListener listener) {
// no listener support
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void removeListener(ILabelProviderListener listener) {
// no listener support
}
}
private void validate() {
setErrorMessage(null);
int implChosenCount = implSelectedCount();
if (implChosenCount>1){
setErrorMessage(Messages.JSFLibraryContainerWizardPage_ImplAlreadyPresent);
}
setPageComplete(isPageComplete());
}
private boolean isEditReference() {
return (containerEntry != null);
}
private int implSelectedCount() {
int count = 0;
for (int i=0;i<lv.getCheckedElements().length;i++){
JSFLibrary lib = (JSFLibrary)lv.getCheckedElements()[i];
if (lib.isImplementation())
count++;
}
return count;
}
private void doDoubleClick(DoubleClickEvent event) {
StructuredSelection ssel = (StructuredSelection)event.getSelection();
if (ssel != null &&
(! ((JSFLibrary)ssel.getFirstElement() instanceof PluginProvidedJSFLibrary)))
openJSFLibraryWizard((IStructuredSelection)event.getSelection());
}
}