/* * 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.modelgenerator.salesforce.ui.wizards; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.graphics.Image; 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.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.ui.help.IWorkbenchHelpSystem; import org.eclipse.ui.model.WorkbenchLabelProvider; import org.teiid.core.designer.util.CoreStringUtil; import org.teiid.core.designer.util.I18nUtil; import org.teiid.core.designer.util.FileUtils; import org.teiid.designer.modelgenerator.salesforce.SalesforceImportWizardManager; import org.teiid.designer.modelgenerator.salesforce.model.DataModel; import org.teiid.designer.modelgenerator.salesforce.model.SalesforceField; import org.teiid.designer.modelgenerator.salesforce.model.SalesforceObject; import org.teiid.designer.modelgenerator.salesforce.ui.ModelGeneratorSalesforceUiConstants; import org.teiid.designer.ui.common.util.UiUtil; import org.teiid.designer.ui.common.util.WidgetFactory; import org.teiid.designer.ui.common.util.WizardUtil; import org.teiid.designer.ui.common.wizard.AbstractWizardPage; /** * @since 8.0 */ public class SelectSalesforceObjectsPage extends AbstractWizardPage implements Listener, FileUtils.Constants, CoreStringUtil.Constants, ModelGeneratorSalesforceUiConstants, ModelGeneratorSalesforceUiConstants.Images, ModelGeneratorSalesforceUiConstants.HelpContexts, ISelectionChangedListener, ICheckStateListener { /** Used as a prefix to properties file keys. */ private static final String PREFIX = I18nUtil.getPropertyPrefix(SelectSalesforceObjectsPage.class); SalesforceImportWizardManager importManager; private CheckboxTableViewer ctv; private Table table; private TableViewer tableViewer; private Button selectAllButton; private Button deselectAllButton; private boolean initializing; protected DataModel salesforceMetadata; boolean updateUI; public SelectSalesforceObjectsPage( SalesforceImportWizardManager importManager ) { super(SelectSalesforceObjectsPage.class.getSimpleName(), getString("title")); //$NON-NLS-1$ this.importManager = importManager; setImageDescriptor(SalesforceUIUtil.getImageDescriptor(NEW_MODEL_BANNER)); } @Override public void setVisible( boolean visible ) { if (visible) { IRunnableWithProgress op = new IRunnableWithProgress() { @Override public void run( IProgressMonitor monitor ) throws InvocationTargetException { try { DataModel model = importManager.createDataModel(monitor); if (salesforceMetadata != model) { salesforceMetadata = model; updateUI = true; } else { updateUI = false; } } catch (Throwable e) { throw new InvocationTargetException(e); } finally { monitor.done(); } } }; try { new ProgressMonitorDialog(Display.getCurrent().getActiveShell()).run(true, true, op); } catch (InvocationTargetException e) { Throwable cause = e.getCause(); Shell shell = this.getShell(); Status status = new Status(IStatus.ERROR, PLUGIN_ID, 0, cause.getLocalizedMessage(), cause); ErrorDialog.openError(shell, getString("dialog.dataModelCreationError.title"), cause.getLocalizedMessage(), status); //$NON-NLS-1$ super.setVisible(false); return; } catch (InterruptedException e) { super.setVisible(false); return; } try { if (updateUI) { ctv.setInput(salesforceMetadata); StructuredSelection selection = new StructuredSelection(ctv.getElementAt(0)); ctv.setSelection(selection); setAllNodesSelected(true); getControl().setVisible(visible); setPageStatus(); } } catch (Exception e) { Shell shell = this.getShell(); Status status = new Status(IStatus.ERROR, PLUGIN_ID, 0, e.getLocalizedMessage(), e); ErrorDialog.openError(shell, getString("dialog.dataModelCreationError.title"), e.getLocalizedMessage(), status); //$NON-NLS-1$ super.setVisible(false); getWizard().getContainer().showPage(getPreviousPage()); return; } } super.setVisible(visible); } @Override public void createControl( Composite theParent ) { IWorkbenchHelpSystem helpSystem = UiUtil.getWorkbench().getHelpSystem(); helpSystem.setHelp(theParent, OBJECT_SELECTION_PAGE); Composite pnl = WidgetFactory.createPanel(theParent, SWT.FILL, GridData.FILL_VERTICAL); // pnl.setLayout(new GridLayout(COLUMNS, false)); setControl(pnl); SashForm outerSplitter = new SashForm(pnl, SWT.VERTICAL); GridData gid = new GridData(); gid.grabExcessHorizontalSpace = gid.grabExcessVerticalSpace = true; gid.horizontalAlignment = gid.verticalAlignment = GridData.FILL; outerSplitter.setLayoutData(gid); Composite metadata = WidgetFactory.createPanel(outerSplitter, SWT.FILL, GridData.FILL_HORIZONTAL); SashForm splitter = new SashForm(metadata, SWT.HORIZONTAL); GridData innerGid = new GridData(); innerGid.grabExcessHorizontalSpace = innerGid.grabExcessVerticalSpace = true; innerGid.horizontalAlignment = innerGid.verticalAlignment = GridData.FILL; splitter.setLayoutData(innerGid); createCheckboxComposite(splitter, getString("salesforce.objects")); //$NON-NLS-1$ createTable(splitter); splitter.setWeights(new int[] {25, 75}); Composite buttons = WidgetFactory.createPanel(outerSplitter, SWT.FILL, GridData.FILL_HORIZONTAL); createButtons(buttons); outerSplitter.setWeights(new int[] {80, 20}); } /** * create the checkbox tree Composite * * @param parent the parent composite * @param title the group title */ private void createCheckboxComposite( Composite parent, String title ) { Composite checkBoxTreeComposite = WidgetFactory.createPanel(parent, SWT.NONE, GridData.FILL_BOTH); GridLayout layout = new GridLayout(1, false); checkBoxTreeComposite.setLayout(layout); // -------------------------- // Group for checkbox list // -------------------------- Group group = WidgetFactory.createGroup(checkBoxTreeComposite, title, GridData.FILL_BOTH, 1, 2); // ---------------------------- // TreeViewer // ---------------------------- ctv = CheckboxTableViewer.newCheckList(group, SWT.BORDER); ctv.getTable().setLayoutData(new GridData(GridData.FILL_BOTH)); ctv.setContentProvider(new ListContentProvider()); ctv.setLabelProvider(new ListLabelProvider()); ctv.addSelectionChangedListener(this); ctv.addCheckStateListener(this); ctv.setSorter(new ViewerSorter()); ctv.setInput(null); } private void createTable( Composite parent ) { Composite tableComposite = WidgetFactory.createPanel(parent, SWT.NONE, GridData.FILL_BOTH); GridLayout layout = new GridLayout(1, false); tableComposite.setLayout(layout); Group group = WidgetFactory.createGroup(tableComposite, getString("column.details"), //$NON-NLS-1$ GridData.FILL_BOTH, 1, 2); int style = SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION; table = new Table(group, style); GridData gridData = new GridData(GridData.FILL_BOTH); gridData.grabExcessVerticalSpace = true; gridData.horizontalSpan = 4; table.setLayoutData(gridData); table.setLinesVisible(true); table.setHeaderVisible(true); TableColumn column = new TableColumn(table, SWT.LEFT, 0); column.setText(getString("visible.name")); //$NON-NLS-1$ column.setWidth(100); column = new TableColumn(table, SWT.LEFT, 1); column.setText(getString("name.in.src")); //$NON-NLS-1$ column.setWidth(100); column = new TableColumn(table, SWT.LEFT, 2); column.setText(getString("type")); //$NON-NLS-1$ column.setWidth(100); column = new TableColumn(table, SWT.LEFT, 3); column.setText(getString("searchable")); //$NON-NLS-1$ column.setWidth(100); column = new TableColumn(table, SWT.LEFT, 4); column.setText(getString("updatable")); //$NON-NLS-1$ column.setWidth(100); column = new TableColumn(table, SWT.LEFT, 5); column.setText(getString("audit.field")); //$NON-NLS-1$ column.setWidth(100); tableViewer = new TableViewer(table); tableViewer.setUseHashlookup(true); tableViewer.setContentProvider(new TableContentProvider()); tableViewer.setLabelProvider(new TableLabelProvider()); tableViewer.setColumnProperties(new String[] { getString("visible.name"), getString("name.in.src"), getString("type"), getString("searchable"), getString("updatable"), getString("audit.field")}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ } private void createButtons( Composite parent ) { // ---------------------------- // Select/DeSelect Buttons // ---------------------------- Composite buttonComposite = WidgetFactory.createPanel(parent, SWT.NONE, GridData.FILL_VERTICAL); GridLayout layout = new GridLayout(1, false); buttonComposite.setLayout(layout); this.selectAllButton = WidgetFactory.createButton(buttonComposite, getString("selectAllButton.text"), GridData.FILL_HORIZONTAL); //$NON-NLS-1$ this.selectAllButton.setToolTipText(getString("selectAllButton.tipText")); //$NON-NLS-1$ this.deselectAllButton = WidgetFactory.createButton(buttonComposite, getString("deselectAllButton.text"), GridData.FILL_HORIZONTAL); //$NON-NLS-1$ this.deselectAllButton.setToolTipText(getString("deselectAllButton.tipText")); //$NON-NLS-1$ this.selectAllButton.addListener(SWT.Selection, this); this.deselectAllButton.addListener(SWT.Selection, this); } /** * Event handler * * @param event the Event */ @Override public void handleEvent( Event event ) { if (!initializing) { // box checked if (event.detail == SWT.CHECK && ((TableItem)event.data).getGrayed()) { TableItem item = (TableItem)event.data; ((SalesforceObject)item.getData()).setSelected(item.getChecked()); } // SelectAll button selected if (event.widget == this.selectAllButton) { setAllNodesSelected(true); } // DeselectAll button selected if (event.widget == this.deselectAllButton) { setAllNodesSelected(false); } setPageStatus(); } } /** * Sets the wizard page status message. * * @since 4.2 */ private void setPageStatus() { if (!this.importManager.getDataModel().hasSelectedObjects()) { WizardUtil.setPageComplete(this, getString("noSelections.msg"), IMessageProvider.ERROR); //$NON-NLS-1$ return; } WizardUtil.setPageComplete(this); getContainer().updateButtons(); } private void setAllNodesSelected( boolean bSelected ) { Object[] sfObjects = importManager.getDataModel().getSalesforceObjects(); for (int i = 0; i < sfObjects.length; i++) { SalesforceObject obj = (SalesforceObject)sfObjects[i]; obj.setSelected(bSelected); ctv.setChecked(obj, bSelected); } } @Override public void selectionChanged( SelectionChangedEvent event ) { Object obj; if (event.getSelection() instanceof IStructuredSelection) { IStructuredSelection selection = (IStructuredSelection)event.getSelection(); if (!selection.isEmpty()) { obj = selection.iterator().next(); tableViewer.setInput(obj); } } else { throw new RuntimeException(getString("unsupported.type")); //$NON-NLS-1$ } } @Override public void checkStateChanged( CheckStateChangedEvent event ) { SalesforceObject obj = (SalesforceObject)event.getElement(); boolean checked = event.getChecked(); obj.setSelected(checked); setPageStatus(); } /** * Utility to get localized text from properties file. * * @param theKey the key whose localized value is being requested * @return the localized text */ private static String getString( String theKey ) { return UTIL.getString(new StringBuffer().append(PREFIX).append(theKey).toString()); } static class ListContentProvider implements IStructuredContentProvider { @Override public void dispose() { } @Override public Object[] getElements( final Object node ) { if (node instanceof DataModel) { return ((DataModel)node).getSalesforceObjects(); } return EMPTY_STRING_ARRAY; } @Override public void inputChanged( final Viewer viewer, final Object oldInput, final Object newInput ) { } } static class ListLabelProvider extends LabelProvider { final WorkbenchLabelProvider workbenchProvider = new WorkbenchLabelProvider(); @Override public Image getImage( final Object node ) { return null; } @Override public String getText( final Object node ) { if (node instanceof DataModel) { return "theModel"; //$NON-NLS-1$ } else if (node instanceof SalesforceObject) { return ((SalesforceObject)node).getLabel(); } return "unknownElement"; //$NON-NLS-1$ } } class TableContentProvider implements IStructuredContentProvider { @Override public Object[] getElements( Object inputElement ) { Object[] result = null; if (inputElement instanceof SalesforceObject) { SalesforceObject object = (SalesforceObject)inputElement; if (!importManager.isModelAuditFields()) { ArrayList<SalesforceField> nonAuditFields = new ArrayList<SalesforceField>(); SalesforceField[] fields = object.getFields(); for (int i = 0; i < fields.length; i++) { SalesforceField field = fields[i]; if (!field.isAuditField()) { nonAuditFields.add(field); } } result = nonAuditFields.toArray(); } else { result = object.getFields(); } } return result; } @Override public void dispose() { } @Override public void inputChanged( Viewer viewer, Object oldInput, Object newInput ) { } } static class TableLabelProvider implements ITableLabelProvider { @Override public void dispose() { } public void inputChanged( Viewer viewer, Object oldInput, Object newInput ) { } @Override public Image getColumnImage( Object element, int columnIndex ) { return null; } @Override public String getColumnText( Object element, int columnIndex ) { SalesforceField field = (SalesforceField)element; String result = ""; //$NON-NLS-1$ switch (columnIndex) { case 0: // COMPLETED_COLUMN result = field.getLabel(); break; case 1: result = field.getName(); break; case 2: result = field.getType(); break; case 3: result = field.isSearchable() ? "True" : "False"; //$NON-NLS-1$ //$NON-NLS-2$ break; case 4: result = field.isUpdateable() ? "True" : "False"; //$NON-NLS-1$ //$NON-NLS-2$ break; case 5: result = field.isAuditField() ? "True" : "False"; //$NON-NLS-1$ //$NON-NLS-2$ break; default: break; } return result; } @Override public void addListener( ILabelProviderListener listener ) { } @Override public boolean isLabelProperty( Object element, String property ) { return false; } @Override public void removeListener( ILabelProviderListener listener ) { } } }