]> git.argeo.org Git - gpl/argeo-slc.git/blob - plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/AbstractAkbNodeEditor.java
fix a few post refactoring UI Bugs
[gpl/argeo-slc.git] / plugins / org.argeo.slc.akb.ui / src / main / java / org / argeo / slc / akb / ui / editors / AbstractAkbNodeEditor.java
1 package org.argeo.slc.akb.ui.editors;
2
3 import javax.jcr.Node;
4 import javax.jcr.Property;
5 import javax.jcr.Repository;
6 import javax.jcr.RepositoryException;
7 import javax.jcr.Session;
8
9 import org.argeo.jcr.JcrUtils;
10 import org.argeo.slc.akb.AkbException;
11 import org.argeo.slc.akb.AkbService;
12 import org.argeo.slc.akb.AkbTypes;
13 import org.argeo.slc.akb.ui.AkbUiUtils;
14 import org.argeo.slc.akb.utils.AkbJcrUtils;
15 import org.eclipse.core.runtime.IProgressMonitor;
16 import org.eclipse.swt.SWT;
17 import org.eclipse.swt.layout.GridData;
18 import org.eclipse.swt.widgets.Composite;
19 import org.eclipse.ui.IEditorInput;
20 import org.eclipse.ui.IEditorSite;
21 import org.eclipse.ui.PartInitException;
22 import org.eclipse.ui.forms.IManagedForm;
23 import org.eclipse.ui.forms.editor.FormEditor;
24 import org.eclipse.ui.forms.editor.FormPage;
25 import org.eclipse.ui.forms.widgets.ScrolledForm;
26
27 /**
28 * Parent Abstract Node editor for AKB. Manage life cycle of the JCR session
29 * that is bound to it.
30 */
31 public abstract class AbstractAkbNodeEditor extends FormEditor {
32 // private final static Log log = LogFactory
33 // .getLog(AbstractEntityEditor.class);
34
35 // We use a one session per editor pattern to secure various nodes and
36 // changes life cycle
37 private Repository repository;
38 private Session session;
39 private AkbService akbService;
40
41 // Business Objects
42 private Node akbNode;
43 // a template or an active environment
44 private Node envNode;
45 // shortcut
46 private boolean isTemplate;
47
48 // Some constants
49 private final static int SHORT_NAME_LENGHT = 10;
50
51 // to implement methods
52 protected abstract String getEditorId();
53
54 protected abstract void populateMainPage(Composite parent,
55 IManagedForm managedForm);
56
57 public void init(IEditorSite site, IEditorInput input)
58 throws PartInitException {
59 setSite(site);
60 setInput(input);
61 try {
62 session = repository.login();
63 AkbNodeEditorInput anei = (AkbNodeEditorInput) getEditorInput();
64 akbNode = session.getNodeByIdentifier(anei.getIdentifier());
65 envNode = session.getNodeByIdentifier(anei.getEnvIdentifier());
66 isTemplate = envNode.isNodeType(AkbTypes.AKB_ENV_TEMPLATE);
67 updatePartNameAndToolTip();
68 } catch (RepositoryException e) {
69 throw new AkbException("Unable open editor for akb node", e);
70 }
71 }
72
73 /**
74 * Overwrite to provide a specific part Name and / or tooltip
75 */
76 protected void updatePartNameAndToolTip() {
77 String name = JcrUtils.get(akbNode, Property.JCR_TITLE);
78
79 // Name
80 if (AkbJcrUtils.checkNotEmptyString(name)) {
81 if (name.length() > SHORT_NAME_LENGHT)
82 name = name.substring(0, SHORT_NAME_LENGHT - 1) + "...";
83 setPartName(name);
84 }
85
86 // Tooltip
87 if (AkbJcrUtils.isEmptyString(name))
88 name = "current item";
89 setTitleToolTip("Display and edit " + name);
90 }
91
92 /** Overwrite to provide supplementary pages between main and history page */
93 protected void addOtherPages() throws PartInitException {
94 }
95
96 /* Pages management */
97 @SuppressWarnings("unused")
98 @Override
99 protected void addPages() {
100 try {
101 if (isTemplate)
102 addPage(new ConnectorAliasPage(this, "mainPage", "Main"));
103 // Add AKB Type specific pages
104 addOtherPages();
105 // Use this when versioning is implemented
106 // if (isTemplate)
107 if (false)
108 addPage(new HistoryPage(this, "historyPage", "History"));
109 } catch (PartInitException e) {
110 throw new AkbException("Unable to initialise pages for editor "
111 + getEditorId(), e);
112 }
113 }
114
115 /**
116 * Display and edit info
117 */
118 private class ConnectorAliasPage extends FormPage {
119
120 public ConnectorAliasPage(FormEditor editor, String id, String title) {
121 super(editor, id, title);
122 }
123
124 protected void createFormContent(IManagedForm managedForm) {
125 super.createFormContent(managedForm);
126 ScrolledForm form = managedForm.getForm();
127 form.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
128 populateMainPage(form.getBody(), managedForm);
129 }
130 }
131
132 /**
133 * Display history
134 */
135 private class HistoryPage extends FormPage {
136
137 public HistoryPage(FormEditor editor, String id, String title) {
138 super(editor, id, title);
139 }
140
141 protected void createFormContent(IManagedForm managedForm) {
142 super.createFormContent(managedForm);
143 ScrolledForm form = managedForm.getForm();
144 form.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
145 Composite parent = form.getBody();
146 parent.setLayout(AkbUiUtils.gridLayoutNoBorder());
147 getToolkit().createLabel(parent,
148 "This page will display history " + "for current AKB Node");
149 }
150 }
151
152 /* EXPOSES TO CHILDREN CLASSES */
153 protected Session getSession() {
154 return session;
155 }
156
157 protected AkbService getAkbService() {
158 return akbService;
159 }
160
161 protected Node getAkbNode() {
162 return akbNode;
163 }
164
165 protected Node getEnvNode() {
166 return envNode;
167 }
168
169 protected boolean isTemplate() {
170 return isTemplate;
171 }
172
173 /* LIFE CYCLE MANAGEMENT */
174 @Override
175 public void dispose() {
176 try {
177 // if (cNode != null)
178 // CommonsJcrUtils.cancelAndCheckin(cNode);
179 }
180
181 finally {
182 JcrUtils.logoutQuietly(session);
183 }
184 super.dispose();
185 }
186
187 @Override
188 public void doSaveAs() {
189 // unused compulsory method
190 }
191
192 @Override
193 public void doSave(IProgressMonitor monitor) {
194 try {
195 if (getSession().hasPendingChanges())
196 JcrUtils.updateLastModified(getAkbNode());
197 getSession().save();
198 updatePartNameAndToolTip();
199 this.firePropertyChange(PROP_DIRTY);
200 } catch (Exception e) {
201 throw new AkbException("Error getting session status.", e);
202 }
203 }
204
205 @Override
206 public boolean isDirty() {
207 try {
208 return session.hasPendingChanges();
209 } catch (Exception e) {
210 throw new AkbException("Error getting session status.", e);
211 }
212 }
213
214 @Override
215 public boolean isSaveAsAllowed() {
216 return false;
217 }
218
219 @Override
220 public void setFocus() {
221 }
222
223 /* DEPENDENCY INJECTION */
224 public void setRepository(Repository repository) {
225 this.repository = repository;
226 }
227
228 public void setAkbService(AkbService akbService) {
229 this.akbService = akbService;
230 }
231 }