]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.cms/src/org/argeo/cms/viewers/AbstractPageViewer.java
Merge security.ui bundle in the cms.ui.workbench bundle
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / viewers / AbstractPageViewer.java
index 5e6de37097ea226c9a0165eb16666739c13e1f3c..b52f76be52f5afe769c436d5cdbed3e5dfc0b11f 100644 (file)
@@ -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,6 +38,7 @@ 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;
@@ -50,6 +55,7 @@ public abstract class AbstractPageViewer extends ContentViewer implements
 
                if (cmsEditable.canEdit()) {
                        mouseListener = createMouseListener();
+                       focusListener = createFocusListener();
                }
                page = findPage(parent);
        }
@@ -86,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;
@@ -146,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);
@@ -205,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() {
@@ -214,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;
@@ -227,6 +294,10 @@ public abstract class AbstractPageViewer extends ContentViewer implements
                return mouseListener;
        }
 
+       public FocusListener getFocusListener() {
+               return focusListener;
+       }
+
        public CmsEditable getCmsEditable() {
                return cmsEditable;
        }
@@ -235,5 +306,4 @@ public abstract class AbstractPageViewer extends ContentViewer implements
        public ISelection getSelection() {
                return selection;
        }
-
-}
+}
\ No newline at end of file