/* * 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.xml.wizards; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.dialogs.IDialogPage; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; 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.Control; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.teiid.core.designer.PluginUtil; import org.teiid.designer.modelgenerator.xml.IUiConstants; import org.teiid.designer.modelgenerator.xml.XmlImporterUiPlugin; import org.teiid.designer.schema.tools.model.schema.RootElement; import org.teiid.designer.ui.common.viewsupport.StatusInfo; import org.teiid.designer.ui.common.widget.accumulator.AccumulatorPanel; import org.teiid.designer.ui.common.widget.accumulator.IAccumulatedValuesChangeListener; import org.teiid.designer.ui.common.widget.accumulator.IAccumulatorSource; import org.teiid.designer.ui.viewsupport.ModelUtilities; /** * RootElementsPage is the wizard page contribution for building Virtual XMLDocument models from XML Schema files in the * workspace. * * @since 8.0 */ public class RootElementsPage extends WizardPage implements IUiConstants, IUiConstants.HelpContexts, IUiConstants.Images { private RootElementsPanel panel; private XsdAsRelationalImportWizard wizard; private static PluginUtil util = XmlImporterUiPlugin.getDefault().getPluginUtil(); /** * Constructor for RootElementsPage. * * @param pageName */ public RootElementsPage( XsdAsRelationalImportWizard wizard ) { super(RootElementsPage.class.getSimpleName()); setTitle(util.getString("RootElementsPage.title")); //$NON-NLS-1$ setDescription(util.getString("RootElementsPage.description")); //$NON-NLS-1$ this.wizard = wizard; wizard.getStateManager(); } /** * @see IDialogPage#createControl(Composite) */ @Override public void createControl( Composite parent ) { panel = new RootElementsPanel(parent, wizard); setControl(panel); } @Override public void dispose() { super.dispose(); Control c = getControl(); if (c != null) { c.dispose(); } } } class RootElementsPanel extends Composite implements IUiConstants, IUiConstants.HelpContexts, IUiConstants.Images, IAccumulatedValuesChangeListener { private static PluginUtil util = XmlImporterUiPlugin.getDefault().getPluginUtil(); private static final String MAPPING_OPTIONS = util.getString("RootElementsPage.mappingOptions"); //$NON-NLS-1$ private static final String USE_STRING = util.getString("RootElementsPage.useString"); //$NON-NLS-1$ private static final String USE_SCHEMA_TYPE = util.getString("RootElementsPage.useSchemaType"); //$NON-NLS-1$ private final static int ACCUMULATOR_RESET_BUTTON_VERTICAL_MARGIN = 4; public final static int DOCUMENTS = 1; private TableViewer documentsListViewer; private AccumulatorPanel documentsAccumulatorPanel = null; private ILabelProvider accumulatorsLabelProvider; Button useSchemaTypeButton; private Button useStringTypeButton; XsdAsRelationalImportWizard wizard; private StateManager manager; private boolean selectionsChanged = false; public RootElementsPanel( Composite parent, XsdAsRelationalImportWizard wizard ) { super(parent, SWT.NULL); this.wizard = wizard; this.manager = wizard.getStateManager(); initialize(); } private void initialize() { GridLayout layout = new GridLayout(); layout.marginHeight = 0; this.setLayout(layout); accumulatorsLabelProvider = ModelUtilities.getEMFLabelProvider(); Group documentsAccumulatorComposite = new Group(this, SWT.NONE); String documentsGroupName = util.getString("RootElementsPage.virtualXMLDocumentsLabel"); //$NON-NLS-1$ documentsAccumulatorComposite.setText(documentsGroupName); GridLayout documentsAccumulatorCompositeLayout = new GridLayout(); documentsAccumulatorComposite.setLayout(documentsAccumulatorCompositeLayout); documentsAccumulatorCompositeLayout.marginWidth = 0; documentsAccumulatorCompositeLayout.marginHeight = 2; IAccumulatorSource documentsAccumulatorSource = new RootElementAccumulatorSource(this); String documentsAvailableHdr = util.getString("RootElementsPage.documentsAccumulatorLeftLabel"); //$NON-NLS-1$ String documentsSelectedHdr = util.getString("RootElementsPage.documentsAccumulatorRightLabel"); //$NON-NLS-1$ documentsAccumulatorPanel = new AccumulatorPanel(documentsAccumulatorComposite, documentsAccumulatorSource, new ArrayList(), accumulatorsLabelProvider, documentsAvailableHdr, documentsSelectedHdr, ACCUMULATOR_RESET_BUTTON_VERTICAL_MARGIN, -1, -1, -1); documentsAccumulatorPanel.addAccumulatedValuesChangeListener(this); Group typeGroup = new Group(this, SWT.NONE); typeGroup.setLayout(new GridLayout(1, true)); typeGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); typeGroup.setText(MAPPING_OPTIONS); useStringTypeButton = new Button(typeGroup, SWT.RADIO); useStringTypeButton.setSelection(true); useStringTypeButton.setText(USE_STRING); useSchemaTypeButton = new Button(typeGroup, SWT.RADIO); useSchemaTypeButton.setSelection(false); useSchemaTypeButton.setText(USE_SCHEMA_TYPE); useSchemaTypeButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected( SelectionEvent e ) { wizard.setUseSchemaTypes(useSchemaTypeButton.getSelection()); } @Override public void widgetDefaultSelected( SelectionEvent e ) { } }); useStringTypeButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected( SelectionEvent e ) { wizard.setUseSchemaTypes(useSchemaTypeButton.getSelection()); } @Override public void widgetDefaultSelected( SelectionEvent e ) { } }); } @Override public void setVisible( boolean visible ) { super.setVisible(visible); if (visible) { Collection availableRoots; try { availableRoots = manager.getPotentialRoots(); } catch (Exception e) { IStatus status = new Status(IStatus.ERROR, wizard.getClass().getName(), IStatus.ERROR, e.getMessage(), e); Shell shell = this.getShell(); ErrorDialog.openError(shell, util.getString("RootElementsPage.exception"), e.getMessage(), status); //$NON-NLS-1$ return; } Collection selectedRoots = new ArrayList(); if (availableRoots == null) { availableRoots = new ArrayList(); } emptyList(documentsListViewer); Iterator iter = availableRoots.iterator(); while (iter.hasNext()) { RootElement root = (RootElement)iter.next(); if (root.isUseAsRoot()) { selectedRoots.add(root); } else { documentsListViewer.add(root); } } documentsAccumulatorPanel.repopulateSelectedItems(selectedRoots); documentsAccumulatorPanel.availableItemsHaveChanged(); } } @Override public void accumulatedValuesChanged( AccumulatorPanel source ) { } private void emptyList( TableViewer listViewer ) { Table list = listViewer.getTable(); if (list != null) { int count = list.getItemCount(); for (int i = count - 1; i >= 0; i--) { Object item = listViewer.getElementAt(i); listViewer.remove(item); } } } public void documentsAccumulatedValuesRemoved( Collection values ) { Iterator it = values.iterator(); while (it.hasNext()) { Object value = it.next(); documentsListViewer.add(value); } } public void documentsAccumulatedValuesAdded( Collection values ) { Iterator it = values.iterator(); while (it.hasNext()) { Object value = it.next(); documentsListViewer.remove(value); } } public Collection getDocumentsAvailableValues() { int count = documentsListViewer.getTable().getItemCount(); ArrayList values = new ArrayList(count); for (int i = 0; i < count; i++) { Object value = documentsListViewer.getElementAt(i); values.add(value); } return values; } public int getDocumentsAvailableValuesCount() { int count = documentsListViewer.getTable().getItemCount(); return count; } public Collection getDocumentsSelectedAvailableValues() { int[] selectionIndices = documentsListViewer.getTable().getSelectionIndices(); ArrayList selectedValues = new ArrayList(selectionIndices.length); for (int i = 0; i < selectionIndices.length; i++) { int index = selectionIndices[i]; selectedValues.add(documentsListViewer.getElementAt(index)); } return selectedValues; } public int getDocumentsSelectedAvailableValuesCount() { if (documentsListViewer != null) { int count = documentsListViewer.getTable().getSelectionCount(); return count; } // endif return 0; } public Control documentsCreateControl( Composite parent ) { documentsListViewer = new TableViewer(parent, SWT.MULTI); documentsListViewer.setLabelProvider(accumulatorsLabelProvider); return documentsListViewer.getControl(); } public void documentsAddSelectionListener( SelectionListener listener ) { documentsListViewer.getTable().addSelectionListener(listener); } public void selectedDocumentsChanged() { Collection selectedRoots = documentsAccumulatorPanel.getSelectedItems(); manager.setSelectedRoots(selectedRoots); } public boolean isSelectionsChanged() { return selectionsChanged; } public void setSelectionsChanged( boolean selectionsChanged ) { this.selectionsChanged = selectionsChanged; } }// end RootElementsPanel class RootElementAccumulatorSource implements IAccumulatorSource { private static final IStatus OK_STATUS = new StatusInfo(IUiConstants.PLUGIN_ID); private RootElementsPanel caller; public RootElementAccumulatorSource( RootElementsPanel cllr ) { super(); this.caller = cllr; } @Override public void accumulatedValuesRemoved( Collection values ) { caller.documentsAccumulatedValuesRemoved(values); caller.selectedDocumentsChanged(); } @Override public void accumulatedValuesAdded( Collection values ) { caller.documentsAccumulatedValuesAdded(values); caller.selectedDocumentsChanged(); } @Override public Collection getAvailableValues() { Collection values = null; values = caller.getDocumentsAvailableValues(); return values; } @Override public int getAvailableValuesCount() { int count = -1; count = caller.getDocumentsAvailableValuesCount(); return count; } @Override public Collection getSelectedAvailableValues() { Collection values = null; values = caller.getDocumentsSelectedAvailableValues(); return values; } @Override public int getSelectedAvailableValuesCount() { int count = -1; count = caller.getDocumentsSelectedAvailableValuesCount(); return count; } @Override public Control createControl( Composite parent ) { Control control = null; control = caller.documentsCreateControl(parent); return control; } @Override public void addSelectionListener( SelectionListener listener ) { caller.documentsAddSelectionListener(listener); } /** * @see org.teiid.designer.ui.common.widget.accumulator.IAccumulatorSource#supportsAddAll() */ @Override public boolean supportsAddAll() { return true; } /** * @see org.teiid.designer.ui.common.widget.accumulator.IAccumulatorSource#getSelectionStatus() */ @Override public IStatus getSelectionStatus() { return OK_STATUS; } }