/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.model.ui.attribute.editor; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.HashSet; import java.util.Set; import java.util.StringTokenizer; import org.jboss.tools.common.model.ui.IAttributeErrorProvider; import org.jboss.tools.common.model.ui.IValueChangeListener; import org.jboss.tools.common.model.ui.IValueProvider; import org.jboss.tools.common.model.ui.attribute.adapter.CheckListAdapter; import org.jboss.tools.common.model.ui.wizards.query.list.TreeItemSelectionManager; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.viewers.IContentProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.jboss.tools.common.model.ui.widgets.IWidgetSettings; public class CheckListFieldEditor extends ExtendedFieldEditor implements IFieldEditor, IPropertyFieldEditor, IPropertyChangeListener, PropertyChangeListener { protected IPropertyEditor propertyEditor; protected IValueChangeListener valueChangeListener; protected IValueProvider valueProvider; protected IContentProvider contentProvider; protected ILabelProvider labelProvider; private String stringValue; private TreeViewer viewer; String separator = ";"; public CheckListFieldEditor() {} public CheckListFieldEditor(IWidgetSettings settings) { super(settings); } protected void adjustForNumColumns(int numColumns) { Control control = getLabelComposite(); ((GridData)control.getLayoutData()).horizontalSpan = numColumns; ((GridData)viewer.getControl().getLayoutData()).horizontalSpan = numColumns - 1; } protected void doFillIntoGrid(Composite parent, int numColumns) { Control control = getLabelComposite(parent); GridData gd = new GridData(); gd.horizontalSpan = numColumns; gd.verticalAlignment = GridData.GRAB_VERTICAL; control.setLayoutData(gd); getListControl(parent); gd = new GridData(GridData.FILL_BOTH); gd.horizontalSpan = numColumns; gd.grabExcessHorizontalSpace = true; viewer.getControl().setLayoutData(gd); } protected void doLoad() { } protected void doLoadDefault() { } protected void doStore() { } public int getNumberOfControls() { return 2; } public Control[] getControls(Composite parent) { return new Control[] {getLabelComposite(parent), getListControl(parent)}; } private Control getListControl(Composite parent) { if(viewer != null && !viewer.getControl().isDisposed()) return viewer.getControl(); viewer = new TreeViewer(parent, SWT.CHECK); viewer.setContentProvider(contentProvider); viewer.setLabelProvider(labelProvider); viewer.setInput(contentProvider); new TreeItemSelectionManager(viewer, new Flipper()); return viewer.getControl(); } protected void init() { this.stringValue = valueProvider.getStringValue(true); setPropertyChangeListener(this); valueProvider.addValueChangeListener(this); } public void dispose() { super.dispose(); /// if (viewer!=null && viewer.getTree()!=null) viewer.getTree().removeMouseListener(mouseAdapter); /// mouseAdapter = null; if (viewer!=null && viewer.getTree()!=null && !viewer.getTree().isDisposed()) viewer.getTree().dispose(); viewer = null; propertyEditor = null; valueChangeListener = null; valueProvider = null; contentProvider = null; labelProvider = null; } public void setEnabled(boolean enabled){ super.setEnabled(enabled); updateErrorState(); } public void setPropertyEditor(IPropertyEditor propertyEditor) { this.propertyEditor = propertyEditor; if (propertyEditor!=null) { valueProvider = (IValueProvider)propertyEditor.getAdapter(IValueProvider.class); valueChangeListener = (IValueChangeListener)propertyEditor.getAdapter(IValueChangeListener.class); contentProvider = (IContentProvider)propertyEditor.getAdapter(ITreeContentProvider.class); labelProvider = (ILabelProvider)propertyEditor.getAdapter(ILabelProvider.class); // Object input = propertyEditor.getInput(); setErrorProvider((IAttributeErrorProvider)propertyEditor.getAdapter(IAttributeErrorProvider.class)); if(propertyEditor.getInput() instanceof CheckListAdapter) { separator = "" + ((CheckListAdapter)propertyEditor.getInput()).getSeparator(); } } init(); } int lock = 0; public void propertyChange(PropertyChangeEvent event) { super.propertyChange(event); valueProvider.removeValueChangeListener(this); if (IPropertyEditor.VALUE.equals(event.getPropertyName())) { Object v = event.getNewValue(); String s = (v == null) ? "" : v.toString(); //$NON-NLS-1$ if(!s.equals(stringValue)) { stringValue = s; if(viewer == null || viewer.getTree() == null || viewer.getTree().isDisposed()) { //do nothing } else { if(lock == 0) { lock++; Tree tree = viewer.getTree(); TreeItem[] is = tree.getItems(); Set<String> vs = new HashSet<String>(); StringTokenizer values = new StringTokenizer(stringValue, ";,"); //$NON-NLS-1$ while(values.hasMoreTokens()) { String n = values.nextToken(); vs.add(n); } for (int i = 0; i < is.length; i++) { Object d = is[i].getData(); is[i].setChecked(vs.contains(d)); } lock--; } viewer.refresh(); } } } valueProvider.addValueChangeListener(this); } public void propertyChange(org.eclipse.jface.util.PropertyChangeEvent event) { } void flip0(TreeItem item) { if(item == null) return; String currentItem = item.getData().toString(); StringTokenizer values = new StringTokenizer(valueProvider.getStringValue(true), ";,"); //$NON-NLS-1$ String newValue = ""; //$NON-NLS-1$ boolean currentItemExists = false; while (values.hasMoreTokens()) { String value = values.nextToken(); if (value.equals(currentItem)) currentItemExists = true; else { if(newValue.length() > 0 && !newValue.endsWith(";") && !newValue.endsWith(",")) newValue += separator; //$NON-NLS-1$ //$NON-NLS-2$ newValue += value; } } if (!currentItemExists) { if(newValue.length() > 0 && !newValue.endsWith(";") && !newValue.endsWith(",")) newValue += separator; //$NON-NLS-1$ //$NON-NLS-2$ newValue += currentItem; } valueChanged(newValue); viewer.refresh(currentItem); } class Flipper implements TreeItemSelectionManager.Listener { public void flip(TreeItem item) { if(lock > 0) return; lock++; flip0(item); lock--; } public boolean isSelected(Object data) { StringTokenizer values = new StringTokenizer(valueProvider.getStringValue(true), ";,"); //$NON-NLS-1$ while (values.hasMoreTokens()) { String n = values.nextToken(); if(data != null && data.equals(n)) return true; } return false; } } protected void valueChanged(String newValue) { String oldValue = stringValue; this.stringValue = newValue; PropertyChangeEvent event = new PropertyChangeEvent(this, IPropertyEditor.VALUE, oldValue, newValue); valueChangeListener.valueChange(event); } public void setFocus() { if(viewer != null && viewer.getTree() != null && !viewer.getTree().isDisposed()) { viewer.getTree().setFocus(); } } public void cut() { } public void copy() { } public void paste() { } public void delete() { } }