1 package org
.argeo
.cms
.ui
.viewers
;
3 import java
.util
.Observable
;
6 import javax
.jcr
.RepositoryException
;
7 import javax
.jcr
.Session
;
8 import javax
.jcr
.nodetype
.NodeType
;
9 import javax
.jcr
.version
.VersionManager
;
11 import org
.argeo
.cms
.CmsException
;
12 import org
.argeo
.cms
.ui
.CmsEditable
;
13 import org
.argeo
.cms
.ui
.CmsEditionEvent
;
14 import org
.eclipse
.rap
.rwt
.RWT
;
15 import org
.eclipse
.swt
.SWT
;
16 import org
.eclipse
.swt
.widgets
.Display
;
17 import org
.eclipse
.swt
.widgets
.Event
;
18 import org
.eclipse
.swt
.widgets
.Listener
;
20 /** Provides the CmsEditable semantic based on JCR versioning. */
21 public class JcrVersionCmsEditable
extends Observable
implements CmsEditable
{
22 private final String nodePath
;// cache
23 private final VersionManager versionManager
;
24 private final Boolean canEdit
;
26 public JcrVersionCmsEditable(Node node
) throws RepositoryException
{
27 this.nodePath
= node
.getPath();
28 if (node
.getSession().hasPermission(node
.getPath(),
29 Session
.ACTION_SET_PROPERTY
)) {
30 // was Session.ACTION_ADD_NODE
32 if (!node
.isNodeType(NodeType
.MIX_VERSIONABLE
)) {
33 node
.addMixin(NodeType
.MIX_VERSIONABLE
);
34 node
.getSession().save();
36 versionManager
= node
.getSession().getWorkspace()
40 versionManager
= null;
45 Display display
= Display
.getCurrent();
46 display
.setData(RWT
.ACTIVE_KEYS
, new String
[] { "CTRL+RETURN",
48 display
.addFilter(SWT
.KeyDown
, new Listener() {
49 private static final long serialVersionUID
= -4378653870463187318L;
51 public void handleEvent(Event e
) {
52 boolean ctrlPressed
= (e
.stateMask
& SWT
.CTRL
) != 0;
53 if (ctrlPressed
&& e
.keyCode
== '\r')
55 else if (ctrlPressed
&& e
.keyCode
== 'E')
63 public Boolean
canEdit() {
67 public Boolean
isEditing() {
71 return versionManager
.isCheckedOut(nodePath
);
72 } catch (RepositoryException e
) {
73 throw new CmsException("Cannot check whether " + nodePath
79 public void startEditing() {
81 versionManager
.checkout(nodePath
);
83 } catch (RepositoryException e1
) {
84 throw new CmsException("Cannot publish " + nodePath
);
86 notifyObservers(new CmsEditionEvent(nodePath
,
87 CmsEditionEvent
.START_EDITING
));
91 public void stopEditing() {
93 versionManager
.checkin(nodePath
);
95 } catch (RepositoryException e1
) {
96 throw new CmsException("Cannot publish " + nodePath
, e1
);
98 notifyObservers(new CmsEditionEvent(nodePath
,
99 CmsEditionEvent
.STOP_EDITING
));