/*
* 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);
}
}