/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.compare.ui.tree; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.mapping.Mapping; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CLabel; 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.Group; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.ui.views.properties.IPropertyDescriptor; import org.eclipse.ui.views.properties.IPropertySource; import org.teiid.core.designer.util.CoreStringUtil; import org.teiid.designer.compare.DifferenceDescriptor; import org.teiid.designer.compare.PropertyDifference; import org.teiid.designer.compare.ui.UiConstants; import org.teiid.designer.ui.common.util.WidgetFactory; import org.teiid.designer.ui.viewsupport.ModelObjectUtilities; import org.teiid.designer.ui.viewsupport.ModelUtilities; /** * DifferenceDescriptorPanel. * * @since 8.0 */ public class DifferenceDescriptorPanel extends Composite implements UiConstants, CoreStringUtil.Constants { private static final String PREFIX = "DifferenceDescriptorPanel."; //$NON-NLS-1$ private static final String[] TBL_HDRS_OLDNEW = new String[] {CoreStringUtil.Constants.EMPTY_STRING, Util.getString(PREFIX + "nameHdr"), //$NON-NLS-1$ Util.getString(PREFIX + "oldValueHdr"), //$NON-NLS-1$ Util.getString(PREFIX + "newValueHdr")}; //$NON-NLS-1$ private static final String[] TBL_HDRS_FIRSTSECOND = new String[] {CoreStringUtil.Constants.EMPTY_STRING, Util.getString(PREFIX + "nameHdr"), //$NON-NLS-1$ Util.getString(PREFIX + "firstValueHdr"), //$NON-NLS-1$ Util.getString(PREFIX + "secondValueHdr")}; //$NON-NLS-1$ private static final String NO_SELECTION = Util.getString(PREFIX + "noSelection.text"); //$NON-NLS-1$ private static final String SELECTION_IS_DELETION = Util.getString(PREFIX + "selectionIsDeletion.text"); //$NON-NLS-1$ private static final String SELECTION_IS_ADDITION = Util.getString(PREFIX + "selectionIsAddition.text"); //$NON-NLS-1$ private static final String SELECTION_IS_CHANGED = Util.getString(PREFIX + "selectionIsChanged.text"); //$NON-NLS-1$ private static final String SELECTION_IS_UNCHANGED = Util.getString(PREFIX + "selectionIsUnchanged.text"); //$NON-NLS-1$ private static final String SELECTION_IS_CHANGE_BELOW = Util.getString(PREFIX + "selectionIsChangeBelow.text"); //$NON-NLS-1$ private CLabel label; private ILabelProvider labelProvider = DifferenceAnalysis.getMappingLabelProvider(); private ILabelProvider propTableLabelProvider; private TableViewer tableViewer; private Table table; List<PropertyDifference> tableRowList; private String title; private boolean enablePropSelection; private boolean showCheckboxes; private int iTerminology = DifferenceReportsPanel.USE_OLD_NEW_TERMINOLOGY; /** * constructor * * @param the parent composite * @param title the title for the composite */ public DifferenceDescriptorPanel( Composite parent, String title, boolean enablePropertySelection, boolean showCheckboxes, int iTerminology ) { super(parent, SWT.NONE); this.title = title; this.enablePropSelection = enablePropertySelection; this.showCheckboxes = showCheckboxes; this.iTerminology = iTerminology; initialize(); } /** * get the Composite's TableViewer * * @return the TableViewer */ public TableViewer getTableViewer() { return this.tableViewer; } /** * Initialize the Panel */ private void initialize() { GridLayout layout = new GridLayout(); this.setLayout(layout); this.setLayoutData(new GridData(GridData.FILL_BOTH)); Group group = WidgetFactory.createGroup(this, title, GridData.FILL_BOTH); label = WidgetFactory.createLabel(group, GridData.FILL_HORIZONTAL); label.setText(EMPTY_STRING); // CheckBox TableViewer int style = SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER; if (showCheckboxes) { tableViewer = CheckboxTableViewer.newCheckList(group, style); } else { tableViewer = new TableViewer(group, style); } table = tableViewer.getTable(); table.setLayout(new GridLayout()); GridData gd = new GridData(GridData.FILL_BOTH); table.setLayoutData(gd); table.setHeaderVisible(true); table.setLinesVisible(true); // create columns String[] sHeaders = new String[] {""}; //$NON-NLS-1$; if (iTerminology == DifferenceReportsPanel.USE_OLD_NEW_TERMINOLOGY) { sHeaders = TBL_HDRS_OLDNEW; } else if (iTerminology == DifferenceReportsPanel.USE_FIRST_SECOND_TERMINOLOGY) { sHeaders = TBL_HDRS_FIRSTSECOND; } for (int i = 0; i < sHeaders.length; i++) { TableColumn column = new TableColumn(table, SWT.LEFT); column.setText(sHeaders[i]); if (this.enablePropSelection == false) { column.setWidth(0); } } tableViewer.setContentProvider(new TableViewerContentProvider()); this.propTableLabelProvider = new TableViewerLabelProvider(); tableViewer.setLabelProvider(this.propTableLabelProvider); // populate table using empty list. this.tableRowList = new ArrayList<PropertyDifference>(); tableViewer.setInput(tableRowList); } private void setColumnHeaderText() { String[] sHeaders = new String[] {""}; //$NON-NLS-1$; if (iTerminology == DifferenceReportsPanel.USE_OLD_NEW_TERMINOLOGY) { sHeaders = TBL_HDRS_OLDNEW; } else if (iTerminology == DifferenceReportsPanel.USE_FIRST_SECOND_TERMINOLOGY) { sHeaders = TBL_HDRS_FIRSTSECOND; } for (int i = 0; i < table.getColumnCount(); i++) { TableColumn column = table.getColumn(i); column.setText(sHeaders[i]); if (this.enablePropSelection == false) { column.setWidth(0); } } } public void setTerminologyStyle( int iTerminology ) { this.iTerminology = iTerminology; setColumnHeaderText(); } /** * Initialize the checkboxtable checkbox states using the PropertyDifference skip flag */ public void initCheckStates() { TableItem[] tableItems = tableViewer.getTable().getItems(); for (int i = 0; i < tableItems.length; i++) { TableItem item = tableItems[i]; Object itemData = item.getData(); if (itemData instanceof PropertyDifference) { PropertyDifference propDiff = (PropertyDifference)itemData; if (propDiff.isSkip()) { item.setChecked(false); } else { item.setChecked(true); } } } } /** * Clear */ public void clear() { setDescriptor(null); } /** * set a new DifferenceDescriptor for the panel. Updates the label and the table contents. * * @param descriptor the DifferenceDescriptor to use */ public void setDescriptor( DifferenceDescriptor descriptor ) { // Set the label text depending on the type of descriptor if (descriptor != null) { Mapping mapping = descriptor.getMapper(); StringBuffer sb = new StringBuffer(); sb.append(this.labelProvider.getText(mapping)); if (DifferenceAnalysis.isAdd(mapping)) { sb.append(" - " + SELECTION_IS_ADDITION); //$NON-NLS-1$ } else if (DifferenceAnalysis.isDelete(mapping)) { sb.append(" - " + SELECTION_IS_DELETION); //$NON-NLS-1$ } else if (DifferenceAnalysis.isChange(mapping)) { sb.append(" - " + SELECTION_IS_CHANGED); //$NON-NLS-1$ } else if (DifferenceAnalysis.isUnchanged(mapping)) { sb.append(" - " + SELECTION_IS_UNCHANGED); //$NON-NLS-1$ } else if (DifferenceAnalysis.isChangeBelow(mapping)) { sb.append(" - " + SELECTION_IS_CHANGE_BELOW); //$NON-NLS-1$ } label.setText(sb.toString()); } else { label.setText(NO_SELECTION); } // Update the table contents updateTableRows(descriptor); } /** * Update the tableContents for the provided DifferenceDescriptor * * @param descriptor the DifferenceDescriptor */ private void updateTableRows( DifferenceDescriptor descriptor ) { Mapping mapping = null; if (descriptor != null) { // Get the descriptor mapping mapping = descriptor.getMapper(); // If the DifferenceDescriptor is 'Change' type, set the table contents if (mapping != null && DifferenceAnalysis.isChange(mapping)) { // Clear current contents this.tableRowList.clear(); // Add new PropertyDifferences to the table Iterator iter = descriptor.getPropertyDifferences().iterator(); while (iter.hasNext()) { PropertyDifference propDiff = (PropertyDifference)iter.next(); this.tableRowList.add(propDiff); } this.tableViewer.refresh(); // Initialize the Checkbox states initCheckStates(); // Pack Columns final TableColumn[] cols = table.getColumns(); for (int ndx = 0; ndx < cols.length; ++ndx) { if (ndx == 0 && this.enablePropSelection == false) { cols[ndx].setWidth(0); } else { cols[ndx].pack(); } } // show the table this.table.setVisible(true); } else { // Clear contents , dont show table this.tableRowList.clear(); this.tableViewer.refresh(); this.table.setVisible(false); } } else { this.tableRowList.clear(); this.tableViewer.refresh(); this.table.setVisible(false); } } class TableViewerContentProvider implements IStructuredContentProvider { /* (non-Javadoc) * @see org.eclipse.jface.viewers.IContentProvider#dispose() */ @Override public void dispose() { } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) */ @Override public Object[] getElements( Object theInputElement ) { return tableRowList.toArray(); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) */ @Override public void inputChanged( Viewer theViewer, Object theOldInput, Object theNewInput ) { } } class TableViewerLabelProvider extends LabelProvider implements ITableLabelProvider { /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int) */ @Override public Image getColumnImage( Object theElement, int theColumnIndex ) { Image result = null; switch (theColumnIndex) { case 2: case 3: IPropertySource source = ModelObjectUtilities.getEmfPropertySourceProvider().getPropertySource(theElement); IPropertyDescriptor[] descs = source.getPropertyDescriptors(); ILabelProvider propertyLabelProvider = descs[1].getLabelProvider(); if (propertyLabelProvider != null) { result = propertyLabelProvider.getImage(theElement); } break; default: break; } return result; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int) */ @Override public String getColumnText( Object theElement, int theColumnIndex ) { String result = null; if (theElement instanceof PropertyDifference) { PropertyDifference row = (PropertyDifference)theElement; IPropertySource source = ModelObjectUtilities.getEmfPropertySourceProvider().getPropertySource(row); IPropertyDescriptor[] descs = source.getPropertyDescriptors(); ILabelProvider propertyLabelProvider = descs[1].getLabelProvider(); switch (theColumnIndex) { case 1: EStructuralFeature feature = row.getAffectedFeature(); if (feature != null) { result = feature.getName(); } break; case 2: Object old = row.getOldValue(); result = getValueString(old, propertyLabelProvider); break; case 3: Object newVal = row.getNewValue(); result = getValueString(newVal, propertyLabelProvider); break; default: result = ""; //$NON-NLS-1$ break; } } else { result = super.getText(theElement); } return result; } } String getValueString( Object value, ILabelProvider propertyLabelProvider ) { String result = null; if (propertyLabelProvider != null) { if (value instanceof List) { String str = new String(); for (Iterator iter = ((List)value).iterator(); iter.hasNext();) { Object o = iter.next(); if (o instanceof EObject) { str += ModelUtilities.getEMFLabelProvider().getText(o); } else { str += propertyLabelProvider.getText(o); } if (iter.hasNext()) { str += "; "; //$NON-NLS-1$ } } result = str; } else { result = propertyLabelProvider.getText(value); } } else if (value != null) { result = value.toString(); } return result; } }// end DifferenceDescriptorPanel