/** * Warlock, the open-source cross-platform game client * * Copyright 2008, Warlock LLC, and individual contributors as indicated * by the @authors tag. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package cc.warlock.rcp.prefs; import java.util.ArrayList; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.EditingSupport; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Rectangle; 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.Label; import org.eclipse.swt.widgets.Text; import cc.warlock.core.client.IWarlockClient; import cc.warlock.core.client.settings.IVariable; import cc.warlock.core.client.settings.IVariableProvider; import cc.warlock.core.client.settings.internal.ClientSettings; import cc.warlock.core.client.settings.internal.Variable; import cc.warlock.rcp.ui.WarlockSharedImages; /** * * @author Marshall Culpepper * */ public class VariablesPreferencePage extends PreferencePageUtils { public static final String PAGE_ID = "cc.warlock.rcp.prefs.variables"; protected IWarlockClient client; protected ClientSettings settings; protected Text filterText; protected TableViewer variableTable; protected ArrayList<Variable> variables = new ArrayList<Variable>(); protected ArrayList<Variable> addedVariables = new ArrayList<Variable>(); protected ArrayList<Variable> removedVariables = new ArrayList<Variable>(); protected Variable currentVariable; protected Button removeButton; public VariablesPreferencePage() { // TODO Auto-generated constructor stub } @Override protected Control createContents(Composite parent) { Composite main = new Composite(parent, SWT.NONE); main.setLayout(new GridLayout(2, false)); Composite filterComposite = new Composite(main, SWT.NONE); GridLayout layout = new GridLayout(2, false); layout.marginWidth = layout.marginHeight = 0; filterComposite.setLayout(layout); filterComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); new Label(filterComposite, SWT.NONE).setText("Filter: "); filterText = new Text(filterComposite, SWT.BORDER); filterText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { variableTable.refresh(); } }); filterText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); new Label(main, SWT.NONE); variableTable = new TableViewer(main, SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL); TableViewerColumn varName = new TableViewerColumn(variableTable, SWT.NONE); varName.getColumn().setWidth(200); varName.getColumn().setText("Variable Name"); varName.setEditingSupport(new TextEditingSupport(variableTable) { protected Object getValue(Object element) { return ((Variable)element).getIdentifier(); } protected void setValue(Object element, Object value) { ((Variable)element).setIdentifier(value.toString()); variableTable.refresh(element); } }); TableViewerColumn value = new TableViewerColumn(variableTable, SWT.NONE); value.getColumn().setWidth(150); value.getColumn().setText("Value"); value.setEditingSupport(new TextEditingSupport(variableTable) { protected Object getValue(Object element) { return ((Variable)element).getValue(); } protected void setValue(Object element, Object value) { ((Variable)element).setValue(value.toString()); variableTable.refresh(element); } }); variableTable.getTable().setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true)); variableTable.getTable().setHeaderVisible(true); variableTable.setUseHashlookup(true); variableTable.setContentProvider(new ArrayContentProvider()); variableTable.setLabelProvider(new VariableLabelProvider()); variableTable.addFilter(new ViewerFilter () { public boolean select(Viewer viewer, Object parentElement, Object element) { Variable var = (Variable) element; if (filterText.getText().equals("")) return true; return (var.getIdentifier().toLowerCase().contains(filterText.getText().toLowerCase()) || var.getValue().toLowerCase().contains(filterText.getText().toLowerCase())); } }); variableTable.setComparator(new ViewerComparator() { public int compare(Viewer viewer, Object e1, Object e2) { Variable v1 = (Variable)e1; Variable v2 = (Variable)e2; return v1.getIdentifier().compareTo(v2.getIdentifier()); } }); variableTable.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { if (variableTable.getSelection().isEmpty()) { currentVariable = null; removeButton.setEnabled(false); } else { currentVariable = (Variable) ((IStructuredSelection)variableTable.getSelection()).getFirstElement(); removeButton.setEnabled(true); } } }); int listHeight = variableTable.getTable().getItemHeight() * 8; Rectangle trim = variableTable.getTable().computeTrim(0, 0, 0, listHeight); GridData data = new GridData(GridData.FILL, GridData.FILL, true, true); data.heightHint = trim.height; variableTable.getTable().setLayoutData(data); Composite buttonsComposite = new Composite(main, SWT.NONE); buttonsComposite.setLayout(new GridLayout(1, true)); buttonsComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true)); Button addButton = new Button(buttonsComposite, SWT.PUSH); addButton.setText("Add Variable"); addButton.setImage(WarlockSharedImages.getImage(WarlockSharedImages.IMG_ADD)); addButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { addVariableSelected(); } }); addButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); removeButton = new Button(buttonsComposite, SWT.PUSH); removeButton.setText("Remove Variable"); removeButton.setImage(WarlockSharedImages.getImage(WarlockSharedImages.IMG_REMOVE)); removeButton.setEnabled(false); removeButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { removeVariableSelected(); } }); removeButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); for (IVariable var : settings.getAllVariables()) { if (var instanceof Variable) { variables.add(new Variable((Variable)var)); } } variableTable.setInput(variables); return main; } protected void addVariableSelected () { Variable var = new Variable(settings.getVariableConfigurationProvider(), "", ""); addedVariables.add(var); variables.add(var); variableTable.add(var); variableTable.editElement(var, 0); } protected void removeVariableSelected () { addedVariables.remove(currentVariable); if (variables.remove(currentVariable)) removedVariables.add(currentVariable); variableTable.remove(currentVariable); } protected static class VariableLabelProvider implements ITableLabelProvider { public void addListener(ILabelProviderListener listener) {} public void dispose() {} public Image getColumnImage(Object element, int columnIndex) { return null; } public String getColumnText(Object element, int columnIndex) { if (columnIndex == 0) { return ((Variable)element).getIdentifier(); } else { return ((Variable)element).getValue(); } } public boolean isLabelProperty(Object element, String property) { return true; } public void removeListener(ILabelProviderListener listener) {} } protected abstract static class TextEditingSupport extends EditingSupport { protected TextCellEditor editor; public TextEditingSupport (TableViewer viewer) { super(viewer); editor = new TextCellEditor(viewer.getTable(), SWT.SINGLE); } @Override protected boolean canEdit(Object element) { return true; } @Override protected CellEditor getCellEditor(Object element) { return editor; } } @Override public void setElement(IAdaptable element) { client = (IWarlockClient)element.getAdapter(IWarlockClient.class); settings = (ClientSettings)client.getClientSettings(); } @Override public boolean performOk() { for (Variable var : variables) { if (var.needsUpdate() && !addedVariables.contains(var)) { IVariableProvider provider = (IVariableProvider) var.getProvider(); provider.removeVariable(var.getOriginalVariable().getIdentifier()); provider.setVariable(var.getIdentifier(), var); } } for (Variable var : removedVariables) { IVariableProvider provider = (IVariableProvider) var.getProvider(); provider.removeVariable(var.getIdentifier()); } for (Variable var : addedVariables) { settings.getVariableConfigurationProvider().addVariable(var); } return true; } }