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.cms.ui.widgets.ScrolledPage;
+import org.argeo.jcr.JcrException;
import org.eclipse.jface.viewers.ContentViewer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
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);
}
}
}
}
+ 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)
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;
});
}
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) {
+ stopEditing(true);
+ }
+
+ @Override
+ public void focusGained(FocusEvent event) {
+ }
+ });
+
layout(part.getControl());
+ showControl(part.getControl());
} catch (RepositoryException e) {
- throw new CmsException("Cannot edit " + part, e);
+ throw new JcrException("Cannot edit " + part, e);
}
}
- private void stopEditing(Boolean save) throws RepositoryException {
+ protected void stopEditing(Boolean save) {
if (edited instanceof Widget && ((Widget) edited).isDisposed()) {
edited = null;
return;
return;
}
- if (save)
- save(edited);
+ try {
+ if (save)
+ save(edited);
- edited.stopEditing();
- updateContent(edited);
- layout(((EditablePart) edited).getControl());
- edited = null;
+ edited.stopEditing();
+ 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 {
+ edited = null;
+ }
}
// METHODS AVAILABLE TO EXTENDING CLASSES
protected void saveEdit() {
- try {
- if (edited != null)
- stopEditing(true);
- } catch (RepositoryException e) {
- throw new CmsException("Cannot stop editing", e);
- }
+ if (edited != null)
+ stopEditing(true);
}
protected void cancelEdit() {
- try {
- if (edited != null)
- stopEditing(false);
- } catch (RepositoryException e) {
- throw new CmsException("Cannot cancel editing", e);
- }
+ if (edited != null)
+ stopEditing(false);
}
/** Layout this controls from the related base page. */
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. */
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;
}