/* * Copyright (C) 2007-2012 Argeo GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.argeo.cms.ui.workbench.internal.jcr.parts; import java.util.ArrayList; import java.util.List; import javax.jcr.Node; import javax.jcr.Property; import javax.jcr.PropertyIterator; import javax.jcr.RepositoryException; import javax.jcr.Value; import org.argeo.cms.ui.workbench.WorkbenchUiPlugin; import org.argeo.cms.ui.workbench.internal.WorkbenchConstants; import org.argeo.cms.ui.workbench.internal.jcr.PropertyLabelProvider; import org.argeo.eclipse.ui.EclipseUiException; import org.eclipse.jface.layout.TreeColumnLayout; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeColumn; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.editor.FormPage; import org.eclipse.ui.forms.widgets.ScrolledForm; /** * Generic editor property page. Lists all properties of current node as a * complex tree. TODO: enable editing */ public class GenericPropertyPage extends FormPage implements WorkbenchConstants { // private final static Log log = // LogFactory.getLog(GenericPropertyPage.class); // Main business Objects private Node currentNode; public GenericPropertyPage(FormEditor editor, String title, Node currentNode) { super(editor, "id", title); this.currentNode = currentNode; } protected void createFormContent(IManagedForm managedForm) { ScrolledForm form = managedForm.getForm(); form.setText(WorkbenchUiPlugin.getMessage("genericNodePageTitle")); Composite body = form.getBody(); FillLayout layout = new FillLayout(); layout.marginHeight = 5; layout.marginWidth = 5; body.setLayout(layout); createComplexTree(body); // TODO TreeColumnLayout triggers a scroll issue with the form: // The inside body is always to big and a scroll bar is shown // Composite tableCmp = new Composite(body, SWT.NO_FOCUS); // createComplexTree(tableCmp); } private TreeViewer createComplexTree(Composite parent) { int style = SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION; Tree tree = new Tree(parent, style); TreeColumnLayout tableColumnLayout = new TreeColumnLayout(); createColumn(tree, tableColumnLayout, "Property", SWT.LEFT, 200, 30); createColumn(tree, tableColumnLayout, "Value(s)", SWT.LEFT, 300, 60); createColumn(tree, tableColumnLayout, "Attributes", SWT.LEFT, 75, 0); // Do not apply the treeColumnLayout it does not work yet // parent.setLayout(tableColumnLayout); tree.setLinesVisible(true); tree.setHeaderVisible(true); TreeViewer treeViewer = new TreeViewer(tree); treeViewer.setContentProvider(new TreeContentProvider()); treeViewer.setLabelProvider(new PropertyLabelProvider()); treeViewer.setInput(currentNode); treeViewer.expandAll(); return treeViewer; } private static TreeColumn createColumn(Tree parent, TreeColumnLayout tableColumnLayout, String name, int style, int width, int weight) { TreeColumn column = new TreeColumn(parent, style); column.setText(name); column.setWidth(width); column.setMoveable(true); column.setResizable(true); tableColumnLayout.setColumnData(column, new ColumnWeightData(weight, width, true)); return column; } // // private void createPropertiesPart(Composite parent) { // try { // // PropertyIterator pi = currentNode.getProperties(); // // // Initializes form part // AbstractFormPart part = new AbstractFormPart() { // public void commit(boolean onSave) { // try { // if (onSave) { // ListIterator it = modifyableProperties // .listIterator(); // while (it.hasNext()) { // // we only support Text controls for the time // // being // Text curControl = (Text) it.next(); // String value = curControl.getText(); // currentNode.setProperty((String) curControl // .getData(JCR_PROPERTY_NAME), value); // } // // // We only commit when onSave = true, // // thus it is still possible to save after a tab // // change. // super.commit(onSave); // } // } catch (RepositoryException re) { // throw new EclipseUiException( // "Unexpected error while saving properties", re); // } // } // }; // // while (pi.hasNext()) { // Property prop = pi.nextProperty(); // addPropertyLine(parent, part, prop); // } // // getManagedForm().addPart(part); // } catch (RepositoryException re) { // throw new EclipseUiException( // "Error during creation of network details section", re); // } // // } // // private void addPropertyLine(Composite parent, AbstractFormPart part, // Property prop) { // try { // tk.createLabel(parent, prop.getName()); // tk.createLabel(parent, // "[" + JcrUtils.getPropertyDefinitionAsString(prop) + "]"); // // if (prop.getDefinition().isProtected()) { // tk.createLabel(parent, formatReadOnlyPropertyValue(prop)); // } else // addModifyableValueWidget(parent, part, prop); // } catch (RepositoryException re) { // throw new EclipseUiException("Cannot get property " + prop, re); // } // } // // private String formatReadOnlyPropertyValue(Property prop) { // try { // String strValue; // // if (prop.getType() == PropertyType.BINARY) // strValue = ""; // else if (prop.isMultiple()) // strValue = Arrays.asList(prop.getValues()).toString(); // else if (prop.getType() == PropertyType.DATE) // strValue = timeFormatter.format(prop.getValue().getDate() // .getTime()); // else // strValue = prop.getValue().getString(); // // return strValue; // } catch (RepositoryException re) { // throw new EclipseUiException( // "Unexpected error while formatting read only property value", // re); // } // } // // private Control addModifyableValueWidget(Composite parent, // AbstractFormPart part, Property prop) { // GridData gd; // try { // if (prop.getType() == PropertyType.STRING) { // Text txt = tk.createText(parent, prop.getString()); // gd = new GridData(GridData.FILL_HORIZONTAL); // txt.setLayoutData(gd); // txt.addModifyListener(new ModifiedFieldListener(part)); // txt.setData(JCR_PROPERTY_NAME, prop.getName()); // modifyableProperties.add(txt); // } else { // // unsupported property type for editing, we create a read only // // label. // return tk // .createLabel(parent, formatReadOnlyPropertyValue(prop)); // } // return null; // } catch (RepositoryException re) { // throw new EclipseUiException( // "Unexpected error while formatting read only property value", // re); // } // // } // Multiple Value Model // protected class MultipleValueItem { // private int index; // private Value value; // // public MultipleValueItem(int index, Value value) { // this.index = index; // this.value = value; // } // // public int getIndex() { // return index; // } // // public Object getValue() { // return value; // } // } private class TreeContentProvider implements ITreeContentProvider { private static final long serialVersionUID = -6162736530019406214L; public Object[] getElements(Object parent) { Object[] props = null; try { if (parent instanceof Node) { Node node = (Node) parent; PropertyIterator pi; pi = node.getProperties(); List propList = new ArrayList(); while (pi.hasNext()) { propList.add(pi.nextProperty()); } props = propList.toArray(); } } catch (RepositoryException e) { throw new EclipseUiException( "Unexpected exception while listing node properties", e); } return props; } public Object getParent(Object child) { return null; } public Object[] getChildren(Object parent) { Object[] result = null; if (parent instanceof Property) { Property prop = (Property) parent; try { if (prop.isMultiple()) { Value[] values = prop.getValues(); // List list = new // ArrayList(); // for (int i = 0; i < values.length; i++) { // MultipleValueItem mvi = new MultipleValueItem(i, // values[i]); // list.add(mvi); // } return values; } } catch (RepositoryException e) { throw new EclipseUiException( "Unexpected error getting multiple values property.", e); } } return result; } public boolean hasChildren(Object parent) { try { if (parent instanceof Property && ((Property) parent).isMultiple()) { return true; } } catch (RepositoryException e) { throw new EclipseUiException( "Unexpected exception while checking if property is multiple", e); } return false; } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } public void dispose() { } } }