/******************************************************************************* * 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.descriptor.relational; import java.awt.Component; import java.awt.GridBagConstraints; import java.awt.Insets; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.Iterator; import javax.swing.JList; import javax.swing.JScrollPane; import javax.swing.ListCellRenderer; import javax.swing.ListModel; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.eclipse.persistence.tools.workbench.framework.context.WorkbenchContext; import org.eclipse.persistence.tools.workbench.framework.context.WorkbenchContextHolder; import org.eclipse.persistence.tools.workbench.framework.ui.dialog.AbstractDialog; import org.eclipse.persistence.tools.workbench.framework.ui.view.AbstractSubjectPanel; import org.eclipse.persistence.tools.workbench.framework.uitools.AddRemoveListPanel; import org.eclipse.persistence.tools.workbench.framework.uitools.AddRemovePanel; import org.eclipse.persistence.tools.workbench.framework.uitools.SwingComponentFactory; import org.eclipse.persistence.tools.workbench.mappingsmodel.db.MWColumn; import org.eclipse.persistence.tools.workbench.mappingsmodel.db.MWTable; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.relational.MWTableDescriptor; import org.eclipse.persistence.tools.workbench.mappingsmodel.descriptor.relational.MWTableDescriptorLockingPolicy; import org.eclipse.persistence.tools.workbench.mappingsplugin.ui.common.cell.ColumnCellRendererAdapter; import org.eclipse.persistence.tools.workbench.mappingsplugin.ui.mapping.relational.RelationalMappingComponentFactory; 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.CompositeCollectionValueModel; import org.eclipse.persistence.tools.workbench.uitools.app.ItemPropertyListValueModelAdapter; import org.eclipse.persistence.tools.workbench.uitools.app.ListCollectionValueModelAdapter; 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.ValueModel; import org.eclipse.persistence.tools.workbench.uitools.app.swing.ListModelAdapter; import org.eclipse.persistence.tools.workbench.uitools.app.swing.ObjectListSelectionModel; import org.eclipse.persistence.tools.workbench.uitools.cell.AdaptableListCellRenderer; public class RelationalLockingColumnsPanel extends AbstractSubjectPanel { // **************** Constructors ****************************************** RelationalLockingColumnsPanel(PropertyValueModel lockingPolicyHolder, WorkbenchContextHolder contextHolder) { super(lockingPolicyHolder, contextHolder); this.initializeLayout(); } // **************** Initialization **************************************** protected void initializeLayout() { GridBagConstraints constraints = new GridBagConstraints(); constraints.gridx = 0; constraints.gridy = 0; constraints.gridwidth = 1; constraints.gridheight = 1; constraints.weightx = 1; constraints.weighty = 1; constraints.fill = GridBagConstraints.HORIZONTAL; constraints.anchor = GridBagConstraints.LINE_START; constraints.insets = new Insets(0, 1, 1, 1); this.add(this.buildColumnLockingColumnsList(), constraints); addHelpTopicId(this, this.helpTopicId()); } private AddRemoveListPanel buildColumnLockingColumnsList() { AddRemoveListPanel listPanel = new AddRemoveListPanel( getApplicationContext(), this.buildPrimaryKeysAddRemoveAdapter(), this.buildSortedColumnLockingColumnsHolder(), AddRemovePanel.RIGHT, resourceRepository().getString("LOCKING_POLICY_SELECTED_FIELDS_LOCKING"), RelationalMappingComponentFactory.buildColumnNodeSelector(getWorkbenchContextHolder())); listPanel.setBorder(buildStandardEmptyBorder()); listPanel.setCellRenderer(buildColumnLockingColumnsListCellRenderer()); return listPanel; } private AddRemoveListPanel.Adapter buildPrimaryKeysAddRemoveAdapter() { return new AddRemoveListPanel.Adapter() { public void addNewItem(ObjectListSelectionModel listSelectionModel) { listSelectionModel.setSelectedValues(addColumnLockingColumns()); } public void removeSelectedItems(ObjectListSelectionModel listSelectionModel) { removeColumnLockingColumns(listSelectionModel.getSelectedValues()); } }; } /** * Overide since this panel should be treated as a single Component. */ public void setEnabled(boolean enabled) { super.setEnabled(enabled); Component[] children = getComponents(); for (int i = 0; i < children.length; i++) { children[i].setEnabled(enabled); } } Object[] addColumnLockingColumns() { Object[] columnLockingColumns = new LockingColumnDialog(getWorkbenchContext()).promptForPrimaryKeys(); for (int i = 0; i < columnLockingColumns.length; i ++) { ((MWTableDescriptorLockingPolicy)relationalDescriptor().getLockingPolicy()).addColumnLockColumn((MWColumn) columnLockingColumns[i]); } return columnLockingColumns; } void removeColumnLockingColumns(Object[] lockingColumns) { for (int i = 0; i < lockingColumns.length; i ++) { ((MWTableDescriptorLockingPolicy)relationalDescriptor().getLockingPolicy()).removeColumnLockColumn((MWColumn) lockingColumns[i]); } } private ListValueModel buildSortedColumnLockingColumnsHolder() { return new SortedListValueModelAdapter(buildNamedColumnLockingColumnsHolder()); } private ListValueModel buildNamedColumnLockingColumnsHolder() { return new ItemPropertyListValueModelAdapter(buildColumnLockingColumnsHolder(), MWColumn.QUALIFIED_NAME_PROPERTY, MWColumn.DATABASE_TYPE_PROPERTY); } private CollectionValueModel buildColumnLockingColumnsHolder() { return new CollectionAspectAdapter(getSubjectHolder(), MWTableDescriptorLockingPolicy.COLUMN_LOCK_COLUMNS_COLLECTION) { protected Iterator getValueFromSubject() { return ((MWTableDescriptorLockingPolicy) this.subject).columnLockColumns(); } }; } private ListCellRenderer buildColumnLockingColumnsListCellRenderer() { return new AdaptableListCellRenderer(new ColumnCellRendererAdapter(resourceRepository())); } // **************** Internal ********************************************** private MWTableDescriptor relationalDescriptor() { return ((MWTableDescriptorLockingPolicy) this.getSubjectHolder().getValue()).getOwningTableDescriptor(); } /** * broaden access a bit */ protected ValueModel getSubjectHolder() { return super.getSubjectHolder(); } // **************** Public ************************************************ public String helpTopicId() { return "descriptor.locking.selectedfields"; } // **************** Member classes **************************************** private class LockingColumnDialog extends AbstractDialog { private ListModel lockingColumnsModel; private ObjectListSelectionModel lockingColumnsSelectionModel; LockingColumnDialog(WorkbenchContext context) { super(context); } protected void initialize() { super.initialize(); this.lockingColumnsModel = this.buildPrimaryKeyListAdapter(); this.lockingColumnsSelectionModel = this.buildLockingColumnsSelectionModel(); this.setTitle(resourceRepository().getString("LOCKING_ADD_REMOVE_DIALOG_TITLE")); this.getOKAction().setEnabled(false); } private ListModel buildPrimaryKeyListAdapter() { return new ListModelAdapter(this.buildSortedColumnsHolder()); } private ListValueModel buildSortedColumnsHolder() { return new SortedListValueModelAdapter(buildAllColumnsCollectionHolder()); } private CollectionValueModel buildAllColumnsCollectionHolder() { return new CompositeCollectionValueModel(buildSortedTablesHolder()) { protected CollectionValueModel transform(Object value) { return new ListCollectionValueModelAdapter(buildSortedColumnsHolder((MWTable) value)); } }; } private ListValueModel buildSortedTablesHolder() { return new SortedListValueModelAdapter(buildTableNameAdapter()); } private ListValueModel buildTableNameAdapter() { return new ItemPropertyListValueModelAdapter(buildTablesHolder(), MWTable.QUALIFIED_NAME_PROPERTY); } private CollectionValueModel buildTablesHolder() { return new CollectionAspectAdapter(getSubjectHolder()) { protected Iterator getValueFromSubject() { return ((MWTableDescriptorLockingPolicy) this.subject).getOwningTableDescriptor().associatedTables(); } }; } ListValueModel buildSortedColumnsHolder(MWTable table) { return new SortedListValueModelAdapter(buildColumnNameAdapter(table)); } private ListValueModel buildColumnNameAdapter(MWTable table) { return new ItemPropertyListValueModelAdapter(buildColumnsHolder(table), MWColumn.NAME_PROPERTY); } private CollectionAspectAdapter buildColumnsHolder(MWTable table) { return new CollectionAspectAdapter(MWTable.COLUMNS_COLLECTION, table) { protected Iterator getValueFromSubject() { return ((MWTable) this.subject).columns(); } protected int sizeFromSubject() { return ((MWTable) this.subject).columnsSize(); } }; } private ObjectListSelectionModel buildLockingColumnsSelectionModel() { ObjectListSelectionModel selectionModel = new ObjectListSelectionModel(this.lockingColumnsModel); selectionModel.addListSelectionListener(this.buildSelectionListener()); return selectionModel; } private ListSelectionListener buildSelectionListener() { return new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if ( ! e.getValueIsAdjusting()) { LockingColumnDialog.this.selectionChanged(); } } }; } void selectionChanged() { this.getOKAction().setEnabled(! this.lockingColumnsSelectionModel.isSelectionEmpty()); } protected Component buildMainPanel() { JList list = SwingComponentFactory.buildList(this.lockingColumnsModel); list.setSelectionModel(this.lockingColumnsSelectionModel); list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); list.setCellRenderer(this.buildListCellRenderer()); list.addMouseListener(buildListMouseListener()); return new JScrollPane(list); } private ListCellRenderer buildListCellRenderer() { return new AdaptableListCellRenderer(new ColumnCellRendererAdapter(this.resourceRepository())); } /** * Double-clicking on a selection in the list will automatically * make the selection. */ protected MouseListener buildListMouseListener() { return new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { LockingColumnDialog.this.clickOK(); } } }; } /** * broaden access a bit */ protected void clickOK() { super.clickOK(); } protected String helpTopicId() { return RelationalLockingColumnsPanel.this.helpTopicId(); } Object[] promptForPrimaryKeys() { this.show(); if (this.wasConfirmed()) { return this.lockingColumnsSelectionModel.getSelectedValues(); } return new Object[0]; } } }