View Javadoc
1   package org.argeo.connect.e4.resources.parts;
2   
3   import javax.jcr.Node;
4   import javax.jcr.Property;
5   import javax.jcr.PropertyIterator;
6   import javax.jcr.RepositoryException;
7   import javax.jcr.Session;
8   import javax.jcr.nodetype.NodeType;
9   
10  import org.apache.commons.logging.Log;
11  import org.apache.commons.logging.LogFactory;
12  import org.argeo.cms.ui.eclipse.forms.AbstractFormPart;
13  import org.argeo.connect.ConnectException;
14  import org.argeo.connect.e4.parts.AbstractConnectCTabEditor;
15  import org.argeo.connect.resources.ResourcesNames;
16  import org.argeo.connect.ui.util.LazyCTabControl;
17  import org.argeo.connect.util.ConnectJcrUtils;
18  import org.argeo.eclipse.ui.EclipseUiUtils;
19  import org.eclipse.jface.viewers.ColumnLabelProvider;
20  import org.eclipse.rap.rwt.RWT;
21  import org.eclipse.swt.SWT;
22  import org.eclipse.swt.custom.CTabFolder;
23  import org.eclipse.swt.layout.GridLayout;
24  import org.eclipse.swt.widgets.Composite;
25  import org.eclipse.swt.widgets.Label;
26  
27  /**
28   * Enable management of a given node template, among other static list
29   * (catalogue) management
30   */
31  public class TemplateEditor extends AbstractConnectCTabEditor {
32  
33  	final static Log log = LogFactory.getLog(TemplateEditor.class);
34  //	public final static String ID = ConnectUiPlugin.PLUGIN_ID + ".templateEditor";
35  
36  	// Context
37  	private Node nodeTemplate;
38  
39  	public void init() {
40  		super.init();
41  		nodeTemplate = getNode();
42  		// TODO workaround to manually add missing mixin
43  		try {
44  			if (!nodeTemplate.isNodeType(NodeType.MIX_VERSIONABLE))
45  				nodeTemplate.addMixin(NodeType.MIX_VERSIONABLE);
46  			if (!nodeTemplate.isNodeType(NodeType.MIX_LAST_MODIFIED))
47  				nodeTemplate.addMixin(NodeType.MIX_LAST_MODIFIED);
48  			Session session = nodeTemplate.getSession();
49  			if (session.hasPendingChanges()) {
50  				session.save();
51  				log.warn("Versionable and last modified mixins " + "have been added to " + nodeTemplate);
52  			}
53  		} catch (RepositoryException e) {
54  			throw new ConnectException("Unable to add missing mixins for node template: " + nodeTemplate, e);
55  		}
56  
57  		String shortName = getResourcesService()
58  				.getItemDefaultEnLabel(ConnectJcrUtils.get(nodeTemplate, ResourcesNames.RESOURCES_TEMPLATE_ID));
59  		setPartName(shortName);
60  	}
61  
62  	protected void populateTabFolder(CTabFolder folder) {
63  		String tooltip;
64  		try {
65  			PropertyIterator pit = nodeTemplate.getProperties();
66  
67  			loop: while (pit.hasNext()) {
68  				Property property = pit.nextProperty();
69  				String propName = property.getName();
70  
71  				// TODO make this more robust
72  				if (!property.isMultiple() || propName.startsWith("jcr:"))
73  					continue loop;
74  				// TODO enhance
75  				String propLabel = propName;
76  
77  				tooltip = "Manage and edit the \"" + propLabel + "\" catalogue";
78  				LazyCTabControl oneBusinessPropertyCatalogue = new TemplateValueCatalogue(folder, SWT.NO_FOCUS, this,
79  						getResourcesService(), getSystemWorkbenchService(), nodeTemplate, propName,
80  						ConnectJcrUtils.get(nodeTemplate, ResourcesNames.RESOURCES_TEMPLATE_ID));
81  				oneBusinessPropertyCatalogue.setLayoutData(EclipseUiUtils.fillAll());
82  				addLazyTabToFolder(folder, oneBusinessPropertyCatalogue, propLabel,
83  						TemplateValueCatalogue.CTAB_ID + "/" + propName, tooltip);
84  			}
85  		} catch (RepositoryException e) {
86  			throw new ConnectException("unable to create property " + "tabs for node template " + nodeTemplate, e);
87  		}
88  	}
89  
90  	@Override
91  	protected void populateHeader(final Composite parent) {
92  		try {
93  			parent.setLayout(new GridLayout());
94  			final Label editionInfoROLbl = getManagedForm().getToolkit().createLabel(parent, "", SWT.WRAP);
95  			editionInfoROLbl.setData(RWT.MARKUP_ENABLED, Boolean.TRUE);
96  			final ColumnLabelProvider festivalLP = new EditionOLP();
97  
98  			final AbstractFormPart editPart = new AbstractFormPart() {
99  				// Update values on refresh
100 				public void refresh() {
101 					super.refresh();
102 					String roText = festivalLP.getText(nodeTemplate);
103 					editionInfoROLbl.setText(roText);
104 					parent.layout();
105 				}
106 			};
107 			editPart.initialize(getManagedForm());
108 			getManagedForm().addPart(editPart);
109 		} catch (Exception e) {
110 			throw new ConnectException("Cannot create main info section", e);
111 		}
112 	}
113 
114 	@Override
115 	protected boolean showDeleteButton() {
116 		return false;
117 	}
118 
119 	private class EditionOLP extends ColumnLabelProvider {
120 
121 		private static final long serialVersionUID = 1L;
122 
123 		@Override
124 		public String getText(Object element) {
125 			Node node = (Node) element;
126 			StringBuilder builder = new StringBuilder();
127 			builder.append("<span style='font-size:15px;'>");
128 			builder.append("<b><big>");
129 			builder.append(ConnectJcrUtils.get(node, ResourcesNames.RESOURCES_TEMPLATE_ID));
130 			builder.append("</big></b> ");
131 			builder.append("</span>");
132 			return builder.toString();
133 		}
134 	}
135 }