X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Fviewers%2FAbstractPageViewer.java;h=b52f76be52f5afe769c436d5cdbed3e5dfc0b11f;hb=c873a0359345503b8e3ca07828bd99d525ec7cc0;hp=331275c44dd3484dbd8e0bd071bfc7e08109fa58;hpb=0a63088e055dcd5ff397ce4e98d008c62c84dc98;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 331275c44..b52f76be5 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; @@ -15,11 +16,14 @@ import org.eclipse.jface.viewers.ContentViewer; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.FocusEvent; +import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.MouseAdapter; 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 @@ -34,28 +38,11 @@ public abstract class AbstractPageViewer extends ContentViewer implements private final CmsEditable cmsEditable; private MouseListener mouseListener; + private FocusListener focusListener; private EditablePart edited; private ISelection selection = StructuredSelection.EMPTY; - // FIXME Added by BSinou to manage non-section Composite. - // Is it the correct method? - protected AbstractPageViewer(Composite parent, int style, - CmsEditable cmsEditable) { - // read only at UI level - readOnly = SWT.READ_ONLY == (style & SWT.READ_ONLY); - - this.cmsEditable = cmsEditable == null ? CmsEditable.NON_EDITABLE - : cmsEditable; - if (this.cmsEditable instanceof Observable) - ((Observable) this.cmsEditable).addObserver(this); - - if (cmsEditable.canEdit()) { - mouseListener = createMouseListener(); - } - page = findPage(parent); - } - protected AbstractPageViewer(Section parent, int style, CmsEditable cmsEditable) { // read only at UI level @@ -68,6 +55,7 @@ public abstract class AbstractPageViewer extends ContentViewer implements if (cmsEditable.canEdit()) { mouseListener = createMouseListener(); + focusListener = createFocusListener(); } page = findPage(parent); } @@ -104,6 +92,21 @@ public abstract class AbstractPageViewer extends ContentViewer implements }; } + /** Create (retrieve) the FocusListener to use. */ + protected FocusListener createFocusListener() { + return new FocusListener() { + private static final long serialVersionUID = 1L; + + @Override + public void focusLost(FocusEvent event) { + } + + @Override + public void focusGained(FocusEvent event) { + } + }; + } + protected Composite findPage(Composite composite) { if (composite instanceof ScrolledPage) { return (ScrolledPage) composite; @@ -164,8 +167,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); @@ -223,6 +234,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() { @@ -232,6 +257,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; @@ -245,6 +294,10 @@ public abstract class AbstractPageViewer extends ContentViewer implements return mouseListener; } + public FocusListener getFocusListener() { + return focusListener; + } + public CmsEditable getCmsEditable() { return cmsEditable; } @@ -253,5 +306,4 @@ public abstract class AbstractPageViewer extends ContentViewer implements public ISelection getSelection() { return selection; } - -} +} \ No newline at end of file