/******************************************************************************* | |
* 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.details.IOngoingChange; | |
import org.eclipse.bpel.common.ui.editmodel.AbstractEditModelCommand; | |
import org.eclipse.bpel.ui.IBPELUIConstants; | |
import org.eclipse.bpel.ui.Policy; | |
import org.eclipse.bpel.ui.commands.CompoundCommand; | |
import org.eclipse.bpel.ui.expressions.IExpressionEditor; | |
import org.eclipse.bpel.ui.util.BatchedMultiObjectAdapter; | |
import org.eclipse.bpel.ui.util.MultiObjectAdapter; | |
import org.eclipse.core.resources.IMarker; | |
import org.eclipse.emf.common.notify.Notification; | |
import org.eclipse.emf.ecore.resource.Resource; | |
import org.eclipse.gef.commands.Command; | |
import org.eclipse.swt.widgets.Composite; | |
/** | |
* | |
* @author Michal Chmielewski (michal.chmielewski@oracle.com) | |
* @date Nov 15, 2006 | |
* | |
*/ | |
@SuppressWarnings("nls") | |
public abstract class TextSection extends BPELPropertySection implements IGetExpressionEditor { | |
static protected final String NL = "\n"; | |
protected IExpressionEditor fEditor; | |
// protected boolean isExecutingStoreCommand = false; | |
protected boolean updating = false; | |
protected IOngoingChange change; | |
protected void disposeEditor() { | |
if (fEditor != null) { | |
fEditor.dispose(); | |
fEditor = null; | |
} | |
} | |
@Override | |
protected MultiObjectAdapter[] createAdapters() { | |
MultiObjectAdapter adapter = new BatchedMultiObjectAdapter() { | |
boolean needRefresh = false; | |
@Override | |
public void notify (Notification n) { | |
if (markersHaveChanged(n)) { | |
updateMarkers(); | |
return ; | |
} | |
needRefresh = needRefresh || isBodyAffected(n); | |
refreshAdapters(); | |
} | |
@Override | |
public void finish() { | |
if (needRefresh) { | |
updateWidgets(); | |
} | |
needRefresh = false; | |
} | |
}; | |
return new MultiObjectAdapter[] { adapter }; | |
} | |
protected String getCommandLabel() { | |
return IBPELUIConstants.CMD_EDIT_EXPRESSION; | |
} | |
protected void createChangeHelper() { | |
change = new IOngoingChange() { | |
public String getLabel() { | |
return getCommandLabel(); | |
} | |
public Command createApplyCommand() { | |
if (fEditor == null) { | |
return null; | |
} | |
CompoundCommand result = makeCompound ( newStoreToModelCommand( fEditor.getEditorContent() )) ; | |
if (result == null) { | |
return null; | |
} | |
// refresh the editor | |
result.add(new AbstractEditModelCommand() { | |
@Override | |
public void execute() { | |
if (fEditor != null) { | |
fEditor.markAsClean(); | |
} | |
} | |
// TODO: is this correct? | |
@Override | |
public Resource[] getResources() { | |
return EMPTY_RESOURCE_ARRAY; | |
} | |
@Override | |
public Resource[] getModifiedResources() { | |
return EMPTY_RESOURCE_ARRAY; | |
} | |
}); | |
return wrapInShowContextCommand(result); | |
} | |
public void restoreOldState() { | |
updateWidgets(); | |
} | |
}; | |
} | |
/** | |
* @see org.eclipse.ui.views.properties.tabbed.AbstractPropertySection#shouldUseExtraSpace() | |
*/ | |
@Override | |
public boolean shouldUseExtraSpace() { | |
return true; | |
} | |
@Override | |
protected void createClient(Composite parent) { | |
createEditor(parent); | |
createChangeHelper(); | |
} | |
protected abstract void createEditor(Composite parent); | |
protected void notifyEditorChanged() { | |
// TODO: why is this method being called before createClient() has finished | |
// when a BuiltInExpressionEditor was selected in the model? | |
if (change != null) { | |
getCommandFramework().notifyChangeInProgress(change); | |
} | |
} | |
protected abstract void updateEditor(); | |
/** | |
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#aboutToBeHidden() | |
*/ | |
@Override | |
public void aboutToBeHidden() { | |
if (Policy.DEBUG) System.out.println("exprdetails.aboutToBeHidden() - "+this); //$NON-NLS-1$ | |
super.aboutToBeHidden(); | |
if (change != null) { | |
getCommandFramework().notifyChangeDone(change); | |
} | |
if (fEditor != null) fEditor.aboutToBeHidden(); | |
} | |
/** | |
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#aboutToBeShown() | |
*/ | |
@Override | |
public void aboutToBeShown() { | |
if (Policy.DEBUG) { | |
System.out.println("exprdetails.aboutToBeShown() - "+this); //$NON-NLS-1$ | |
} | |
// TODO: can't remove the following line because we rely on this event | |
// in some places. | |
// updateEditor(); | |
super.aboutToBeShown(); | |
if (fEditor != null) { | |
fEditor.aboutToBeShown(); | |
} | |
// if (Platform.getWS().equals(Platform.WS_GTK)) { | |
// ((DetailsArea)detailsArea).getDetailsAreaComposite().getScrolledComposite().pack(true); | |
// ((DetailsArea)detailsArea).getDetailsAreaComposite().getScrolledComposite().pack(true); | |
// } | |
} | |
/** | |
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#dispose() | |
*/ | |
@Override | |
public void dispose() { | |
super.dispose(); | |
disposeEditor(); | |
} | |
protected void updateWidgets() { | |
assert getInput() != null; | |
if (!updating) { | |
updating = true; | |
try { | |
updateEditor(); | |
} finally { | |
updating = false; | |
} | |
} | |
} | |
/** | |
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#getUserContext() | |
*/ | |
@Override | |
public Object getUserContext() { | |
return (fEditor==null)? null : fEditor.getUserContext(); | |
} | |
/** | |
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#restoreUserContext(java.lang.Object) | |
*/ | |
@Override | |
public void restoreUserContext(Object userContext) { | |
if (fEditor != null) { | |
fEditor.restoreUserContext(userContext); | |
} | |
} | |
/** | |
* @see org.eclipse.bpel.ui.properties.IGetExpressionEditor#getExpressionEditor() | |
*/ | |
public IExpressionEditor getExpressionEditor() { | |
return fEditor; | |
} | |
protected abstract Command newStoreToModelCommand(Object body); | |
protected abstract boolean isBodyAffected(Notification n); | |
/** | |
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#gotoMarker(org.eclipse.core.resources.IMarker) | |
*/ | |
@Override | |
public void gotoMarker(IMarker marker) { | |
// TODO: Look up the use type. | |
String useType = null; | |
IExpressionEditor editor = getExpressionEditor(); | |
// may have not been created yet | |
if (editor == null) { | |
return ; | |
} | |
editor.gotoTextMarker(marker, useType, fModelObject); | |
} | |
} |