Introduce Makefile for Java build
[lgpl/argeo-commons.git] / org.argeo.cms.ui / src / org / argeo / cms / ui / viewers / AbstractPageViewer.java
index e23e3ba7957320a67cdd82cb0d5de5f18c4561be..ef24ee0d5021fd729ab8fe3a9b055c3aa9c5e896 100644 (file)
@@ -11,10 +11,8 @@ import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.security.auth.Subject;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.cms.CmsException;
-import org.argeo.cms.ui.CmsEditable;
+import org.argeo.api.cms.CmsEditable;
+import org.argeo.api.cms.CmsLog;
 import org.argeo.cms.ui.widgets.ScrolledPage;
 import org.argeo.jcr.JcrException;
 import org.eclipse.jface.viewers.ContentViewer;
@@ -34,7 +32,7 @@ import org.xml.sax.SAXParseException;
 public abstract class AbstractPageViewer extends ContentViewer implements Observer {
        private static final long serialVersionUID = 5438688173410341485L;
 
-       private final static Log log = LogFactory.getLog(AbstractPageViewer.class);
+       private final static CmsLog log = CmsLog.getLog(AbstractPageViewer.class);
 
        private final boolean readOnly;
        /** The basis for the layouts, typically a ScrolledPage. */
@@ -75,8 +73,8 @@ public abstract class AbstractPageViewer extends ContentViewer implements Observ
                                        initModel(node);
                                        node.getSession().save();
                                }
-               } catch (Exception e) {
-                       throw new CmsException("Cannot initialize model", e);
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot initialize model", e);
                }
        }
 
@@ -121,6 +119,16 @@ public abstract class AbstractPageViewer extends ContentViewer implements Observ
                }
        }
 
+       public void layoutPage() {
+               if (page != null)
+                       page.layout(true, true);
+       }
+
+       protected void showControl(Control control) {
+               if (page != null && (page instanceof ScrolledPage))
+                       ((ScrolledPage) page).showControl(control);
+       }
+
        @Override
        public void update(Observable o, Object arg) {
                if (o == cmsEditable)
@@ -154,9 +162,11 @@ public abstract class AbstractPageViewer extends ContentViewer implements Observ
                                else
                                        mouseListener = null;
                                refresh(getControl());
-                               layout(getControl());
+                               // layout(getControl());
+                               if (!getControl().isDisposed())
+                                       layoutPage();
                        } catch (RepositoryException e) {
-                               throw new CmsException("Cannot refresh", e);
+                               throw new JcrException("Cannot refresh", e);
                        }
                        return null;
                });
@@ -188,10 +198,11 @@ public abstract class AbstractPageViewer extends ContentViewer implements Observ
                        }
 
                        part.startEditing();
+                       edited = part;
                        updateContent(part);
                        prepare(part, caretPosition);
-                       edited = part;
                        edited.getControl().addFocusListener(new FocusListener() {
+                               private static final long serialVersionUID = 6883521812717097017L;
 
                                @Override
                                public void focusLost(FocusEvent event) {
@@ -204,8 +215,9 @@ public abstract class AbstractPageViewer extends ContentViewer implements Observ
                        });
 
                        layout(part.getControl());
+                       showControl(part.getControl());
                } catch (RepositoryException e) {
-                       throw new CmsException("Cannot edit " + part, e);
+                       throw new JcrException("Cannot edit " + part, e);
                }
        }
 
@@ -227,8 +239,12 @@ public abstract class AbstractPageViewer extends ContentViewer implements Observ
                                save(edited);
 
                        edited.stopEditing();
-                       updateContent(edited);
-                       layout(((EditablePart) edited).getControl());
+                       EditablePart editablePart = edited;
+                       Control control = ((EditablePart) edited).getControl();
+                       edited = null;
+                       // TODO make edited state management more robust
+                       updateContent(editablePart);
+                       layout(control);
                } catch (RepositoryException e) {
                        throw new JcrException("Cannot stop editing", e);
                } finally {
@@ -262,14 +278,14 @@ public abstract class AbstractPageViewer extends ContentViewer implements Observ
                if (parent.getParent() != null)
                        return findDataParent(parent.getParent());
                else
-                       throw new CmsException("No data parent found");
+                       throw new IllegalStateException("No data parent found");
        }
 
        // UTILITIES
        /** Check whether the edited part is in a proper state */
        protected void checkEdited() {
                if (edited == null || (edited instanceof Widget) && ((Widget) edited).isDisposed())
-                       throw new CmsException("Edited should not be null or disposed at this stage");
+                       throw new IllegalStateException("Edited should not be null or disposed at this stage");
        }
 
        /** Persist all changes. */
@@ -302,7 +318,7 @@ public abstract class AbstractPageViewer extends ContentViewer implements Observ
                        res = Subject.getSubject(accessControlContext);
                }
                if (res == null)
-                       throw new CmsException("No subject associated with this viewer");
+                       throw new IllegalStateException("No subject associated with this viewer");
                return res;
        }