monolipse.ui.views.ReferenceContainerPropertyPage.java Source code

Java tutorial

Introduction

Here is the source code for monolipse.ui.views.ReferenceContainerPropertyPage.java

Source

/*
 * Boo Development Tools for the Eclipse IDE
 * Copyright (C) 2005 Rodrigo B. de Oliveira (rbo@acm.org)
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 */
package monolipse.ui.views;

import java.io.*;
import java.util.*;
import java.util.List;

import monolipse.core.*;
import monolipse.core.foundation.*;
import monolipse.ui.*;

import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.jface.preference.*;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.*;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.*;
import org.eclipse.ui.model.*;
import org.eclipse.ui.views.navigator.*;

public class ReferenceContainerPropertyPage extends PreferencePage implements IWorkbenchPropertyPage {

    abstract class ReferenceLabelProvider implements ITableLabelProvider {
        private Image _image = BooUI.getImage(IBooUIConstants.ASSEMBLY_REFERENCE);

        public Image getColumnImage(Object element, int columnIndex) {
            return 0 == columnIndex ? _image : null;
        }

        public void dispose() {
        }

        public void addListener(ILabelProviderListener listener) {
        }

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

        public void removeListener(ILabelProviderListener listener) {
        }
    }

    class GACContentProvider implements IStructuredContentProvider {

        IAssemblyReference[] _gac;

        public Object[] getElements(Object inputElement) {
            if (null == _gac) {
                try {
                    _gac = BooCore.listGlobalAssemblyCache();
                } catch (IOException e) {
                    dumpError(e);
                }
            }
            return _gac;
        }

