1 package org
.argeo
.cms
.ui
.workbench
.internal
.jcr
.parts
;
3 import java
.text
.DateFormat
;
4 import java
.text
.SimpleDateFormat
;
5 import java
.util
.ArrayList
;
6 import java
.util
.Arrays
;
8 import java
.util
.ListIterator
;
10 import javax
.jcr
.Node
;
11 import javax
.jcr
.Property
;
12 import javax
.jcr
.PropertyIterator
;
13 import javax
.jcr
.PropertyType
;
14 import javax
.jcr
.RepositoryException
;
16 import org
.argeo
.cms
.ui
.CmsUiConstants
;
17 import org
.argeo
.cms
.ui
.workbench
.internal
.WorkbenchConstants
;
18 import org
.argeo
.eclipse
.ui
.EclipseUiException
;
19 import org
.argeo
.jcr
.JcrUtils
;
20 import org
.eclipse
.swt
.SWT
;
21 import org
.eclipse
.swt
.events
.ModifyEvent
;
22 import org
.eclipse
.swt
.events
.ModifyListener
;
23 import org
.eclipse
.swt
.layout
.GridData
;
24 import org
.eclipse
.swt
.layout
.GridLayout
;
25 import org
.eclipse
.swt
.widgets
.Composite
;
26 import org
.eclipse
.swt
.widgets
.Control
;
27 import org
.eclipse
.swt
.widgets
.Text
;
28 import org
.eclipse
.ui
.forms
.AbstractFormPart
;
29 import org
.eclipse
.ui
.forms
.IManagedForm
;
30 import org
.eclipse
.ui
.forms
.editor
.FormEditor
;
31 import org
.eclipse
.ui
.forms
.editor
.FormPage
;
32 import org
.eclipse
.ui
.forms
.widgets
.FormToolkit
;
33 import org
.eclipse
.ui
.forms
.widgets
.ScrolledForm
;
36 * Work-In-Progress Node editor page: provides edition feature on String
37 * properties for power users. TODO implement manual modification of all
41 public class GenericNodePage
extends FormPage
implements WorkbenchConstants
{
42 // private final static CmsLog log = CmsLog.getLog(GenericNodePage.class);
45 private final static String JCR_PROPERTY_NAME
= "jcr:name";
48 protected DateFormat timeFormatter
= new SimpleDateFormat(CmsUiConstants
.DATE_TIME_FORMAT
);
50 // Main business Objects
51 private Node currentNode
;
54 private FormToolkit tk
;
55 private List
<Control
> modifyableProperties
= new ArrayList
<Control
>();
57 public GenericNodePage(FormEditor editor
, String title
, Node currentNode
) {
58 super(editor
, "id", title
);
59 this.currentNode
= currentNode
;
62 protected void createFormContent(IManagedForm managedForm
) {
63 tk
= managedForm
.getToolkit();
64 ScrolledForm form
= managedForm
.getForm();
65 Composite innerBox
= form
.getBody();
66 // Composite innerBox = new Composite(form.getBody(), SWT.NO_FOCUS);
67 GridLayout twt
= new GridLayout(3, false);
68 innerBox
.setLayout(twt
);
69 createPropertiesPart(innerBox
);
72 private void createPropertiesPart(Composite parent
) {
74 AbstractFormPart part
= new AbstractFormPart() {
75 public void commit(boolean onSave
) {
78 ListIterator
<Control
> it
= modifyableProperties
.listIterator();
79 while (it
.hasNext()) {
80 // we only support Text controls
81 Text curControl
= (Text
) it
.next();
82 String value
= curControl
.getText();
83 currentNode
.setProperty((String
) curControl
.getData(JCR_PROPERTY_NAME
), value
);
86 // We only commit when onSave = true,
87 // thus it is still possible to save after a tab
89 if (currentNode
.getSession().hasPendingChanges())
90 currentNode
.getSession().save();
93 } catch (RepositoryException re
) {
94 throw new EclipseUiException("Cannot save properties on " + currentNode
, re
);
99 PropertyIterator pi
= currentNode
.getProperties();
100 while (pi
.hasNext()) {
101 Property prop
= pi
.nextProperty();
102 addPropertyLine(parent
, part
, prop
);
104 getManagedForm().addPart(part
);
105 } catch (RepositoryException re
) {
106 throw new EclipseUiException("Cannot display properties for " + currentNode
, re
);
110 private void addPropertyLine(Composite parent
, AbstractFormPart part
, Property prop
) {
112 tk
.createLabel(parent
, prop
.getName());
113 tk
.createLabel(parent
, "[" + JcrUtils
.getPropertyDefinitionAsString(prop
) + "]");
115 if (prop
.getDefinition().isProtected()) {
116 tk
.createLabel(parent
, formatReadOnlyPropertyValue(prop
));
118 addModifyableValueWidget(parent
, part
, prop
);
119 } catch (RepositoryException re
) {
120 throw new EclipseUiException("Cannot display property " + prop
, re
);
124 private String
formatReadOnlyPropertyValue(Property prop
) throws RepositoryException
{
126 if (prop
.getType() == PropertyType
.BINARY
)
127 strValue
= "<binary>";
128 else if (prop
.isMultiple())
129 strValue
= Arrays
.asList(prop
.getValues()).toString();
130 else if (prop
.getType() == PropertyType
.DATE
)
131 strValue
= timeFormatter
.format(prop
.getValue().getDate().getTime());
133 strValue
= prop
.getValue().getString();
137 private Control
addModifyableValueWidget(Composite parent
, AbstractFormPart part
, Property prop
)
138 throws RepositoryException
{
140 if (prop
.getType() == PropertyType
.STRING
&& !prop
.isMultiple()) {
141 Text txt
= tk
.createText(parent
, prop
.getString(), SWT
.WRAP
| SWT
.MULTI
);
142 gd
= new GridData(GridData
.FILL_HORIZONTAL
);
143 txt
.setLayoutData(gd
);
144 txt
.addModifyListener(new ModifiedFieldListener(part
));
145 txt
.setData(JCR_PROPERTY_NAME
, prop
.getName());
146 modifyableProperties
.add(txt
);
148 // unsupported property type for editing, we create a read only
150 return tk
.createLabel(parent
, formatReadOnlyPropertyValue(prop
));
155 private class ModifiedFieldListener
implements ModifyListener
{
156 private static final long serialVersionUID
= 2117484480773434646L;
157 private AbstractFormPart formPart
;
159 public ModifiedFieldListener(AbstractFormPart generalPart
) {
160 this.formPart
= generalPart
;
163 public void modifyText(ModifyEvent e
) {
164 formPart
.markDirty();