/******************************************************************************* * 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.adapter; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.StringTokenizer; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.Viewer; import org.jboss.tools.common.meta.XAttribute; import org.jboss.tools.common.meta.action.XAttributeData; import org.jboss.tools.common.model.ui.IStructuredChangeListener; import org.jboss.tools.common.model.ui.IValueChangeListener; import org.jboss.tools.common.model.ui.ModelUIPlugin; import org.jboss.tools.common.model.ui.StructuredChange; import org.jboss.tools.common.model.ui.StructuredChangedEvent; import org.jboss.tools.common.model.ui.attribute.IListContentProvider; import org.jboss.tools.common.model.util.ModelFeatureFactory; public class StructuredListAdapter extends DefaultValueAdapter implements IStructuredChangeListener, IListContentProvider { public interface INewValueProvider { public Object getValue(); } protected static final String DEFAULT_DELIMITER = ";"; //$NON-NLS-1$ ILabelProvider labelProvider = new LabelProvider(); INewValueProvider newValueProvider = null; String delimiter = DEFAULT_DELIMITER; boolean trim = false; public void setAttribute(XAttribute attribute) { super.setAttribute(attribute); setDelimiter(attribute); } public void setAttributeData(XAttributeData data) { super.setAttributeData(data); setDelimiter(data.getAttribute()); } private void setDelimiter(XAttribute attribute) { String s = attribute.getProperty("delimiter"); //$NON-NLS-1$ if(s != null) { if(s.equals("comma")) s = ","; //$NON-NLS-1$ //$NON-NLS-2$ } delimiter = (s == null || s.length() != 1) ? DEFAULT_DELIMITER : s; trim = "true".equals(attribute.getProperty("trim")); //$NON-NLS-1$ //$NON-NLS-2$ String newValueClassName = attribute.getProperty("newValueClassName"); //$NON-NLS-1$ if(newValueClassName != null) { try { newValueProvider = (INewValueProvider)ModelFeatureFactory.getInstance().createFeatureInstance(newValueClassName); } catch (ClassCastException e) { ModelUIPlugin.getPluginLog().logError(e); } } } public Object getAdapter(Class adapter) { Object result = null; if (adapter == INewValueProvider.class) result = newValueProvider; else if (adapter == IValueChangeListener.class) result = this; else if (adapter == IStructuredChangeListener.class) result = this; else if (adapter == IListContentProvider.class) result = this; else if (adapter == ILabelProvider.class) result = labelProvider; else result = super.getAdapter(adapter); return result; } // IStructuredChangeListener public void structureChanged(StructuredChangedEvent event) { StringBuffer newValue = new StringBuffer(); StructuredChange change = (StructuredChange)event.getChange(); Iterator iterator = change.iterator(); if (iterator != null) while (iterator.hasNext()) { newValue.append(iterator.next()); if (iterator.hasNext()) newValue.append(delimiter); } setValue(newValue.toString()); } // IListContentProvider public Object[] getElements(Object inputElement) { List<String> tokens = new ArrayList<String>(); StringTokenizer tokenizer = new StringTokenizer(getStringValue(true), delimiter); while (tokenizer.hasMoreTokens()) { String t = tokenizer.nextToken(); if(trim) t = t.trim(); tokens.add(t); } return tokens.toArray(); } public void dispose() { if (labelProvider !=null) labelProvider.dispose(); labelProvider = null; newValueProvider = null; } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } public void setNewValueProvider(INewValueProvider provider) { newValueProvider = provider; } }