/*
* Copyright (C) 2007-2012 Mathieu Baudier
*
* 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.slc.client.ui.dist.editors;
import java.util.ArrayList;
import java.util.List;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.Property;
import javax.jcr.PropertyIterator;
import javax.jcr.RepositoryException;
import javax.jcr.Value;
import javax.jcr.nodetype.NodeType;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.argeo.ArgeoException;
import org.argeo.slc.client.ui.dist.DistImages;
import org.argeo.slc.client.ui.dist.utils.DistUiHelpers;
import org.argeo.slc.client.ui.dist.utils.GenericDoubleClickListener;
import org.argeo.slc.jcr.SlcNames;
import org.argeo.slc.jcr.SlcTypes;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
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.FormToolkit;
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 ArtifactDetailsPage extends FormPage implements SlcNames, SlcTypes {
private final static Log log = LogFactory.getLog(ArtifactDetailsPage.class);
// Main business Objects
private Node currentNode;
// This page widgets
private FormToolkit tk;
private TreeViewer complexTree;
private Text mavenSnippet;
public ArtifactDetailsPage(FormEditor editor, String title, Node currentNode) {
super(editor, "id", title);
this.currentNode = currentNode;
}
protected void createFormContent(IManagedForm managedForm) {
tk = managedForm.getToolkit();
ScrolledForm form = managedForm.getForm();
GridLayout layout = new GridLayout(1, false);
layout.marginWidth = 5;
form.getBody().setLayout(layout);
complexTree = createComplexTree(form.getBody());
createMavenSnipet(form.getBody());
}
private TreeViewer createComplexTree(Composite parent) {
int style = SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION;
Tree tree = new Tree(parent, style);
GridData gd = new GridData(GridData.FILL_BOTH);
gd.grabExcessHorizontalSpace = true;
gd.grabExcessVerticalSpace = true;
tree.setLayoutData(gd);
createColumn(tree, "Attribute", SWT.LEFT, 200);
createColumn(tree, "Value", SWT.LEFT, 200);
tree.setLinesVisible(true);
tree.setHeaderVisible(true);
TreeViewer result = new TreeViewer(tree);
result.setContentProvider(new TreeContentProvider());
result.setLabelProvider(new TreeLabelProvider());
result.setInput(currentNode);
result.expandToLevel(2);
result.addDoubleClickListener(new GenericDoubleClickListener(result));
// result.expandAll();
return result;
}
private void createMavenSnipet(Composite parent) {
mavenSnippet = new Text(parent, SWT.MULTI | SWT.WRAP | SWT.BORDER);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.grabExcessHorizontalSpace = true;
gd.heightHint = 75;
mavenSnippet.setLayoutData(gd);
mavenSnippet.setText(generateXmlSnippet());
}
// Helpers
private String generateXmlSnippet() {
try {
StringBuffer sb = new StringBuffer();
sb.append("\n");
sb.append("\t");
sb.append(currentNode.getProperty(SLC_GROUP_ID).getString());
sb.append("\n");
sb.append("\t");
sb.append(currentNode.getProperty(SLC_ARTIFACT_ID).getString());
sb.append("\n");
sb.append("\t");
sb.append(currentNode.getProperty(SLC_ARTIFACT_VERSION).getString());
sb.append("\n");
sb.append("");
return sb.toString();
} catch (RepositoryException re) {
throw new ArgeoException(
"unexpected error while generating maven snippet");
}
}
private static TreeColumn createColumn(Tree parent, String name, int style,
int width) {
TreeColumn result = new TreeColumn(parent, style);
result.setText(name);
result.setWidth(width);
result.setMoveable(true);
result.setResizable(true);
return result;
}
// View specific object
private class ViewSpecificItems {
private String key;
private Object value;
private boolean isFolder;
private Node curNode;
public ViewSpecificItems(String key, Object value, boolean isFolder) {
this.key = key;
this.value = value;
this.isFolder = isFolder;
}
public String getKey() {
return key;
}
public void setNode(Node node) {
this.curNode = node;
}
public Node getNode() {
return curNode;
}
public Object getValue() {
return value;
}
public boolean isFolder() {
return isFolder;
}
}
// providers
private class TreeLabelProvider extends ColumnLabelProvider implements
SlcTypes, SlcNames {
public void update(ViewerCell cell) {
try {
int colIndex = cell.getColumnIndex();
Object element = cell.getElement();
if (element instanceof Property) {
Property prop = (Property) element;
if (colIndex == 0)
cell.setText(DistUiHelpers.getLabelJcrName(prop
.getName()));
else if (colIndex == 1)
cell.setText(DistUiHelpers.formatValueAsString(prop
.getValue()));
} else if (element instanceof ViewSpecificItems) {
if (colIndex == 0)
cell.setText(((ViewSpecificItems) element).getKey());
else if (colIndex == 1)
cell.setText(DistUiHelpers
.formatAsString(((ViewSpecificItems) element)
.getValue()));
} else if (element instanceof Node) {
Node node = (Node) element;
if (colIndex == 0) {
if (node.isNodeType(NodeType.NT_FILE)) {
cell.setImage(DistImages.IMG_FILE);
cell.setText(node.getName());
} else if (node.isNodeType(SLC_IMPORTED_PACKAGE))
cell.setText("Import package");
else if (node.isNodeType(SLC_EXPORTED_PACKAGE))
cell.setText("Export package");
} else if (colIndex == 1) {
if (node.isNodeType(SLC_ARTIFACT)) {
StringBuffer sb = new StringBuffer("");
if (node.hasProperty(SLC_ARTIFACT_CLASSIFIER)) {
sb.append(node.getProperty(
SLC_ARTIFACT_CLASSIFIER).getString());
sb.append(" ");
}
if (node.hasProperty(SLC_ARTIFACT_EXTENSION))
sb.append(node.getProperty(
SLC_ARTIFACT_EXTENSION).getString());
cell.setText(sb.toString());
} else if (node.isNodeType(SLC_IMPORTED_PACKAGE)
|| node.isNodeType(SLC_EXPORTED_PACKAGE))
cell.setText(node.getProperty(SLC_NAME).getString());
}
}
} catch (RepositoryException e) {
throw new ArgeoException(
"unexpected error while getting artifact information",
e);
}
}
}
private class TreeContentProvider implements ITreeContentProvider {
public Object[] getElements(Object parent) {
List