changeset 62:52d63c65f7bb

Use jface data binding for extensions page
author Omair Majid <omajid@redhat.com>
date Thu, 02 Jan 2014 10:52:35 -0500
parents 0f80f81a2773
children fb4fcb5bb4ac
files META-INF/MANIFEST.MF src/com/redhat/thermostat/plugin/eclipse/editor/ExtensionEditPage.java src/com/redhat/thermostat/plugin/eclipse/model/Extension.java
diffstat 3 files changed, 74 insertions(+), 54 deletions(-) [+]
line wrap: on
line diff
--- a/META-INF/MANIFEST.MF	Thu Jan 02 08:56:54 2014 -0500
+++ b/META-INF/MANIFEST.MF	Thu Jan 02 10:52:35 2014 -0500
@@ -15,6 +15,12 @@
  org.eclipse.jdt.core;bundle-version="3.9.0",
  org.eclipse.ui.forms;bundle-version="3.6.0",
  org.eclipse.wst.sse.ui;bundle-version="1.3.200",
- org.junit;bundle-version="4.10.0"
+ org.junit;bundle-version="4.10.0",
+ org.eclipse.core.databinding,
+ org.eclipse.core.databinding.beans,
+ org.eclipse.core.databinding.observable,
+ org.eclipse.core.databinding.property,
+ org.eclipse.jface.databinding,
+ com.ibm.icu
 Bundle-RequiredExecutionEnvironment: JavaSE-1.7
 Bundle-ActivationPolicy: lazy
--- a/src/com/redhat/thermostat/plugin/eclipse/editor/ExtensionEditPage.java	Thu Jan 02 08:56:54 2014 -0500
+++ b/src/com/redhat/thermostat/plugin/eclipse/editor/ExtensionEditPage.java	Thu Jan 02 10:52:35 2014 -0500
@@ -1,10 +1,10 @@
 package com.redhat.thermostat.plugin.eclipse.editor;
 
-import java.util.List;
-
-import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.core.databinding.DataBindingContext;
+import org.eclipse.core.databinding.beans.BeansObservables;
+import org.eclipse.core.databinding.observable.list.IObservableList;
+import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
 import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.window.Window;
@@ -24,23 +24,23 @@
 import org.eclipse.ui.forms.widgets.TableWrapData;
 import org.eclipse.ui.forms.widgets.TableWrapLayout;
 
+import com.redhat.thermostat.plugin.eclipse.model.BundleInformation;
 import com.redhat.thermostat.plugin.eclipse.model.Extension;
 import com.redhat.thermostat.plugin.eclipse.model.PluginModel;
-import com.redhat.thermostat.plugin.eclipse.model.PluginModel.PluginModelChangeListener;
 
 public class ExtensionEditPage implements IDetailsPage {
 
     private FormToolkit toolkit;
     private PluginModel model;
-    private TableViewer bundleViewer;
-    private String extensionName;
+    private TableViewer bundlesTableViewer;
+
+    private Extension extensionModel;
 
-    private PluginModelChangeListener modelRefresher = new PluginModelChangeListener() {
-        @Override
-        public void modelChanged() {
-            updateFromModel();
-        }
-    };
+    private DataBindingContext bindingContext;
+
+    public ExtensionEditPage() {
+        // no-op
+    }
 
     public void setModel(PluginModel model) {
         this.model = model;
@@ -53,24 +53,27 @@
 
     @Override
     public void dispose() {
-        model.removeModelChangeListener(modelRefresher);
+        // no-op
     }
 
     @Override
     public boolean isDirty() {
-        Extension extensionModel = model.getExtension(extensionName);
         if (extensionModel == null) {
             return false;
         }
 
+        Extension extensionInMasterModel = model.getExtension(extensionModel.getName());
+        if (extensionInMasterModel == null) {
+            return false;
+        }
+
         // TODO change this is-content-different into is-content-dirty
-        return !extensionModel.getBundles().equals(BundleInformationHelpers.getBundles((List<String>) bundleViewer.getInput()));
+        return !extensionInMasterModel.equals(extensionModel);
     }
 
     @Override
     public void commit(boolean onSave) {
-        System.out.println("[" + extensionName + "] commit(" + onSave + ")");
-        updateModel();
+        model.updateExtension(extensionModel);
     }
 
     @Override
@@ -93,14 +96,19 @@
 
     @Override
     public void refresh() {
-        updateFromModel();
+        // no-op
     }
 
     @Override
     public void selectionChanged(IFormPart part, ISelection selection) {
-        extensionName = (String) ((IStructuredSelection)selection).getFirstElement();
-        updateFromModel();
-        System.out.println("[" + extensionName + "] selectionChanged");
+        if (bindingContext != null) {
+            bindingContext.dispose();
+        }
+
+        String extensionName = (String) ((IStructuredSelection)selection).getFirstElement();
+        extensionModel = model.getExtension(extensionName);
+
+        bindingContext = initDataBindings();
     }
 
     @Override
@@ -120,7 +128,6 @@
         section.setLayoutData(tableData);
 
         section.setText("Extension details");
-        section.setDescription("Items marked with * are required");
 
         Composite sectionContents = toolkit.createComposite(section);
         section.setClient(sectionContents);
@@ -139,11 +146,10 @@
         bundles.setClient(bundleContents);
         bundleContents.setLayout(new GridLayout(2, false));
 
-        Table list = toolkit.createTable(bundleContents, SWT.BORDER | SWT.V_SCROLL);
-        list.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-        bundleViewer = new TableViewer(list);
-        IStructuredContentProvider contentProvider = ArrayContentProvider.getInstance();
-        bundleViewer.setContentProvider(contentProvider);
+        Table bundlesTable = toolkit.createTable(bundleContents, SWT.BORDER | SWT.V_SCROLL);
+        bundlesTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+        bundlesTableViewer = new TableViewer(bundlesTable);
 
         Composite buttonComposite = toolkit.createComposite(bundleContents);
         buttonComposite.setLayout(new GridLayout(1, false));
@@ -156,9 +162,7 @@
                 NewBundleDialog dialog = new NewBundleDialog(sectionContents.getShell());
                 dialog.create();
                 if (dialog.open() == Window.OK) {
-                    List<String> viewModel = (List<String>) bundleViewer.getInput();
-                    viewModel.add(BundleInformationHelpers.getString(dialog.getBundle()));
-                    bundleViewer.setInput(viewModel);
+                    extensionModel.addBundle(dialog.getBundle());
                 }
             }
         });
