/*******************************************************************************
* Copyright (c) 2000, 2011 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
* Red Hat, Inc.
*******************************************************************************/
package org.jboss.tools.common.text.ext.hyperlink.xpl;
import org.eclipse.jdt.ui.actions.IJavaEditorActionDefinitionIds;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.text.hyperlink.IHyperlink;
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.StyledCellLabelProvider;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.jface.viewers.StyledString.Styler;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.TextStyle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.dialogs.SearchPattern;
/**
* Show hierarchy in light-weight control.
*
* @since 3.0
*/
public class HierarchyInformationControl extends AbstractInformationControl {
private IHyperlink[] hyperlinks;
private BeanTableLabelProvider fLabelProvider;
public HierarchyInformationControl(Shell parent, String title, int shellStyle, int tableStyle, IHyperlink[] hyperlinks) {
super(parent, shellStyle, tableStyle, IJavaEditorActionDefinitionIds.OPEN_HIERARCHY, true);
this.hyperlinks = hyperlinks;
setTitleText(title);
}
/**
* {@inheritDoc}
*/
@Override
protected boolean hasHeader() {
return true;
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.ui.text.JavaOutlineInformationControl#createTableViewer(org.eclipse.swt.widgets.Composite, int)
*/
@Override
protected TableViewer createTableViewer(Composite parent, int style) {
Table table = new Table(parent, SWT.SINGLE | (style & ~SWT.MULTI));
GridData gd= new GridData(GridData.FILL_BOTH);
gd.heightHint= table.getItemHeight() * 12;
table.setLayoutData(gd);
TableViewer tableViewer= new TableViewer(table);
tableViewer.addFilter(new BeanFilter());
fLabelProvider= createTableLableProvider();
tableViewer.setLabelProvider(fLabelProvider);
return tableViewer;
}
protected BeanTableLabelProvider createTableLableProvider() {
return new BeanTableLabelProvider();
}
/**
* {@inheritDoc}
*/
@Override
public void setInput(Object information) {
if(!(information instanceof IHyperlink[])){
inputChanged(null, null);
return;
}
hyperlinks = (IHyperlink[])information;
BeanTableContentProvider contentProvider= new BeanTableContentProvider(hyperlinks);
getTableViewer().setContentProvider(contentProvider);
inputChanged(hyperlinks, hyperlinks[0]);
}
/**
* {@inheritDoc}
*/
@Override
protected Object getSelectedElement() {
Object selectedElement= super.getSelectedElement();
return selectedElement;
}
@Override
protected String getId() {
return "org.jboss.tools.cdi.text.ext.InformationControl";
}
public static class BeanTableContentProvider implements IStructuredContentProvider{
private IHyperlink[] hyperlinks;
public BeanTableContentProvider(IHyperlink[] beans){
this.hyperlinks = beans;
}
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
@Override
public Object[] getElements(Object inputElement) {
return hyperlinks;
}
}
protected boolean select2(SearchPattern patternMatcher, Object element) {
return true;
}
public class BeanFilter extends ViewerFilter {
SearchPattern patternMatcher = new SearchPattern();
public boolean isConsistentItem(Object item) {
return true;
}
@Override
public boolean select(Viewer viewer, Object parentElement,
Object element) {
return select2(patternMatcher, element);
}
}
protected static Color gray = new Color(null, 128, 128, 128);
protected static Color black = Display.getDefault().getSystemColor(SWT.COLOR_INFO_FOREGROUND);
protected static Styler NAME_STYLE = new DefaultStyler(black, false);
protected static Styler PACKAGE_STYLE = new DefaultStyler(gray, false);
private static class DefaultStyler extends Styler {
private final Color foreground;
private final boolean italic;
public DefaultStyler(Color foreground, boolean italic) {
this.foreground = foreground;
this.italic = italic;
}
@Override
public void applyStyles(TextStyle textStyle) {
if (foreground != null) {
textStyle.foreground = foreground;
}
if(italic) {
textStyle.font = JFaceResources.getFontRegistry().getItalic(JFaceResources.DEFAULT_FONT);
}
}
}
protected class BeanTableLabelProvider extends StyledCellLabelProvider implements DelegatingStyledCellLabelProvider.IStyledLabelProvider {
@Override
public void update(ViewerCell cell) {
Object element = cell.getElement();
StyledString styledString = getStyledText(element);
cell.setText(styledString.getString());
cell.setStyleRanges(styledString.getStyleRanges());
cell.setImage(getImage(element));
super.update(cell);
}
public String getText(Object element) {
return getStyledText(element).getString();
}
@Override
public StyledString getStyledText(Object element) {
StyledString sb = new StyledString();
if(element instanceof IHyperlink){
sb.append(((IHyperlink)element).getHyperlinkText(), NAME_STYLE);
}
return sb;
}
@Override
public Image getImage(Object element) {
return null;
}
}
}