/******************************************************************************* * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.tools.workbench.mappingsplugin.ui.project.relational; import java.util.Iterator; import javax.swing.ListCellRenderer; import org.eclipse.persistence.tools.workbench.framework.context.WorkbenchContextHolder; import org.eclipse.persistence.tools.workbench.framework.resources.ResourceRepository; import org.eclipse.persistence.tools.workbench.framework.ui.chooser.DefaultListChooser; import org.eclipse.persistence.tools.workbench.framework.ui.chooser.DefaultListChooserDialog; import org.eclipse.persistence.tools.workbench.framework.uitools.SwingComponentFactory; import org.eclipse.persistence.tools.workbench.mappingsmodel.MWModel; import org.eclipse.persistence.tools.workbench.mappingsmodel.db.MWDatabase; import org.eclipse.persistence.tools.workbench.mappingsmodel.db.MWTable; import org.eclipse.persistence.tools.workbench.mappingsplugin.ui.common.cell.TableCellRendererAdapter; import org.eclipse.persistence.tools.workbench.uitools.app.CollectionAspectAdapter; import org.eclipse.persistence.tools.workbench.uitools.app.CollectionValueModel; import org.eclipse.persistence.tools.workbench.uitools.app.ExtendedListValueModelWrapper; import org.eclipse.persistence.tools.workbench.uitools.app.ItemPropertyListValueModelAdapter; import org.eclipse.persistence.tools.workbench.uitools.app.ListValueModel; import org.eclipse.persistence.tools.workbench.uitools.app.PropertyValueModel; import org.eclipse.persistence.tools.workbench.uitools.app.SortedListValueModelAdapter; import org.eclipse.persistence.tools.workbench.uitools.app.TransformationPropertyValueModel; import org.eclipse.persistence.tools.workbench.uitools.app.ValueModel; import org.eclipse.persistence.tools.workbench.uitools.app.swing.ComboBoxModelAdapter; import org.eclipse.persistence.tools.workbench.uitools.cell.AdaptableListCellRenderer; import org.eclipse.persistence.tools.workbench.uitools.chooser.ListChooser; import org.eclipse.persistence.tools.workbench.uitools.chooser.NodeSelector; public class RelationalProjectComponentFactory extends SwingComponentFactory { public static ListChooser buildTableChooser(PropertyValueModel mwModelHolder, PropertyValueModel selectedTableHolder, DefaultListChooserDialog.Builder dialogBuilder, WorkbenchContextHolder contextHolder) { ListChooser listChooser = new DefaultListChooser( new ComboBoxModelAdapter( buildExtendedTablesHolder(mwModelHolder), selectedTableHolder ), contextHolder, buildTableNodeSelector(contextHolder), dialogBuilder ); listChooser.setRenderer(buildMWTableListCellRenderer(contextHolder.getWorkbenchContext().getApplicationContext().getResourceRepository())); return listChooser; } /** * the database will never change, but the MWModel might */ private static ValueModel buildDatabaseAdapter(PropertyValueModel mwModelHolder) { return new TransformationPropertyValueModel(mwModelHolder) { protected Object transform(Object value) { return (value == null) ? null : ((MWModel) value).getDatabase(); } protected Object reverseTransform(Object value) { throw new UnsupportedOperationException(); } }; } /** * tack a null on the front of the list of tables * (to represent "none selected") */ public static ListValueModel buildExtendedTablesHolder(PropertyValueModel mwModelHolder) { return new ExtendedListValueModelWrapper(buildSortedTablesHolder(buildDatabaseAdapter(mwModelHolder))); } /** * sort the list of tables */ private static ListValueModel buildSortedTablesHolder(ValueModel databaseHolder) { return new SortedListValueModelAdapter(buildTableNameAdapter(databaseHolder)); } /** * listen to each table's name */ private static ListValueModel buildTableNameAdapter(ValueModel databaseHolder) { return new ItemPropertyListValueModelAdapter(buildTablesAdapter(databaseHolder), MWTable.QUALIFIED_NAME_PROPERTY); } /** * adapt the database's tables */ private static CollectionValueModel buildTablesAdapter(ValueModel databaseHolder) { return new CollectionAspectAdapter(databaseHolder, MWDatabase.TABLES_COLLECTION) { protected Iterator getValueFromSubject() { return ((MWDatabase) this.subject).tables(); } protected int sizeFromSubject() { return ((MWDatabase) this.subject).tablesSize(); } }; } private static ListCellRenderer buildMWTableListCellRenderer(ResourceRepository resourceRepository) { return new AdaptableListCellRenderer(new TableCellRendererAdapter(resourceRepository)); } public static NodeSelector buildTableNodeSelector(final WorkbenchContextHolder contextHolder) { return new NodeSelector() { public void selectNodeFor(Object item) { RelationalProjectNode projectNode = (RelationalProjectNode) contextHolder.getWorkbenchContext().getNavigatorSelectionModel().getSelectedProjectNodes()[0]; projectNode.selectTableNodeFor((MWTable) item, contextHolder.getWorkbenchContext().getNavigatorSelectionModel()); } }; } }