org.eclipse.jst.jsf.ui.internal.jsflibraryconfig.JSFLibraryConfigControl.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jst.jsf.ui.internal.jsflibraryconfig.JSFLibraryConfigControl.java

Source

/*******************************************************************************
 * Copyright (c) 2006, 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:
 *    Justin Chen
 *******************************************************************************/
package org.eclipse.jst.jsf.ui.internal.jsflibraryconfig;

import java.util.ArrayList;
import java.util.Collections;
import java.util.EventObject;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.Vector;

import org.eclipse.core.runtime.ISafeRunnable;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.SafeRunnable;
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.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryConfigDialogSettingData;
import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryConfigModel;
import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryInternalReference;
import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties;
import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
import org.eclipse.jst.jsf.ui.internal.Messages;
import org.eclipse.jst.jsf.ui.internal.classpath.JSFLibraryWizard;
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.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelSynchHelper;

/**
 * A custom control used in wizard and property pages.
 * 
 * @author Justin Chen
 * @deprecated
 */
public class JSFLibraryConfigControl extends Composite {

    final static private int COLUMN_DEPLOY = 0;
    final static private int COLUMN_LIB_NAME = 1;

    private JSFLibraryConfigModel workingCopyModel = null;

    private CheckboxTableViewer ctvSelCompLib;
    private TreeViewer tvCompLib;
    private TreeViewerAdapter tvAdapter;
    private TreeLabelProvider tvLabelProvider;
    private Button btnAddAll;
    private Button btnRemoveAll;

    private Vector newJSFLibCreatedListeners = new Vector();
    private Set _changeListeners;
    private boolean _initing;
    private IDataModel model;

    /**
     * @param listener
     */
    public void addOkClickedListener(IJSFImplLibraryCreationListener listener) {
        newJSFLibCreatedListeners.addElement(listener);
    }

    /**
     * @param listener
     */
    public void removeOkClickedListener(IJSFImplLibraryCreationListener listener) {
        newJSFLibCreatedListeners.removeElement(listener);
    }

    /**
     * @param listener
     */
    public void addChangeListener(JSFLibraryConfigControlChangeListener listener) {
        getChangeListeners().add(listener);
    }

    /**
     * @param listener
     */
    public void removeChangeListener(JSFLibraryConfigControlChangeListener listener) {
        if (getChangeListeners().contains(listener))
            getChangeListeners().remove(listener);
    }

    private Set getChangeListeners() {
        if (_changeListeners == null) {
            _changeListeners = new HashSet();
        }
        return _changeListeners;
    }

    private void fireChangedEvent(final EventObject e) {
        if (_initing)
            return;
        SafeRunnable.run(new ISafeRunnable() {
            public void handleException(Throwable exception) {
                // TODO: should we perhaps do something here?
                JSFUiPlugin.log(IStatus.ERROR, exception.getLocalizedMessage());
            }

            public void run() throws Exception {
                for (Iterator it = getChangeListeners().iterator(); it.hasNext();) {
                    ((JSFLibraryConfigControlChangeListener) it.next())
                            .changed(new JSFLibraryConfigControlChangeEvent(e));
                }
            }
        });
    }

    /**
     * Create the composite
     * @param parent
     * @param style
     */
    public JSFLibraryConfigControl(Composite parent, int style) {
        super(parent, style);
        _initing = true;
        createControls();
    }

    /**
     * set control values from provided model.
     * 
     * @param source
     */
    public void loadControlValuesFromModel(JSFLibraryConfigDialogSettingData source) {
        if (source != null) {
            // never read persistentModel = source;
            workingCopyModel = JSFLibraryConfigModel.JSFLibraryConfigModelFactory.createInstance(source);
            initializeControlValues();
            _initing = false;
        } else {
            JSFUiPlugin.log(IStatus.ERROR, Messages.JSFLibraryConfigControl_NullProject);
        }

    }

    /* (non-Javadoc)
     * @see org.eclipse.swt.widgets.Widget#dispose()
     */
    public void dispose() {
        super.dispose();
    }

    /**
     * Return a list of selected JSF Component Libraries.
     * Otherwise, return an empty list.
     * 
     * @return a list of selected JSF Component Libraries
    */
    public List getSelectedJSFLibComponents() {
        return workingCopyModel.getCurrentJSFComponentLibrarySelection();
    }

