]> git.argeo.org Git - gpl/argeo-slc.git/blob - legacy/argeo-commons/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/jcr/parts/GenericNodePage.java
Massive Argeo APIs refactoring
[gpl/argeo-slc.git] / legacy / argeo-commons / org.argeo.cms.ui.workbench / src / org / argeo / cms / ui / workbench / internal / jcr / parts / GenericNodePage.java
1 package org.argeo.cms.ui.workbench.internal.jcr.parts;
2
3 import java.text.DateFormat;
4 import java.text.SimpleDateFormat;
5 import java.util.ArrayList;
6 import java.util.Arrays;
7 import java.util.List;
8 import java.util.ListIterator;
9
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;
15
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;
34
35 /**
36 * Work-In-Progress Node editor page: provides edition feature on String
37 * properties for power users. TODO implement manual modification of all
38 * property types.
39 */
40
41 public class GenericNodePage extends FormPage implements WorkbenchConstants {
42 // private final static CmsLog log = CmsLog.getLog(GenericNodePage.class);
43
44 // local constants
45 private final static String JCR_PROPERTY_NAME = "jcr:name";
46
47 // Utils
48 protected DateFormat timeFormatter = new SimpleDateFormat(CmsUiConstants.DATE_TIME_FORMAT);
49
50 // Main business Objects
51 private Node currentNode;
52
53 // This page widgets
54 private FormToolkit tk;
55 private List<Control> modifyableProperties = new ArrayList<Control>();
56
57 public GenericNodePage(FormEditor editor, String title, Node currentNode) {
58 super(editor, "id", title);
59 this.currentNode = currentNode;
60 }
61
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);
70 }
71
72 private void createPropertiesPart(Composite parent) {
73 try {
74 AbstractFormPart part = new AbstractFormPart() {
75 public void commit(boolean onSave) {
76 try {
77 if (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);
84 }
85
86 // We only commit when onSave = true,
87 // thus it is still possible to save after a tab
88 // change.
89 if (currentNode.getSession().hasPendingChanges())
90 currentNode.getSession().save();
91 super.commit(onSave);
92 }
93 } catch (RepositoryException re) {
94 throw new EclipseUiException("Cannot save properties on " + currentNode, re);
95 }
96 }
97 };
98
99 PropertyIterator pi = currentNode.getProperties();
100 while (pi.hasNext()) {
101 Property prop = pi.nextProperty();
102 addPropertyLine(parent, part, prop);
103 }
104 getManagedForm().addPart(part);
105 } catch (RepositoryException re) {
106 throw new EclipseUiException("Cannot display properties for " + currentNode, re);
107 }
108 }
109
110 private void addPropertyLine(Composite parent, AbstractFormPart part, Property prop) {
111 try {
112 tk.createLabel(parent, prop.getName());
113 tk.createLabel(parent, "[" + JcrUtils.getPropertyDefinitionAsString(prop) + "]");
114
115 if (prop.getDefinition().isProtected()) {
116 tk.createLabel(parent, formatReadOnlyPropertyValue(prop));
117 } else
118 addModifyableValueWidget(parent, part, prop);
119 } catch (RepositoryException re) {
120 throw new EclipseUiException("Cannot display property " + prop, re);
121 }
122 }
123
124 private String formatReadOnlyPropertyValue(Property prop) throws RepositoryException {
125 String strValue;
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());
132 else
133 strValue = prop.getValue().getString();
134 return strValue;
135 }
136
137 private Control addModifyableValueWidget(Composite parent, AbstractFormPart part, Property prop)
138 throws RepositoryException {
139 GridData gd;
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);
147 } else {
148 // unsupported property type for editing, we create a read only
149 // label.
150 return tk.createLabel(parent, formatReadOnlyPropertyValue(prop));
151 }
152 return null;
153 }
154
155 private class ModifiedFieldListener implements ModifyListener {
156 private static final long serialVersionUID = 2117484480773434646L;
157 private AbstractFormPart formPart;
158
159 public ModifiedFieldListener(AbstractFormPart generalPart) {
160 this.formPart = generalPart;
161 }
162
163 public void modifyText(ModifyEvent e) {
164 formPart.markDirty();
165 }
166 }
167 }