/*******************************************************************************
* Copyright (c) 2006, 2007 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
*******************************************************************************/
package org.eclipse.jface.snippets.viewers;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.text.TextPresentation;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ITableColorProvider;
import org.eclipse.jface.viewers.ITableFontProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StyleRangeLabelProvider;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
/**
* A TableViewer using a StyleRangeLabelProvider to show some of the posibilities:
*
* - placing the image provided by the label provider anywhere in the label
* - multi-line labels (currently only by placing line breaks in the label)
* - multi font labels
* - multi colored labels
*
*
* @author Michael Krkoska
*/
public class Snippet042StyleRangeProviderFull {
private static final String[] TEXT = new String[] {
"TextStyle defines a set of styles that can be\n" +
"applied to a range of text. The hashCode() method\n" +
"in this class uses the values of the public fields to",
"compute the hash value.\uFFFC When storing instances\n" +
"of the class in hashed collections do not modify\n" +
"these fields after the object has been inserted.",
"Application code does not need to explicitly\n" +
"release the resources managed and thus no\n" +
"dispose() method is provided.\uFFFC", };
private static final Pattern METHODS = Pattern.compile("\\w+\\(\\)");
private static final int SHELL_WIDTH = 640;
private static final Display DISPLAY = Display.getDefault();
private static int IMAGE_SIZE = 16;
private static final Image IMAGE1 = new Image(DISPLAY, DISPLAY.getSystemImage(SWT.ICON_WARNING).getImageData().scaledTo(IMAGE_SIZE, IMAGE_SIZE));
private static final Image IMAGE2 = new Image(DISPLAY, DISPLAY.getSystemImage(SWT.ICON_ERROR).getImageData().scaledTo(IMAGE_SIZE, IMAGE_SIZE));
public static void main( String[] args ) {
Shell shell = new Shell(DISPLAY, SWT.CLOSE);
shell.setSize(SHELL_WIDTH, 300);
shell.setLayout(new GridLayout(2, false));
Snippet042StyleRangeProviderFull example = new Snippet042StyleRangeProviderFull();
example.createPartControl(shell);
shell.open();
while ( !shell.isDisposed() ) {
if ( !DISPLAY.readAndDispatch() ) {
DISPLAY.sleep();
}
}
DISPLAY.dispose();
}
private TableViewer viewer;
private Text text;
public Snippet042StyleRangeProviderFull() {
int defaultSize = JFaceResources.getDefaultFontDescriptor().getFontData()[0].getHeight();
JFaceResources.getFontRegistry().put("Courier", new FontData[] { new FontData("Courier New", defaultSize, SWT.NORMAL) });
FontData[] fontData = JFaceResources.getFontRegistry().defaultFontDescriptor().getFontData();
fontData[0].setHeight(fontData[0].getHeight() + 2);
JFaceResources.getFontRegistry().put("BiggerDefault", fontData);
}
public void createPartControl( Composite parent ) {
Label label = new Label(parent, SWT.NONE);
label.setText("type something here:");
text = new Text(parent, SWT.NONE);
text.setText("hash");
text.setSelection(0, 4);
text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
text.addListener(SWT.Modify, new Listener() {
public void handleEvent( Event event ) {
viewer.refresh();
}
});
// SWT.FULL_SELECTION is needed on win32 as long as Bug 168807 exists
viewer = new TableViewer(parent, SWT.FULL_SELECTION);
GridData data = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
data.horizontalSpan = 2;
viewer.getControl().setLayoutData(data);
viewer.setContentProvider(new ArrayContentProvider());
createColumns();
viewer.setLabelProvider(new MyStyleRangeLabelProvider(new MyLabelProvider()));
StyleRangeLabelProvider.setUpOwnerDraw(viewer);
viewer.setInput(TEXT);
}
private void createColumns() {
TableLayout layout = new TableLayout();
viewer.getTable().setLayout(layout);
viewer.getTable().setHeaderVisible(true);
viewer.getTable().setLinesVisible(true);
int width = SHELL_WIDTH - 2 * 5 - viewer.getTable().getShell().computeTrim(0, 0, 0, 0).width;
int width1 = width / 2;
int width2 = width - width1;
TableColumn tc = new TableColumn(viewer.getTable(), SWT.NONE);
tc.setText("col1");
layout.addColumnData(new ColumnPixelData(width1));
tc = new TableColumn(viewer.getTable(), SWT.NONE);
tc.setText("col2");
layout.addColumnData(new ColumnPixelData(width2));
}
private final class MyLabelProvider extends LabelProvider implements ITableLabelProvider, ITableColorProvider, ITableFontProvider {
public Color getBackground( Object element, int columnIndex ) {
return null;
}
public Image getColumnImage( Object element, int columnIndex ) {
return columnIndex == 0 ? IMAGE1 : IMAGE2;
}
public String getColumnText( Object element, int columnIndex ) {
return element.toString();
}
public Font getFont( Object element, int columnIndex ) {
if ( element == TEXT[(columnIndex + 2) % 3] ) {
return JFaceResources.getFont("BiggerDefault");
}
return null;
}
public Color getForeground( Object element, int columnIndex ) {
if ( element == TEXT[columnIndex + 1] ) {
return DISPLAY.getSystemColor(SWT.COLOR_DARK_RED);
}
return null;
}
}
private final class MyStyleRangeLabelProvider extends StyleRangeLabelProvider {
private MyStyleRangeLabelProvider( ILabelProvider labelProvider ) {
super(labelProvider);
}
public StyleRange[] getStyleRanges( Object element, int columnIndex, String label ) {
String searchText = text.getText();
TextPresentation tp = new TextPresentation();
if ( searchText.length() > 0 ) {
Color yellow = text.getDisplay().getSystemColor(SWT.COLOR_YELLOW);
int index = -1;
while ( (index = label.indexOf(searchText, index + 1)) >= 0 ) {
StyleRange styleRange = new StyleRange(index, searchText.length(), null, yellow);
tp.mergeStyleRange(styleRange);
}
}
Font courier = JFaceResources.getFont("Courier");
Matcher matcher = METHODS.matcher(label);
while ( matcher.find() ) {
StyleRange styleRange = new StyleRange(matcher.start(), matcher.end() - matcher.start(), null, null);
styleRange.font = courier;
tp.mergeStyleRange(styleRange);
}
List ranges = new ArrayList();
for ( Iterator iterator = tp.getAllStyleRangeIterator(); iterator.hasNext(); ) {
ranges.add(iterator.next());
}
return (StyleRange[])ranges.toArray(new StyleRange[ranges.size()]);
}
}
}