You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2013/07/23 20:25:42 UTC
svn commit: r1506197 - in
/cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor:
AbstractCallbackMethodsTab.java CallbackDescriptorTableModel.java
Author: aadamchik
Date: Tue Jul 23 18:25:42 2013
New Revision: 1506197
URL: http://svn.apache.org/r1506197
Log:
CAY-1846 Reworking of callback mapping
patch by Ilya Vasiuk
Modified:
cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/AbstractCallbackMethodsTab.java
cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/CallbackDescriptorTableModel.java
Modified: cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/AbstractCallbackMethodsTab.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/AbstractCallbackMethodsTab.java?rev=1506197&r1=1506196&r2=1506197&view=diff
==============================================================================
--- cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/AbstractCallbackMethodsTab.java (original)
+++ cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/AbstractCallbackMethodsTab.java Tue Jul 23 18:25:42 2013
@@ -20,28 +20,20 @@ package org.apache.cayenne.modeler.edito
import java.awt.BorderLayout;
import java.awt.Dimension;
-import java.awt.Insets;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
-import java.awt.image.ComponentColorModel;
+import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
-import javax.swing.AbstractButton;
import javax.swing.ImageIcon;
import javax.swing.JButton;
-import javax.swing.JComboBox;
import javax.swing.JComponent;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
@@ -55,6 +47,7 @@ import javax.swing.event.ListSelectionLi
import javax.swing.event.TableColumnModelEvent;
import javax.swing.event.TableColumnModelListener;
import javax.swing.table.JTableHeader;
+
import org.apache.cayenne.map.CallbackDescriptor;
import org.apache.cayenne.map.CallbackMap;
import org.apache.cayenne.map.LifecycleEvent;
@@ -101,26 +94,25 @@ public abstract class AbstractCallbackMe
* panel for displaying callback method tables
*/
protected JPanel auxPanel;
-
+
/**
* preferences for the callback methods table
*/
protected TableColumnPreferences tablePreferences;
- /**
- * Dropdown for callback type selection. Contains fixed list of 7 callback types.
- */
protected CallbackType[] callbackTypes = {
- new CallbackType(LifecycleEvent.POST_ADD, "post-add"),
- new CallbackType(LifecycleEvent.PRE_PERSIST, "pre-persist"),
- new CallbackType(LifecycleEvent.POST_PERSIST, "post-persist"),
- new CallbackType(LifecycleEvent.PRE_UPDATE, "pre-update"),
- new CallbackType(LifecycleEvent.POST_UPDATE, "post-update"),
- new CallbackType(LifecycleEvent.PRE_REMOVE, "pre-remove"),
- new CallbackType(LifecycleEvent.POST_REMOVE, "post-remove"),
- new CallbackType(LifecycleEvent.POST_LOAD, "post-load"),
+ new CallbackType(LifecycleEvent.POST_ADD, "PostAdd"),
+ new CallbackType(LifecycleEvent.PRE_PERSIST, "PrePersist"),
+ new CallbackType(LifecycleEvent.POST_PERSIST, "PostPersist"),
+ new CallbackType(LifecycleEvent.PRE_UPDATE, "PreUpdate"),
+ new CallbackType(LifecycleEvent.POST_UPDATE, "PostUpdate"),
+ new CallbackType(LifecycleEvent.PRE_REMOVE, "PreRemove"),
+ new CallbackType(LifecycleEvent.POST_REMOVE, "PostRemove"),
+ new CallbackType(LifecycleEvent.POST_LOAD, "PostLoad"),
};
+ protected CayenneTable[] tables = new CayenneTable[callbackTypes.length];
+
/**
* constructor
*
@@ -167,8 +159,8 @@ public abstract class AbstractCallbackMe
auxPanel = new JPanel();
auxPanel.setOpaque(false);
auxPanel.setLayout(new BorderLayout());
-
- initTablePreferences();
+
+ createTables();
add(new JScrollPane(auxPanel), BorderLayout.CENTER);
}
@@ -190,6 +182,7 @@ public abstract class AbstractCallbackMe
public void callbackMethodAdded(CallbackMethodEvent e) {
rebuildTables();
+ selectAdded();
}
public void callbackMethodRemoved(CallbackMethodEvent e) {
@@ -202,201 +195,92 @@ public abstract class AbstractCallbackMe
* rebuilds table content
*/
protected void rebuildTables() {
- FormLayout formLayout = new FormLayout("left:" + auxPanel.getWidth() + "px");
- DefaultFormBuilder builder = new DefaultFormBuilder(formLayout);
-
- auxPanel.removeAll();
+
- CallbackMap callbackMap = getCallbackMap();
- if (callbackMap != null) {
- for(CallbackType callbackType : callbackTypes) {
- builder.append(createTable(callbackType));
- }
+ CallbackMap callbackMap = getCallbackMap();
+
+ for(int i = 0; i < callbackTypes.length; i++) {
+
+ CallbackType callbackType = callbackTypes[i];
+
+ List<String> methods = new ArrayList<String>();
+ CallbackDescriptor descriptor = null;
+
+ if (callbackMap != null && callbackType != null) {
+ descriptor = callbackMap.getCallbackDescriptor(callbackType.getType());
+ for (String callbackMethod : descriptor.getCallbackMethods()) {
+ methods.add(callbackMethod);
+ }
+ }
+
+ CallbackDescriptorTableModel model = new CallbackDescriptorTableModel(
+ mediator,
+ this,
+ methods,
+ descriptor,
+ callbackType);
+
+ tables[i].setModel(model);
}
+
+ for(int i = 0; i < tables.length; i++)
+ tablePreferences.bind(tables[i], null, null, null);
+ }
+
+ private void createTables() {
+ FormLayout formLayout = new FormLayout("left:pref");
+ DefaultFormBuilder builder = new DefaultFormBuilder(formLayout);
+
+ int index = 0;
+ for(CallbackType callbackType : callbackTypes) {
+ tables[index] = createTable(callbackType);
+ builder.append(createTablePanel(tables[index++]));
+ }
+
+ initTablePreferences();
auxPanel.add(builder.getPanel(), BorderLayout.CENTER);
validate();
}
- private JPanel createTable(final CallbackType callbackType)
- {
-
+ private CayenneTable createTable(CallbackType callbackType) {
final CayenneTable cayenneTable = new CayenneTable();
// drag-and-drop initialization
cayenneTable.setDragEnabled(true);
- List<String> methods = new ArrayList<String>();
- CallbackDescriptor descriptor = null;
- CallbackMap callbackMap = getCallbackMap();
-
- descriptor = callbackMap.getCallbackDescriptor(callbackType.getType());
- for (String callbackMethod : descriptor.getCallbackMethods()) {
- methods.add(callbackMethod);
- }
-
- final CallbackDescriptorTableModel model = new CallbackDescriptorTableModel(
- mediator,
- this,
- methods,
- descriptor);
-
- cayenneTable.setModel(model);
- cayenneTable.setRowHeight(25);
- cayenneTable.setRowMargin(3);
- cayenneTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
- cayenneTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
-
- cayenneTable.setTransferHandler(new TransferHandler() {
-
- @Override
- protected Transferable createTransferable(JComponent c) {
- int rowIndex = cayenneTable.getSelectedRow();
-
- String result = null;
- if (rowIndex >= 0 && rowIndex < cayenneTable.getModel().getRowCount()) {
- result = String.valueOf(cayenneTable.getModel().getValueAt(
- rowIndex,
- CallbackDescriptorTableModel.METHOD_NAME));
- }
-
- return new StringSelection(result);
- }
-
- @Override
- public int getSourceActions(JComponent c) {
- return COPY_OR_MOVE;
- }
-
- @Override
- public boolean importData(JComponent comp, Transferable t) {
- if (canImport(comp, t.getTransferDataFlavors())) {
- String callbackMethod;
- try {
- callbackMethod = (String) t
- .getTransferData(DataFlavor.stringFlavor);
- }
- catch (Exception e) {
- logger.warn("Error transferring", e);
- return false;
- }
-
- int rowIndex = cayenneTable.getSelectedRow();
-
- CallbackDescriptor callbackDescriptor = ((CallbackDescriptorTableModel)cayenneTable.getCayenneModel()).getCallbackDescriptor();
- mediator.setDirty(callbackDescriptor.moveMethod(
- callbackMethod,
- rowIndex));
- rebuildTables();
- return true;
- }
-
- return false;
- }
-
- @Override
- public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) {
- for (DataFlavor flavor : transferFlavors) {
- if (DataFlavor.stringFlavor.equals(flavor)) {
- return true;
- }
- }
- return false;
- }
- });
-
- cayenneTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
-
- public void valueChanged(ListSelectionEvent e) {
- if (!e.getValueIsAdjusting()) {
- String[] methods = new String[0];
-
- if (cayenneTable.getSelectedRow() != -1) {
- int[] sel = cayenneTable.getSelectedRows();
- methods = new String[sel.length];
-
- for (int i = 0; i < sel.length; i++) {
- methods[i] = (String) cayenneTable
- .getValueAt(
- sel[i],
- cayenneTable
- .convertColumnIndexToView(CallbackDescriptorTableModel.METHOD_NAME));
- }
- }
-
- LifecycleEvent currentType = ((CallbackDescriptorTableModel)cayenneTable.getCayenneModel()).getCallbackDescriptor().getCallbackType();
- for(CallbackType callbackType : callbackTypes) {
- if(callbackType.getType() == currentType) {
- mediator.setCurrentCallbackType(callbackType);
- break;
- }
- }
-
- mediator.setCurrentCallbackMethods(methods);
- getRemoveCallbackMethodAction().setEnabled(methods.length > 0);
- getRemoveCallbackMethodAction().setName(
- getRemoveCallbackMethodAction().getActionName(
- methods.length > 1));
- }
- }
- });
-
- cayenneTable.getColumnModel().addColumnModelListener(new TableColumnModelListener() {
-
- public void columnMarginChanged(ChangeEvent e) {
- if(!cayenneTable.getColumnWidthChanged()) {
- if(cayenneTable.getTableHeader().getResizingColumn() != null) {
- tablePreferences.bind(cayenneTable, null, null, null);
- cayenneTable.setColumnWidthChanged(true);
- }
- }
- }
-
- public void columnSelectionChanged(ListSelectionEvent e) {
-
- }
-
- public void columnRemoved(TableColumnModelEvent e) {
-
- }
-
- public void columnMoved(TableColumnModelEvent e) {
-
- }
-
- public void columnAdded(TableColumnModelEvent e) {
-
- }
- });
-
- cayenneTable.getTableHeader().addMouseListener(new MouseAdapter()
- {
- public void mouseReleased(MouseEvent e)
- {
- if(cayenneTable.getColumnWidthChanged())
- {
- if(cayenneTable.getWidth() <= 60)
- cayenneTable.setSize(50, cayenneTable.getHeight());
- rebuildTables();
- cayenneTable.setColumnWidthChanged(false);
- }
- }
- });
-
- tablePreferences.bind(cayenneTable, null, null, null);
-
- // Create and install a popup
- JPopupMenu popup = new JPopupMenu();
- popup.add(getRemoveCallbackMethodAction().buildMenu());
-
- TablePopupHandler.install(cayenneTable, popup);
+ cayenneTable.setRowHeight(25);
+ cayenneTable.setRowMargin(3);
+ cayenneTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
+ cayenneTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+
+ cayenneTable.setTransferHandler(new CallbackImportableHandler(cayenneTable));
+ cayenneTable.getSelectionModel().addListSelectionListener(new CallbackListSelectionListener(cayenneTable));
+ cayenneTable.getColumnModel().addColumnModelListener(new CallbackTableColumnModelListener(cayenneTable));
+ cayenneTable.getTableHeader().addMouseListener(new CallbackMouseAdapter(cayenneTable));
+ cayenneTable.getTableHeader().addMouseMotionListener(new CallbackMouseMotionListener(cayenneTable));
+
+ // Create and install a popup
+ JPopupMenu popup = new JPopupMenu();
+ popup.add(getRemoveCallbackMethodAction().buildMenu());
+
+ TablePopupHandler.install(cayenneTable, popup);
+
+ addButtonAtHeader(
+ cayenneTable,
+ getCreateCallbackMethodAction().buildButton(),
+ new ButtonListener(callbackType),
+ ModelerUtil.buildIcon("icon-create-method.gif"));
+
+ return cayenneTable;
+ }
+
+ private JPanel createTablePanel(final CayenneTable cayenneTable) {
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
- addButtonAtHeader(cayenneTable, getCreateCallbackMethodAction().buildButton(), new ButtonListener(callbackType), ModelerUtil.buildIcon("icon-create-method.gif"));
-
panel.add(cayenneTable.getTableHeader(), BorderLayout.NORTH);
panel.add(cayenneTable, BorderLayout.CENTER);
@@ -407,7 +291,7 @@ public abstract class AbstractCallbackMe
PanelBuilder builder = new PanelBuilder(new FormLayout("left:10dlu, 2dlu", "center:10dlu"));
CellConstraints cc = new CellConstraints();
- button.setIcon(ModelerUtil.buildIcon("icon-create-method.gif"));
+ button.setIcon(buttonIcon);
button.setOpaque(false);
button.setBorderPainted(false);
button.setContentAreaFilled(false);
@@ -419,8 +303,9 @@ public abstract class AbstractCallbackMe
buttonPanel.setOpaque(false);
JTableHeader header = table.getTableHeader();
- //header.setMinimumSize(new Dimension(50, header.getHeight()));
header.setLayout(new BorderLayout());
+ header.setReorderingAllowed(false);
+ header.setPreferredSize(new Dimension(150, 20));
header.add(buttonPanel, BorderLayout.EAST);
}
@@ -439,5 +324,213 @@ public abstract class AbstractCallbackMe
protected final CallbackType getSelectedCallbackType() {
return mediator.getCurrentCallbackType();
- }
+ }
+
+ private void selectAdded() {
+ for(int i = 0; i < callbackTypes.length; i++) {
+ if(callbackTypes[i] == mediator.getCurrentCallbackType()) {
+ if (tables[i].editCellAt(
+ tables[i].getRowCount() - 1,
+ CallbackDescriptorTableModel.METHOD_NAME)
+ && tables[i].getEditorComponent() != null) {
+ tables[i].getEditorComponent().requestFocus();
+ }
+ }
+ }
+ }
+
+ protected class CallbackImportableHandler extends TransferHandler {
+
+ private CayenneTable table;
+
+ public CallbackImportableHandler(CayenneTable table) {
+ this.table = table;
+ }
+
+ protected Transferable createTransferable(JComponent c) {
+ int rowIndex = table.getSelectedRow();
+
+ String result = null;
+ if (rowIndex >= 0 && rowIndex < table.getModel().getRowCount()) {
+ result = String.valueOf(table.getModel().getValueAt(
+ rowIndex,
+ CallbackDescriptorTableModel.METHOD_NAME));
+ }
+
+ return new StringSelection(result);
+ }
+
+ public int getSourceActions(JComponent c) {
+ return COPY_OR_MOVE;
+ }
+
+ public boolean importData(JComponent comp, Transferable t) {
+ if (canImport(comp, t.getTransferDataFlavors())) {
+ String callbackMethod;
+ try {
+ callbackMethod = (String) t
+ .getTransferData(DataFlavor.stringFlavor);
+ }
+ catch (Exception e) {
+ logger.warn("Error transferring", e);
+ return false;
+ }
+
+ int rowIndex = table.getSelectedRow();
+
+ CallbackDescriptor callbackDescriptor = ((CallbackDescriptorTableModel)table.getCayenneModel()).getCallbackDescriptor();
+ mediator.setDirty(callbackDescriptor.moveMethod(
+ callbackMethod,
+ rowIndex));
+ rebuildTables();
+ return true;
+ }
+
+ return false;
+ }
+
+ public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) {
+ for (DataFlavor flavor : transferFlavors) {
+ if (DataFlavor.stringFlavor.equals(flavor)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+
+ protected class CallbackListSelectionListener implements ListSelectionListener {
+
+ private CayenneTable table;
+
+ public CallbackListSelectionListener(CayenneTable table){
+ this.table = table;
+ }
+
+ public void valueChanged(ListSelectionEvent e) {
+ if (!e.getValueIsAdjusting()) {
+ String[] methods = new String[0];
+
+ if(!((ListSelectionModel)e.getSource()).isSelectionEmpty()) {
+ for(int i = 0; i < tables.length; i++) {
+ if(!tables[i].equals(table)) {
+ tables[i].getSelectionModel().removeSelectionInterval(0,tables[i].getRowCount()-1);
+ if(tables[i].getCellEditor() != null) {
+ tables[i].getCellEditor().stopCellEditing();
+ }
+ }
+ }
+ }
+
+
+ if (table.getSelectedRow() != -1) {
+ int[] sel = table.getSelectedRows();
+ methods = new String[sel.length];
+
+ for (int i = 0; i < sel.length; i++) {
+ methods[i] = (String) table
+ .getValueAt(
+ sel[i],
+ table
+ .convertColumnIndexToView(CallbackDescriptorTableModel.METHOD_NAME));
+ }
+ }
+
+ LifecycleEvent currentType = ((CallbackDescriptorTableModel)table.getCayenneModel()).getCallbackDescriptor().getCallbackType();
+ for(CallbackType callbackType : callbackTypes) {
+ if(callbackType.getType() == currentType) {
+ mediator.setCurrentCallbackType(callbackType);
+ break;
+ }
+ }
+
+ mediator.setCurrentCallbackMethods(methods);
+ getRemoveCallbackMethodAction().setEnabled(methods.length > 0);
+ getRemoveCallbackMethodAction().setName(
+ getRemoveCallbackMethodAction().getActionName(
+ methods.length > 1));
+ }
+ }
+ }
+
+ protected class CallbackTableColumnModelListener implements TableColumnModelListener {
+
+ private CayenneTable table;
+
+ public CallbackTableColumnModelListener(CayenneTable table){
+ this.table = table;
+ }
+
+ public void columnMarginChanged(ChangeEvent e)
+ {
+ if(!table.getColumnWidthChanged())
+ {
+ if(table.getTableHeader().getResizingColumn() != null)
+ {
+ table.setColumnWidthChanged(true);
+ }
+ }
+ }
+
+ public void columnMoved(TableColumnModelEvent e) {
+
+ }
+
+ public void columnAdded(TableColumnModelEvent e) {
+
+ }
+
+ public void columnRemoved(TableColumnModelEvent e) {
+
+ }
+
+ public void columnSelectionChanged(ListSelectionEvent e) {
+
+ }
+ }
+
+ private class CallbackMouseAdapter extends MouseAdapter {
+
+ CayenneTable table;
+
+ public CallbackMouseAdapter(CayenneTable table) {
+ this.table = table;
+ }
+
+ public void mouseReleased(MouseEvent e)
+ {
+ if(table.getColumnWidthChanged())
+ {
+ for(int i=0; i<tables.length; i++) {
+ tables[i].getColumnModel().getColumn(0).setPreferredWidth(table.getWidth());
+ }
+ initTablePreferences();
+ table.setColumnWidthChanged(false);
+ }
+ }
+ }
+
+ private class CallbackMouseMotionListener implements MouseMotionListener {
+
+ CayenneTable table;
+
+ public CallbackMouseMotionListener(CayenneTable table) {
+ this.table = table;
+ }
+
+ public void mouseMoved(MouseEvent arg0) {
+ }
+
+ public void mouseDragged(MouseEvent arg0) {
+ if(table.getColumnWidthChanged())
+ {
+ tablePreferences.bind(table, null, null, null);
+ for(int i=0; i<tables.length; i++) {
+ if(!table.equals(tables[i])) {
+ tables[i].getColumnModel().getColumn(0).setPreferredWidth(table.getWidth());
+ }
+ }
+ }
+ }
+ }
}
Modified: cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/CallbackDescriptorTableModel.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/CallbackDescriptorTableModel.java?rev=1506197&r1=1506196&r2=1506197&view=diff
==============================================================================
--- cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/CallbackDescriptorTableModel.java (original)
+++ cayenne/main/trunk/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/CallbackDescriptorTableModel.java Tue Jul 23 18:25:42 2013
@@ -38,6 +38,7 @@ public class CallbackDescriptorTableMode
public static final int METHOD_NAME = 0;
protected ObjEntity entity;
protected CallbackDescriptor callbackDescriptor;
+ protected CallbackType callbackType;
/**
* constructor
@@ -48,9 +49,10 @@ public class CallbackDescriptorTableMode
* @param callbackDescriptor callback descriptor instance
*/
public CallbackDescriptorTableModel(ProjectController mediator, Object eventSource,
- List objectList, CallbackDescriptor callbackDescriptor) {
+ List objectList, CallbackDescriptor callbackDescriptor, CallbackType callbackType) {
super(mediator, eventSource, objectList);
this.callbackDescriptor = callbackDescriptor;
+ this.callbackType = callbackType;
}
/**
@@ -114,7 +116,7 @@ public class CallbackDescriptorTableMode
* @return column name
*/
public String getColumnName(int column) {
- return callbackDescriptor.getCallbackType().name();
+ return callbackType.getName();
}
/**