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

}
