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 2009/10/08 11:04:52 UTC
svn commit: r823096 [1/2] - in /cayenne/main/trunk/framework:
cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/
cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/
cayenne-modeler/.settings/ cayenne-modeler/src/main/java...
Author: aadamchik
Date: Thu Oct 8 09:04:49 2009
New Revision: 823096
URL: http://svn.apache.org/viewvc?rev=823096&view=rev
Log:
CAY-1260 Modeler support for embeddables and embedded attributes
patch Inspector1_5.txt by Olga Tkachova
Added:
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/OverrideEmbeddableAttributeTableModel.java
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CellEditorForAttributeTable.java
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/DataMap.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/Embeddable.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/EmbeddedAttribute.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/NamedObjectFactory.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/ProjectTraversal.java
cayenne/main/trunk/framework/cayenne-modeler/.settings/org.eclipse.jdt.core.prefs
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeView.java
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialog.java
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialogView.java
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialog.java
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialogView.java
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EditorView.java
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableAttributeTab.java
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableAttributeTableModel.java
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableTab.java
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjAttributeTableModel.java
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/Comparators.java
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/DataMap.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/DataMap.java?rev=823096&r1=823095&r2=823096&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/DataMap.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/DataMap.java Thu Oct 8 09:04:49 2009
@@ -578,6 +578,7 @@
}
embeddablesMap.put(embeddable.getClassName(), embeddable);
+ embeddable.setDataMap(this);
}
/**
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/Embeddable.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/Embeddable.java?rev=823096&r1=823095&r2=823096&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/Embeddable.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/Embeddable.java Thu Oct 8 09:04:49 2009
@@ -41,6 +41,7 @@
protected String className;
protected SortedMap<String, EmbeddableAttribute> attributes;
+ protected DataMap dataMap;
public Embeddable() {
this(null);
@@ -51,6 +52,16 @@
this.className = className;
}
+
+ public DataMap getDataMap() {
+ return dataMap;
+ }
+
+
+ public void setDataMap(DataMap dataMap) {
+ this.dataMap = dataMap;
+ }
+
/**
* Returns Java class of the embeddable.
*/
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/EmbeddedAttribute.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/EmbeddedAttribute.java?rev=823096&r1=823095&r2=823096&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/EmbeddedAttribute.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/EmbeddedAttribute.java Thu Oct 8 09:04:49 2009
@@ -36,7 +36,6 @@
*/
public class EmbeddedAttribute extends ObjAttribute {
- protected String type;
protected SortedMap<String, String> attributeOverrides;
public EmbeddedAttribute() {
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/NamedObjectFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/NamedObjectFactory.java?rev=823096&r1=823095&r2=823096&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/NamedObjectFactory.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/NamedObjectFactory.java Thu Oct 8 09:04:49 2009
@@ -252,19 +252,44 @@
}
static class EmbeddableFactory extends NamedObjectFactory {
+
+ private String nameBase;
+
+
+ public String getNameBase() {
+ return nameBase;
+ }
+
+
+ public void setNameBase(String nameBase) {
+ this.nameBase = nameBase;
+ }
+
@Override
protected String nameBase() {
- return "Package.UntitledObjEntity";
+ System.out.println("nameBase");
+ if(getNameBase()==null){
+ setNameBase("UntitledEmbeddable");
+ }
+ return getNameBase();
+
}
@Override
protected Object create(String name, Object namingContext) {
+ DataMap map = (DataMap) namingContext;
+ if(map.getDefaultPackage() != null){
+ return new Embeddable(map.getDefaultPackage() + "." + name);
+ }
return new Embeddable(name);
}
@Override
protected boolean isNameInUse(String name, Object namingContext) {
DataMap map = (DataMap) namingContext;
+ if(map.getDefaultPackage() != null){
+ return map.getEmbeddable((map.getDefaultPackage() + "." + name)) != null;
+ }
return map.getEmbeddable(name) != null;
}
}
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/ProjectTraversal.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/ProjectTraversal.java?rev=823096&r1=823095&r2=823096&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/ProjectTraversal.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/project/ProjectTraversal.java Thu Oct 8 09:04:49 2009
@@ -91,6 +91,9 @@
else if (rootNode instanceof Entity) {
this.traverseEntities(Collections.singletonList(rootNode).iterator(), path);
}
+ else if (rootNode instanceof Embeddable) {
+ this.traverseEmbeddable(Collections.singletonList(rootNode).iterator(), path);
+ }
else if (rootNode instanceof Attribute) {
this.traverseAttributes(Collections.singletonList(rootNode).iterator(), path);
}
@@ -102,9 +105,6 @@
else if (rootNode instanceof DataNode) {
this.traverseNodes(Collections.singletonList(rootNode).iterator(), path);
}
- else if (rootNode instanceof Embeddable) {
- this.traverseEmbeddable(Collections.singletonList(rootNode).iterator(), path);
- }
else {
String nodeClass = (rootNode != null)
? rootNode.getClass().getName()
@@ -177,8 +177,8 @@
if (handler.shouldReadChildren(map, path)) {
this.traverseEntities(map.getObjEntities().iterator(), mapPath);
- this.traverseEntities(map.getDbEntities().iterator(), mapPath);
this.traverseEmbeddable(map.getEmbeddables().iterator(), mapPath);
+ this.traverseEntities(map.getDbEntities().iterator(), mapPath);
this.traverseProcedures(map.getProcedures().iterator(), mapPath);
this.traverseQueries(map.getQueries().iterator(), mapPath);
}
Modified: cayenne/main/trunk/framework/cayenne-modeler/.settings/org.eclipse.jdt.core.prefs
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/.settings/org.eclipse.jdt.core.prefs?rev=823096&r1=823095&r2=823096&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/.settings/org.eclipse.jdt.core.prefs (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/.settings/org.eclipse.jdt.core.prefs Thu Oct 8 09:04:49 2009
@@ -1,15 +1,5 @@
-#Fri Nov 16 16:54:33 EST 2007
+#Wed Oct 07 15:54:03 EEST 2009
eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=48
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java?rev=823096&r1=823095&r2=823096&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java Thu Oct 8 09:04:49 2009
@@ -222,9 +222,8 @@
projectMenu.add(getAction(CreateDataMapAction.getActionName()).buildMenu());
projectMenu.add(getAction(CreateObjEntityAction.getActionName()).buildMenu());
- projectMenu.add(getAction(CreateDbEntityAction.getActionName()).buildMenu());
-
projectMenu.add(getAction(CreateEmbeddableAction.getActionName()).buildMenu());
+ projectMenu.add(getAction(CreateDbEntityAction.getActionName()).buildMenu());
projectMenu.add(getAction(CreateProcedureAction.getActionName()).buildMenu());
projectMenu.add(getAction(CreateQueryAction.getActionName()).buildMenu());
@@ -390,9 +389,7 @@
toolBar.add(getAction(CreateObjEntityAction.getActionName()).buildButton());
-
toolBar.add(getAction(CreateEmbeddableAction.getActionName()).buildButton());
-
toolBar.add(getAction(CreateQueryAction.getActionName()).buildButton());
toolBar.addSeparator();
Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeView.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeView.java?rev=823096&r1=823095&r2=823096&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeView.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeView.java Thu Oct 8 09:04:49 2009
@@ -925,8 +925,9 @@
popup.add(buildMenu(CreateDataMapAction.getActionName()));
popup.add(buildMenu(CreateObjEntityAction.getActionName()));
- popup.add(buildMenu(CreateDbEntityAction.getActionName()));
popup.add(buildMenu(CreateEmbeddableAction.getActionName()));
+ popup.add(buildMenu(CreateDbEntityAction.getActionName()));
+
popup.add(buildMenu(CreateProcedureAction.getActionName()));
popup.add(buildMenu(CreateQueryAction.getActionName()));
popup.addSeparator();
Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java?rev=823096&r1=823095&r2=823096&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java Thu Oct 8 09:04:49 2009
@@ -29,6 +29,8 @@
import org.apache.cayenne.map.Attribute;
import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.map.EmbeddableAttribute;
import org.apache.cayenne.map.Entity;
import org.apache.cayenne.map.ObjEntity;
import org.apache.cayenne.map.Relationship;
@@ -36,6 +38,7 @@
import org.apache.cayenne.modeler.dialog.FindDialog;
import org.apache.cayenne.modeler.util.CayenneAction;
import org.apache.cayenne.project.ProjectPath;
+import org.apache.cayenne.query.Query;
public class FindAction extends CayenneAction {
private java.util.List<Object> paths;
@@ -70,6 +73,12 @@
paths.add(path.getPath());
else if (o instanceof Relationship && matchFound(((Relationship) o).getName(), pattern))
paths.add(path.getPath());
+ else if (o instanceof Query && matchFound(((Query) o).getName(), pattern))
+ paths.add(path.getPath());
+ else if (o instanceof Embeddable && matchFound(((Embeddable) o).getClassName(), pattern))
+ paths.add(path.getPath());
+ else if (o instanceof EmbeddableAttribute && matchFound(((EmbeddableAttribute) o).getName(), pattern))
+ paths.add(path.getPath());
}
}
Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialog.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialog.java?rev=823096&r1=823095&r2=823096&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialog.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialog.java Thu Oct 8 09:04:49 2009
@@ -42,6 +42,8 @@
import org.apache.cayenne.map.DbAttribute;
import org.apache.cayenne.map.DbEntity;
import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.map.EmbeddableAttribute;
import org.apache.cayenne.map.Entity;
import org.apache.cayenne.map.ObjAttribute;
import org.apache.cayenne.map.ObjEntity;
@@ -52,9 +54,13 @@
import org.apache.cayenne.modeler.ProjectTreeModel;
import org.apache.cayenne.modeler.editor.EditorView;
import org.apache.cayenne.modeler.event.AttributeDisplayEvent;
+import org.apache.cayenne.modeler.event.EmbeddableAttributeDisplayEvent;
+import org.apache.cayenne.modeler.event.EmbeddableDisplayEvent;
import org.apache.cayenne.modeler.event.EntityDisplayEvent;
+import org.apache.cayenne.modeler.event.QueryDisplayEvent;
import org.apache.cayenne.modeler.event.RelationshipDisplayEvent;
import org.apache.cayenne.modeler.util.CayenneController;
+import org.apache.cayenne.query.Query;
/**
* An instance of this class is responsible for displaying search results and navigating
@@ -80,7 +86,7 @@
this.paths = paths;
- Map objEntityNames = new HashMap(), dbEntityNames = new HashMap(), attrNames = new HashMap(), relatNames = new HashMap();
+ Map objEntityNames = new HashMap(), dbEntityNames = new HashMap(), attrNames = new HashMap(), relatNames = new HashMap(), queryNames = new HashMap(), embeddableNames = new HashMap(), embeddableAttributeNames = new HashMap();
Iterator it = paths.iterator();
int index = 0;
while (it.hasNext()) {
@@ -98,6 +104,27 @@
((DbEntity) path[path.length - 1]).getName());
}
+ if (path[path.length - 1] instanceof Query) {
+ queryNames.put(new Integer(index++), ((Query) path[path.length - 1])
+ .getName());
+ }
+
+ if (path[path.length - 1] instanceof Embeddable) {
+
+ String name = ((Embeddable) path[path.length - 1]).getClassName();
+ embeddableNames.put(
+ new Integer(index++),
+ name);
+ }
+
+ if (path[path.length - 1] instanceof EmbeddableAttribute) {
+
+ Object parentObject = ((EmbeddableAttribute) path[path.length - 1]).getEmbeddable();
+ String parName = getParentName(path, parentObject);
+ embeddableAttributeNames.put(new Integer(index++), parName
+ + "."
+ + ((EmbeddableAttribute) path[path.length - 1]).getName());
+ }
if (path[path.length - 1] instanceof Attribute) {
Object parentObject = ((Attribute) path[path.length - 1]).getParent();
attrNames.put(new Integer(index++), getParentName(path, parentObject)
@@ -124,7 +151,14 @@
}
}
- view = new FindDialogView(objEntityNames, dbEntityNames, attrNames, relatNames);
+ view = new FindDialogView(
+ objEntityNames,
+ dbEntityNames,
+ attrNames,
+ relatNames,
+ queryNames,
+ embeddableNames,
+ embeddableAttributeNames);
initBindings();
}
@@ -184,7 +218,56 @@
if (path[path.length - 1] instanceof DbEntity)
editor.getDbDetailView().currentDbEntityChanged(event);
}
+
+ if (path[path.length - 1] instanceof Query) {
+
+ /** Make selection in a project tree, open correspondent entity tab */
+ editor.getProjectTreeView().getSelectionModel().setSelectionPath(
+ buildTreePath(path, editor));
+ QueryDisplayEvent event = new QueryDisplayEvent(
+ editor.getProjectTreeView(),
+ (Query) path[path.length - 1],
+ (DataMap) path[path.length - 2],
+ (DataDomain) path[path.length - 3]);
+
+ editor.currentQueryChanged(event);
+ }
+
+ if (path[path.length - 1] instanceof Embeddable) {
+
+ /** Make selection in a project tree, open correspondent entity tab */
+ editor.getProjectTreeView().getSelectionModel().setSelectionPath(
+ buildTreePath(path, editor));
+ EmbeddableDisplayEvent event = new EmbeddableDisplayEvent(
+ editor.getProjectTreeView(),
+ (Embeddable) path[path.length - 1],
+ (DataMap) path[path.length - 2],
+ (DataDomain) path[path.length - 3]);
+ event.setMainTabFocus(true);
+
+ editor.currentEmbeddableChanged(event);
+ }
+
+ if (path[path.length - 1] instanceof EmbeddableAttribute) {
+ /** Make selection in a project tree, open correspondent embeddable tab */
+ Object[] o = new Object[path.length - 1];
+ for (int i = 0; i < path.length - 1; i++)
+ o[i] = path[i];
+ editor.getProjectTreeView().getSelectionModel().setSelectionPath(
+ buildTreePath(o, editor));
+
+ EmbeddableAttributeDisplayEvent event = new EmbeddableAttributeDisplayEvent(
+ editor.getProjectTreeView(),
+ (Embeddable) path[path.length - 2],
+ (EmbeddableAttribute) path[path.length - 1],
+ (DataMap) path[path.length - 3],
+ (DataDomain) path[path.length - 4]);
+ event.setMainTabFocus(true);
+
+ editor.getEmbeddableView().currentEmbeddableAttributeChanged(event);
+ }
+
if (path[path.length - 1] instanceof Attribute
|| path[path.length - 1] instanceof Relationship) {
@@ -239,6 +322,7 @@
event.setMainTabFocus(true);
editor.getObjDetailView().currentObjRelationshipChanged(event);
}
+
}
private class JumpToResultActionListener implements MouseListener {
@@ -325,6 +409,10 @@
DbEntity dbEntity = (DbEntity) parentObject;
nameParent = dbEntity.getName();
}
+ if (parentObject instanceof Embeddable) {
+ Embeddable embeddable = (Embeddable) parentObject;
+ nameParent = embeddable.getClassName();
+ }
return nameParent;
}
Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialogView.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialogView.java?rev=823096&r1=823095&r2=823096&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialogView.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialogView.java Thu Oct 8 09:04:49 2009
@@ -49,10 +49,13 @@
import javax.swing.table.DefaultTableCellRenderer;
import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.Embeddable;
import org.apache.cayenne.map.ObjAttribute;
import org.apache.cayenne.map.ObjEntity;
import org.apache.cayenne.map.ObjRelationship;
import org.apache.cayenne.modeler.util.CellRenderers;
+import org.apache.cayenne.query.SelectQuery;
+
/**
* Swing component displaying results produced by search feature.
@@ -73,7 +76,7 @@
}
public FindDialogView(Map objEntityNames, Map dbEntityNames, Map attrNames,
- Map relatNames) {
+ Map relatNames, Map queryNames, Map embeddableNames, Map embeddableAttributeNames) {
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
@@ -81,7 +84,10 @@
if (objEntityNames.isEmpty()
&& dbEntityNames.isEmpty()
&& attrNames.isEmpty()
- && relatNames.isEmpty()) {
+ && relatNames.isEmpty()
+ && queryNames.isEmpty()
+ && embeddableNames.isEmpty()
+ && embeddableAttributeNames.isEmpty()) {
panel.add(new JLabel("Nothing found!"));
}
else {
@@ -90,7 +96,10 @@
int sizeDataVector = objEntityNames.size()
+ dbEntityNames.size()
+ attrNames.size()
- + relatNames.size();
+ + relatNames.size()
+ + queryNames.size()
+ + embeddableNames.size()
+ + embeddableAttributeNames.size();
Object[][] dataVector = new Object[sizeDataVector][];
@@ -100,18 +109,31 @@
dataVector = createResultTable(objEntityNames, CellRenderers
.iconForObject(new ObjEntity()), dataVector, curentLineInTable);
- curentLineInTable = objEntityNames.size();
+
+ curentLineInTable = objEntityNames.size();
+ dataVector = createResultTable(embeddableNames, CellRenderers
+ .iconForObject(new Embeddable()), dataVector, curentLineInTable);
+
+ curentLineInTable = curentLineInTable + embeddableNames.size();
dataVector = createResultTable(dbEntityNames, CellRenderers
.iconForObject(new DbEntity()), dataVector, curentLineInTable);
-
- curentLineInTable = curentLineInTable + dbEntityNames.size();
+
+ curentLineInTable = curentLineInTable + dbEntityNames.size();
dataVector = createResultTable(attrNames, CellRenderers
.iconForObject(new ObjAttribute()), dataVector, curentLineInTable);
+
+ curentLineInTable = curentLineInTable + attrNames.size();
+ dataVector = createResultTable(embeddableAttributeNames, CellRenderers
+ .iconForObject(new ObjAttribute()), dataVector, curentLineInTable);
- curentLineInTable = curentLineInTable + attrNames.size();
+ curentLineInTable = curentLineInTable + embeddableAttributeNames.size();
dataVector = createResultTable(relatNames, CellRenderers
.iconForObject(new ObjRelationship()), dataVector, curentLineInTable);
-
+
+ curentLineInTable = curentLineInTable + relatNames.size();
+ dataVector = createResultTable(queryNames, CellRenderers
+ .iconForObject(new SelectQuery()), dataVector, curentLineInTable);
+
tableModel.setDataVector(dataVector, new Object[] {
""
});
Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialog.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialog.java?rev=823096&r1=823095&r2=823096&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialog.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialog.java Thu Oct 8 09:04:49 2009
@@ -18,34 +18,55 @@
****************************************************************/
package org.apache.cayenne.modeler.dialog.objentity;
+import java.awt.Color;
import java.awt.Component;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Vector;
+import javax.swing.DefaultComboBoxModel;
import javax.swing.JOptionPane;
+import javax.swing.JTable;
import javax.swing.WindowConstants;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
+import javax.swing.table.DefaultTableCellRenderer;
+import javax.swing.table.TableColumn;
import javax.swing.tree.TreePath;
import org.apache.cayenne.map.Attribute;
import org.apache.cayenne.map.DbAttribute;
import org.apache.cayenne.map.DbEntity;
import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.map.EmbeddableAttribute;
+import org.apache.cayenne.map.EmbeddedAttribute;
import org.apache.cayenne.map.Entity;
import org.apache.cayenne.map.ObjAttribute;
import org.apache.cayenne.map.ObjEntity;
import org.apache.cayenne.map.Relationship;
+import org.apache.cayenne.map.event.AttributeEvent;
+import org.apache.cayenne.map.event.EntityEvent;
+import org.apache.cayenne.map.event.MapEvent;
import org.apache.cayenne.modeler.ProjectController;
import org.apache.cayenne.modeler.editor.ObjAttributeTableModel;
+import org.apache.cayenne.modeler.event.AttributeDisplayEvent;
+import org.apache.cayenne.modeler.event.EntityDisplayEvent;
import org.apache.cayenne.modeler.util.CayenneController;
import org.apache.cayenne.modeler.util.Comparators;
import org.apache.cayenne.modeler.util.EntityTreeFilter;
import org.apache.cayenne.modeler.util.EntityTreeModel;
+import org.apache.cayenne.modeler.util.ModelerUtil;
+import org.apache.cayenne.project.ProjectPath;
import org.apache.cayenne.swing.BindingBuilder;
import org.apache.cayenne.util.CayenneMapEntry;
@@ -53,29 +74,44 @@
TreeSelectionListener {
private ObjAttributeTableModel model;
+ private OverrideEmbeddableAttributeTableModel embeddableModel;
private int row;
protected ObjAttributeInfoDialogView view;
protected ObjAttribute attribute;
protected ObjAttribute attributeSaved;
- protected List attributesList;
- protected List attributesSavedList;
-
protected List<DbEntity> relTargets;
protected ObjEntity objectTarget;
protected List<ObjEntity> objectTargets;
- protected List<String> mapKeys;
+ protected Map<String, Embeddable> stringToEmbeddables;
+ protected List<String> embeddableNames;
+
protected ProjectController mediator;
+ private Object lastObjectType;
public ObjAttributeInfoDialog(ProjectController mediator, int row,
ObjAttributeTableModel model) {
super(mediator);
- this.view = new ObjAttributeInfoDialogView();
+ this.view = new ObjAttributeInfoDialogView(mediator);
this.mediator = mediator;
this.model = model;
this.row = row;
+ this.stringToEmbeddables = new HashMap<String, Embeddable>();
+ this.embeddableNames = new ArrayList<String>();
+ Iterator it = mediator.getProject().treeNodes();
+ while (it.hasNext()) {
+ ProjectPath path = (ProjectPath) it.next();
+ Object o = path.getObject();
+ Object[] p = path.getPath();
+ if (o instanceof Embeddable) {
+ Embeddable emb = (Embeddable) p[p.length - 1];
+ stringToEmbeddables.put(emb.getClassName(), emb);
+ embeddableNames.add(emb.getClassName());
+ }
+ }
+
initController(model.getAttribute(row));
}
@@ -98,14 +134,24 @@
}
private void initController(ObjAttribute attr) {
+
+ for (int i = 0; i < embeddableNames.size(); i++) {
+ ((DefaultComboBoxModel) view.getType().getModel()).addElement(embeddableNames
+ .get(i)
+ .toString());
+ }
+
this.attribute = attr;
- this.attributeSaved = new ObjAttribute();
- attributeSaved.setDbAttributePath(attribute.getDbAttributePath());
- attributeSaved.setName(attribute.getName());
- attributeSaved.setEntity(attribute.getEntity());
- attributeSaved.setParent(attribute.getParent());
- attributeSaved.setType(attribute.getType());
- attributeSaved.setUsedForLocking(attribute.isUsedForLocking());
+
+ if (attribute instanceof EmbeddedAttribute
+ || embeddableNames.contains(attribute.getType())) {
+ this.attributeSaved = new EmbeddedAttribute();
+ }
+ else {
+ this.attributeSaved = new ObjAttribute();
+ }
+
+ copyObjAttribute(attributeSaved, attribute);
relTargets = new ArrayList<DbEntity>(attribute
.getEntity()
@@ -135,6 +181,9 @@
view.getCurrentPathLabel().setText("");
}
view.getSourceEntityLabel().setText(attribute.getEntity().getName());
+
+ view.getType().setSelectedItem(attribute.getType());
+
BindingBuilder builder = new BindingBuilder(
getApplication().getBindingFactory(),
this);
@@ -149,20 +198,21 @@
Entity firstEntity = null;
if (attribute.getDbAttribute() == null) {
- Iterator<CayenneMapEntry> it = attribute.getDbPathIterator();
if (attribute.getParent() instanceof ObjEntity) {
DbEntity dbEnt = ((ObjEntity) attribute.getParent()).getDbEntity();
- Collection<DbAttribute> attrib = dbEnt.getAttributes();
- Collection<DbRelationship> rel = dbEnt.getRelationships();
-
- if (attrib.size() > 0) {
- Iterator<DbAttribute> iter = attrib.iterator();
- firstEntity = iter.next().getEntity();
- }
- else if (rel.size() > 0) {
- Iterator<DbRelationship> iter = rel.iterator();
- firstEntity = iter.next().getSourceEntity();
+ if (dbEnt != null) {
+ Collection<DbAttribute> attrib = dbEnt.getAttributes();
+ Collection<DbRelationship> rel = dbEnt.getRelationships();
+
+ if (attrib.size() > 0) {
+ Iterator<DbAttribute> iter = attrib.iterator();
+ firstEntity = iter.next().getEntity();
+ }
+ else if (rel.size() > 0) {
+ Iterator<DbRelationship> iter = rel.iterator();
+ firstEntity = iter.next().getSourceEntity();
+ }
}
}
}
@@ -194,13 +244,179 @@
}
});
view.getPathBrowser().setModel(treeModel);
-
}
}
if (attribute.getDbAttribute() != null) {
setSelectionPath();
}
+
+ view.getType().addItemListener(new ItemListener() {
+
+ public void itemStateChanged(ItemEvent e) {
+ if (lastObjectType != null) {
+ if (!lastObjectType.equals(e.getItemSelectable())) {
+
+ if (embeddableNames.contains(e
+ .getItemSelectable()
+ .getSelectedObjects()[0].toString())) {
+ if (attributeSaved instanceof ObjAttribute) {
+ EmbeddedAttribute copyAttrSaved = new EmbeddedAttribute();
+ copyObjAttribute(copyAttrSaved, attributeSaved);
+ attributeSaved = copyAttrSaved;
+ }
+ }
+ else {
+ if (attributeSaved instanceof EmbeddedAttribute) {
+ ObjAttribute copyAttrSaved = new ObjAttribute();
+ copyObjAttribute(copyAttrSaved, attributeSaved);
+ attributeSaved = copyAttrSaved;
+ }
+ }
+
+ attributeSaved
+ .setType(e.getItemSelectable().getSelectedObjects()[0]
+ .toString());
+ rebuildTable();
+ setEnabledSaveButton();
+ }
+ }
+ }
+ });
+
+ view.getAttributeName().addKeyListener(new KeyListener() {
+
+ public void keyPressed(KeyEvent e) {
+ if (!view.getAttributeName().getText().equals(attribute.getName())) {
+ setEnabledSaveButton();
+ }
+ }
+
+ public void keyReleased(KeyEvent e) {
+ if (!view.getAttributeName().getText().equals(attribute.getName())) {
+ setEnabledSaveButton();
+ }
+ }
+
+ public void keyTyped(KeyEvent e) {
+ }
+ });
+
+ rebuildTable();
+
+ }
+
+ private void setEnabledSaveButton() {
+ if (!attribute.getDbPathIterator().hasNext()) {
+ view.getSaveButton().setEnabled(true);
+ }
+ else {
+ boolean isAttributeLast = false;
+ Iterator<CayenneMapEntry> it = attribute.getDbPathIterator();
+ while (it.hasNext()) {
+ Object obj = it.next();
+ if (obj instanceof DbAttribute && !it.hasNext()) {
+ isAttributeLast = true;
+ }
+ }
+ view.getSaveButton().setEnabled(isAttributeLast);
+ }
+ }
+
+ private void setUpTableStructure() {
+
+ DefaultTableCellRenderer renderer = new CellRenderer();
+
+ TableColumn nameColumn = view
+ .getOverrideAttributeTable()
+ .getColumnModel()
+ .getColumn(OverrideEmbeddableAttributeTableModel.OBJ_ATTRIBUTE);
+ nameColumn.setMinWidth(180);
+ nameColumn.setCellRenderer(renderer);
+
+ TableColumn typeColumn = view
+ .getOverrideAttributeTable()
+ .getColumnModel()
+ .getColumn(OverrideEmbeddableAttributeTableModel.OBJ_ATTRIBUTE_TYPE);
+ typeColumn.setMinWidth(200);
+ typeColumn.setCellRenderer(renderer);
+
+ TableColumn dbAttrColumn = view
+ .getOverrideAttributeTable()
+ .getColumnModel()
+ .getColumn(OverrideEmbeddableAttributeTableModel.DB_ATTRIBUTE);
+ dbAttrColumn.setMinWidth(180);
+ dbAttrColumn.setCellRenderer(renderer);
+
+ TableColumn dbAttrTypeColumn = view
+ .getOverrideAttributeTable()
+ .getColumnModel()
+ .getColumn(OverrideEmbeddableAttributeTableModel.DB_ATTRIBUTE_TYPE);
+ dbAttrTypeColumn.setMinWidth(180);
+ dbAttrTypeColumn.setCellRenderer(renderer);
+
+ initComboBoxes();
+
+ }
+
+ private void initComboBoxes() {
+ Collection<String> nameAttr = null;
+ if (attributeSaved != null) {
+ DbEntity currentEnt = ((ObjEntity) attributeSaved.getEntity()).getDbEntity();
+
+ if (currentEnt != null) {
+ nameAttr = ModelerUtil.getDbAttributeNames(mediator, currentEnt);
+ embeddableModel.setCellEditor(nameAttr, view.getOverrideAttributeTable());
+ embeddableModel.setComboBoxes(
+ nameAttr,
+ OverrideEmbeddableAttributeTableModel.DB_ATTRIBUTE);
+ }
+ }
+ }
+
+ private void rebuildTable() {
+ String typeName = null;
+
+ Collection<EmbeddableAttribute> embAttrTempCopy = new ArrayList<EmbeddableAttribute>();
+
+ if (attributeSaved.getType() != null) {
+ typeName = attributeSaved.getType().toString();
+ }
+ if (embeddableNames.contains(typeName)) {
+
+ Collection<EmbeddableAttribute> embAttrTemp = ((Embeddable) stringToEmbeddables
+ .get(typeName)).getAttributes();
+ Iterator<EmbeddableAttribute> it = embAttrTemp.iterator();
+
+ while (it.hasNext()) {
+ EmbeddableAttribute temp = (EmbeddableAttribute) it.next();
+ EmbeddableAttribute at = new EmbeddableAttribute();
+ at.setDbAttributeName(temp.getDbAttributeName());
+ at.setName(temp.getName());
+ at.setType(temp.getType());
+ at.setEmbeddable(temp.getEmbeddable());
+ embAttrTempCopy.add(at);
+ }
+ }
+
+ embeddableModel = new OverrideEmbeddableAttributeTableModel(
+ mediator,
+ this,
+ embAttrTempCopy,
+ attributeSaved);
+
+ view.getOverrideAttributeTable().setModel(embeddableModel);
+ view.getOverrideAttributeTable().setRowHeight(25);
+ view.getOverrideAttributeTable().setRowMargin(3);
+
+ setUpTableStructure();
+
+ if (view.getType().getSelectedItem() == null) {
+ lastObjectType = "";
+ }
+ else {
+ lastObjectType = view.getType().getSelectedItem();
+ }
}
public void closeAction() {
@@ -210,27 +426,30 @@
public boolean setPath(boolean isChange) {
StringBuilder attributePath = new StringBuilder();
StringBuilder pathStr = new StringBuilder();
- TreePath path = view.getPathBrowser().getSelectionPath();
+ if (((ObjEntity) attribute.getEntity()).getDbEntity() != null) {
+ TreePath path = view.getPathBrowser().getSelectionPath();
- if (path.getLastPathComponent() instanceof DbAttribute) {
- Object[] pathComponents = path.getPath();
- for (int i = 0; i < pathComponents.length; i++) {
- boolean attrOrRel = true;
- if (pathComponents[i] instanceof DbAttribute) {
- pathStr.append(((DbAttribute) pathComponents[i]).getName());
- attributePath.append(((DbAttribute) pathComponents[i]).getName());
- }
- else if (pathComponents[i] instanceof DbRelationship) {
- pathStr.append(((DbRelationship) pathComponents[i]).getName());
- attributePath.append(((DbRelationship) pathComponents[i]).getName());
- }
- else {
- attrOrRel = false;
- }
+ if (path.getLastPathComponent() instanceof DbAttribute) {
+ Object[] pathComponents = path.getPath();
+ for (int i = 0; i < pathComponents.length; i++) {
+ boolean attrOrRel = true;
+ if (pathComponents[i] instanceof DbAttribute) {
+ pathStr.append(((DbAttribute) pathComponents[i]).getName());
+ attributePath.append(((DbAttribute) pathComponents[i]).getName());
+ }
+ else if (pathComponents[i] instanceof DbRelationship) {
+ pathStr.append(((DbRelationship) pathComponents[i]).getName());
+ attributePath.append(((DbRelationship) pathComponents[i])
+ .getName());
+ }
+ else {
+ attrOrRel = false;
+ }
- if (i != pathComponents.length - 1 && attrOrRel) {
- pathStr.append(" -> ");
- attributePath.append(".");
+ if (i != pathComponents.length - 1 && attrOrRel) {
+ pathStr.append(" -> ");
+ attributePath.append(".");
+ }
}
}
}
@@ -240,21 +459,51 @@
view.getCurrentPathLabel().setText(pathStr.toString());
- if (attribute.getDbAttributePath() != null) {
+ if (attribute.getDbAttributePath() != null
+ && !embeddableNames.contains(view.getType().getSelectedItem().toString())) {
if (!attribute.getDbAttributePath().equals(attributePath.toString())
- || !attribute.getName().equals(view.getAttributeName().getText())) {
- attributeSaved.setDbAttributePath(attributePath.toString());
+ || isChange()) {
+
+ if (isRegistredType(attributeSaved.getType())) {
+ attributeSaved.setDbAttributePath(attributePath.toString());
+ }
+ else {
+ attributeSaved.setDbAttributePath("");
+ }
attributeSaved.setName(view.getAttributeName().getText());
- if (!attribute.getDbAttributePath().equals(attributePath.toString()) && isChange) {
+ attributeSaved.setType(view.getType().getSelectedItem().toString());
+
+ if (!attribute.getDbAttributePath().equals(attributePath.toString())
+ && isChange) {
model.setUpdatedValueAt(attributeSaved.getDbAttributePath(), row, 3);
}
+
return true;
}
}
else {
- if (attributePath.length() > 0
- || !attribute.getName().equals(view.getAttributeName().getText())) {
- attributeSaved.setDbAttributePath(attributePath.toString());
+ if (attributePath.length() > 0 || isChange()) {
+ if (isRegistredType(attributeSaved.getType())) {
+ attributeSaved.setDbAttributePath(attributePath.toString());
+ }
+ else {
+ attributeSaved.setDbAttributePath("");
+
+ if (attributeSaved instanceof EmbeddedAttribute) {
+
+ if (embeddableModel.isAttributeOverrideChange()) {
+ Map<String, String> overrides = ((EmbeddedAttribute) attributeSaved)
+ .getAttributeOverrides();
+ Map<String, String> currentOverrAttr = getCurrentOverrideAttribute();
+ compareAndSetOverrideInEmbeddedAttribute(
+ attributeSaved,
+ overrides,
+ currentOverrAttr);
+ }
+ }
+
+ }
+ attributeSaved.setType(view.getType().getSelectedItem().toString());
attributeSaved.setName(view.getAttributeName().getText());
if (attributePath.length() > 0 && isChange) {
model.setUpdatedValueAt(attributeSaved.getDbAttributePath(), row, 3);
@@ -265,6 +514,21 @@
return false;
}
+ public boolean isChange() {
+
+ boolean isOvverideTableChange = ((OverrideEmbeddableAttributeTableModel) view
+ .getOverrideAttributeTable()
+ .getModel()).isAttributeOverrideChange();
+ return isOvverideTableChange
+ || !attribute.getName().equals(view.getAttributeName().getText())
+ || (attribute.getType() == null && view
+ .getType()
+ .getSelectedItem()
+ .toString() != null)
+ || !attribute.getType().equals(
+ view.getType().getSelectedItem().toString());
+ }
+
public void saveMapping() {
if (setPath(false)) {
@@ -273,14 +537,89 @@
"You have changed Db Attribute path. Do you want it to be saved?",
"Save ObjAttribute",
JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
- model.setUpdatedValueAt(attributeSaved.getName(), row, 1);
- model.setUpdatedValueAt(attributeSaved.getDbAttributePath(), row, 3);
+
+ if ((attributeSaved instanceof EmbeddedAttribute && !(attribute instanceof EmbeddedAttribute))
+ || (!(attributeSaved instanceof EmbeddedAttribute) && attribute instanceof EmbeddedAttribute)) {
+ model.getEntity().removeAttribute(attribute.getName());
+ model.getEntity().addAttribute(attributeSaved);
+
+ mediator.fireObjEntityEvent(new EntityEvent(
+ this,
+ model.getEntity(),
+ MapEvent.CHANGE));
+
+ EntityDisplayEvent event = new EntityDisplayEvent(
+ this,
+ mediator.getCurrentObjEntity(),
+ mediator.getCurrentDataMap(),
+ mediator.getCurrentDataDomain());
+
+ mediator.fireObjEntityDisplayEvent(event);
+
+ mediator.fireObjAttributeEvent(new AttributeEvent(
+ this,
+ attributeSaved,
+ model.getEntity(),
+ MapEvent.CHANGE));
+
+ AttributeDisplayEvent eventAttr = new AttributeDisplayEvent(
+ this,
+ attributeSaved,
+ mediator.getCurrentObjEntity(),
+ mediator.getCurrentDataMap(),
+ mediator.getCurrentDataDomain());
+
+ mediator.fireObjAttributeDisplayEvent(eventAttr);
+
+ }
+
+ if ((attributeSaved instanceof EmbeddedAttribute && attribute instanceof EmbeddedAttribute)
+ || (!(attributeSaved instanceof EmbeddedAttribute) && !(attribute instanceof EmbeddedAttribute))) {
+ model.setUpdatedValueAt(attributeSaved.getName(), row, 1);
+ model.setUpdatedValueAt(attributeSaved.getType(), row, 2);
+ model.setUpdatedValueAt(attributeSaved.getDbAttributePath(), row, 3);
+ }
+
+ if (attributeSaved instanceof EmbeddedAttribute
+ && attribute instanceof EmbeddedAttribute) {
+
+ if (embeddableModel.isAttributeOverrideChange()) {
+ Map<String, String> overrides;
+ overrides = ((EmbeddedAttribute) attribute)
+ .getAttributeOverrides();
+ Map<String, String> currentOverrAttr = ((EmbeddedAttribute) attributeSaved)
+ .getAttributeOverrides();
+
+ compareAndSetOverrideInEmbeddedAttribute(
+ attribute,
+ overrides,
+ currentOverrAttr);
+ }
+ }
}
}
-
closeAction();
}
+ public Map<String, String> getCurrentOverrideAttribute() {
+ Map<String, String> currentEmbeddableOverrite = new HashMap<String, String>();
+ Collection<EmbeddableAttribute> embList = embeddableModel.getEmbeddableList();
+ Embeddable emb = stringToEmbeddables.get(attributeSaved.getType());
+ Iterator<EmbeddableAttribute> it = embList.iterator();
+ while (it.hasNext()) {
+ EmbeddableAttribute e = it.next();
+ if ((emb.getAttribute(e.getName()).getDbAttributeName() == null && e
+ .getDbAttributeName() != null)
+ || (emb.getAttribute(e.getName()).getDbAttributeName() != null && !emb
+ .getAttribute(e.getName())
+ .getDbAttributeName()
+ .equals(e.getDbAttributeName()))) {
+ currentEmbeddableOverrite.put(e.getName(), e.getDbAttributeName());
+ }
+ }
+ return currentEmbeddableOverrite;
+ }
+
public void valueChanged(TreeSelectionEvent e) {
TreePath selectedPath = e.getPath();
@@ -402,4 +741,123 @@
view.getSaveButton().setEnabled(true);
}
}
+
+ public boolean isRegistredType(String typeName) {
+ boolean isType = false;
+ String[] typeNames = ModelerUtil.getRegisteredTypeNames();
+ for (int i = 0; i < typeNames.length; i++) {
+ if (typeNames[i].equals(typeName)) {
+ isType = true;
+ }
+ }
+ return isType;
+ }
+
+ // custom renderer used for inherited attributes highlighting
+ final class CellRenderer extends DefaultTableCellRenderer {
+
+ @Override
+ public Component getTableCellRendererComponent(
+ JTable table,
+ Object value,
+ boolean isSelected,
+ boolean hasFocus,
+ int row,
+ int column) {
+
+ super.getTableCellRendererComponent(
+ table,
+ value,
+ isSelected,
+ hasFocus,
+ row,
+ column);
+
+ OverrideEmbeddableAttributeTableModel model = (OverrideEmbeddableAttributeTableModel) table
+ .getModel();
+
+ if (!model.isCellEditable(row, column)) {
+ setForeground(Color.GRAY);
+ }
+ else {
+ setForeground(isSelected && !hasFocus
+ ? table.getSelectionForeground()
+ : table.getForeground());
+ }
+ setBackground(isSelected && !hasFocus
+ ? table.getSelectionBackground()
+ : table.getBackground());
+
+ return this;
+ }
+ }
+
+ private void copyObjAttribute(ObjAttribute attributeSaved, ObjAttribute attribute) {
+ attributeSaved.setDbAttributePath(attribute.getDbAttributePath());
+ attributeSaved.setName(attribute.getName());
+ attributeSaved.setEntity(attribute.getEntity());
+ attributeSaved.setParent(attribute.getParent());
+ attributeSaved.setType(attribute.getType());
+ attributeSaved.setUsedForLocking(attribute.isUsedForLocking());
+
+ if (attributeSaved instanceof EmbeddedAttribute) {
+ Map<String, String> attrOverrides;
+ if (attribute instanceof EmbeddedAttribute) {
+ attrOverrides = ((EmbeddedAttribute) attribute).getAttributeOverrides();
+ }
+ else {
+ attrOverrides = new HashMap<String, String>();
+ }
+ if (attrOverrides.size() > 0) {
+ Iterator it = attrOverrides.entrySet().iterator();
+
+ while (it.hasNext()) {
+ Map.Entry attrOv = (Map.Entry) it.next();
+ ((EmbeddedAttribute) attributeSaved).addAttributeOverride(attrOv
+ .getKey()
+ .toString(), attrOv.getValue().toString());
+ }
+ }
+ }
+ }
+
+ private void compareAndSetOverrideInEmbeddedAttribute(
+ ObjAttribute attribute,
+ Map<String, String> overrides,
+ Map<String, String> currentOverrAttr) {
+ ArrayList<String> keysForDelete = new ArrayList<String>();
+ ArrayList<String> keysForAdd = new ArrayList<String>();
+
+ Iterator it = overrides.entrySet().iterator();
+ while (it.hasNext()) {
+ Map.Entry obj = (Map.Entry) it.next();
+
+ String key = (String) obj.getKey();
+ if (currentOverrAttr.get(key) == null
+ || !(obj.getValue().equals(currentOverrAttr.get(key)))) {
+ keysForDelete.add(key);
+ }
+ }
+
+ Iterator iter = currentOverrAttr.entrySet().iterator();
+ while (iter.hasNext()) {
+ Map.Entry obj = (Map.Entry) iter.next();
+ String key = (String) obj.getKey();
+ if (overrides.get(key) == null
+ || !(obj.getValue().equals(overrides.get(key)))) {
+ keysForAdd.add(key);
+ }
+ }
+
+ for (int i = 0; i < keysForDelete.size(); i++) {
+ ((EmbeddedAttribute) attribute).removeAttributeOverride(keysForDelete.get(i));
+ }
+ for (int i = 0; i < keysForAdd.size(); i++) {
+ String key = keysForAdd.get(i);
+ ((EmbeddedAttribute) attribute).addAttributeOverride(key, currentOverrAttr
+ .get(key));
+ }
+
+ }
+
}
Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialogView.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialogView.java?rev=823096&r1=823095&r2=823096&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialogView.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialogView.java Thu Oct 8 09:04:49 2009
@@ -19,8 +19,13 @@
package org.apache.cayenne.modeler.dialog.objentity;
import java.awt.BorderLayout;
+import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ComponentEvent;
+import java.awt.event.ComponentListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
@@ -30,12 +35,18 @@
import javax.swing.JScrollPane;
import javax.swing.JTextField;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.util.CayenneTable;
+import org.apache.cayenne.modeler.util.CayenneWidgetFactory;
+import org.apache.cayenne.modeler.util.ModelerUtil;
import org.apache.cayenne.modeler.util.MultiColumnBrowser;
import org.apache.cayenne.modeler.util.PanelFactory;
+import org.apache.cayenne.modeler.util.combo.AutoCompletion;
import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
+import com.jgoodies.forms.layout.RowSpec;
public class ObjAttributeInfoDialogView extends JDialog {
@@ -52,19 +63,39 @@
protected JLabel currentPathLabel;
protected JLabel sourceEntityLabel;
protected JComboBox targCombo;
-
+
+ protected JComboBox type;
+ protected JPanel typeManagerPane;
+
+ protected CayenneTable overrideAttributeTable;
+
+ ProjectController mediator;
+
static final Dimension BROWSER_CELL_DIM = new Dimension(130, 200);
+
+ static final String EMBEDDABLE_PANEL = "EMBEDDABLE_PANEL";
+ static final String FLATTENED_PANEL = "FLATTENED_PANEL";
+
+ public ObjAttributeInfoDialogView(ProjectController mediator) {
- public ObjAttributeInfoDialogView() {
+ this.mediator = mediator;
// create widgets
this.cancelButton = new JButton("Close");
this.saveButton = new JButton("Done");
this.selectPathButton = new JButton("Select path");
+
this.attributeName = new JTextField(25);
this.currentPathLabel = new JLabel();
this.sourceEntityLabel = new JLabel();
+ this.type = CayenneWidgetFactory.createComboBox(ModelerUtil
+ .getRegisteredTypeNames(), false);
+ AutoCompletion.enable(type, false, true);
+ type.getRenderer();
+
+ overrideAttributeTable = new CayenneTable();
+
saveButton.setEnabled(false);
cancelButton.setEnabled(true);
selectPathButton.setEnabled(false);
@@ -75,12 +106,14 @@
setLayout(new BorderLayout());
CellConstraints cc = new CellConstraints();
- PanelBuilder builder = new PanelBuilder(
+ final PanelBuilder builder = new PanelBuilder(
new FormLayout(
- "right:max(50dlu;pref), 3dlu, fill:min(150dlu;pref), 3dlu, 300dlu, 3dlu, fill:min(120dlu;pref)",
- "p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, top:14dlu, 3dlu, top:p:grow"));
+ "right:max(50dlu;pref), 3dlu, fill:min(200dlu;pref), 15dlu, right:max(30dlu;pref), 3dlu, 185dlu, "
+ + "3dlu, 20dlu, 3dlu, fill:min(70dlu;pref)",
+ "p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 6dlu, p, 6dlu, p, 3dlu, fill:p:grow"));
builder.setDefaultDialogBorder();
- builder.addSeparator("ObjAttribute Information", cc.xywh(1, 1, 5, 1));
+ builder.addSeparator("ObjAttribute Information", cc.xywh(1, 1, 11, 1));
+
builder.addLabel("Attribute:", cc.xy(1, 3));
builder.add(attributeName, cc.xywh(3, 3, 1, 1));
@@ -93,29 +126,111 @@
builder.addLabel("Target:", cc.xy(1, 9));
builder.add(targCombo, cc.xywh(3, 9, 1, 1));
- builder.addSeparator("Mapping to DbRelationships", cc.xywh(1, 11, 5, 1));
+ builder.addLabel("Type:", cc.xy(1, 11));
+ builder.add(type, cc.xywh(3, 11, 1, 1));
+
+ builder.addSeparator("Mapping to Attributes", cc.xywh(1, 13, 10, 1));
+
+ typeManagerPane = new JPanel();
+ typeManagerPane.setLayout(new CardLayout());
+
+ final FormLayout fL = new FormLayout(
+ "483dlu ",
+ "p, 3dlu, fill:min(128dlu;pref):grow");
+
+ // panel for Flattened attribute
+ final PanelBuilder builderPathPane = new PanelBuilder(fL);
JPanel buttonsPane = new JPanel(new FlowLayout(FlowLayout.LEADING));
buttonsPane.add(selectPathButton);
- builder.add(buttonsPane, cc.xywh(1, 13, 5, 1));
+ builderPathPane.add(buttonsPane, cc.xywh(1, 1, 1, 1));
pathBrowser = new ObjAttributePathBrowser(selectPathButton, saveButton);
pathBrowser.setPreferredColumnSize(BROWSER_CELL_DIM);
pathBrowser.setDefaultRenderer();
- builder.add(new JScrollPane(
+ builderPathPane.add(new JScrollPane(
pathBrowser,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
- JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED), cc.xywh(1, 15, 5, 3));
+ JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED), cc.xywh(1, 3, 1, 1));
+
+ // panel for embeddable attribute
+ final FormLayout fLEmb = new FormLayout(
+ "483dlu ",
+ "fill:min(140dlu;pref):grow");
+
+ final PanelBuilder embeddablePane = new PanelBuilder(fLEmb);
+
+ embeddablePane.add(new JScrollPane(overrideAttributeTable,
+ JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
+ JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED),
+ cc.xywh(1, 1, 1, 1));
+
+ typeManagerPane.add(builderPathPane.getPanel(), FLATTENED_PANEL);
+ typeManagerPane.add(embeddablePane.getPanel(), EMBEDDABLE_PANEL);
+
+ builder.add(typeManagerPane, cc.xywh(1, 15, 11, 1));
add(builder.getPanel(), BorderLayout.CENTER);
+
+ this.addComponentListener(new ComponentListener() {
+
+ int height;
+
+ public void componentHidden(ComponentEvent e) {
+ }
+
+ public void componentMoved(ComponentEvent e) {
+ }
+
+ public void componentResized(ComponentEvent e) {
+ int delta = e.getComponent().getHeight() - height;
+ if (delta < 0) {
+ fL.setRowSpec(3, new RowSpec("fill:min(10dlu;pref):grow"));
+ fLEmb.setRowSpec(1, new RowSpec("fill:min(10dlu;pref):grow"));
+ }
+ }
+
+ public void componentShown(ComponentEvent e) {
+ height = e.getComponent().getHeight();
+ }
+ });
+
add(PanelFactory.createButtonPanel(new JButton[] {
saveButton, cancelButton
}), BorderLayout.SOUTH);
+
+ type.addActionListener(new ActionListener() {
+
+ public void actionPerformed(ActionEvent e) {
+ boolean isType = false;
+ String[] typeNames = ModelerUtil.getRegisteredTypeNames();
+ for (int i = 0; i < typeNames.length; i++) {
+ if (type.getSelectedItem() == null || typeNames[i].equals(type.getSelectedItem().toString())) {
+ isType = true;
+ }
+ }
+
+ if (isType) {
+ ((CardLayout) typeManagerPane.getLayout()).show(typeManagerPane, FLATTENED_PANEL);
+ }
+ else {
+ ((CardLayout) typeManagerPane.getLayout()).show(typeManagerPane, EMBEDDABLE_PANEL);
+ getCurrentPathLabel().setText("");
+
+ }
+ }
+
+ });
+ }
+
+ public CayenneTable getOverrideAttributeTable() {
+ return overrideAttributeTable;
+ }
+
+ public JComboBox getType() {
+ return type;
}
-
-
-
public JComboBox getTargCombo() {
return targCombo;
}
Added: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/OverrideEmbeddableAttributeTableModel.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/OverrideEmbeddableAttributeTableModel.java?rev=823096&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/OverrideEmbeddableAttributeTableModel.java (added)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/OverrideEmbeddableAttributeTableModel.java Thu Oct 8 09:04:49 2009
@@ -0,0 +1,286 @@
+/*****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ****************************************************************/
+package org.apache.cayenne.modeler.dialog.objentity;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.DefaultCellEditor;
+import javax.swing.DefaultListCellRenderer;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.ListCellRenderer;
+
+import org.apache.cayenne.dba.TypesMapping;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.EmbeddableAttribute;
+import org.apache.cayenne.map.EmbeddedAttribute;
+import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.util.CayenneTable;
+import org.apache.cayenne.modeler.util.CayenneTableModel;
+import org.apache.cayenne.modeler.util.CayenneWidgetFactory;
+import org.apache.cayenne.modeler.util.CellEditorForAttributeTable;
+
+public class OverrideEmbeddableAttributeTableModel extends CayenneTableModel {
+
+ private Map<String, String> overrideAttr;
+ private ObjAttribute attr;
+ private boolean isAttributeOverrideChange;
+
+ private CellEditorForAttributeTable cellEditor;
+ Collection<String> nameAttr;
+ private CayenneTable table;
+
+ protected List<EmbeddableAttribute> embeddableList;
+
+ public List<EmbeddableAttribute> getEmbeddableList() {
+ return embeddableList;
+ }
+
+ public OverrideEmbeddableAttributeTableModel(ProjectController mediator,
+ Object eventSource, Collection<EmbeddableAttribute> embAttr, ObjAttribute attr) {
+
+ super(mediator, eventSource, new ArrayList<Object>(embAttr));
+ this.embeddableList = new ArrayList<EmbeddableAttribute>(embAttr);
+ this.attr = attr;
+ this.isAttributeOverrideChange = false;
+ if (attr instanceof EmbeddedAttribute) {
+ EmbeddedAttribute embeddedAttribute = (EmbeddedAttribute) attr;
+ this.overrideAttr = embeddedAttribute.getAttributeOverrides();
+ }
+ else {
+ this.overrideAttr = null;
+ }
+
+ Iterator<EmbeddableAttribute> it = embeddableList.iterator();
+
+ while (it.hasNext()) {
+ EmbeddableAttribute emb = it.next();
+ if (overrideAttr != null) {
+ if (overrideAttr.get(emb.getName()) != null) {
+ emb.setDbAttributeName(overrideAttr.get(emb.getName()));
+ }
+ }
+ }
+ }
+
+ public Map<String, String> getOverrideAttr() {
+ return overrideAttr;
+ }
+
+ // Columns
+ static final int OBJ_ATTRIBUTE = 0;
+ static final int OBJ_ATTRIBUTE_TYPE = 1;
+ static final int DB_ATTRIBUTE = 2;
+ static final int DB_ATTRIBUTE_TYPE = 3;
+
+ protected void orderList() {
+ // NOOP
+ }
+
+ /**
+ * Returns ObjAttribute class.
+ */
+ @Override
+ public Class<?> getElementsClass() {
+ return ObjAttribute.class;
+ }
+
+ @Override
+ public void setUpdatedValueAt(Object value, int row, int col) {
+
+ EmbeddableAttribute attribute = getEmbeddableAttribute(row);
+
+ if (col == DB_ATTRIBUTE) {
+
+ attribute.setDbAttributeName(value != null ? value.toString() : null);
+ fireTableCellUpdated(row, col);
+ this.isAttributeOverrideChange = true;
+ ((ObjAttributeInfoDialogView) ((ObjAttributeInfoDialog) eventSource)
+ .getView()).getSaveButton().setEnabled(true);
+
+ if (value != null) {
+ DbEntity currentEnt = ((ObjEntity) attr.getEntity()).getDbEntity();
+ if (currentEnt != null) {
+ DbAttribute dbAttr = (DbAttribute) currentEnt.getAttribute(value
+ .toString());
+ if (dbAttr != null) {
+ fireTableCellUpdated(DB_ATTRIBUTE_TYPE, col);
+ }
+ }
+ }
+ fireTableRowsUpdated(row, row);
+ }
+ }
+
+ public boolean isAttributeOverrideChange() {
+ return isAttributeOverrideChange;
+ }
+
+ public CellEditorForAttributeTable setCellEditor(
+ Collection<String> nameAttr,
+ CayenneTable table) {
+ this.table = table;
+ this.cellEditor = new CellEditorForAttributeTable(table, CayenneWidgetFactory
+ .createComboBox(nameAttr, true));
+ return cellEditor;
+ }
+
+ public CellEditorForAttributeTable getCellEditor() {
+ return cellEditor;
+ }
+
+ public boolean isCellEditable(int row, int col) {
+ return col == DB_ATTRIBUTE;
+ }
+
+ public EmbeddableAttribute getEmbeddableAttribute(int row) {
+ return (row >= 0 && row < embeddableList.size())
+ ? (EmbeddableAttribute) embeddableList.get(row)
+ : null;
+ }
+
+ public int getColumnCount() {
+ return 4;
+ }
+
+ public Object getValueAt(int row, int column) {
+ EmbeddableAttribute attribute = getEmbeddableAttribute(row);
+
+ if (column == OBJ_ATTRIBUTE) {
+ return attribute.getName();
+ }
+ else if (column == OBJ_ATTRIBUTE_TYPE) {
+ return attribute.getType();
+ }
+ else {
+ String dbAttributeName = attribute.getDbAttributeName();
+ if (column == DB_ATTRIBUTE) {
+ return dbAttributeName;
+ }
+ else if (column == DB_ATTRIBUTE_TYPE) {
+
+ DbEntity currentEnt = ((ObjEntity) attr.getEntity()).getDbEntity();
+ if (currentEnt != null
+ && currentEnt.getAttributes() != null
+ && dbAttributeName != null) {
+ DbAttribute dbAttr = (DbAttribute) currentEnt
+ .getAttribute(dbAttributeName);
+ if (dbAttr != null) {
+ return TypesMapping.getSqlNameByType(dbAttr.getType());
+ }
+ }
+ return null;
+ }
+ else {
+ return null;
+ }
+ }
+ }
+
+ public String getColumnName(int column) {
+ switch (column) {
+ case OBJ_ATTRIBUTE:
+ return "ObjAttribute";
+ case OBJ_ATTRIBUTE_TYPE:
+ return "Java Type";
+ case DB_ATTRIBUTE:
+ return "DbAttribute";
+ case DB_ATTRIBUTE_TYPE:
+ return "DB Type";
+ default:
+ return "";
+ }
+ }
+
+ public void setComboBoxes(Collection<String> nameAttr, int column) {
+
+ int count = getRowCount();
+ for (int i = 0; i < count; i++) {
+ EmbeddableAttribute embAt = getEmbeddableAttribute(i);
+ if (!nameAttr.contains(embAt.getDbAttributeName())
+ && embAt.getDbAttributeName() != null) {
+ Collection<String> attributeComboForRow = new ArrayList<String>();
+ attributeComboForRow.addAll(nameAttr);
+ attributeComboForRow.add(embAt.getDbAttributeName());
+ JComboBox comboBoxForRow = CayenneWidgetFactory.createComboBox(
+ attributeComboForRow,
+ true);
+
+ cellEditor.setEditorAt(new Integer(i), new DefaultCellEditor(
+ comboBoxForRow));
+ BoxCellRenderer renderer = new BoxCellRenderer();
+ renderer.setNotActiveColumn(attributeComboForRow.size() - 1);
+ comboBoxForRow.setRenderer(renderer);
+
+ }
+ }
+
+ table.getColumnModel().getColumn(column).setCellEditor(cellEditor);
+ }
+
+ public ObjAttribute getAttribute() {
+ return attr;
+ }
+
+}
+
+class BoxCellRenderer implements ListCellRenderer {
+
+ protected DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();
+ private int notActiveColumn;
+
+ public Component getListCellRendererComponent(
+ JList list,
+ Object value,
+ int index,
+ boolean isSelected,
+ boolean cellHasFocus) {
+
+ JLabel renderer = (JLabel) defaultRenderer.getListCellRendererComponent(
+ list,
+ value,
+ index,
+ isSelected,
+ cellHasFocus);
+
+ if (getNotActiveColumn() != 0 && index == getNotActiveColumn()) {
+ renderer.setForeground(Color.GRAY);
+ }
+
+ return renderer;
+ }
+
+ public int getNotActiveColumn() {
+ return notActiveColumn;
+ }
+
+ public void setNotActiveColumn(int notActiveColumn) {
+ this.notActiveColumn = notActiveColumn;
+ }
+}
Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EditorView.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EditorView.java?rev=823096&r1=823095&r2=823096&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EditorView.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EditorView.java Thu Oct 8 09:04:49 2009
@@ -86,19 +86,24 @@
protected Container detailPanel;
protected CardLayout detailLayout;
private ProjectTreeView treePanel;
+
+ private DbEntityTabbedView dbDetailView;
+ private ObjEntityTabbedView objDetailView;
+ private EmbeddableTabbedView embeddableView;
+
public ProjectTreeView getProjectTreeView() {
return treePanel;
}
- private DbEntityTabbedView dbDetailView;
-
+ public EmbeddableTabbedView getEmbeddableView() {
+ return embeddableView;
+ }
+
public DbEntityTabbedView getDbDetailView() {
return dbDetailView;
}
- private ObjEntityTabbedView objDetailView;
-
public ObjEntityTabbedView getObjDetailView() {
return objDetailView;
}
@@ -153,7 +158,7 @@
Component ejbqlQueryView = new EjbqlTabbedView(eventController);
detailPanel.add(ejbqlQueryView, EJBQL_QUERY_VIEW);
- Component embeddableView = new EmbeddableTabbedView(eventController);
+ embeddableView = new EmbeddableTabbedView(eventController);
detailPanel.add(new JScrollPane(embeddableView), EMBEDDABLE_VIEW);
objDetailView = new ObjEntityTabbedView(eventController);
Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableAttributeTab.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableAttributeTab.java?rev=823096&r1=823095&r2=823096&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableAttributeTab.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableAttributeTab.java Thu Oct 8 09:04:49 2009
@@ -19,8 +19,6 @@
package org.apache.cayenne.modeler.editor;
import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Component;
import java.util.EventObject;
import java.util.List;
@@ -28,12 +26,10 @@
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
-import javax.swing.JTable;
import javax.swing.JToolBar;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
-import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;
import org.apache.cayenne.map.DataMap;
@@ -95,7 +91,6 @@
add(toolBar, BorderLayout.NORTH);
table = new CayenneTable();
- table.setDefaultRenderer(String.class, new CellRenderer());
/**
* Create and install a popup
@@ -261,51 +256,4 @@
public void embeddableRemoved(EmbeddableEvent e, DataMap map) {
}
-
- // custom renderer used for inherited attributes highlighting
- final class CellRenderer extends DefaultTableCellRenderer {
-
- @Override
- public Component getTableCellRendererComponent(
- JTable table,
- Object value,
- boolean isSelected,
- boolean hasFocus,
- int row,
- int column) {
-
- super.getTableCellRendererComponent(
- table,
- value,
- isSelected,
- hasFocus,
- row,
- column);
-
- EmbeddableAttributeTableModel model = (EmbeddableAttributeTableModel) table
- .getModel();
- EmbeddableAttribute attribute = model.getEmbeddableAttribute(row);
- if (column != EmbeddableAttributeTableModel.INHERITED) {
-
- if (!model.isCellEditable(row, column)) {
- setForeground(Color.GRAY);
- }
- else {
- setForeground(isSelected && !hasFocus ? table
- .getSelectionForeground() : table.getForeground());
- }
-
- setIcon(null);
- }
- else {
- setText("");
- }
- setBackground(isSelected && !hasFocus
- ? table.getSelectionBackground()
- : table.getBackground());
-
- return this;
- }
- }
-
}
Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableAttributeTableModel.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableAttributeTableModel.java?rev=823096&r1=823095&r2=823096&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableAttributeTableModel.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableAttributeTableModel.java Thu Oct 8 09:04:49 2009
@@ -18,20 +18,10 @@
****************************************************************/
package org.apache.cayenne.modeler.editor;
-import java.awt.Component;
-import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
-import java.util.EventObject;
-import java.util.Hashtable;
-
-import javax.swing.DefaultCellEditor;
-import javax.swing.JComboBox;
-import javax.swing.JTable;
-import javax.swing.event.CellEditorListener;
-import javax.swing.table.TableCellEditor;
import org.apache.cayenne.map.Embeddable;
import org.apache.cayenne.map.EmbeddableAttribute;
@@ -40,6 +30,7 @@
import org.apache.cayenne.modeler.util.CayenneTable;
import org.apache.cayenne.modeler.util.CayenneTableModel;
import org.apache.cayenne.modeler.util.CayenneWidgetFactory;
+import org.apache.cayenne.modeler.util.CellEditorForAttributeTable;
import org.apache.cayenne.modeler.util.ProjectUtil;
import org.apache.cayenne.util.Util;
@@ -53,9 +44,7 @@
static final int OBJ_ATTRIBUTE_TYPE = 2;
static final int DB_ATTRIBUTE = 3;
- private CellEditor cellEditor;
-
- private CayenneTable table;
+ private CellEditorForAttributeTable cellEditor;
public EmbeddableAttributeTableModel(Embeddable embeddable,
ProjectController mediator, Object eventSource) {
@@ -143,15 +132,14 @@
}
}
- public CellEditor setCellEditor(Collection<String> nameAttr, CayenneTable table) {
- this.cellEditor = new CellEditor(table, CayenneWidgetFactory.createComboBox(
+ public CellEditorForAttributeTable setCellEditor(Collection<String> nameAttr, CayenneTable table) {
+ this.cellEditor = new CellEditorForAttributeTable(table, CayenneWidgetFactory.createComboBox(
nameAttr,
true));
- this.table = table;
return cellEditor;
}
- public CellEditor getCellEditor() {
+ public CellEditorForAttributeTable getCellEditor() {
return cellEditor;
}
@@ -175,85 +163,4 @@
return a.getEmbeddable() == embeddable ? 1 : -1;
}
}
-
- final class CellEditor implements TableCellEditor {
-
- protected Hashtable editors;
- protected TableCellEditor editor, defaultEditor;
- JTable table;
-
- public CellEditor(JTable table, JComboBox combo) {
- this.table = table;
- editors = new Hashtable();
- if (combo != null) {
- defaultEditor = new DefaultCellEditor(combo);
- }
- else {
- defaultEditor = new DefaultCellEditor(new JComboBox());
- }
- }
-
- public void setEditorAt(int row, TableCellEditor editor) {
- editors.put(new Integer(row), editor);
- }
-
- public Component getTableCellEditorComponent(
- JTable table,
- Object value,
- boolean isSelected,
- int row,
- int column) {
-
- return editor.getTableCellEditorComponent(
- table,
- value,
- isSelected,
- row,
- column);
- }
-
- public Object getCellEditorValue() {
- return editor.getCellEditorValue();
- }
-
- public boolean stopCellEditing() {
- return editor.stopCellEditing();
- }
-
- public void cancelCellEditing() {
- editor.cancelCellEditing();
- }
-
- public boolean isCellEditable(EventObject anEvent) {
- selectEditor((MouseEvent) anEvent);
- return editor.isCellEditable(anEvent);
- }
-
- public void addCellEditorListener(CellEditorListener l) {
- editor.addCellEditorListener(l);
- }
-
- public void removeCellEditorListener(CellEditorListener l) {
- editor.removeCellEditorListener(l);
- }
-
- public boolean shouldSelectCell(EventObject anEvent) {
- selectEditor((MouseEvent) anEvent);
- return editor.shouldSelectCell(anEvent);
- }
-
- protected void selectEditor(MouseEvent e) {
- int row;
- if (e == null) {
- row = table.getSelectionModel().getAnchorSelectionIndex();
- }
- else {
- row = table.rowAtPoint(e.getPoint());
- }
- editor = (TableCellEditor) editors.get(new Integer(row));
- if (editor == null) {
- editor = defaultEditor;
- }
- }
- }
}
Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableTab.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableTab.java?rev=823096&r1=823095&r2=823096&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableTab.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableTab.java Thu Oct 8 09:04:49 2009
@@ -34,6 +34,7 @@
import org.apache.cayenne.modeler.event.EmbeddableDisplayListener;
import org.apache.cayenne.modeler.util.TextAdapter;
import org.apache.cayenne.util.Util;
+import org.apache.cayenne.validation.ValidationException;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;
@@ -102,12 +103,23 @@
if (Util.nullSafeEquals(newClassName, embeddable.getClassName())) {
return;
}
-
- // completely new name, set new name for entity
- EmbeddableEvent e = new EmbeddableEvent(this, embeddable, embeddable.getClassName());
- embeddable.setClassName(newClassName);
- mediator.fireEmbeddableEvent(e, mediator.getCurrentDataMap());
+ if(newClassName == null){
+ throw new ValidationException("Entity name is required.");
+ } else if (embeddable.getDataMap().getEmbeddable(newClassName) == null) {
+ // completely new name, set new name for embeddable
+ EmbeddableEvent e = new EmbeddableEvent(this, embeddable, embeddable.getClassName());
+ embeddable.setClassName(newClassName);
+
+ mediator.fireEmbeddableEvent(e, mediator.getCurrentDataMap());
+ } else {
+ // there is an embeddable with the same name
+ throw new ValidationException("There is another embeddable with name '"
+ + newClassName
+ + "'.");
+ }
+
+
}
public void currentEmbeddableChanged(EmbeddableDisplayEvent e) {