/*
* Copyright (c) 2005- michael lawley and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation
* which accompanies this distribution, and is available by writing to
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* Contributors:
* michael lawley
*
*
*
*/
package tefkat.plugin;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.URIConverter;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
/**
* @author lawley
*
*/
public class TefkatPreferencePage
extends PreferencePage
implements IWorkbenchPreferencePage {
private final static String ENABLED_COLUMN = "enabled";
private final static String SOURCE_COLUMN = "source";
private final static String TARGET_COLUMN = "target";
// Set column names
private final static String[] columnNames = new String[] {
ENABLED_COLUMN,
SOURCE_COLUMN,
TARGET_COLUMN
};
private Table table;
private TableViewer tableViewer;
private URIMapList mapList = new URIMapList();
private IPropertyChangeListener preferenceListener = new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals(TefkatPlugin.URIMAP_PREFERENCE)) {
if (null != event.getOldValue()) {
List list = TefkatPlugin.convertFromString((String) event.getOldValue());
for (final Iterator itr = list.iterator(); itr.hasNext(); ) {
URIMap map = (URIMap) itr.next();
if (map.enabled) {
URI uri = URI.createURI(map.source);
URIConverter.URI_MAP.remove(uri);
}
}
}
if (null != event.getNewValue()) {
List list = TefkatPlugin.convertFromString((String) event.getNewValue());
for (final Iterator itr = list.iterator(); itr.hasNext(); ) {
URIMap map = (URIMap) itr.next();
if (map.enabled) {
URI sourceUri = URI.createURI(map.source);
URI targetUri = URI.createURI(map.target);
URIConverter.URI_MAP.put(sourceUri, targetUri);
}
}
}
}
}
};
protected Control createContents(Composite parent) {
noDefaultAndApplyButton();
setDescription("Enabled entries in the mapping table below will be used to convert Resource URIs into actual URI locations (eg URLs)");
// setMessage("Enabled entries in the mapping table below will be used to convert Resource URIs into actual URI locations (eg URLs)");
GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.FILL_BOTH);
parent.setLayoutData(gridData);
// Set numColumns to 2 for the buttons
GridLayout layout = new GridLayout(2, false);
layout.marginWidth = 4;
parent.setLayout(layout);
// Create the table
createTable(parent);
// Create and setup the TableViewer
createTableViewer();
tableViewer.setContentProvider(new MapListContentProvider());
tableViewer.setLabelProvider(new MapListLabelProvider());
mapList.getMaps().addAll(TefkatPlugin.convertFromString(getPreferenceStore().getString(TefkatPlugin.URIMAP_PREFERENCE)));
tableViewer.setInput(mapList);
createButtons(parent);
return null;
}
private void createTable(Composite parent) {
int style = SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL |
SWT.FULL_SELECTION | SWT.HIDE_SELECTION;
// final int NUMBER_COLUMNS = 3;
table = new Table(parent, style);
GridData gridData = new GridData(GridData.FILL_BOTH);
gridData.grabExcessVerticalSpace = true;
gridData.horizontalSpan = 2;
table.setLayoutData(gridData);
table.setLinesVisible(true);
table.setHeaderVisible(true);
// 1st column with checkboxes - NOTE: The SWT.CENTER has no effect!!
TableColumn column = new TableColumn(table, SWT.CENTER, 0);
column.setText("!");
column.setWidth(20);
// 2nd column with URI Source
column = new TableColumn(table, SWT.LEFT, 1);
column.setText("URI Source");
column.setWidth(200);
// 3rd column with URI Target
column = new TableColumn(table, SWT.LEFT, 2);
column.setText("URI Target");
column.setWidth(200);
}
private void createTableViewer() {
tableViewer = new TableViewer(table);
tableViewer.setUseHashlookup(true);
tableViewer.setColumnProperties(columnNames);
// Create the cell editors
CellEditor[] editors = new CellEditor[columnNames.length];
// Column 1 : Enabled (Checkbox)
editors[0] = new CheckboxCellEditor(table);
// Column 2 : Source (URI)
editors[1] = new TextCellEditor(table);
((Text) editors[1].getControl()).addVerifyListener(
new VerifyListener() {
public void verifyText(VerifyEvent e) {
// These are the valid chars in a URI per RFC 2396
e.doit = e.text.matches("[-#:;?@&=+$,/._~*'()%0-9a-zA-Z]*");
}
});
// Column 3 : Target (URI)
editors[2] = new TextCellEditor(table);
((Text) editors[2].getControl()).addVerifyListener(
new VerifyListener() {
public void verifyText(VerifyEvent e) {
// These are the valid chars in a URI per RFC 2396
e.doit = e.text.matches("[-#:;?@&=+$,/._~*'()%0-9a-zA-Z]*");
}
});
// Assign the cell editors to the viewer
tableViewer.setCellEditors(editors);
// Set the cell modifier for the viewer
tableViewer.setCellModifier(new TefkatCellModifier());
}
private void createButtons(Composite parent) {
// Create and configure the "Add" button
Button add = new Button(parent, SWT.PUSH | SWT.CENTER);
add.setText("Add");
GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gridData.widthHint = 80;
add.setLayoutData(gridData);
add.addSelectionListener(new SelectionAdapter() {
// Add a URIMap to the URIMapList and refresh the view
public void widgetSelected(SelectionEvent e) {
mapList.addMap();
}
});
// Create and configure the "Delete" button
Button delete = new Button(parent, SWT.PUSH | SWT.CENTER);
delete.setText("Delete");
gridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gridData.widthHint = 80;
delete.setLayoutData(gridData);
delete.addSelectionListener(new SelectionAdapter() {
// Remove the selection and refresh the view
public void widgetSelected(SelectionEvent e) {
URIMap map = (URIMap) ((IStructuredSelection)
tableViewer.getSelection()).getFirstElement();
if (map != null) {
mapList.removeMap(map);
}
}
});
}
public void init(IWorkbench workbench) {
setPreferenceStore(TefkatPlugin.getPlugin().getPreferenceStore());
getPreferenceStore().addPropertyChangeListener(preferenceListener);
}
public void dispose() {
getPreferenceStore().removePropertyChangeListener(preferenceListener);
super.dispose();
}
public boolean performOk() {
boolean result = super.performOk();
if (result) {
String value = TefkatPlugin.convertToString(mapList.getMaps());
getPreferenceStore().setValue(TefkatPlugin.URIMAP_PREFERENCE, value);
}
return result;
}
static class URIMap {
boolean enabled = true;
String source = "";
String target = "";
}
class TefkatCellModifier implements ICellModifier {
public boolean canModify(Object element, String property) {
return true;
}
public Object getValue(Object element, String property) {
int columnIndex = Arrays.asList(columnNames).indexOf(property);
Object result = null;
URIMap map = (URIMap) element;
switch (columnIndex) {
case 0 : // ENABLED_COLUMN
result = Boolean.valueOf(map.enabled);
break;
case 1 : // SOURCE_COLUMN
result = map.source;
break;
case 2 : // TARGET_COLUMN
result = map.target;
break;
default :
result = "";
}
return result;
}
public void modify(Object element, String property, Object value) {
if (element instanceof Item) {
element = ((Item) element).getData();
}
int columnIndex = Arrays.asList(columnNames).indexOf(property);
URIMap map = (URIMap) element;
switch (columnIndex) {
case 0 : // ENABLED_COLUMN
map.enabled = ((Boolean) value).booleanValue();
break;
case 1 : // SOURCE_COLUMN
map.source = ((String) value).trim();
break;
case 2 : // TARGET_COLUMN
map.target = ((String) value).trim();
break;
default :
}
mapList.mapChanged(map);
}
}
class URIMapList {
private List maps = new ArrayList();
private Set changeListeners = new HashSet();
public URIMapList() {
// add("http:///", "platform:/");
}
public void addChangeListener(IMapListViewer viewer) {
changeListeners.add(viewer);
}
public void removeChangeListener(IMapListViewer viewer) {
changeListeners.remove(viewer);
}
public List getMaps() {
return maps;
}
public void addMap() {
URIMap map = new URIMap();
maps.add(map);
for (final Iterator itr = changeListeners.iterator(); itr.hasNext(); ) {
((IMapListViewer) itr.next()).addMap(map);
}
}
public void removeMap(URIMap map) {
for (final Iterator itr = changeListeners.iterator(); itr.hasNext(); ) {
((IMapListViewer) itr.next()).removeMap(map);
}
}
public void mapChanged(URIMap map) {
for (final Iterator itr = changeListeners.iterator(); itr.hasNext(); ) {
((IMapListViewer) itr.next()).updateMap(map);
}
}
}
interface IMapListViewer {
public void addMap(URIMap map);
public void removeMap(URIMap map);
public void updateMap(URIMap map);
}
class MapListContentProvider
implements IStructuredContentProvider, IMapListViewer {
public Object[] getElements(Object inputElement) {
return mapList.getMaps().toArray();
}
public void dispose() {
mapList.removeChangeListener(this);
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
if (null != oldInput) {
((URIMapList) oldInput).removeChangeListener(this);
}
if (null != newInput) {
((URIMapList) newInput).addChangeListener(this);
}
}
public void addMap(URIMap map) {
tableViewer.add(map);
}
public void removeMap(URIMap map) {
tableViewer.remove(map);
}
public void updateMap(URIMap map) {
tableViewer.update(map, null);
}
}
static class MapListLabelProvider
extends LabelProvider
implements ITableLabelProvider {
private static final String CHECKED_IMAGE = "checked";
private static final String UNCHECKED_IMAGE = "unchecked";
private static final ImageRegistry imageRegistry = new ImageRegistry();
static {
String iconPath = "icons/";
imageRegistry.put(CHECKED_IMAGE, ImageDescriptor.createFromFile(
TefkatPlugin.class,
iconPath + CHECKED_IMAGE + ".gif"
)
);
imageRegistry.put(UNCHECKED_IMAGE, ImageDescriptor.createFromFile(
TefkatPlugin.class,
iconPath + UNCHECKED_IMAGE + ".gif"
)
);
}
public Image getColumnImage(Object element, int columnIndex) {
return columnIndex == 0 ? getImage(((URIMap) element).enabled) : null;
}
private Image getImage(boolean b) {
return b ? imageRegistry.get(CHECKED_IMAGE) : imageRegistry.get(UNCHECKED_IMAGE);
}
public String getColumnText(Object element, int columnIndex) {
String result = "";
URIMap map = (URIMap) element;
switch (columnIndex) {
case 1 : // SOURCE_COLUMN
result = map.source;
break;
case 2 : // TARGET_COLUMN
result = map.target;
break;
default :
}
return result;
}
}
}