X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Fviewers%2FAbstractPageViewer.java;h=21f259c8882d22be81695533091c93be57e4fee5;hb=85ced0e58ded00f296948b6dff51f84994855080;hp=5e6de37097ea226c9a0165eb16666739c13e1f3c;hpb=998cdf60d00ffc35d987bdb373a9676b095f16f8;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/viewers/AbstractPageViewer.java b/org.argeo.cms/src/org/argeo/cms/viewers/AbstractPageViewer.java index 5e6de3709..21f259c88 100644 --- a/org.argeo.cms/src/org/argeo/cms/viewers/AbstractPageViewer.java +++ b/org.argeo.cms/src/org/argeo/cms/viewers/AbstractPageViewer.java @@ -5,6 +5,7 @@ import java.util.Observer; import javax.jcr.Node; import javax.jcr.RepositoryException; +import javax.jcr.Session; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -20,6 +21,7 @@ import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Widget; +import org.xml.sax.SAXParseException; /** Base class for viewers related to a page */ public abstract class AbstractPageViewer extends ContentViewer implements @@ -146,8 +148,16 @@ public abstract class AbstractPageViewer extends ContentViewer implements if (edited == part) return; - if (edited != null && edited != part) - stopEditing(true); + if (edited != null && edited != part) { + EditablePart previouslyEdited = edited; + try { + stopEditing(true); + } catch (Exception e) { + notifyEditionException(e); + edit(previouslyEdited, caretPosition); + return; + } + } part.startEditing(); updateContent(part); @@ -205,6 +215,20 @@ public abstract class AbstractPageViewer extends ContentViewer implements page.layout(controls); } + /** + * Find the first {@link EditablePart} in the parents hierarchy of this + * control + */ + protected EditablePart findDataParent(Control parent) { + if (parent instanceof EditablePart) { + return (EditablePart) parent; + } + if (parent.getParent() != null) + return findDataParent(parent.getParent()); + else + throw new CmsException("No data parent found"); + } + // UTILITIES /** Check whether the edited part is in a proper state */ protected void checkEdited() { @@ -214,6 +238,30 @@ public abstract class AbstractPageViewer extends ContentViewer implements "Edited should not be null or disposed at this stage"); } + /** Persist all changes. */ + protected void persistChanges(Session session) throws RepositoryException { + session.save(); + session.refresh(false); + // TODO notify that changes have been persisted + } + + /** Convenience method using a Node in order to save the underlying session. */ + protected void persistChanges(Node anyNode) throws RepositoryException { + persistChanges(anyNode.getSession()); + } + + /** Notify edition exception */ + protected void notifyEditionException(Throwable e) { + Throwable eToLog = e; + if (e instanceof IllegalArgumentException) + if (e.getCause() instanceof SAXParseException) + eToLog = e.getCause(); + log.error(eToLog.getMessage()); + if (log.isTraceEnabled()) + log.trace("Full stack of " + eToLog.getMessage(), e); + // TODO Light error notification popup + } + // GETTERS / SETTERS public boolean isReadOnly() { return readOnly; @@ -235,5 +283,4 @@ public abstract class AbstractPageViewer extends ContentViewer implements public ISelection getSelection() { return selection; } - -} +} \ No newline at end of file