improved buttons customizability
diff --git a/modeling/plugins/org.eclipse.pde.ds.ui/src/org/eclipse/pde/ds/ui/internal/editor/masterdetail/PropertiesMasterDetail.java b/modeling/plugins/org.eclipse.pde.ds.ui/src/org/eclipse/pde/ds/ui/internal/editor/masterdetail/PropertiesMasterDetail.java
index 79a1aa5..c7c8e1f 100644
--- a/modeling/plugins/org.eclipse.pde.ds.ui/src/org/eclipse/pde/ds/ui/internal/editor/masterdetail/PropertiesMasterDetail.java
+++ b/modeling/plugins/org.eclipse.pde.ds.ui/src/org/eclipse/pde/ds/ui/internal/editor/masterdetail/PropertiesMasterDetail.java
@@ -8,7 +8,7 @@
  * Contributors:
  *     Anyware Technologies - initial API and implementation
  *
- * $Id: PropertiesMasterDetail.java,v 1.14 2009/08/07 16:41:55 bcabe Exp $
+ * $Id: PropertiesMasterDetail.java,v 1.15 2009/08/21 17:40:59 bcabe Exp $
  */
 package org.eclipse.pde.ds.ui.internal.editor.masterdetail;
 
@@ -31,7 +31,7 @@
 	private Button addButtonProperties;
 
 	public PropertiesMasterDetail(EmfFormEditor<?> editor) {
-		super(editor, "Properties", EmfMasterDetailBlock.NO_BUTTONS);
+		super(editor, "Properties", EmfMasterDetailBlock.USE_CUSTOM_PUSH_BUTTONS);
 	}
 
 	public IDetailsPage getPage(Object key) {
@@ -50,6 +50,7 @@
 	protected void createCustomButtons(Composite parent) {
 		addButtonProperty = createButton(parent, "Add Property");
 		addButtonProperties = createButton(parent, "Add Properties");
+		setRemoveButton(createButton(parent, "Remove"));
 	}
 
 	public Button getAddButtonProperty() {
diff --git a/modeling/plugins/org.eclipse.pde.ds.ui/src/org/eclipse/pde/ds/ui/internal/editor/masterdetail/ServicesMasterDetail.java b/modeling/plugins/org.eclipse.pde.ds.ui/src/org/eclipse/pde/ds/ui/internal/editor/masterdetail/ServicesMasterDetail.java
index 9e0e20f..38bc1b6 100644
--- a/modeling/plugins/org.eclipse.pde.ds.ui/src/org/eclipse/pde/ds/ui/internal/editor/masterdetail/ServicesMasterDetail.java
+++ b/modeling/plugins/org.eclipse.pde.ds.ui/src/org/eclipse/pde/ds/ui/internal/editor/masterdetail/ServicesMasterDetail.java
@@ -8,7 +8,7 @@
  * Contributors:
  *     Anyware Technologies - initial API and implementation
  *
- * $Id: ServicesMasterDetail.java,v 1.9 2009/08/07 16:41:55 bcabe Exp $
+ * $Id: ServicesMasterDetail.java,v 1.10 2009/08/21 17:40:59 bcabe Exp $
  */
 package org.eclipse.pde.ds.ui.internal.editor.masterdetail;
 
@@ -33,7 +33,7 @@
 	private Button _btnAddRequired;
 
 	public ServicesMasterDetail(EmfFormEditor<?> editor) {
-		super(editor, "Services", EmfMasterDetailBlock.NO_BUTTONS);
+		super(editor, "Services", EmfMasterDetailBlock.USE_CUSTOM_PUSH_BUTTONS);
 	}
 
 	@Override
@@ -75,6 +75,7 @@
 	protected void createCustomButtons(Composite parent) {
 		_btnAddRequired = createButton(parent, "Add Reference");
 		_btnAddProvided = createButton(parent, "Add Provided");
+		setRemoveButton(createButton(parent, "Remove"));
 	}
 
 	public Button getBtnAddProvided() {
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/EmfMasterDetailBlock.java b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/EmfMasterDetailBlock.java
index 865f445..6722b4a 100644
--- a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/EmfMasterDetailBlock.java
+++ b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/EmfMasterDetailBlock.java
@@ -8,7 +8,7 @@
  * Contributors:
  *     Anyware Technologies - initial API and implementation
  *
- * $Id: EmfMasterDetailBlock.java,v 1.15 2009/09/02 14:11:43 bcabe Exp $
+ * $Id: EmfMasterDetailBlock.java,v 1.16 2009/09/11 21:18:00 bcabe Exp $
  */
 package org.eclipse.pde.emfforms.editor;
 
@@ -45,9 +45,29 @@
 
 	protected EmfFormEditor<?> parentEditor;
 
+	/**
+	 * Style constant to indicate that no generic buttons (neither toolbar nor push) should be displayed 
+	 */
 	public static final int NO_BUTTONS = 0;
+
+	/**
+	 * Style constant to indicate whether generic toolbar buttons should be displayed or not 
+	 */
 	public static final int USE_GENERIC_TOOLBAR_BUTTONS = 1 << 0;
+
+	/**
+	 * Style constant to indicate whether generic push buttons should be displayed on the
+	 * right-hand side of the tree viewer or not
+	 */
 	public static final int USE_GENERIC_PUSH_BUTTONS = 1 << 1;
+
+	/**
+	 * Style constant to indicate whether custom push buttons should be displayed on the
+	 * right-hand side of the tree viewer or not.
+	 * If the flag is set, the {@link EmfMasterDetailBlock#createCustomButtons(Composite)} will be called. 
+	 */
+	public static final int USE_CUSTOM_PUSH_BUTTONS = 1 << 2;
+
 	protected int buttonOption = USE_GENERIC_TOOLBAR_BUTTONS;
 
 	private String title;
@@ -92,10 +112,13 @@
 			Composite buttonComposite = new Composite(client, SWT.NONE);
 			GridLayoutFactory.fillDefaults().numColumns(1).applyTo(buttonComposite);
 
-			addButton = createButton(buttonComposite, "Add"); //$NON-NLS-1$
-			removeButton = createButton(buttonComposite, "Remove"); //$NON-NLS-1$
+			if (showGenericPushButtons())
+				addButton = createButton(buttonComposite, "Add"); //$NON-NLS-1$
+			if (showCustomPushButtons())
+				createCustomButtons(buttonComposite);
+			if (showGenericPushButtons())
+				removeButton = createButton(buttonComposite, "Remove"); //$NON-NLS-1$
 
-			createCustomButtons(buttonComposite);
 			GridDataFactory.fillDefaults().grab(false, false).applyTo(buttonComposite);
 		}
 
@@ -155,7 +178,7 @@
 		// ActionBarContributor's global handlers
 		configureActionBarManagement();
 
-		if (showPushButtons()) {
+		if (getRemoveButton() != null) {
 
 			DataBindingContext bindingContext = new DataBindingContext();
 
@@ -225,7 +248,15 @@
 	}
 
 	private boolean showPushButtons() {
-		return (buttonOption & USE_GENERIC_PUSH_BUTTONS) > 0;
+		return showCustomPushButtons() || showGenericPushButtons();
+	}
+
+	private boolean showCustomPushButtons() {
+		return ((buttonOption & USE_CUSTOM_PUSH_BUTTONS) > 0);
+	}
+
+	private boolean showGenericPushButtons() {
+		return ((buttonOption & USE_GENERIC_PUSH_BUTTONS) > 0);
 	}
 
 	private boolean showToolbarButtons() {
@@ -290,6 +321,14 @@
 		return removeButton;
 	}
 
+	public void setAddButton(Button addButton) {
+		this.addButton = addButton;
+	}
+
+	public void setRemoveButton(Button removeButton) {
+		this.removeButton = removeButton;
+	}
+
 	protected void createContextMenuFor(StructuredViewer viewer) {
 		MenuManager contextMenu = new MenuManager("#PopUp"); //$NON-NLS-1$
 		contextMenu.add(new Separator("additions")); //$NON-NLS-1$