/*******************************************************************************
* Copyright (c) 2005, 2012 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.bpel.ui.properties;
import org.eclipse.bpel.common.ui.command.ICommandFramework;
import org.eclipse.bpel.common.ui.details.ChangeHelper;
import org.eclipse.bpel.common.ui.flatui.FlatFormAttachment;
import org.eclipse.bpel.common.ui.flatui.FlatFormData;
import org.eclipse.bpel.common.ui.flatui.FlatFormLayout;
import org.eclipse.bpel.ui.BPELTabbedPropertySheetPage;
import org.eclipse.bpel.ui.IBPELUIConstants;
import org.eclipse.bpel.ui.adapters.IVirtualCopyRuleSide;
import org.eclipse.bpel.ui.commands.util.UpdateModelCommand;
import org.eclipse.bpel.ui.util.BPELUtil;
import org.eclipse.bpel.ui.util.BatchedMultiObjectAdapter;
import org.eclipse.bpel.ui.util.MultiObjectAdapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.commands.Command;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
/**
* An IDetailsSection representing a panel of widgets for one specifying one kind
* of From/To contents. Subclasses of AssignCategory can answer whether they apply
* to the contents of a particular From or To, and they provide widgets specific to
* that kind of contents.
*
*/
public abstract class AssignCategoryBase extends BPELPropertySection implements IAssignCategory {
protected BPELPropertySection fOwnerSection;
protected Composite fComposite;
protected ChangeHelper fChangeHelper;
protected Composite fParent;
protected IVirtualCopyRuleSide fCopyRuleSide;
protected AssignCategoryBase ( BPELPropertySection ownerSection ) {
fOwnerSection = ownerSection;
}
/**
* Initialize the widgets from the state in the toOrFrom object.
* The toOrFrom object may contain additional state which isn't used by the widgets
* of this category; this state will be preserved in the model unless the user changes
* something in the category's widgets and causes a storeIntoModel() to occur.
*
* If isFrom is true, toOrFrom will be a From object, otherwise it will be a To object.
*/
protected abstract void load (IVirtualCopyRuleSide side);
/**
* Store the state represented by the widgets into the toOrFrom object.
* If isFrom is true, toOrFrom will be a From object, otherwise it will be a To object.
*/
protected abstract void store (IVirtualCopyRuleSide side);
// This is used by changeHelper to determine what shows up in Undo/Redo.
// The return value is FlatFormatted with getName() as the only argument.
// Subclasses may override.
protected String getLabelFlatFormatString() {
return IBPELUIConstants.FORMAT_CMD_SELECT;
}
protected ChangeHelper getChangeHelper() {
return fChangeHelper;
}
/**
* @see org.eclipse.bpel.ui.properties.IAssignCategory#getName()
*/
public String getName() {
return null;
}
/**
* @see org.eclipse.bpel.ui.properties.IAssignCategory#isCategoryForModel(org.eclipse.emf.ecore.EObject)
*/
public boolean isCategoryForModel(EObject model) {
return false;
}
/**
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#dispose()
*/
@Override
public void dispose() {
super.dispose();
}
/**
* Policy: wrap the command with contexts from the ownerSection (rather
* than from the category itself). On undo, the ownerSection will delegate
* to the category's methods.
*/
@Override
protected Command wrapInShowContextCommand (Command inner) {
return super.wrapInShowContextCommand(inner, fOwnerSection);
}
protected boolean isToOrFromAffected (Notification n) {
return true;
}
@Override
protected MultiObjectAdapter[] createAdapters() {
return new BatchedMultiObjectAdapter[] {
new BatchedMultiObjectAdapter() {
boolean bUpdate = false;
@Override
public void notify (Notification n) {
bUpdate = isToOrFromAffected(n) ;
}
@Override
public void finish() {
if (bUpdate) {
updateCategoryWidgets();
bUpdate = false;
}
}
}
};
}
/**
* Return the composite that was used in createControls call.
*
* @see org.eclipse.bpel.ui.properties.IAssignCategory#getComposite()
*/
public Composite getComposite () {
return fParent;
}
/**
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
*/
@Override
public void createControls (Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage) {
// hack - we have to do this in order to get the command framework before calling super.createControls
ICommandFramework commandFramework = ((BPELTabbedPropertySheetPage)aTabbedPropertySheetPage).getEditor().getCommandFramework();
fChangeHelper = new ChangeHelper(commandFramework) {
public String getLabel() {
return BPELUtil.formatString(getLabelFlatFormatString(), getName());
}
public Command createApplyCommand() {
return wrapInShowContextCommand(newStoreModelCommand());
}
public void restoreOldState() {
updateCategoryWidgets();
}
};
super.createControls(parent, aTabbedPropertySheetPage);
fParent = parent;
}
@SuppressWarnings("nls")
@Override
protected void basicSetInput (EObject newInput) {
fCopyRuleSide = BPELUtil.adapt(newInput, IVirtualCopyRuleSide.class);
super.basicSetInput(newInput);
}
/**
* This is a little whacked here.
*
*/
@SuppressWarnings("nls")
protected void updateCategoryWidgets() {
load(fCopyRuleSide);
}
/**
* Return a newStoreModelCommand
* @return the command
*/
@SuppressWarnings("nls")
public Command newStoreModelCommand() {
return new UpdateModelCommand(fCopyRuleSide.getCopyRuleSide(),"Modify ..!") {
@Override
public void doExecute() {
store ( fCopyRuleSide );
}
};
}
protected boolean isDefaultCompositeOpaque() {
return true;
}
@Override
protected final void createClient(Composite parent) {
// ugly HACK to make subclasses work
FlatFormLayout layout = new FlatFormLayout();
layout.marginHeight = layout.marginWidth = 0;
parent.setLayout(layout);
createClient2(parent);
}
/**
* Override this method. Call this version if the subclass wants its own composite
* with margin and black border.
*/
protected void createClient2(Composite parent) {
if (isDefaultCompositeOpaque()) {
fComposite = fWidgetFactory.createPlainComposite(parent, SWT.NONE);
} else {
fComposite = fWidgetFactory.createComposite(parent);
}
FlatFormLayout layout = new FlatFormLayout();
layout.marginWidth = 0;//IDetailsAreaConstants.HMARGIN;
layout.marginHeight = 0;//IDetailsAreaConstants.VMARGIN;
fComposite.setLayout(layout);
FlatFormData data = new FlatFormData();
data.left = new FlatFormAttachment(0, 0);
data.right = new FlatFormAttachment(100, 0);
data.top = new FlatFormAttachment(0, 0);
data.bottom = new FlatFormAttachment(100, 0);
// data.borderType = IBorderConstants.BORDER_1P1_BLACK;
fComposite.setLayoutData(data);
}
/**
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#refresh()
*/
@Override
public void refresh() {
super.refresh();
updateCategoryWidgets();
}
/**
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#aboutToBeHidden()
*/
@Override
public void aboutToBeHidden() {
if (isCreated) {
// hack!
ChangeHelper changeHelper = getChangeHelper();
if (changeHelper != null) {
getCommandFramework().notifyChangeDone(changeHelper);
}
}
super.aboutToBeHidden();
}
/**
* This is just a workaround to keep the AssignCategory from changing too much.
* @param model the model object
*/
public void setInput (EObject model) {
removeAllAdapters();
basicSetInput(model);
addAllAdapters();
}
/**
* @see org.eclipse.bpel.ui.properties.IAssignCategory#isHidden()
*/
public boolean isHidden() {
return isHidden;
}
}