/*******************************************************************************
* Copyright (c) 2014 BREDEX GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* BREDEX GmbH - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.jubula.client.toolkit.ui.view;
import java.util.Iterator;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.jubula.client.core.utils.StringHelper;
import org.eclipse.jubula.client.ui.constants.IconConstants;
import org.eclipse.jubula.client.ui.filter.JBPatternFilter;
import org.eclipse.jubula.client.ui.rcp.filter.JBFilteredTree;
import org.eclipse.jubula.client.ui.rcp.provider.contentprovider.AbstractTreeViewContentProvider;
import org.eclipse.jubula.client.ui.rcp.provider.labelprovider.GeneralLabelProvider;
import org.eclipse.jubula.client.ui.utils.LayoutUtil;
import org.eclipse.jubula.toolkit.common.xml.businessprocess.ComponentBuilder;
import org.eclipse.jubula.tools.internal.i18n.CompSystemI18n;
import org.eclipse.jubula.tools.internal.xml.businessmodell.Action;
import org.eclipse.jubula.tools.internal.xml.businessmodell.CompSystem;
import org.eclipse.jubula.tools.internal.xml.businessmodell.Component;
import org.eclipse.jubula.tools.internal.xml.businessmodell.ConcreteComponent;
import org.eclipse.jubula.tools.internal.xml.businessmodell.Param;
import org.eclipse.jubula.tools.internal.xml.businessmodell.ParamValueSet;
import org.eclipse.jubula.tools.internal.xml.businessmodell.ToolkitDescriptor;
import org.eclipse.jubula.tools.internal.xml.businessmodell.ValueSetElement;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.part.ViewPart;
/**
* @author BREDEX GmbH
*/
public class ToolkitOverView extends ViewPart {
/**
* @author BREDEX GmbH
*/
private final class OverViewLabelProvider extends
GeneralLabelProvider {
/** {@inheritDoc} */
public String getText(Object element) {
final StringHelper sh = StringHelper.getInstance();
if (element instanceof ToolkitDescriptor) {
ToolkitDescriptor toolkitDescriptor =
(ToolkitDescriptor) element;
StringBuilder sb = new StringBuilder(
toolkitDescriptor.getName());
final String parent = toolkitDescriptor.getIncludes();
if (!StringUtils.isBlank(parent)) {
final ToolkitDescriptor parentDescriptor = COMP_SYSTEM
.getToolkitDescriptor(parent);
if (parentDescriptor != null) {
sb.append(" --> ").append(parentDescriptor.getName()); //$NON-NLS-1$
}
}
return sb.toString();
} else if (element instanceof Component) {
Component component = (Component) element;
StringBuilder sb = new StringBuilder(sh.get(
component.getType(), true));
if (component instanceof ConcreteComponent) {
ConcreteComponent concreteComponent =
(ConcreteComponent) component;
final String componentClass =
concreteComponent.getComponentClass().getName();
if (!StringUtils.isBlank(componentClass)) {
sb.append(" - ").append(componentClass); //$NON-NLS-1$
}
}
String description = component.getDescriptionKey();
if (description != null) {
sb.append(" (" + CompSystemI18n.getString(description) + ")"); //$NON-NLS-1$ //$NON-NLS-2$
}
final String since = component.getSince();
if (!StringUtils.isBlank(since)) {
sb.append(" @since ").append(since); //$NON-NLS-1$
}
return sb.toString();
} else if (element instanceof Action) {
Action action = (Action) element;
String description = action.getDescriptionKey();
if (description != null) {
return sh.get(action.getName(), true) + " (" //$NON-NLS-1$
+ CompSystemI18n.getString(description) + ")"; //$NON-NLS-1$
}
return sh.get(action.getName(), true);
} else if (element instanceof Param) {
Param param = (Param) element;
StringBuilder sb = new StringBuilder();
if (param.isOptional()) {
sb.append("optional: "); //$NON-NLS-1$
}
sb.append(CompSystemI18n.getString(param.getType())).append(" : "); //$NON-NLS-1$;
sb.append(sh.get(param.getName(), true));
if (param.hasValueSet()) {
sb.append(" ["); //$NON-NLS-1$
ParamValueSet valueSet = param.getValueSet();
Iterator<ValueSetElement> iterator = valueSet.iterator();
while (iterator.hasNext()) {
sb.append(CompSystemI18n.getString(iterator.next()
.getValue(), true));
if (iterator.hasNext()) {
sb.append(", "); //$NON-NLS-1$
}
}
sb.append("]"); //$NON-NLS-1$
}
String description = param.getDescriptionKey();
if (description != null) {
sb.append(" (" + CompSystemI18n.getString(description) + ")"); //$NON-NLS-1$ //$NON-NLS-2$
}
return sb.toString();
}
return super.getText(element);
}
/** {@inheritDoc} */
public Image getImage(Object element) {
if (element instanceof ToolkitDescriptor) {
return IconConstants.CATEGORY_IMAGE;
}
if (element instanceof Component) {
if (element instanceof ConcreteComponent) {
ConcreteComponent concreteComponent =
(ConcreteComponent) element;
final String componentClass =
concreteComponent.getComponentClass().getName();
if (!StringUtils.isBlank(componentClass)) {
return IconConstants.TECHNICAL_NAME_IMAGE;
}
}
return IconConstants.LOGICAL_NAME_IMAGE;
}
if (element instanceof Action) {
return IconConstants.CAP_IMAGE;
}
if (element instanceof Param) {
return IconConstants.UP_ARROW_DIS_IMAGE;
}
return null;
}
@Override
public Color getForeground(Object element) {
if (element instanceof ConcreteComponent) {
ConcreteComponent concreteComponent =
(ConcreteComponent) element;
if (!concreteComponent.isSupported()) {
return LayoutUtil.GRAY_COLOR;
}
}
return super.getForeground(element);
}
}
/**
* @author BREDEX GmbH
*/
private final class OverViewContentProvider extends
AbstractTreeViewContentProvider {
/** {@inheritDoc} */
public Object[] getChildren(Object parent) {
if (parent instanceof CompSystem) {
CompSystem compSystem = (CompSystem) parent;
return compSystem.getAllToolkitDescriptors()
.toArray();
}
if (parent instanceof ToolkitDescriptor) {
ToolkitDescriptor toolkitDescriptor =
(ToolkitDescriptor) parent;
return COMP_SYSTEM.getComponents(
toolkitDescriptor.getToolkitID(), true).toArray();
}
if (parent instanceof Component) {
Component component = (Component) parent;
return component.getActions().toArray();
}
if (parent instanceof Action) {
Action action = (Action) parent;
return action.getParams().toArray();
}
return ArrayUtils.EMPTY_OBJECT_ARRAY;
}
/** {@inheritDoc} */
public Object getParent(Object element) {
return null;
}
}
/** the component system instance */
private static final CompSystem COMP_SYSTEM = ComponentBuilder
.getInstance().getCompSystem();
/** the viewer */
private TreeViewer m_viewer;
/** Constructor */
public ToolkitOverView() {
}
/** {@inheritDoc} */
public void createPartControl(Composite parent) {
final FilteredTree ft = new JBFilteredTree(parent, SWT.MULTI
| SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER, new JBPatternFilter(),
true);
setTreeViewer(ft.getViewer());
final TreeViewer treeViewer = getTreeViewer();
treeViewer.setContentProvider(new OverViewContentProvider());
treeViewer.setLabelProvider(new OverViewLabelProvider());
treeViewer.setSorter(new ViewerSorter());
treeViewer.setInput(COMP_SYSTEM);
getSite().setSelectionProvider(treeViewer);
}
/**
* @return the tree viewer
*/
private TreeViewer getTreeViewer() {
return m_viewer;
}
/**
* @param viewer
* the tree viewer
*/
private void setTreeViewer(TreeViewer viewer) {
m_viewer = viewer;
}
/** {@inheritDoc} */
public void setFocus() {
getTreeViewer().getTree().setFocus();
}
}