    /**
     * 
     * @return JSFLibraryConfigModelAdapter
     */
    public JSFLibraryConfigModel getWorkingModel() {
        return workingCopyModel;
    }

    private void initializeControlValues() {
        loadJSFCompList();

        JSFLibraryInternalReference savedCompLib = null;
        JSFLibraryInternalReference selected = null;
        //Iterator it = persistentModel.getJSFComponentLibraries().iterator();
        Iterator it = workingCopyModel.getJSFComponentLibraries().iterator();
        while (it.hasNext()) {
            savedCompLib = (JSFLibraryInternalReference) it.next();
            selected = JSFLibraryRegistryUtil.getInstance().getJSFLibraryReferencebyID(savedCompLib.getID());
            if (selected != null) {
                ctvSelCompLib.setChecked(selected, selected.isCheckedToBeDeployed());
            }
        }

        setCompListModelProperty();

        redraw();
    }

    private void loadJSFCompList() {
        tvCompLib.setInput(workingCopyModel.getJSFComponentLibraries());
        ctvSelCompLib.setInput(workingCopyModel.getJSFComponentLibraries());
    }

    private void createCompLibControls(Composite parent) {
        final Composite cmpCompLibs = new Composite(parent, SWT.NONE);
        final GridLayout gridLayoutCompLibs = new GridLayout();
        gridLayoutCompLibs.numColumns = 4;
        gridLayoutCompLibs.marginWidth = 0;
        gridLayoutCompLibs.marginHeight = 0;
        cmpCompLibs.setLayout(gridLayoutCompLibs);
        GridData gdComp = new GridData();
        gdComp.horizontalAlignment = SWT.FILL;
        gdComp.grabExcessHorizontalSpace = true;
        cmpCompLibs.setLayoutData(gdComp);

        tvCompLib = new TreeViewer(cmpCompLibs, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
        tvAdapter = new TreeViewerAdapter();
        tvLabelProvider = new TreeLabelProvider();
        tvCompLib.setContentProvider(tvAdapter);
        tvCompLib.setLabelProvider(tvLabelProvider);
        tvCompLib.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                resetComponentLibSelection((StructuredSelection) event.getSelection(), tvCompLib, ctvSelCompLib,
                        true);
                fireChangedEvent(event);
            }
        });
        tvCompLib.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
        tvCompLib.addFilter(new TreeViewerFilter());

        final Composite composite_buttons = new Composite(cmpCompLibs, SWT.NONE);
        composite_buttons.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
        composite_buttons.setLayout(new GridLayout());

        final Composite composite_Single = new Composite(composite_buttons, SWT.None);
        composite_Single.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        final GridLayout gl_Single = new GridLayout();
        gl_Single.marginHeight = 4;
        composite_Single.setLayout(new GridLayout());

        final Button btnAdd = new Button(composite_Single, SWT.NONE);
        btnAdd.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
        btnAdd.setText(Messages.JSFLibraryConfigControl_Add);
        btnAdd.setEnabled(false);

        final Button btnRemove = new Button(composite_Single, SWT.NONE);
        btnRemove.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
        btnRemove.setText(Messages.JSFLibraryConfigControl_Remove);
        btnRemove.setEnabled(false);

        final Composite composite_All = new Composite(composite_buttons, SWT.None);
        composite_All.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        final GridLayout gl_All = new GridLayout();
        gl_Single.marginHeight = 4;
        composite_All.setLayout(gl_All);

        btnAddAll = new Button(composite_All, SWT.NONE);
        btnAddAll.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
        btnAddAll.setText(Messages.JSFLibraryConfigControl_AddAll);

        btnRemoveAll = new Button(composite_All, SWT.NONE);
        btnRemoveAll.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
        btnRemoveAll.setText(Messages.JSFLibraryConfigControl_RemoveAll);

        final Composite composite_New = new Composite(composite_buttons, SWT.None);
        composite_New.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        final GridLayout gl_New = new GridLayout();
        gl_Single.marginHeight = 4;
        composite_New.setLayout(gl_New);

        final Button btnNewCompLib = new Button(composite_New, SWT.NONE);
        btnNewCompLib.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false));
        btnNewCompLib.setText(Messages.JSFLibraryConfigControl_NewComponentLibrary);
        btnNewCompLib.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                JSFLibraryWizard wizard = new JSFLibraryWizard();
                IWorkbench wb = PlatformUI.getWorkbench();
                wizard.init(wb, null);
                WizardDialog dialog = new WizardDialog(wb.getActiveWorkbenchWindow().getShell(), wizard);
                int ret = dialog.open();
                if (ret == Window.OK) {
                    JSFLibraryInternalReference lib = new JSFLibraryInternalReference(wizard.getJSFLibrary(), true,
                            true);
                    JSFLibraryRegistryUtil.getInstance().addJSFLibrary(lib);
                    workingCopyModel.getJSFComponentLibraries().add(lib);

                    loadJSFCompList();
                    setCompListModelProperty();
                    ctvSelCompLib.setChecked(lib, true);
                }
            }
        });

        ctvSelCompLib = CheckboxTableViewer.newCheckList(cmpCompLibs, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER);
        ctvSelCompLib.addFilter(new CheckedTableViewerFilter());
        final Table table = ctvSelCompLib.getTable();
        table.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
        table.setHeaderVisible(true);
        final TableColumn tcDeploy = new TableColumn(table, SWT.LEFT);
        tcDeploy.setWidth(50);
        tcDeploy.setText(Messages.JSFLibraryConfigControl_TH_Deploy);
        tcDeploy.setToolTipText(Messages.JSFLibraryConfigControl_DeployJAR);
        final TableColumn tcLibName = new TableColumn(table, SWT.LEFT);
        tcLibName.setWidth(150);
        tcLibName.setText(Messages.JSFLibraryConfigControl_TH_LibraryName);

        //ctvSelCompLib.setCellModifier(new CellModifierCTVSelCompLib());
        ctvSelCompLib.setSorter(new SelectedCompLibCTVSorter());
        ctvSelCompLib.setLabelProvider(new SelectedCompLibCTVLabelProvider());
        ctvSelCompLib.setContentProvider(new CompLibCTVContentProvider());
        ctvSelCompLib.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                resetComponentLibSelection((StructuredSelection) event.getSelection(), tvCompLib, ctvSelCompLib,
                        false);
                fireChangedEvent(event);
            }
        });
        ctvSelCompLib.addCheckStateListener(new ICheckStateListener() {
            public void checkStateChanged(CheckStateChangedEvent event) {
                JSFLibraryInternalReference changedItem = (JSFLibraryInternalReference) event.getElement();
                boolean isChecked4Deploy = event.getChecked();

                List list = workingCopyModel.getJSFComponentLibraries();
                Iterator it = list.iterator();
                JSFLibraryInternalReference crtjsflib = null;
                while (it.hasNext()) {
                    crtjsflib = (JSFLibraryInternalReference) it.next();
                    if (crtjsflib.getID().equals(changedItem.getID())) {
                        crtjsflib.setToBeDeployed(isChecked4Deploy);
                        fireChangedEvent(event);
                        break;
                    }
                }
            }
        });

        btnAdd.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                resetComponentLibSelection((StructuredSelection) tvCompLib.getSelection(), tvCompLib, ctvSelCompLib,
                        true);
                fireChangedEvent(e);
            }
        });

        btnAddAll.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                resetCompontLibSelectionAll(tvCompLib, ctvSelCompLib, true);
                fireChangedEvent(e);
            }
        });
        btnRemove.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                resetComponentLibSelection((StructuredSelection) ctvSelCompLib.getSelection(), tvCompLib,
                        ctvSelCompLib, false);
                fireChangedEvent(e);
            }
        });

        btnRemoveAll.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                resetCompontLibSelectionAll(tvCompLib, ctvSelCompLib, false);
                fireChangedEvent(e);
            }
        });

        tvCompLib.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                StructuredSelection sel = (StructuredSelection) event.getSelection();
                btnAdd.setEnabled(!sel.isEmpty() && sel.getFirstElement() instanceof JSFLibraryInternalReference);
                btnAddAll.setEnabled(tvCompLib.getTree().getItemCount() > 0);
            }
        });

        ctvSelCompLib.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                StructuredSelection sel = (StructuredSelection) event.getSelection();
                btnRemove.setEnabled(!sel.isEmpty());
                btnRemoveAll.setEnabled(ctvSelCompLib.getTable().getItemCount() > 0);
            }
        });

    }

    private void createControls() {
        setRedraw(true);
        final GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 1;
        gridLayout.marginLeft = 0;
        gridLayout.marginRight = 0;
        gridLayout.marginWidth = 0;
        gridLayout.marginTop = 0;
        this.setLayout(gridLayout);

        createCompLibControls(this);
    }

    /*
     * Event handling helper methods
     */

    // Set selected item to the given state on model and update viewers.  
    private void resetComponentLibSelection(StructuredSelection item, TreeViewer srcViewer,
            CheckboxTableViewer destViewer, boolean state) {
        if (item != null && !item.isEmpty()) {
            List selected = new ArrayList(item.size());
            for (Iterator sel = item.iterator(); sel.hasNext();) {
                JSFLibraryInternalReference jsfLibDctr = (JSFLibraryInternalReference) sel.next();
                selected.add(jsfLibDctr);
                List list = workingCopyModel.getJSFComponentLibraries();
                Iterator it = list.iterator();
                JSFLibraryInternalReference crtjsfLibDctr = null;
                while (it.hasNext()) {
                    crtjsfLibDctr = (JSFLibraryInternalReference) it.next();
                    if (crtjsfLibDctr.getID().equals(jsfLibDctr.getID())) {
                        crtjsfLibDctr.setToBeDeployed(state);
                        crtjsfLibDctr.setSelected(state);
                    }
                }
            }

            loadJSFCompList();

            srcViewer.refresh();
            destViewer.refresh();
            for (Iterator it = selected.iterator(); it.hasNext();) {
                destViewer.setChecked(it.next(), state);
            }

            setCompListModelProperty();
        }
    }

    // Reset all component library from given state to model and update viewers.   
    private void resetCompontLibSelectionAll(TreeViewer srcViewer, CheckboxTableViewer destViewer, boolean state) {

        List list = workingCopyModel.getJSFComponentLibraries();
        Iterator it = list.iterator();
        JSFLibraryInternalReference jsfLibDctr;
        while (it.hasNext()) {
            jsfLibDctr = (JSFLibraryInternalReference) it.next();
            jsfLibDctr.setSelected(state);
            jsfLibDctr.setToBeDeployed(state);
        }

        loadJSFCompList();

        srcViewer.refresh();
        destViewer.refresh();
        destViewer.setAllChecked(state);

        btnAddAll.setEnabled(!state);
        btnRemoveAll.setEnabled(state);

        setCompListModelProperty();
    }

    //synchHelper is not able to track changes to data elements in tableviewer... manual set of property
    private void setCompListModelProperty() {
        TableItem[] tableItems = ctvSelCompLib.getTable().getItems();
        List compLibs = new ArrayList(tableItems.length);
        for (int i = 0; i < tableItems.length; i++) {
            compLibs.add(tableItems[i].getData());
        }
        JSFLibraryInternalReference[] libs = (JSFLibraryInternalReference[]) compLibs
                .toArray(new JSFLibraryInternalReference[0]);
        model.setProperty(IJSFFacetInstallDataModelProperties.COMPONENT_LIBRARIES, libs);
    }

    /**
     * Configure the JSFLibraryConfigControl elements to used the containers synchHelper
     * @param synchHelper
     */
    public void setSynchHelper(DataModelSynchHelper synchHelper) {
        model = synchHelper.getDataModel();
    }

    /**
     *    Inner Classes for filtering.
     *
     */
    private static class CheckedTableViewerFilter extends ViewerFilter {
        public boolean select(Viewer viewer, Object parentElement, Object element) {
            if (element instanceof JSFLibraryInternalReference) {
                return ((JSFLibraryInternalReference) element).isSelected();
            }
            return false;
        }
    }

    private static class TreeViewerFilter extends ViewerFilter {

        public boolean select(Viewer viewer, Object parentElement, Object element) {
            if (element instanceof JSFLibraryInternalReference) {
                return !((JSFLibraryInternalReference) element).isSelected();
            }
            return true;
        }
    }

    private static class CompLibCTVContentProvider implements IStructuredContentProvider {
        private List jsfComplLibs = new ArrayList(0);

        public Object[] getElements(Object inputElement) {
            return jsfComplLibs.toArray();
        }

        public void dispose() {
            // do nothing
        }

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            if (newInput == null) {
                jsfComplLibs = Collections.EMPTY_LIST;
            } else {
                jsfComplLibs = (List) newInput;
            }
        }
    }

    // Label Provider
    private static class SelectedCompLibCTVLabelProvider extends LabelProvider implements ITableLabelProvider {
        public String getColumnText(Object element, int columnIndex) {
            if (element instanceof JSFLibraryInternalReference) {

                switch (columnIndex) {
                case COLUMN_DEPLOY:
                    return " "; //$NON-NLS-1$
                case COLUMN_LIB_NAME:
                    return ((JSFLibraryInternalReference) element).getLabel();
                }
            }
            return ""; //$NON-NLS-1$

        }

        public Image getColumnImage(Object element, int columnIndex) {
            return null;
        }
    }

    // Sorter
    private static class SelectedCompLibCTVSorter extends ViewerSorter {
        public int compare(Viewer viewer, Object e1, Object e2) {
            if (e1 instanceof JSFLibraryInternalReference && e2 instanceof JSFLibraryInternalReference) {
                JSFLibraryInternalReference item1 = (JSFLibraryInternalReference) e1;
                JSFLibraryInternalReference item2 = (JSFLibraryInternalReference) e2;
                return item1.getLabel().compareToIgnoreCase(item2.getLabel());
            }
            return 0;
        }
    }

    /*
     * Content provider Adapter for TreeViewer
     */
    private class TreeViewerAdapter implements ITreeContentProvider {
        private final Object[] NO_ELEMENTS = new Object[0];

        // ------- ITreeContentProvider Interface ------------

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            // will never happen
        }

        public void dispose() {
            // do nothing
        }

        public Object[] getElements(Object obj) {
            return workingCopyModel.getJSFComponentLibraries().toArray();
        }

        public Object[] getChildren(Object element) {
            if (element instanceof JSFLibraryInternalReference) {
                return ((JSFLibraryInternalReference) element).getArchiveFiles().toArray();
            }
            return NO_ELEMENTS;
        }

        public Object getParent(Object element) {
            return null;
        }

        public boolean hasChildren(Object element) {
            if (element instanceof JSFLibraryInternalReference) {
                return true;
            }
            return false;
        }

    }

    private static class TreeLabelProvider implements ILabelProvider {
        private final Image libImg;
        private final Image jarImg;

        TreeLabelProvider() {
            ImageDescriptor jarImgDesc = JSFUiPlugin.getImageDescriptor("obj16/jar_obj.gif"); //$NON-NLS-1$
            jarImg = jarImgDesc.createImage();
            ImageDescriptor libImgDesc = JSFUiPlugin.getImageDescriptor("obj16/library_obj.gif"); //$NON-NLS-1$
            libImg = libImgDesc.createImage();
        }

        public Image getImage(Object element) {
            if (element instanceof JSFLibraryInternalReference) {
                return libImg;
            }
            return jarImg;
        }

        public String getText(Object element) {
            StringBuffer labelBuf = new StringBuffer();
            if (element instanceof JSFLibraryInternalReference) {
                JSFLibraryInternalReference libWrapper = (JSFLibraryInternalReference) element;
                JSFLibrary lib = libWrapper.getLibrary();
                labelBuf.append(lib.getLabel());
                if (lib.isImplementation()) {
                    labelBuf.append(" "); //$NON-NLS-1$
                    if (lib == JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry()
                            .getDefaultImplementation()) {
                        labelBuf.append(Messages.JSFLibrariesPreferencePage_DEFAULT_IMPL_DESC);
                    } else {
                        labelBuf.append(Messages.JSFLibrariesPreferencePage_IMPL_DESC);
                    }
                }
            }
            if (element instanceof ArchiveFile) {
                ArchiveFile jar = (ArchiveFile) element;
                labelBuf.append(jar.getName());
                if (!jar.exists())
                    labelBuf.append(Messages.JSFLibrariesPreferencePage_MISSING_DESC);
                labelBuf.append(" - ").append(((ArchiveFile) element).getSourceLocation()); //$NON-NLS-1$
            }
            return labelBuf.toString();
        }

        public void addListener(ILabelProviderListener listener) {
            // not handling listeners
        }

        public void dispose() {
            if (libImg != null) {
                libImg.dispose();
            }
            if (jarImg != null) {
                jarImg.dispose();
            }
        }

        public boolean isLabelProperty(Object element, String property) {
            return false;
        }

        public void removeListener(ILabelProviderListener listener) {
            // not handling listeners
        }
    }

}