Java tutorial
/******************************************************************************* * 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("Montral", 3407963, provinceTree2)); provinceTree2.addChild(new MyModel("Qubec", 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(); } }