        public void dispose() {
        }

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }
    }

    class GACLabelProvider extends ReferenceLabelProvider {
        public String getColumnText(Object element, int columnIndex) {
            IGlobalAssemblyCacheReference reference = (IGlobalAssemblyCacheReference) element;
            switch (columnIndex) {
            case 0:
                return reference.getAssemblyName();
            case 1:
                return reference.getVersion();
            case 2:
                return reference.getToken();
            }
            return "";
        }
    }

    class SelectedReferencesContentProvider implements IStructuredContentProvider {

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

        public void dispose() {
        }

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }
    }

    class SelectedReferencesLabelProvider extends ReferenceLabelProvider {
        public String getColumnText(Object element, int columnIndex) {
            IAssemblyReference reference = (IAssemblyReference) element;
            return columnIndex == 0 ? reference.getAssemblyName() : reference.getType();
        }
    }

    private IAdaptable _element;

    private java.util.Set<IAssemblyReference> _references = new LinkedHashSet<IAssemblyReference>();

    private TableViewer _selectedViewer;

    public ReferenceContainerPropertyPage() {
    }

    protected void performDefaults() {
    }

    public boolean performOk() {
        try {
            IAssemblyReference[] references = new IAssemblyReference[_references.size()];
            _references.toArray(references);
            IAssemblySource assemblySource = getAssemblySource();
            assemblySource.setReferences(references);
            assemblySource.save(null);
            return true;
        } catch (CoreException e) {
            dumpError(e);
        }
        return false;
    }

    public IAdaptable getElement() {
        return _element;
    }

    public void setElement(IAdaptable element) {
        _element = element;
    }

    protected Control createContents(Composite parent) {

        initializeReferences();

        Composite control = new Composite(parent, SWT.NONE);

        CTabFolder libraryBrowser = createTabbedLibraryBrowser(control);
        _selectedViewer = createSelectedLibrariesViewer(control);

        GridLayout layout = new GridLayout(1, true);
        control.setLayout(layout);
        libraryBrowser.setLayoutData(new GridData(GridData.FILL_BOTH));
        _selectedViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));

        return control;
    }

    private void initializeReferences() {
        _references.addAll(Arrays.asList(getAssemblySource().getReferences()));
    }

    private void dumpError(Exception e) {
        e.printStackTrace();
        setErrorMessage(e.getLocalizedMessage());
    }

    private TableViewer createSelectedLibrariesViewer(Composite control) {
        final TableViewer viewer = new TableViewer(control, SWT.BORDER);
        Table table = viewer.getTable();

        addColumn(table, "Assembly", 250);
        addColumn(table, "Type", 150);

        table.setHeaderVisible(true);

        viewer.setContentProvider(new SelectedReferencesContentProvider());
        viewer.setLabelProvider(new SelectedReferencesLabelProvider());
        viewer.setInput(getAssemblySource());
        table.addKeyListener(new KeyAdapter() {
            public void keyReleased(KeyEvent e) {
                if (e.keyCode == SWT.DEL) {
                    List<?> selected = ((IStructuredSelection) _selectedViewer.getSelection()).toList();
                    _references.removeAll(selected);
                    _selectedViewer.refresh();
                }
            }

        });
        return viewer;
    }

    private CTabFolder createTabbedLibraryBrowser(Composite control) {
        final CTabFolder tabFolder = new CTabFolder(control, SWT.BORDER);
        tabFolder.setBorderVisible(true);

        CTabItem localReferencesPage = new CTabItem(tabFolder, SWT.NONE, 0);
        localReferencesPage.setText("Libraries");
        localReferencesPage.setControl(createLocalReferenceBrowser(tabFolder));

        CTabItem sourceReferencesPage = new CTabItem(tabFolder, SWT.NONE, 1);
        sourceReferencesPage.setText("Assembly Sources");
        sourceReferencesPage.setControl(createAssemblySourceBrowser(tabFolder));

        final CTabItem gacReferencesPage = new CTabItem(tabFolder, SWT.NONE, 2);
        gacReferencesPage.setText("Global Assembly Cache");
        final TableViewer gacBrowser = createGACBrowser(tabFolder);
        gacReferencesPage.setControl(gacBrowser.getControl());

        tabFolder.setSelection(localReferencesPage);

        final Object dummyInput = new Object();
        tabFolder.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                if (gacReferencesPage == tabFolder.getSelection()) {
                    if (gacBrowser.getInput() != dummyInput) {
                        gacBrowser.setInput(dummyInput);
                    }
                }
            }
        });

        return tabFolder;
    }

    private TableViewer createGACBrowser(Composite tabFolder) {
        TableViewer viewer = new TableViewer(tabFolder, SWT.FULL_SELECTION);

        Table table = viewer.getTable();

        addColumn(table, "Name", 150);
        addColumn(table, "Version", 150);
        addColumn(table, "Public Key", 100);

        table.setHeaderVisible(true);

        viewer.setContentProvider(new GACContentProvider());
        viewer.setLabelProvider(new GACLabelProvider());
        viewer.addDoubleClickListener(_doubleClickListener);

        return viewer;
    }

    private void addColumn(Table table, String text, int width) {
        TableColumn columnName = new TableColumn(table, SWT.LEFT);
        columnName.setText(text);
        columnName.setWidth(width);
    }

    IDoubleClickListener _doubleClickListener = new IDoubleClickListener() {
        public void doubleClick(DoubleClickEvent event) {
            Object element = ((IStructuredSelection) event.getSelection()).getFirstElement();
            IAssemblyReference reference = getReference(element);
            if (null == reference)
                return;
            BooCore.logInfo("REF: " + reference.toString());

            _references.add(reference);
            _selectedViewer.refresh(true);
        }

        private IAssemblyReference getReference(Object element) {
            if (element instanceof IAssemblyReference)
                return (IAssemblyReference) element;
            return (IAssemblyReference) Platform.getAdapterManager().getAdapter(element, IAssemblyReference.class);
        }
    };

    private Control createAssemblySourceBrowser(Composite parent) {
        TreeViewer viewer = createResourceBrowser(parent);
        viewer.addFilter(new ViewerFilter() {
            public boolean select(Viewer viewer, Object parentElement, Object element) {
                try {
                    if (element instanceof IContainer) {
                        return isOrContainsAssemblySource((IContainer) element);
                    }

                } catch (CoreException e) {
                    dumpError(e);
                }
                return false;
            }
        });
        //viewer.expandAll();
        return viewer.getControl();
    }

    private Control createLocalReferenceBrowser(Composite parent) {
        TreeViewer viewer = createResourceBrowser(parent);

        viewer.addFilter(new ViewerFilter() {
            public boolean select(Viewer viewer, Object parentElement, Object element) {
                try {
                    if (element instanceof IContainer) {
                        return containsLibrary((IContainer) element);
                    }
                    if (element instanceof IFile) {
                        return isLibrary((IFile) element);
                    }
                } catch (CoreException e) {
                    dumpError(e);
                }
                return false;
            }
        });
        //viewer.expandAll();
        return viewer.getControl();
    }

    private TreeViewer createResourceBrowser(Composite parent) {
        TreeViewer viewer = new TreeViewer(parent, SWT.FILL);
        viewer.setContentProvider(new WorkbenchContentProvider());
        viewer.setLabelProvider(new BooExplorerLabelProvider());

        viewer.addDoubleClickListener(_doubleClickListener);

        ResourcePatternFilter resourcePatternFilter = new ResourcePatternFilter();
        resourcePatternFilter.setPatterns(new String[] { ".*" });
        viewer.addFilter(resourcePatternFilter);
        viewer.addFilter(DerivedResourceFilter.DEFAULT);

        viewer.setInput(WorkspaceUtilities.getWorkspaceRoot());
        return viewer;
    }

    protected boolean isLibrary(IFile file) {
        String name = file.getName().toLowerCase();
        return null == name ? false : (name.endsWith(".dll") || name.endsWith(".exe"));
    }

    protected boolean containsLibrary(IContainer folder) throws CoreException {
        final boolean[] result = new boolean[] { false };
        folder.accept(new IResourceVisitor() {
            public boolean visit(IResource resource) throws CoreException {
                if (IResource.FILE == resource.getType() && isLibrary((IFile) resource)) {
                    result[0] = true;
                    return false;
                }
                return true;
            }
        });

        return result[0];
    }

    protected boolean isOrContainsAssemblySource(IContainer folder) throws CoreException {
        if (!folder.getProject().isOpen())
            return false;

        if (isValidAssemblySourceReference(folder))
            return true;
        final boolean[] result = new boolean[] { false };
        folder.accept(new IResourceVisitor() {
            public boolean visit(IResource resource) throws CoreException {
                if (IResource.FOLDER == resource.getType() && isValidAssemblySourceReference((IFolder) resource)) {
                    result[0] = true;
                    return false;
                }
                return true;
            }
        });

        return result[0];
    }

    private boolean isValidAssemblySourceReference(IContainer folder) throws CoreException {
        return folder.getType() == IResource.FOLDER && isValidAssemblySourceReference((IFolder) folder);
    }

    private boolean isValidAssemblySourceReference(IFolder folder) throws CoreException {
        IAssemblySource source = BooCore.getAssemblySource(folder);
        return null == source ? false : source != getAssemblySource();
    }

    private IAssemblySource getAssemblySource() {
        return (IAssemblySource) getElement().getAdapter(IAssemblySource.class);
    }

}