You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by mg...@apache.org on 2017/01/05 22:09:32 UTC

[24/50] cayenne-modeler git commit: Initial crude shimming of Object Entity relationships tab.

Initial crude shimming of Object Entity relationships tab.


Project: http://git-wip-us.apache.org/repos/asf/cayenne-modeler/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne-modeler/commit/04b54a71
Tree: http://git-wip-us.apache.org/repos/asf/cayenne-modeler/tree/04b54a71
Diff: http://git-wip-us.apache.org/repos/asf/cayenne-modeler/diff/04b54a71

Branch: refs/heads/master
Commit: 04b54a719f7c9e46438d13ac99cbb286d4a4a627
Parents: 3514a99
Author: mrg <bl...@gmail.com>
Authored: Sun Oct 2 11:39:47 2016 -0400
Committer: mrg <bl...@gmail.com>
Committed: Sun Oct 2 11:39:47 2016 -0400

----------------------------------------------------------------------
 .../layout/ObjectEntityAttributesTabLayout.java |  26 --
 .../modeler/layout/ObjectEntityLayout.java      |  29 +--
 .../ObjectEntityRelationshipsTabLayout.java     | 261 +++++++++++++++++++
 .../ObjectEntityAttributesTabLayout.fxml        |   2 +-
 .../resources/layouts/ObjectEntityLayout.fxml   |   2 +-
 .../ObjectEntityRelationshipsTabLayout.fxml     | 180 +++++++++++++
 6 files changed, 452 insertions(+), 48 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne-modeler/blob/04b54a71/src/main/java/org/apache/cayenne/modeler/layout/ObjectEntityAttributesTabLayout.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/cayenne/modeler/layout/ObjectEntityAttributesTabLayout.java b/src/main/java/org/apache/cayenne/modeler/layout/ObjectEntityAttributesTabLayout.java
index 84b6242..e3d368e 100644
--- a/src/main/java/org/apache/cayenne/modeler/layout/ObjectEntityAttributesTabLayout.java
+++ b/src/main/java/org/apache/cayenne/modeler/layout/ObjectEntityAttributesTabLayout.java
@@ -209,30 +209,6 @@ public class ObjectEntityAttributesTabLayout
 
     }
 
-//    private void loadComponents()
-//    {
-//        try
-//        {
-//            objectEntityClassTabViewController = new ObjectEntityClassTabLayout(this);
-//
-//            loadTab(objectEntityClassTabViewController, classTabAnchorPane);
-//        }
-//        catch (Exception exception)
-//        {
-//            // TODO Auto-generated catch block
-//            exception.printStackTrace();
-//        }
-//    }
-
-//    public void display(final ObjEntity objEntity)
-//    {
-//        LOGGER.debug("trying to display: " + objEntity);
-////        attributesTableView.setItems(FXCollections.observableArrayList(objEntity.getAttributes()));
-//
-////        objectEntityClassTabViewController.display(objEntity);
-////        objEntity.getAttributes()
-//    }
-
     public void tabChanged(final Event event)
     {
         LOGGER.debug("event: " + event);
@@ -245,8 +221,6 @@ public class ObjectEntityAttributesTabLayout
         this.objectEntityAdapter = objectEntityAdapter;
     }
 
