/*******************************************************************************
* 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.editors.dnd.composite;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.ICellEditorListener;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.IElementComparer;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableLayout;
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.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.jboss.tools.common.model.ui.editors.dnd.IDropWizardModel;
import org.jboss.tools.common.model.ui.editors.dnd.DropUtils.AttributeDescriptorValueProvider;
import org.jboss.tools.common.model.ui.objecteditor.ExtendedCellEditorProvider;
import org.jboss.tools.common.model.util.ModelFeatureFactory;
/**
*
* @author eskimo
*
*/
public class TagAttributesComposite extends Composite implements PropertyChangeListener, SelectionListener {
private IDropWizardModel fWizardModel;
private TableViewer tableViewer = null;
private boolean fFiltered = false;
/**
* @author eskimo
*/
public static class AttributeDescriptorValue {
String name;
boolean isRequired;
boolean isPreferable;
/**
*
* @param descriptor
*/
public AttributeDescriptorValue(String name, boolean isRequired, boolean isPreferable) {
this.name = name;
this.isPreferable = isPreferable;
this.isRequired = isRequired;
}
/**
*
*/
private Object fValue;
/**
*
* @return
*/
public Object getValue() {
return fValue;
}
/**
*
* @param value
*/
public void setValue(Object value) {
fValue = value;
}
/**
*
*/
public String getName() {
return name;
}
/**
*
*/
public boolean isPreferable() {
return isPreferable;
}
public void setPreferable(boolean b) {
isPreferable = b;
}
/**
*
*/
public boolean isRequired() {
return isRequired;
}
/**
*
*/
public boolean equals(Object obj) {
return super.equals(obj);
}
/**
*
*/
public int hashCode() {
return super.hashCode();
}
}
/**
*
* @param parent
* @param style
* @param wizardModel
*/
public TagAttributesComposite(Composite parent, int style, IDropWizardModel wizardModel, Properties context) {
this(parent, style, wizardModel, false, context);
}
/**
*
* @param parent
* @param style
* @param wizardModel
*/
public TagAttributesComposite(Composite parent, int style, IDropWizardModel wizardModel,boolean filtered, final Properties context) {
super(parent, style);
this.context = context;
fFiltered = filtered;
fWizardModel = wizardModel;
fWizardModel.addPropertyChangeListener(this);
addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
fWizardModel.removePropertyChangeListener(TagAttributesComposite.this);
if (context != null) {
context.clear();
}
removeDisposeListener(this);
}
});
AttributeDescriptorValueProvider valueProvider = fWizardModel.getDropData().getValueProvider();
if(valueProvider != null) {
valueProvider.initContext(context);
}
GridLayout layout = new GridLayout();
layout.marginWidth = 0;
layout.marginHeight = 0;
layout.numColumns = 1;
setLayout(layout);
GridData data = new GridData(GridData.FILL_BOTH);
setLayoutData(data);
final Table swtTable = new Table(this, SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.H_SCROLL | SWT.SINGLE );
data = new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL);
TableLayout tableLayout = new TableLayout();
tableViewer =
new TagAttributesTableViewer(swtTable);
swtTable.setLayout(tableLayout);
swtTable.setLayoutData(data);
swtTable.setHeaderVisible(true);
swtTable.setLinesVisible(true);
tableLayout.addColumnData(new ColumnPixelData(150));
TableColumn col = new TableColumn(swtTable, SWT.NONE);
col.setText("Attribute name");
tableLayout.addColumnData(new ColumnPixelData(250));
col = new TableColumn(swtTable, SWT.NONE);
col.setText("Value");
tableViewer.setColumnProperties(new String[] {"Name","Value"}); //$NON-NLS-1$ //$NON-NLS-2$
tableViewer.setUseHashlookup(true);
tableViewer.setComparer(new IElementComparer() {
public boolean equals(Object a, Object b) {
return a == b;
}
public int hashCode(Object element) {
return element == null ? 0 : element.hashCode();
}
});
tableViewer.setCellModifier(
new ICellModifier(){
public boolean canModify(Object element, String property) {
return true;
}
public Object getValue(Object element, String property) {
AttributeDescriptorValue attrDescr = (AttributeDescriptorValue)element;
context.setProperty("attributeName", attrDescr.getName()); //$NON-NLS-1$
String tagName = "" + fWizardModel.getTagProposal().getName(); //$NON-NLS-1$
String prefix = fWizardModel.getTagProposal().getPrefix();
if(prefix != null && prefix.length() > 0 && !tagName.startsWith(prefix + ":")) { //$NON-NLS-1$ //$NON-NLS-2$
tagName = prefix + ":" + tagName; //$NON-NLS-1$
}
context.setProperty("nodeName", tagName); //$NON-NLS-1$
ISelection s = fWizardModel.getDropData().getSelectionProvider().getSelection();
if (s instanceof TextSelection) {
int offset = ((TextSelection)s).getOffset();
context.put("offset", new Integer(offset));
}
return attrDescr.getValue()==null?"":attrDescr.getValue(); //$NON-NLS-1$
}
public void modify(Object element, String property, Object value) {
TableItem item = (TableItem)element;
AttributeDescriptorValue attrDescr = (AttributeDescriptorValue)item.getData();
fWizardModel.setAttributeValue(attrDescr,value);
if(tableViewer != null) {
tableViewer.refresh();
}
}
}
);
ExtendedCellEditorProvider provider = createCellEditorProvider();
if(provider != null) {
tableViewer.setCellEditors(
new CellEditor[]{null,
provider.createCellEditor(swtTable, context)}
);
} else {
tableViewer.setCellEditors(
new CellEditor[]{null,
new TextCellEditor(swtTable)}
);
}
tableViewer.getCellEditors()[1].addListener(
new ICellEditorListener() {
public void applyEditorValue() {
}
public void cancelEditor() {
}
public void editorValueChanged(boolean oldValidState, boolean newValidState) {
// TODO Auto-generated method stub
if(tableViewer.isCellEditorActive()) {
IStructuredSelection selection = (IStructuredSelection)tableViewer.getSelection();
AttributeDescriptorValue attrValue = (AttributeDescriptorValue)selection.getFirstElement();
fWizardModel.setAttributeValue(attrValue,tableViewer.getCellEditors()[1].getValue());
}
}
}
);
tableViewer.setContentProvider(
new IStructuredContentProvider() {
public Object[] getElements(Object inputElement) {
return filterElements();
}
private Object[] filterElements() {
AttributeDescriptorValue[] value = fWizardModel.getAttributeValueDescriptors();
if(!isFiltered()) return value;
List<AttributeDescriptorValue> filtered = new ArrayList<AttributeDescriptorValue>();
for (int i = 0; i < value.length; i++) {
AttributeDescriptorValue value2 = value[i];
if(value2.isRequired() || value2.isPreferable()) {
filtered.add(value2);
}
}
return filtered.toArray();
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
);
tableViewer.setLabelProvider(
new ITableLabelProvider () {
public static final int ATTRIBUTE_NAME_INDEX = 0;
public static final int ATTRIBUTE_VALUE_INDEX = 1;
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
public String getColumnText(Object element, int columnIndex) {
AttributeDescriptorValue attrDescr = (AttributeDescriptorValue)element;
switch (columnIndex) {
case ATTRIBUTE_NAME_INDEX:
if(attrDescr.isRequired()) {
return attrDescr.getName();
} else if(attrDescr.isPreferable()) {
return attrDescr.getName();
} else {
return attrDescr.getName();
}
case ATTRIBUTE_VALUE_INDEX:
return attrDescr.getValue()==null?"":attrDescr.getValue().toString(); //$NON-NLS-1$
}
throw new IllegalArgumentException("Wrong column index for LabelProvider"); //$NON-NLS-1$
}
public void addListener(ILabelProviderListener listener) {
}
public void dispose() {
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void removeListener(ILabelProviderListener listener) {
}
}
);
tableViewer.setInput(new Object());
}
private Properties context;
private ExtendedCellEditorProvider createCellEditorProvider() {
return (ExtendedCellEditorProvider)ModelFeatureFactory.getInstance().createFeatureInstance("org.jboss.tools.jst.web.ui.internal.editor.outline.JSPCellEditorProviderImpl"); //$NON-NLS-1$
}
/**
*
* @return
*/
protected boolean isFiltered() {
return fFiltered ;
}
/**
*
*/
public void propertyChange(PropertyChangeEvent evt) {
if(tableViewer.isCellEditorActive()) return;
if(IDropWizardModel.TAG_PROPOSAL.equals(evt.getPropertyName())) {
tableViewer.setInput(new Object());
AttributeDescriptorValueProvider valueProvider = fWizardModel.getDropData().getValueProvider();
if(valueProvider != null) {
valueProvider.initContext(context);
}
} else {
tableViewer.refresh();
}
}
/**
*
* @param attributes
* @return
*/
public static final boolean areThereAttributesForCommonTab(AttributeDescriptorValue[] attributes) {
for (int i = 0; i < attributes.length; i++) {
AttributeDescriptorValue value = attributes[i];
if(value.isPreferable() || value.isRequired()) return true;
}
return false;
}
/**
*
* @param model
*/
public void setWizardModel(IDropWizardModel model) {
fWizardModel = model;
tableViewer.setInput(new Object());
tableViewer.refresh();
}
/**
* remove the selectin when switched
*/
public void widgetSelected(SelectionEvent e) {
tableViewer.refresh();
}
public void widgetDefaultSelected(SelectionEvent e) {
}
}