/*
* uDig - User Friendly Desktop Internet GIS client
* http://udig.refractions.net
* (C) 2012, Refractions Research Inc.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* (http://www.eclipse.org/legal/epl-v10.html), and the Refractions BSD
* License v1.0 (http://udig.refractions.net/files/bsd3-v10.html).
*/
package org.locationtech.udig.project.ui.preferences;
import org.locationtech.udig.ui.PlatformGIS;
import org.locationtech.udig.ui.graphics.Glyph;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.geotools.brewer.color.BrewerPalette;
import org.geotools.brewer.color.ColorBrewer;
/**
* Used to allow the MapPreferencePage to select a palette to draw on when assigning colours to
* new layers.
*/
public class PaletteSelectionFieldEditor extends FieldEditor {
TableViewer palettes;
public PaletteSelectionFieldEditor(String name, String string, Composite parent) {
super(name, string, parent);
}
@Override
protected void adjustForNumColumns( int numColumns ) {
Control control = getLabelControl();
((GridData) control.getLayoutData()).horizontalSpan = numColumns;
((GridData) palettes.getControl().getLayoutData()).horizontalSpan = numColumns;
}
@Override
protected void doFillIntoGrid( Composite parent, int numColumns ) {
Control control = getLabelControl(parent);
GridData gd = new GridData();
gd.horizontalSpan = numColumns;
control.setLayoutData(gd);
palettes = getTableControl(parent);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.verticalAlignment = GridData.FILL;
gd.horizontalSpan = numColumns;
gd.grabExcessHorizontalSpace = true;
gd.heightHint = 95;
palettes.getControl().setLayoutData(gd);
// buttonBox = getButtonBoxControl(parent);
// gd = new GridData();
// gd.verticalAlignment = GridData.BEGINNING;
// buttonBox.setLayoutData(gd);
}
private TableViewer getTableControl(Composite parent) {
TableViewer paletteTable = new TableViewer(new Table(parent, SWT.BORDER | SWT.V_SCROLL
| SWT.H_SCROLL | SWT.FULL_SELECTION));
TableLayout tableLayout = new TableLayout();
tableLayout.addColumnData(new ColumnWeightData(1, 20, false));
TableColumn firstColumn = new TableColumn(paletteTable.getTable(), SWT.LEFT);
firstColumn.setAlignment(SWT.LEFT);
paletteTable.getTable().setLayout(tableLayout);
// gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
// gridData.horizontalSpan = 2;
// gridData.heightHint = 150;
// gridData.widthHint = 175;
paletteTable.setLabelProvider(new LabelProvider() {
public Image getImage(Object element) {
if (element instanceof BrewerPalette) {
BrewerPalette palette = (BrewerPalette) element;
return Glyph.palette(palette.getColors(palette.getMaxColors())).createImage();
}
return null;
}
public String getText(Object element) {
if (element instanceof BrewerPalette) {
BrewerPalette palette = (BrewerPalette) element;
String text = null;
text = palette.getName() + ": " + palette.getDescription(); //$NON-NLS-1$
if (text == null) text = palette.getName();
return text;
}
return null;
}
});
paletteTable.setContentProvider(new IStructuredContentProvider() {
public Object[] getElements(Object inputElement) {
if (inputElement instanceof ColorBrewer) {
ColorBrewer brewer = (ColorBrewer) inputElement;
return brewer.getPalettes();
} else {
return new Object[0];
}
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
});
paletteTable.setSorter(new ViewerSorter() {
@Override
public int compare( Viewer viewer, Object e1, Object e2 ) {
if (e1 instanceof BrewerPalette && e2 instanceof BrewerPalette) {
BrewerPalette p1 = (BrewerPalette) e1;
BrewerPalette p2 = (BrewerPalette) e2;
//alphabetical by name
return p1.getName().compareTo(p2.getName());
} else return super.compare(viewer, e1, e2);
}
});
paletteTable.setInput(PlatformGIS.getColorBrewer());
return paletteTable;
}
@Override
protected void doLoad() {
if (palettes != null) {
select(getPreferenceStore().getString(getPreferenceName()));
}
}
@Override
protected void doLoadDefault() {
if (palettes != null) {
select(getPreferenceStore().getDefaultString(getPreferenceName()));
}
}
private void select(String paletteName) {
ColorBrewer brewer = PlatformGIS.getColorBrewer();
if (paletteName == null || !brewer.hasPalette(paletteName))
return;
BrewerPalette palette = brewer.getPalette(paletteName);
palettes.setSelection(new StructuredSelection(palette));
}
@Override
protected void doStore() {
ISelection select = palettes.getSelection();
if (select == null) {
getPreferenceStore().setToDefault(getPreferenceName());
return;
}
BrewerPalette palette = (BrewerPalette) ((StructuredSelection) select).getFirstElement();
getPreferenceStore().setValue(getPreferenceName(), palette.getName());
}
@Override
public int getNumberOfControls() {
return 2;
}
}