-//    private void attributesTableViewSelectionListener(ObservableValue obs, ObjectAttributeAdapter oldSelection, ObjectAttributeAdapter newSelection)
-//    private ChangeListener<? super ObjectAttributeAdapter> attributesTableViewSelectionListener;
     private final ChangeListener<ObjectAttributeAdapter> attributesTableViewSelectionListener = (obs, oldSelection, newSelection) ->
         {
             final String[] javaTypes = ObjectEntityUtilities.getRegisteredTypeNames();

http://git-wip-us.apache.org/repos/asf/cayenne-modeler/blob/04b54a71/src/main/java/org/apache/cayenne/modeler/layout/ObjectEntityLayout.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/cayenne/modeler/layout/ObjectEntityLayout.java b/src/main/java/org/apache/cayenne/modeler/layout/ObjectEntityLayout.java
index e557898..44ce183 100644
--- a/src/main/java/org/apache/cayenne/modeler/layout/ObjectEntityLayout.java
+++ b/src/main/java/org/apache/cayenne/modeler/layout/ObjectEntityLayout.java
@@ -37,12 +37,13 @@ public class ObjectEntityLayout
     private static final Log LOGGER = LogFactory.getLog(ObjectEntityLayout.class);
 
     @FXML
-    private AnchorPane classTabAnchorPane, attributesTabAnchorPane;
+    private AnchorPane classTabAnchorPane, attributesTabAnchorPane, relationshipsTabAnchorPane;
 
 //    private MainWindowLayout mainWindow;
 
     private ObjectEntityClassTabLayout objectEntityClassTabLayout;
     private ObjectEntityAttributesTabLayout objectEntityAttributesTabLayout;
+    private ObjectEntityRelationshipsTabLayout objectEntityRelationshipsTabLayout;
 
     private ObjectEntityAdapter objectEntityAdapter;
 
@@ -56,11 +57,13 @@ public class ObjectEntityLayout
     {
         try
         {
-            objectEntityClassTabLayout      = new ObjectEntityClassTabLayout(this);
-            objectEntityAttributesTabLayout = new ObjectEntityAttributesTabLayout(this);
+            objectEntityClassTabLayout         = new ObjectEntityClassTabLayout(this);
+            objectEntityAttributesTabLayout    = new ObjectEntityAttributesTabLayout(this);
+            objectEntityRelationshipsTabLayout = new ObjectEntityRelationshipsTabLayout(this);
 
             loadTab(objectEntityClassTabLayout, classTabAnchorPane);
             loadTab(objectEntityAttributesTabLayout, attributesTabAnchorPane);
+            loadTab(objectEntityRelationshipsTabLayout, relationshipsTabAnchorPane);
         }
         catch (final Exception exception)
         {
@@ -69,27 +72,10 @@ public class ObjectEntityLayout
         }
     }
 
-//    @Override
-//    private void loadTab(AnchorPane source, AnchorPane destination)
-//    {
-//        destination.getChildren().removeAll(destination.getChildren());
-//
-//        // Make the detail view fill the pane.
-//        AnchorPane.setTopAnchor(source, 0.0);
-//        AnchorPane.setLeftAnchor(source, 0.0);
-//        AnchorPane.setRightAnchor(source, 0.0);
-//        AnchorPane.setBottomAnchor(source, 0.0);
-//
-//        destination.getChildren().add(source);
-//    }
-
     @Deprecated // Unused?
     public void display(final ObjEntity objEntity)
     {
         LOGGER.debug("trying to display: " + objEntity);
-//        objectEntityClassTabLayout.display(objEntity);
-//        objectEntityAttributesTabLayout.display(objEntity);
-//        objEntity.getAttributes()
     }
 
 //    public void tabChanged(ActionEvent event)
@@ -106,6 +92,7 @@ public class ObjectEntityLayout
 
         objectEntityClassTabLayout.setPropertyAdapter(objectEntityAdapter);
         objectEntityAttributesTabLayout.setPropertyAdapter(objectEntityAdapter);
+        objectEntityRelationshipsTabLayout.setPropertyAdapter(objectEntityAdapter);
     }
 
     @Override
@@ -115,6 +102,7 @@ public class ObjectEntityLayout
 
         objectEntityClassTabLayout.beginEditing();
         objectEntityAttributesTabLayout.beginEditing();
+        objectEntityRelationshipsTabLayout.beginEditing();
     }
 
     @Override
@@ -124,5 +112,6 @@ public class ObjectEntityLayout
 
         objectEntityClassTabLayout.endEditing();
         objectEntityAttributesTabLayout.endEditing();
