/*******************************************************************************
* Copyright (c) 2009, 2010 Innovation Gate GmbH.
* 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:
* Innovation Gate GmbH - initial API and implementation
******************************************************************************/
package de.innovationgate.eclipse.wgadesigner.pages;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
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.TableViewer;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import de.innovationgate.eclipse.utils.ui.model.BeanListTableModelContentProvider;
import de.innovationgate.eclipse.utils.ui.model.BeanListTableModelLabelProvider;
import de.innovationgate.eclipse.wgadesigner.WGADesignerPlugin;
import de.innovationgate.eclipse.wgadesigner.classpath.LibrarySet;
import de.innovationgate.eclipse.wgadesigner.classpath.WGALibrarySetContainer;
import de.innovationgate.wga.model.BeanListTableModel;
public class LibraryContainerPage extends WizardPage implements IClasspathContainerPage, IClasspathContainerPageExtension, IClasspathContainerPageExtension2 {
private IClasspathEntry _containerEntry;
private Table _tabLibraries;
private IClasspathEntry[] _currentEntries;
public LibraryContainerPage() {
super("WGA Developer Studio Libraries", "WGA Developer Studio Libraries", null);
setPageComplete(false);
}
public LibraryContainerPage(String pageName, String title, ImageDescriptor titleImage) {
super("WGA Developer Studio Libraries", "WGA Developer Studio Libraries", null);
setPageComplete(false);
}
public boolean finish() {
return true;
}
public IClasspathEntry getSelection() {
return null;
}
public void setSelection(IClasspathEntry containerEntry) {
_containerEntry = containerEntry;
}
public void createControl(Composite parent) {
Composite container = new Composite(parent, SWT.NULL);
GridLayout layout = new GridLayout();
layout.numColumns = 1;
container.setLayout(layout);
_tabLibraries = new Table(container, SWT.CHECK|SWT.READ_ONLY);
GridData tabLayout = new GridData(GridData.FILL_BOTH);
_tabLibraries.setLayoutData(tabLayout);
_tabLibraries.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
boolean itemsChecked = false;
TableItem[] items = _tabLibraries.getItems();
for (TableItem item : items) {
if (item.getChecked()) {
itemsChecked = true;
// check dependencies
LibrarySet set = (LibrarySet) item.getData();
if (set.getDependencies() != null) {
for (String id : set.getDependencies()) {
for (TableItem dependentItem : items) {
LibrarySet dependentSet = (LibrarySet) dependentItem.getData();
if (dependentSet.getId().equals(id)) {
dependentItem.setChecked(true);
dependentItem.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_GRAY));
}
}
}
}
} else {
// deselect dependencies
LibrarySet set = (LibrarySet) item.getData();
if (set.getDependencies() != null) {
for (String id : set.getDependencies()) {
for (TableItem dependentItem : items) {
LibrarySet dependentSet = (LibrarySet) dependentItem.getData();
if (dependentSet.getId().equals(id)) {
dependentItem.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_WIDGET_FOREGROUND));
}
}
}
}
}
}
setPageComplete(itemsChecked);
}
});
TableViewer viewer = new TableViewer(_tabLibraries);
List<LibrarySet> librarySets = new ArrayList<LibrarySet>(WGADesignerPlugin.getDefault().getLibrarySets().values());
Iterator<LibrarySet> setIt = librarySets.iterator();
while (setIt.hasNext()) {
String id = setIt.next().getId();
IPath currentSetPath = new Path(WGALibrarySetContainer.ID).append(id);
if (_currentEntries != null) {
// check if id is already in classpathentries
for (IClasspathEntry entry : _currentEntries) {
if (entry.getPath().equals(currentSetPath)) {
setIt.remove();
}
}
}
}
Collections.sort(librarySets, new Comparator<LibrarySet>() {
public int compare(LibrarySet o1, LibrarySet o2) {
return o1.getName().compareTo(o2.getName());
}
});
BeanListTableModel<LibrarySet> model = new BeanListTableModel<LibrarySet>(librarySets) {
@Override
public int getColumnCount() {
return 1;
}
@Override
public String getColumnText(LibrarySet bean, int column) {
return bean.getName();
}
@Override
public Object getColumnValue(LibrarySet bean, int column) {
return bean.getName();
}
@Override
public boolean isColumnEditable(LibrarySet bean, int column) {
return false;
}
@Override
public void setColumnValue(LibrarySet bean, int column, Object value) {
}
};
viewer.setContentProvider(new BeanListTableModelContentProvider());
viewer.setLabelProvider(new BeanListTableModelLabelProvider(model));
viewer.setInput(model);
setControl(container);
}
public IClasspathEntry[] getNewContainers() {
List<IClasspathEntry> entries = new ArrayList<IClasspathEntry>();
IPath containerPath = new Path(WGALibrarySetContainer.ID);
TableItem[] items = _tabLibraries.getItems();
for (TableItem item : items) {
if (item.getChecked()) {
LibrarySet librarySet = (LibrarySet) item.getData();
entries.add(JavaCore.newContainerEntry(containerPath.append(librarySet.getId())));
}
}
return entries.toArray(new IClasspathEntry[0]);
}
public void initialize(IJavaProject project, IClasspathEntry[] currentEntries) {
_currentEntries = currentEntries;
}
}