blob: bfb6107e5a990bc560c0927d25887b4157443a3c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2019 Red Hat and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Red Hat - Bug 443717
*******************************************************************************/
package org.eclipse.jface.snippets.viewers;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.resource.FontRegistry;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.ITableColorProvider;
import org.eclipse.jface.viewers.ITableFontProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
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.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
public class Snippet067TreeViewerSorted {
private class MyContentProvider implements ITreeContentProvider {
@Override
public Object[] getElements(Object inputElement) {
return ((MyModel) inputElement).children.toArray();
}
@Override
public Object[] getChildren(Object parentElement) {
return getElements(parentElement);
}
@Override
public Object getParent(Object element) {
if (element == null) {
return null;
}
return ((MyModel) element).parent;
}
@Override
public boolean hasChildren(Object element) {
return !((MyModel) element).children.isEmpty();
}
}
public class MyModel {
private MyModel parent;
private List<MyModel> children;
private String name;
private int populationSize;
private int category = 0;
public MyModel(String locationName, int populationSize, MyModel parent) {
this.parent = parent;
this.children = new ArrayList<>();
this.name = locationName;
this.populationSize = populationSize;
}
public void addChild(MyModel child) {
this.children.add(child);
}
public void setCategory(int category) {
this.category = category;
}
public int getPopulationSize() {
return this.populationSize;
}
public int getCategory() {
return this.category;
}
@Override
public String toString() {
return this.name + ": " + NumberFormat.getInstance().format(this.populationSize);
}
}
public Snippet067TreeViewerSorted(Shell shell, Composite composite) {
final TreeViewer v = new TreeViewer(shell);
v.setLabelProvider(new LabelProvider());
v.setComparator(new MyComparator());
v.setContentProvider(new MyContentProvider());
createColumn(v.getTree(), "Values");
v.setInput(createModel());
// Combo
FormData comboFormData = new FormData(300, 50);
comboFormData.left = new FormAttachment(0, 30);
comboFormData.right = new FormAttachment(100, -30);
comboFormData.bottom = new FormAttachment(100, -30);
Combo changeSortingCombo = new Combo(composite, SWT.READ_ONLY);
changeSortingCombo.setToolTipText("Change Sorting Method");
changeSortingCombo.setLayoutData(comboFormData);
changeSortingCombo.add("Sort Method: Descending by Population");
changeSortingCombo.add("Sort Method: Comparator (Categories)");
changeSortingCombo.select(0);
changeSortingCombo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
int selectedIndex = changeSortingCombo.getSelectionIndex();
if (selectedIndex == 0) {
v.setComparator(new MyComparator());
v.setLabelProvider(new DefaultLabelProvider());
} else if (selectedIndex == 1) {
v.setComparator(new MyCategoryComparator());
v.setLabelProvider(new MyLabelProvider());
}
v.update(v, null);
shell.layout(true, true);
}
});
// Category Legend
Composite legendComposite = new Composite(composite, SWT.NONE);
final TableViewer legendV = new TableViewer(legendComposite);
FormData legendFormData = new FormData(300, 300);
legendFormData.right = new FormAttachment(100, -30);
legendFormData.left = new FormAttachment(0, 30);
legendFormData.top = new FormAttachment(0, 30);
legendFormData.bottom = new FormAttachment(changeSortingCombo, -30);
legendComposite.setLayoutData(legendFormData);
legendComposite.setLayout(new FillLayout());
legendV.setLabelProvider(new LegendLabelProvider());
legendV.setContentProvider(ArrayContentProvider.getInstance());
final String[] legendCategories = { "Population > 1,000,000", "Population > 500,000", "Population > 250,000",
"Population > 50,000", "Population > 25,000", "Population > 5000", "Population <= 5000" };
legendV.setInput(legendCategories);
legendV.update(legendV, null);
// Legend label
Label legendLabel = new Label(composite, SWT.BORDER);
legendLabel.setSize(50, 25);
legendLabel.setText("Legend");
FormData labelFormData = new FormData(50, 25);
labelFormData.bottom = new FormAttachment(legendComposite, 0);
labelFormData.right = new FormAttachment(legendComposite, 300);
legendLabel.setLayoutData(labelFormData);
}
public class DefaultLabelProvider extends LabelProvider
implements ITableLabelProvider, ITableFontProvider, ITableColorProvider {
FontRegistry registry = new FontRegistry();
@Override
public Color getForeground(Object element, int columnIndex) {
return null;
}
@Override
public Color getBackground(Object element, int columnIndex) {
return null;
}
@Override
public Font getFont(Object element, int columnIndex) {
return registry.defaultFont();
}
@Override
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
@Override
public String getColumnText(Object element, int columnIndex) {
return element.toString();
}
}
public class MyLabelProvider extends LabelProvider
implements ITableLabelProvider, ITableFontProvider, ITableColorProvider {
FontRegistry registry = new FontRegistry();
@Override
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
@Override
public String getColumnText(Object element, int columnIndex) {
return element.toString();
}
@Override
public Font getFont(Object element, int columnIndex) {
if (((MyModel) element).getCategory() == 0) {
return registry.getBold(Display.getCurrent().getSystemFont().getFontData()[0].getName());
}
return null;
}
@Override
public Color getBackground(Object element, int columnIndex) {
int category = ((MyModel) element).getCategory();
Display display = Display.getCurrent();
if (category == 0) {
return display.getSystemColor(SWT.COLOR_RED);
} else if (category == 1) {
return display.getSystemColor(SWT.COLOR_GRAY);
} else if (category == 2) {
return display.getSystemColor(SWT.COLOR_YELLOW);
} else if (category == 3) {
return display.getSystemColor(SWT.COLOR_BLUE);
} else if (category == 4) {
return display.getSystemColor(SWT.COLOR_GREEN);
} else if (category == 5) {
return display.getSystemColor(SWT.COLOR_CYAN);
} else if (category == 6) {
return display.getSystemColor(SWT.COLOR_WHITE);
}
return null;
}
@Override
public Color getForeground(Object element, int columnIndex) {
int category = ((MyModel) element).getCategory();
if (category == 0 | category == 3) {
return Display.getCurrent().getSystemColor(SWT.COLOR_WHITE);
}
return null;
}
}
public class LegendLabelProvider extends LabelProvider
implements IBaseLabelProvider, ITableFontProvider, ITableColorProvider {
FontRegistry registry = new FontRegistry();
@Override
public Font getFont(Object element, int columnIndex) {
return registry.getBold(Display.getCurrent().getSystemFont().getFontData()[0].getName());
}
@Override
public Color getBackground(Object element, int columnIndex) {
String legendItemText = (String) element;
Display display = Display.getCurrent();
if (legendItemText.equals("Population > 1,000,000")) {
return display.getSystemColor(SWT.COLOR_RED);
} else if (legendItemText.equals("Population > 500,000")) {
return display.getSystemColor(SWT.COLOR_GRAY);
} else if (legendItemText.equals("Population > 250,000")) {
return display.getSystemColor(SWT.COLOR_YELLOW);
} else if (legendItemText.equals("Population > 50,000")) {
return display.getSystemColor(SWT.COLOR_BLUE);
} else if (legendItemText.equals("Population > 25,000")) {
return display.getSystemColor(SWT.COLOR_GREEN);
} else if (legendItemText.equals("Population > 5000")) {
return display.getSystemColor(SWT.COLOR_CYAN);
} else if (legendItemText.equals("Population <= 5000")) {
return display.getSystemColor(SWT.COLOR_WHITE);
}
return null;
}
@Override
public Color getForeground(Object element, int columnIndex) {
String legendItemText = (String) element;
if (legendItemText.equals("Population > 1,000,000") || legendItemText.equals("Population > 50,000")) {
return Display.getCurrent().getSystemColor(SWT.COLOR_WHITE);
}
return null;
}
}
public class MyCategoryComparator extends ViewerComparator {
@Override
public int category(Object element) {
MyModel location = (MyModel) element;
int populationSize = location.getPopulationSize();
int category = 6;
if (populationSize > 5000) {
category = 5;
}
if (populationSize > 25000) {
category = 4;
}
if (populationSize > 50000) {
category = 3;
}
if (populationSize > 250000) {
category = 2;
}
if (populationSize > 500000) {
category = 1;
}
if (populationSize > 1000000) {
category = 0;
}
location.setCategory(category);
return category;
}
}
public class MyComparator extends ViewerComparator {
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
MyModel location1 = (MyModel) e1;
MyModel location2 = (MyModel) e2;
return Integer.compare(location2.getPopulationSize(), location1.getPopulationSize());
}
}
public void createColumn(Tree tr, String text) {
TreeColumn column = new TreeColumn(tr, SWT.NONE);
column.setWidth(100);
column.setText(text);
tr.setHeaderVisible(true);
}
private MyModel createModel() {
MyModel root = new MyModel("Canada", 35151728, null);
MyModel provinceTree1 = new MyModel("Ontario", 14446515, root);
provinceTree1.addChild(new MyModel("Toronto", 2731571, provinceTree1));
provinceTree1.addChild(new MyModel("Ottawa", 934243, provinceTree1));
provinceTree1.addChild(new MyModel("Mississauga", 721599, provinceTree1));
MyModel provinceTree2 = new MyModel("Quebec", 8433301, root);
provinceTree2.addChild(new MyModel("Montréal", 3407963, provinceTree2));
provinceTree2.addChild(new MyModel("Québec", 661011, provinceTree2));
provinceTree2.addChild(new MyModel("Ottawa (Gatineau) ", 236329, provinceTree2));
MyModel provinceTree3 = new MyModel("Nova Scotia", 965382, root);
provinceTree3.addChild(new MyModel("Halifax", 297943, provinceTree3));
provinceTree3.addChild(new MyModel("Sydney", 31597, provinceTree3));
provinceTree3.addChild(new MyModel("Truro", 23261, provinceTree3));
MyModel provinceTree4 = new MyModel("New Brunswick", 772094, root);
provinceTree4.addChild(new MyModel("Saint John", 67575, provinceTree4));
provinceTree4.addChild(new MyModel("Moncton", 71889, provinceTree4));
provinceTree4.addChild(new MyModel("Dieppe", 11897, provinceTree4));
MyModel provinceTree5 = new MyModel("Manitoba", 1360396, root);
provinceTree5.addChild(new MyModel("Winnipeg", 705244, provinceTree5));
provinceTree5.addChild(new MyModel("Brandon", 48859, provinceTree5));
provinceTree5.addChild(new MyModel("Steinbach", 15829, provinceTree5));
MyModel provinceTree6 = new MyModel("British Columbia", 5020302, root);
provinceTree6.addChild(new MyModel("Vancouver", 603502, provinceTree6));
provinceTree6.addChild(new MyModel("Surrey", 468251, provinceTree6));
provinceTree6.addChild(new MyModel("Burnaby", 224218, provinceTree6));
MyModel provinceTree7 = new MyModel("Prince Edward Island", 154748, root);
provinceTree7.addChild(new MyModel("Charlottetown", 36094, provinceTree7));
provinceTree7.addChild(new MyModel("Summerside", 14829, provinceTree7));
provinceTree7.addChild(new MyModel("Alberton", 1145, provinceTree7));
MyModel provinceTree8 = new MyModel("Saskatchewan", 1168423, root);
provinceTree8.addChild(new MyModel("Saskatoon", 246376, provinceTree8));
provinceTree8.addChild(new MyModel("Regina", 215106, provinceTree8));
provinceTree8.addChild(new MyModel("Prince Albert", 35926, provinceTree8));
MyModel provinceTree9 = new MyModel("Alberta", 4345737, root);
provinceTree9.addChild(new MyModel("Calgary", 1239220, provinceTree9));
provinceTree9.addChild(new MyModel("Edmonton", 932546, provinceTree9));
provinceTree9.addChild(new MyModel("Red Deer", 100418, provinceTree9));
MyModel provinceTree10 = new MyModel("Newfoundland and Labrador", 523790, root);
provinceTree10.addChild(new MyModel("St John's", 108860, provinceTree10));
provinceTree10.addChild(new MyModel("Conception Bay South", 26199, provinceTree10));
provinceTree10.addChild(new MyModel("Mount Pearl", 231210, provinceTree10));
root.addChild(provinceTree1);
root.addChild(provinceTree2);
root.addChild(provinceTree3);
root.addChild(provinceTree4);
root.addChild(provinceTree5);
root.addChild(provinceTree6);
root.addChild(provinceTree7);
root.addChild(provinceTree8);
root.addChild(provinceTree9);
root.addChild(provinceTree10);
return root;
}
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
Composite composite = new Composite(shell, SWT.NONE);
composite.setLayout(new FormLayout());
new Snippet067TreeViewerSorted(shell, composite);
shell.layout(true, true);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}