+        objectEntityRelationshipsTabLayout.endEditing();
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne-modeler/blob/04b54a71/src/main/java/org/apache/cayenne/modeler/layout/ObjectEntityRelationshipsTabLayout.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/cayenne/modeler/layout/ObjectEntityRelationshipsTabLayout.java b/src/main/java/org/apache/cayenne/modeler/layout/ObjectEntityRelationshipsTabLayout.java
new file mode 100644
index 0000000..96ef74a
--- /dev/null
+++ b/src/main/java/org/apache/cayenne/modeler/layout/ObjectEntityRelationshipsTabLayout.java
@@ -0,0 +1,261 @@
+/*****************************************************************
+ *   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.layout;
+
+import java.io.IOException;
+
+import org.apache.cayenne.modeler.adapters.ObjectAttributeAdapter;
+import org.apache.cayenne.modeler.adapters.ObjectEntityAdapter;
+import org.apache.cayenne.modeler.utility.ObjectEntityUtilities;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import de.jensd.fx.glyphs.GlyphsDude;
+import de.jensd.fx.glyphs.fontawesome.FontAwesomeIcon;
+import javafx.beans.value.ChangeListener;
+import javafx.event.Event;
+import javafx.fxml.FXML;
+import javafx.geometry.Pos;
+import javafx.scene.control.Button;
+import javafx.scene.control.CheckBox;
+import javafx.scene.control.ComboBox;
+import javafx.scene.control.Label;
+import javafx.scene.control.TableCell;
+import javafx.scene.control.TableColumn;
+import javafx.scene.control.TableView;
+import javafx.scene.control.TextField;
+import javafx.scene.control.cell.PropertyValueFactory;
+
+public class ObjectEntityRelationshipsTabLayout
+    extends AbstractViewLayout
+    implements DetailEditorSupport<ObjectEntityAdapter>
+{
+    private static final Log LOGGER = LogFactory.getLog(ObjectEntityRelationshipsTabLayout.class);
+
+    @FXML
+    private Button newRelationshipButton;
+
+    @FXML
+    private Button synchronizeWithDatabaseEntityButton, viewRelatedDatabaseEntityButton;
+
+    @FXML
+    private Button deleteButton;
+
+    @FXML
+    private Button cutButton, copyButton, pasteButton;
+
+    @FXML
+    private TextField javaAttributeNameTextField;
+
+    @FXML
+    private ComboBox<String> javaTypeComboBox;
+
+    @FXML
+    private CheckBox optimisticLockingCheckBox;
+
+    @FXML
+    private TableView<ObjectAttributeAdapter> relationshipsTableView;
+
+    @FXML
+    private TableColumn<ObjectAttributeAdapter,String> relationshipNameColumn;
+
+    @FXML
+    private TableColumn<ObjectAttributeAdapter,String> relationshipTargetColumn;
+//    private TableColumn<ObjAttribute,ComboBox<String>> attributeTypeColumn;
+
+    @FXML
+    private TableColumn<ObjectAttributeAdapter,String> attributeDatabasePathColumn;
+
+    @FXML
+    private TableColumn<ObjectAttributeAdapter,String> attributeDatabaseTypeColumn;
+
+    @FXML
+    private TableColumn<ObjectAttributeAdapter,Boolean> attributeUsedForLockingColumn;
+
+    @FXML
+    private TableColumn<ObjectAttributeAdapter,Boolean> attributeIsInheritedColumn;
+
+    @FXML
+    private Label databaseTypeLabel;
+
+//    private MainWindowSupport parent;
+
+    private ObjectEntityClassTabLayout objectEntityClassTabViewController;
+
+    private ObjectEntityAdapter objectEntityAdapter;
+
+    public ObjectEntityRelationshipsTabLayout(final MainWindowSupport parentComponent) throws IOException
+    {
+        super(parentComponent, "/layouts/ObjectEntityRelationshipsTabLayout.fxml");
+    }
+
+//    private static ObservableList javaTypes = FXCollections.observableArrayList(ObjectEntityUtilities.getRegisteredTypeNames());
+
+//    @FXML
+//    private Button newAttributeButton;
+//
+//    @FXML
+//    private Button synchronizeWithDatabaseEntityButton, viewRelatedDatabaseEntityButton;
+//
+//    @FXML
+//    private Button deleteButton;
+//
+//    @FXML
+//    private Button cutButton, copyButton, pasteButton;
+
+    @Override
+    public void initializeLayout()
+    {
+        super.initializeLayout();
+
+        newRelationshipButton.setGraphic(GlyphsDude.createIcon(FontAwesomeIcon.PLUS, "16px"));
+        newRelationshipButton.setText(null);
+
+        synchronizeWithDatabaseEntityButton.setGraphic(GlyphsDude.createIcon(FontAwesomeIcon.REFRESH, "16px"));
+        synchronizeWithDatabaseEntityButton.setText(null);
+
+        viewRelatedDatabaseEntityButton.setGraphic(GlyphsDude.createIcon(FontAwesomeIcon.TABLE, "16px"));
+        viewRelatedDatabaseEntityButton.setText(null);
+
+        deleteButton.setGraphic(GlyphsDude.createIcon(FontAwesomeIcon.TRASH, "16px"));
+        deleteButton.setText(null);
+
+        cutButton.setGraphic(GlyphsDude.createIcon(FontAwesomeIcon.CUT, "16px"));
+        cutButton.setText(null);
+
+        copyButton.setGraphic(GlyphsDude.createIcon(FontAwesomeIcon.COPY, "16px"));
+        copyButton.setText(null);
+
+        pasteButton.setGraphic(GlyphsDude.createIcon(FontAwesomeIcon.PASTE, "16px"));
+        pasteButton.setText(null);
+
+        attributeUsedForLockingColumn.setText(null);
+        attributeIsInheritedColumn.setText(null);
+
+        attributeUsedForLockingColumn.setGraphic(GlyphsDude.createIcon(FontAwesomeIcon.LOCK, "16px"));
+        attributeIsInheritedColumn.setGraphic(GlyphsDude.createIcon(FontAwesomeIcon.LEVEL_UP, "16px"));
+
+        relationshipNameColumn.setCellValueFactory(cellData -> cellData.getValue().nameProperty());
+        relationshipTargetColumn.setCellValueFactory(cellData -> cellData.getValue().javaTypeProperty());
+        attributeDatabasePathColumn.setCellValueFactory(cellData -> cellData.getValue().databaseAttributePathProperty());
+        // FIXME: See if there is a way of doing this without using the string "databaseType"...
+        attributeDatabaseTypeColumn.setCellValueFactory(new PropertyValueFactory<ObjectAttributeAdapter,String>("databaseType"));
+
+        attributeUsedForLockingColumn.setCellValueFactory(cellData -> cellData.getValue().usedForLockingProperty());
+        attributeUsedForLockingColumn.setCellFactory((column) ->
+            {
+                return new TableCell<ObjectAttributeAdapter,Boolean>()
+                    {
+                        @Override
+                        protected void updateItem(final Boolean item, final boolean empty)
+                        {
+                            super.updateItem(item, empty);
+
+                            setAlignment(Pos.CENTER);
+                            setStyle("-fx-padding: 0;");
+                            setText("");
+
+                            if (item == null || empty || item == false)
+                                setGraphic(null);
+                            else
+                                setGraphic(GlyphsDude.createIcon(FontAwesomeIcon.LOCK, "16px"));
+                        }
+                     };
+            });
+    }
+
+    public void tabChanged(final Event event)
+    {
+        LOGGER.debug("event: " + event);
+        getMainWindow().getCayenneProject().getDataMaps();
+    }
+
+    @Override
+    public void setPropertyAdapter(final ObjectEntityAdapter objectEntityAdapter)
+    {
+        this.objectEntityAdapter = objectEntityAdapter;
+    }
+
+    private final ChangeListener<ObjectAttributeAdapter> attributesTableViewSelectionListener = (obs, oldSelection, newSelection) ->
+        {
+            final String[] javaTypes = ObjectEntityUtilities.getRegisteredTypeNames();
+
+            if (oldSelection != null)
+            {
+                javaAttributeNameTextField.textProperty().unbindBidirectional(oldSelection.nameProperty());
+                javaTypeComboBox.valueProperty().unbindBidirectional(oldSelection.javaTypeProperty());
+                optimisticLockingCheckBox.selectedProperty().unbindBidirectional(oldSelection.usedForLockingProperty());
+            }
+
+            javaTypeComboBox.getItems().clear();
+
+            if (newSelection != null)
+            {
+                javaTypeComboBox.getItems().addAll(javaTypes);
+
+                javaAttributeNameTextField.textProperty().bindBidirectional(newSelection.nameProperty());
+                javaTypeComboBox.valueProperty().bindBidirectional(newSelection.javaTypeProperty());
+                optimisticLockingCheckBox.selectedProperty().bindBidirectional(newSelection.usedForLockingProperty());
+                databaseTypeLabel.setText(newSelection.getDatabaseType());
+            }
+
+            javaAttributeNameTextField.setDisable(newSelection == null);
+            javaTypeComboBox.setDisable(newSelection == null);
+            optimisticLockingCheckBox.setDisable(newSelection == null);
+        };
+
+    @Override
+    public void beginEditing()
+    {
+        disable(javaAttributeNameTextField);
+        javaAttributeNameTextField.setText(null);
+
+        disable(javaTypeComboBox);
+        javaTypeComboBox.getItems().clear();
+        javaTypeComboBox.setValue(null);
+
+        disable(optimisticLockingCheckBox);
+        optimisticLockingCheckBox.setSelected(false);
+
+        databaseTypeLabel.setText("N/A");
+
+        relationshipsTableView.setItems(objectEntityAdapter.getAttributes());
+        relationshipsTableView.getSelectionModel().selectedItemProperty().addListener(attributesTableViewSelectionListener);
+
+        // Automatically select the first item, if available.
+        if (relationshipsTableView.getItems().size() > 0)
+            relationshipsTableView.getSelectionModel().select(0);
+    }
+
+    @Override
+    public void endEditing()
+    {
+        final ObjectAttributeAdapter currentObjectAttributeAdapter = relationshipsTableView.getSelectionModel().getSelectedItem();
+
+        if (currentObjectAttributeAdapter != null)
+        {
+            javaAttributeNameTextField.textProperty().unbindBidirectional(currentObjectAttributeAdapter.nameProperty());
+            javaTypeComboBox.valueProperty().unbindBidirectional(currentObjectAttributeAdapter.javaTypeProperty());
+            optimisticLockingCheckBox.selectedProperty().unbindBidirectional(currentObjectAttributeAdapter.usedForLockingProperty());
+        }
+
+        relationshipsTableView.getSelectionModel().selectedItemProperty().removeListener(attributesTableViewSelectionListener);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne-modeler/blob/04b54a71/src/main/resources/layouts/ObjectEntityAttributesTabLayout.fxml
----------------------------------------------------------------------
diff --git a/src/main/resources/layouts/ObjectEntityAttributesTabLayout.fxml b/src/main/resources/layouts/ObjectEntityAttributesTabLayout.fxml
index 1771a56..efe5df7 100644
--- a/src/main/resources/layouts/ObjectEntityAttributesTabLayout.fxml
+++ b/src/main/resources/layouts/ObjectEntityAttributesTabLayout.fxml
@@ -74,7 +74,7 @@
             </HBox>
             <TableView fx:id="attributesTableView" VBox.vgrow="ALWAYS">
                <placeholder>
-                  <Label text="No Java attributes have been defined; please add them using the toolbar above." />
+                  <Label text="No Object Entity (Java) attributes have been defined; please add them using the toolbar above." />
                </placeholder>
                <columns>
                   <TableColumn fx:id="attributeIsInheritedColumn" editable="false" maxWidth="25.0" minWidth="25.0" prefWidth="25.0" resizable="false" sortable="false" text="I" />

http://git-wip-us.apache.org/repos/asf/cayenne-modeler/blob/04b54a71/src/main/resources/layouts/ObjectEntityLayout.fxml
----------------------------------------------------------------------
diff --git a/src/main/resources/layouts/ObjectEntityLayout.fxml b/src/main/resources/layouts/ObjectEntityLayout.fxml
index a8a5318..5297fba 100644
--- a/src/main/resources/layouts/ObjectEntityLayout.fxml
+++ b/src/main/resources/layouts/ObjectEntityLayout.fxml
@@ -49,7 +49,7 @@
           </Tab>
             <Tab closable="false" text="Relationships">
               <content>
-                <AnchorPane minHeight="0.0" prefWidth="200.0">
+                <AnchorPane fx:id="relationshipsTabAnchorPane" minHeight="0.0" prefWidth="200.0">
                      <children>
                         <Label alignment="CENTER" text="View is in Separate FXML" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
                      </children>

http://git-wip-us.apache.org/repos/asf/cayenne-modeler/blob/04b54a71/src/main/resources/layouts/ObjectEntityRelationshipsTabLayout.fxml
----------------------------------------------------------------------
diff --git a/src/main/resources/layouts/ObjectEntityRelationshipsTabLayout.fxml b/src/main/resources/layouts/ObjectEntityRelationshipsTabLayout.fxml
new file mode 100644
index 0000000..bf2500d
--- /dev/null
+++ b/src/main/resources/layouts/ObjectEntityRelationshipsTabLayout.fxml
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+        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.
+-->
+
+<?import javafx.geometry.*?>
+<?import javafx.scene.control.*?>
+<?import java.lang.*?>
+<?import javafx.scene.layout.*?>
+
+<fx:root maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="616.0" prefWidth="868.0" type="AnchorPane" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1">
+   <children>
+      <VBox layoutX="10.0" layoutY="10.0" minHeight="400.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
+         <children>
+            <HBox prefWidth="200.0">
+               <children>
+                  <Button fx:id="newRelationshipButton" mnemonicParsing="false" text="New Relationship">
+                     <tooltip>
+                        <Tooltip text="Create a new Object Attribute." />
+                     </tooltip>
+                  </Button>
+                  <Button fx:id="synchronizeWithDatabaseEntityButton" mnemonicParsing="false" text="Sync">
+                     <tooltip>
+                        <Tooltip text="Synchronize this Object Entity with the mapped Database Entity." />
+                     </tooltip>
+                  </Button>
+                  <Button fx:id="viewRelatedDatabaseEntityButton" mnemonicParsing="false" text="Jump">
+                     <tooltip>
+                        <Tooltip text="View related Database Entity." />
+                     </tooltip>
+                  </Button>
+                  <Pane maxWidth="-Infinity" minWidth="-Infinity" prefWidth="16.0" />
+                  <Button fx:id="deleteButton" mnemonicParsing="false" text="Delete">
+                     <tooltip>
+                        <Tooltip text="Delete this Object Attribute." />
+                     </tooltip>
+                  </Button>
+                  <Pane maxWidth="-Infinity" minWidth="-Infinity" prefWidth="16.0" />
+                  <Button fx:id="cutButton" mnemonicParsing="false" text="Cut">
+                     <tooltip>
+                        <Tooltip text="Cut this Object Attribute." />
+                     </tooltip>
+                  </Button>
+                  <Button fx:id="copyButton" mnemonicParsing="false" text="Copy">
+                     <tooltip>
+                        <Tooltip text="Copy this Object Attribute." />
+                     </tooltip>
+                  </Button>
+                  <Button fx:id="pasteButton" mnemonicParsing="false" text="Paste">
+                     <tooltip>
+                        <Tooltip text="Paste previously cut or copied Object Attribute." />
+                     </tooltip>
+                  </Button>
+               </children>
+               <VBox.margin>
+                  <Insets bottom="8.0" left="8.0" right="8.0" top="8.0" />
+               </VBox.margin>
+            </HBox>
+            <TableView fx:id="relationshipsTableView" VBox.vgrow="ALWAYS">
+               <placeholder>
+                  <Label text="No Object Entity (Java) relationships have been defined; please add them using the toolbar above." />
+               </placeholder>
+               <columns>
+                  <TableColumn fx:id="attributeIsInheritedColumn" editable="false" maxWidth="25.0" minWidth="25.0" prefWidth="25.0" resizable="false" sortable="false" text="I" />
+                  <TableColumn fx:id="attributeUsedForLockingColumn" editable="false" maxWidth="25.0" minWidth="25.0" prefWidth="25.0" resizable="false" sortable="false" text="L" />
+                  <TableColumn fx:id="relationshipNameColumn" maxWidth="1.7976931348623157E308" minWidth="-1.0" prefWidth="179.0" text="Relationship Name" />
+                  <TableColumn fx:id="relationshipTargetColumn" maxWidth="1.7976931348623157E308" minWidth="-1.0" prefWidth="182.0" text="Target" />
+                  <TableColumn fx:id="attributeDatabaseTypeColumn" editable="false" maxWidth="1.7976931348623157E308" minWidth="-1.0" prefWidth="116.0" text="Semantics" />
+                  <TableColumn fx:id="attributeDatabasePathColumn" maxWidth="1.7976931348623157E308" minWidth="-1.0" prefWidth="183.0" text="Database Path" />
+                  <TableColumn prefWidth="157.0" text="Database Type" />
+               </columns>
+            </TableView>
+            <GridPane vgap="6.0" VBox.vgrow="NEVER">
+               <columnConstraints>
+                  <ColumnConstraints fillWidth="false" halignment="RIGHT" hgrow="NEVER" />
+                  <ColumnConstraints fillWidth="false" hgrow="NEVER" maxWidth="-Infinity" minWidth="-Infinity" prefWidth="210.0" />
+                  <ColumnConstraints fillWidth="false" halignment="RIGHT" />
+                  <ColumnConstraints fillWidth="false" hgrow="NEVER" maxWidth="-Infinity" minWidth="-Infinity" prefWidth="210.0" />
+                  <ColumnConstraints hgrow="ALWAYS" />
+               </columnConstraints>
+               <rowConstraints>
+                  <RowConstraints vgrow="SOMETIMES" />
+                  <RowConstraints vgrow="SOMETIMES" />
+               </rowConstraints>
+               <children>
+                  <Label text="Relationship Name: " />
+                  <Label text="Database Attribute Path: " GridPane.rowIndex="1" />
+                  <Label text="Java Type: " GridPane.columnIndex="2" />
+                  <Label text="Database Type: " GridPane.columnIndex="2" GridPane.rowIndex="1" />
+                  <TextField fx:id="javaAttributeNameTextField" maxWidth="-Infinity" minWidth="-Infinity" prefWidth="200.0" GridPane.columnIndex="1" />
+                  <Label fx:id="databaseTypeLabel" text="type name here" GridPane.columnIndex="3" GridPane.rowIndex="1" />
+                  <ComboBox fx:id="javaTypeComboBox" editable="true" maxWidth="-Infinity" minWidth="-Infinity" prefWidth="200.0" promptText="Enter or Choose..." GridPane.columnIndex="3" />
+                  <CheckBox fx:id="optimisticLockingCheckBox" mnemonicParsing="false" text="Optimistic Locking" GridPane.columnIndex="4" />
+                  <ComboBox maxWidth="-Infinity" minWidth="-Infinity" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="1" />
+               </children>
+               <padding>
+                  <Insets bottom="8.0" left="8.0" right="8.0" top="8.0" />
+               </padding>
+            </GridPane>
+            <TabPane maxHeight="200.0" minHeight="120.0" tabClosingPolicy="UNAVAILABLE">
+               <tabs>
+                  <Tab text="Getter JavaDoc">
+                     <content>
+                        <AnchorPane>
+                           <children>
+                              <TextArea promptText="Omit comment characters.  Press return to include newlines in output." AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
+                           </children>
+                        </AnchorPane>
+                     </content>
+                  </Tab>
+                  <Tab text="Add-To JavaDoc">
+                     <content>
+                        <AnchorPane>
+                           <children>
+                              <TextArea promptText="Omit comment characters.  Press return to include newlines in output." AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
+                           </children>
+                        </AnchorPane>
+                     </content>
+                  </Tab>
+                  <Tab text="Remove-From JavaDoc">
+                     <content>
+                        <AnchorPane>
+                           <children>
+                              <TextArea promptText="Omit comment characters.  Press return to include newlines in output." AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
+                           </children>
+                        </AnchorPane>
+                     </content>
+                  </Tab>
+                  <Tab text="Attribute Annotations">
+                     <content>
+                        <AnchorPane>
+                           <children>
+                              <TextArea layoutX="320.0" layoutY="-63.0" promptText="Add annotations to be included here.  Press return to include newlines in output.  Be sure to add any required imports under the Class tab." AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
+                           </children>
+                        </AnchorPane>
+                     </content>
+                  </Tab>
+                  <Tab text="Getter Annotations">
+                     <content>
+                        <AnchorPane>
+                           <children>
+                              <TextArea promptText="Add annotations to be included here.  Press return to include newlines in output.  Be sure to add any required imports under the Class tab." AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
+                           </children>
+                        </AnchorPane>
+                     </content>
+                  </Tab>
+                  <Tab text="Setter Annotations">
+                     <content>
+                        <AnchorPane>
+                           <children>
+                              <TextArea promptText="Add annotations to be included here.  Press return to include newlines in output.  Be sure to add any required imports under the Class tab." AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
+                           </children>
+                        </AnchorPane>
+                     </content>
+                  </Tab>
+               </tabs>
+               <padding>
+                  <Insets bottom="8.0" left="8.0" right="8.0" />
+               </padding>
+            </TabPane>
+         </children>
+      </VBox>
+   </children>
+</fx:root>