@@ -168,34 +172,23 @@
         remove.addSelectionListener(new SelectionAdapter() {
             @Override
             public void widgetSelected(SelectionEvent e) {
-                Object selectedItem = ((IStructuredSelection)bundleViewer.getSelection()).getFirstElement();
-                List<?> viewModel = (List<?>) bundleViewer.getInput();
-                viewModel.remove(selectedItem);
-                bundleViewer.setInput(viewModel);
+                BundleInformation selectedItem = (BundleInformation)
+                        ((IStructuredSelection)bundlesTableViewer.getSelection()).getFirstElement();
+                extensionModel.removeBundle(selectedItem);
             }
         });
+
     }
 
-    private void updateFromModel() {
-        if (extensionName == null) {
-            return;
-        }
+    private DataBindingContext initDataBindings() {
+        DataBindingContext bindingContext = new DataBindingContext();
 
-        Extension extensionModel = model.getExtension(extensionName);
-
-        // extension removed?
-        if (extensionModel == null) {
-            return;
-        }
+        ObservableListContentProvider listContentProvider = new ObservableListContentProvider();
+        bundlesTableViewer.setContentProvider(listContentProvider);
 
-        bundleViewer.setInput(BundleInformationHelpers.getStrings(extensionModel.getBundles()));
-    }
+        IObservableList bundlesModel = BeansObservables.observeList(extensionModel, "bundles");
+        bundlesTableViewer.setInput(bundlesModel);
 
-    private void updateModel() {
-        Extension updated = new Extension(extensionName,
-                BundleInformationHelpers.getBundles((List<String>) bundleViewer.getInput()));
-
-        model.updateExtension(updated);
+        return bindingContext;
     }
-
 }
--- a/src/com/redhat/thermostat/plugin/eclipse/model/Extension.java	Thu Jan 02 08:56:54 2014 -0500
+++ b/src/com/redhat/thermostat/plugin/eclipse/model/Extension.java	Thu Jan 02 10:52:35 2014 -0500
@@ -1,6 +1,7 @@
 package com.redhat.thermostat.plugin.eclipse.model;
 
 import java.util.List;
+import java.util.Objects;
 
 public class Extension extends ModelObject {
 
@@ -22,6 +23,7 @@
         firePropertyChange("name", this.name, this.name = name);
     }
 
+    /** Do not modify the returned list */
     public List<BundleInformation> getBundles() {
         return this.bundles;
     }
@@ -30,4 +32,23 @@
         firePropertyChange("bundles", this.bundles, this.bundles = bundles);
     }
 
+    public void addBundle(BundleInformation bundle) {
+        bundles.add(bundle);
+        firePropertyChange("bundles", null, bundles);
+    }
+
+    public void removeBundle(BundleInformation bundle) {
+        bundles.remove(bundle);
+        firePropertyChange("bundles", null, bundles);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (!(obj instanceof Extension)) {
+            return false;
+        }
+        Extension other = (Extension) obj;
+        return Objects.equals(this.name, other.name) && Objects.equals(this.bundles, other.bundles);
+    }
+
 }
\ No newline at end of file