updated comments and refactored a little
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/editors/JpaXmlEditor.java b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/editors/JpaXmlEditor.java
index 478db28..ab091ee 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/editors/JpaXmlEditor.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.ui/src/org/eclipse/jpt/jpa/ui/internal/editors/JpaXmlEditor.java
@@ -79,19 +79,33 @@
{
/**
- * The IFileEditorInput model
+ * The IFileEditorInput model.
+ * <p>
+ * @see #setInput(IEditorInput)
*/
private final ModifiablePropertyValueModel<IFileEditorInput> editorInputModel = new SimplePropertyValueModel<IFileEditorInput>();
/**
- * The one we listen to
+ * The root structure node model is built from the editorInputModel. We assume
+ * there is only 1 root structure node in the JpaFile. This is true of the
+ * persistence.xml and orm.xml models.
+ * <p>
+ * We listen to changes to this model and swap out the editor pages.
+ * Do not use this model as the subjectModel for the pages,
+ * we need to control that model ourselves.
+ * @see #pageRootStructureNodeModel
*/
private PropertyValueModel<JpaStructureNode> rootStructureNodeModel;
+ /**
+ * Store the root structure node listener so we can remove it on {@link #dispose()}.
+ * Listens to {@link #rootStructureNodeModel} in order to swap out the editor pages.
+ */
private final PropertyChangeListener rootStructureNodeListener = new RootStructureNodeListener();
/**
- * The one to be passed to the Page
+ * This root structure node model is passed to the pages. This gives us control
+ * over when the subject is changed for the pages.
*/
private ModifiablePropertyValueModel<JpaStructureNode> pageRootStructureNodeModel;
@@ -151,9 +165,8 @@
@Override
protected void addPages() {
this.addXMLSourceEditorPage();
- //TODO this.addXMLDesignEditorPage();
- if (this.getRootStructureNode() != null) {
- this.setPageRootStructureNode_(this.getRootStructureNode());
+ if (this.rootStructureNodeModel.getValue() != null) {
+ this.setPageRootStructureNode_(this.rootStructureNodeModel.getValue());
this.setActivePage(0);
}
}
@@ -178,20 +191,21 @@
* @see #getRootStructureNode()
* @see Page
*/
- protected void addSpecificPages() {
- JptResourceType resourceType = this.getRootStructureNode().getResourceType();
+ protected void addSpecificPages(PropertyValueModel<JpaStructureNode> structureNodeModel) {
+ JpaStructureNode rootStructureNode = structureNodeModel.getValue();
+ JptResourceType resourceType = rootStructureNode.getResourceType();
if (resourceType == null) {
return; // might not ever get here... (if we have a p.xml, it probably has a resource type...)
}
- JpaPlatform jpaPlatform = this.getRootStructureNode().getJpaPlatform();
+ JpaPlatform jpaPlatform = rootStructureNode.getJpaPlatform();
JpaPlatformUi jpaPlatformUI = (JpaPlatformUi) jpaPlatform.getAdapter(JpaPlatformUi.class);
ResourceUiDefinition definition = jpaPlatformUI.getResourceUiDefinition(resourceType);
ListIterable<JpaEditorPageDefinition> pageDefinitions = definition.getEditorPageDefinitions();
for (JpaEditorPageDefinition editorPageDefinition : pageDefinitions) {
- FormPage formPage = new Page(editorPageDefinition);
+ FormPage formPage = new Page(editorPageDefinition, structureNodeModel);
int index = this.getPageCount() == 0 ? 0 : this.getPageCount() - 1;//always keep the source tab as the last tab
try {
@@ -283,25 +297,23 @@
this.pageRootStructureNodeModel.setValue(null);
this.pageRootStructureNodeModel = null;
}
-
- while (this.getPageCount() > 1) {//don't remove the XML Editor page
+ if (this.getPageCount() > 1) {
//set the XML source editor to be the active page before removing the other pages.
//If I don't do this and the active page gets removed it will build the contents
//of the next page. I don't want to do this since I'm trying to remove all the
- //pages except the xml source page.
- this.setActivePage(getPageCount() - 1);
- this.removePage(0);
+ //pages except the XML source editor page.
+ this.setActivePage(this.getPageCount() - 1);
+
+ while (this.getPageCount() > 1) {//don't remove the XML Editor page
+ this.removePage(0);
+ }
}
if (rootStructureNode != null) {
this.pageRootStructureNodeModel = new SimplePropertyValueModel<JpaStructureNode>(rootStructureNode);
- this.addSpecificPages();
+ this.addSpecificPages(this.pageRootStructureNodeModel);
}
}
- protected JpaStructureNode getRootStructureNode() {
- return this.rootStructureNodeModel.getValue();
- }
-
//*should* be only 1 root structure node for the jpa file (this is true for persistence.xml and orm.xml files)
protected PropertyValueModel<JpaStructureNode> buildRootStructureNodeModel() {
return new CollectionPropertyValueModelAdapter<JpaStructureNode, JpaStructureNode>(this.buildRootStructureNodesCollectionModel()) {
@@ -352,6 +364,7 @@
public void dispose() {
this.editorInputModel.setValue(null);
this.localResourceManager.dispose();
+ this.widgetFactory.dispose();
this.rootStructureNodeModel.removePropertyChangeListener(PropertyValueModel.VALUE, this.rootStructureNodeListener);
super.dispose();
@@ -397,16 +410,22 @@
private final JpaEditorPageDefinition editorPageDefinition;
/**
+ * This root structure node model.
+ */
+ private PropertyValueModel<JpaStructureNode> structureNodeModel;
+
+ /**
* The FormPage's image descriptor, stored so that we can dispose of it.
*/
private ImageDescriptor imageDescriptor;
- Page(JpaEditorPageDefinition editorPageDefinition) {
+ Page(JpaEditorPageDefinition editorPageDefinition, PropertyValueModel<JpaStructureNode> structureNodeModel) {
super(JpaXmlEditor.this,
editorPageDefinition.getClass().getName(),
editorPageDefinition.getPageText());
this.editorPageDefinition = editorPageDefinition;
+ this.structureNodeModel = structureNodeModel;
}
@Override
@@ -446,7 +465,7 @@
Composite body = form.getForm().getBody();
body.setLayout(new GridLayout(1, true));
- this.editorPageDefinition.buildEditorPageContent(form, getWidgetFactory(), JpaXmlEditor.this.pageRootStructureNodeModel);
+ this.editorPageDefinition.buildEditorPageContent(form, getWidgetFactory(), this.structureNodeModel);
//calling this because it makes the scroll bar appear on the editor tabs when the content
//is larger than the editor tab area. Not sure how else to make this happen
form.reflow(true);