blob: 0446f3bb03514c1b4268585a680c61465f628d4c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 xored software, Inc. and others.
* 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:
* xored software,Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.dltk.tcl.internal.debug.ui.interpreters;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.eclipse.dltk.tcl.core.TclPackagesManager;
import org.eclipse.dltk.tcl.core.packages.TclInterpreterInfo;
import org.eclipse.dltk.tcl.core.packages.TclPackageInfo;
import org.eclipse.dltk.tcl.internal.ui.TclImages;
import org.eclipse.dltk.ui.DLTKPluginImages;
import org.eclipse.dltk.ui.viewsupport.ImageDescriptorRegistry;
import org.eclipse.emf.common.util.EList;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
/**
* @since 2.0
*/
public class AvailablePackagesBlock {
private TclInterpreterInfo interpreter = null;
private TreeViewer viewer;
private AddTclInterpreterDialog dialog;
private static class Node {
String value;
Object image;
}
private static class Library extends Node {
}
public AvailablePackagesBlock(AddTclInterpreterDialog dialog) {
this.dialog = dialog;
}
public void createIn(Composite content) {
viewer = new TreeViewer(content);
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1);
gd.heightHint = 50;
viewer.getControl().setLayoutData(gd);
viewer.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof TclPackageInfo) {
String name = ((TclPackageInfo) element).getName();
String version = ((TclPackageInfo) element).getVersion();
if (version != null && version.length() > 0) {
return name + " (" + version + ")";
} else {
return name;
}
}
if (element instanceof Node) {
return ((Node) element).value;
}
return super.getText(element);
}
@Override
public Image getImage(Object element) {
if (element instanceof TclPackageInfo) {
return DLTKPluginImages
.get(DLTKPluginImages.IMG_OBJS_PACKAGE);
}
if (element instanceof Node) {
Object image = ((Node) element).image;
if (image instanceof Image) {
return (Image) image;
} else if (image instanceof ImageDescriptor) {
return registry.get((ImageDescriptor) image);
}
}
return registry.get(TclImages.DESC_OBJS_TCL);
}
@Override
public void dispose() {
super.dispose();
registry.dispose();
}
final ImageDescriptorRegistry registry = new ImageDescriptorRegistry(
false);
});
viewer.setContentProvider(new ITreeContentProvider() {
public void inputChanged(Viewer viewer, Object oldInput,
Object newInput) {
}
public void dispose() {
}
public Object[] getElements(Object inputElement) {
if (inputElement instanceof TclInterpreterInfo) {
TclInterpreterInfo info = (TclInterpreterInfo) inputElement;
EList<TclPackageInfo> packages = info.getPackages();
List<TclPackageInfo> sorted = new ArrayList<TclPackageInfo>();
sorted.addAll(packages);
Collections.sort(sorted, new Comparator<TclPackageInfo>() {
public int compare(TclPackageInfo o1, TclPackageInfo o2) {
return o1.getName().compareTo(o2.getName());
}
});
return sorted.toArray();
}
return new Object[0];
}
public boolean hasChildren(Object element) {
if (element instanceof TclPackageInfo) {
return true;
}
return false;
}
public Object getParent(Object element) {
return null;
}
public Object[] getChildren(final Object parentElement) {
if (parentElement instanceof TclPackageInfo) {
final TclPackageInfo info = (TclPackageInfo) parentElement;
if (!info.isFetched()) {
TclPackagesManager.getPackageInfo(
AvailablePackagesBlock.this.dialog
.getInterpreterStandin(), info
.getName(), true,
AvailablePackagesBlock.this.interpreter, null);
}
List<Node> result = new ArrayList<Node>();
EList<String> sources = info.getSources();
for (String source : sources) {
Node nde = new Node();
nde.value = source;
nde.image = TclImages.DESC_OBJS_TCL;
result.add(nde);
}
EList<String> libs = info.getLibraries();
for (String source : libs) {
Node nde = new Library();
nde.value = source;
nde.image = DLTKPluginImages
.get(DLTKPluginImages.IMG_OBJS_LIBRARY);
result.add(nde);
}
return result.toArray();
}
return new Object[0];
}
});
viewer.setComparator(new ViewerComparator() {
@Override
public int category(Object element) {
if (element instanceof Library) {
return 1;
}
return super.category(element);
}
});
// viewer.setInput(elements);
}
public void updatePackages(TclInterpreterInfo info) {
this.interpreter = info;
// Collections.sort(elements);
viewer.getControl().getDisplay().asyncExec(new Runnable() {
public void run() {
viewer.setInput(interpreter);
viewer.refresh();
}
});
}
}