import javax.jcr.Node;
import javax.jcr.RepositoryException;
+import javax.jcr.Session;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.argeo.cms.CmsEditable;
import org.argeo.cms.CmsException;
-import org.argeo.cms.widgets.JcrComposite;
import org.argeo.cms.widgets.ScrolledPage;
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
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
if (cmsEditable.canEdit()) {
mouseListener = createMouseListener();
+ focusListener = createFocusListener();
}
page = findPage(parent);
}
};
}
+ /** 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;
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);
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() {
"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;
return mouseListener;
}
+ public FocusListener getFocusListener() {
+ return focusListener;
+ }
+
public CmsEditable getCmsEditable() {
return cmsEditable;
}
public ISelection getSelection() {
return selection;
}
-
-}
+}
\ No newline at end of file