/******************************************************************************* * Copyright (c) 2009 EclipseSource 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: * EclipseSource - initial API and implementation ******************************************************************************/ package org.eclipse.rap.examples.pages; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.viewers.*; import org.eclipse.rap.examples.IExamplePage; import org.eclipse.rwt.graphics.Graphics; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.*; public class TreeViewerExample implements IExamplePage { public void createControl( final Composite parent ) { parent.setLayout( ExampleUtil.createGridLayout( 1, false, 10, 20 ) ); Composite composite = new Composite( parent, SWT.NONE ); composite.setLayout( new GridLayout() ); composite.setLayoutData( new GridData( SWT.FILL, SWT.TOP, true, false ) ); final Tree tree = new Tree( composite, SWT.BORDER ); GridData layoutData = new GridData( GridData.FILL_BOTH ); layoutData.minimumHeight = 250; tree.setLayoutData( layoutData ); TreeColumn column1 = new TreeColumn( tree, SWT.LEFT ); column1.setText( "City" ); column1.setWidth( 175 ); TreeColumn column2 = new TreeColumn( tree, SWT.CENTER ); column2.setText( "Timezone" ); column2.setWidth( 75 ); TreeColumn column3 = new TreeColumn( tree, SWT.CENTER ); column3.setText( "Offset" ); column3.setWidth( 75 ); tree.setLinesVisible( true ); tree.setHeaderVisible( true ); TreeViewer viewer = new TreeViewer( tree ); viewer.setContentProvider( new ExampleContentProvider() ); viewer.setLabelProvider( new ExampleLabelProvider() ); viewer.setInput( createDummyModel() ); viewer.expandAll(); } private static TreeObject createDummyModel() { TreeObject result = new TreeObject( "" ); TreeObject asia = new TreeObject( "Asia" ); result.addChild( asia ); asia.addChild( new City( "Hong Kong", "HKT", +8 ) ); asia.addChild( new City( "Tokyo", "JST", +9 ) ); TreeObject europe = new TreeObject( "Europe" ); result.addChild( europe ); europe.addChild( new City( "Lisbon", "WET", 0 ) ); europe.addChild( new City( "Berlin", "CET", +1 ) ); europe.addChild( new City( "Sofia", "EET", +2 ) ); europe.addChild( new City( "Moscow", "MT", +3 ) ); TreeObject northAmerica = new TreeObject( "North America" ); result.addChild( northAmerica ); northAmerica.addChild( new City( "New York", "EST", -5 ) ); northAmerica.addChild( new City( "Chicago", "CST", -6 ) ); northAmerica.addChild( new City( "Los Angeles", "PST", -8 ) ); northAmerica.addChild( new City( "Anchorage, Alaska", "AKST", -9 ) ); return result; } static class TreeObject { private TreeObject parent; private final List children; public final String name; public TreeObject( final String name ) { this.name = name; children = new ArrayList(); } public void setParent( final TreeObject parent ) { this.parent = parent; } public TreeObject getParent() { return parent; } public void addChild( final TreeObject child ) { children.add( child ); child.setParent( this ); } public void removeChild( final TreeObject child ) { children.remove( child ); child.setParent( null ); } public TreeObject[] getChildren() { TreeObject[] result = new TreeObject[ children.size() ]; children.toArray( result ); return result; } public boolean hasChildren() { return children.size() > 0; } public String toString() { return name; } } static class City extends TreeObject { public final String tz; public final int offset; public City( final String name, final String tz, final int offset ) { super( name ); this.tz = tz; this.offset = offset; } } static final class ExampleLabelProvider extends CellLabelProvider { Image image1 = Graphics.getImage( "resources/world.gif", getClass().getClassLoader() ); Image image2 = Graphics.getImage( "resources/greendot.gif", getClass().getClassLoader() ); public void update( final ViewerCell cell ) { TreeObject object = ( TreeObject )cell.getElement(); int columnIndex = cell.getColumnIndex(); switch( columnIndex ) { case 0: cell.setText( object.name ); cell.setImage( object.hasChildren() ? image1 : image2 ); break; case 1: if( object instanceof City ) { City city = ( City )object; cell.setText( city.tz ); } break; case 2: if( object instanceof City ) { City city = ( City )object; cell.setText( "UTC " + ( city.offset >= 0 ? "-" : "" ) + String.valueOf( city.offset ) ); } break; } } } static class ExampleContentProvider implements IStructuredContentProvider, ITreeContentProvider { public void inputChanged( final Viewer v, final Object oldInput, final Object newInput ) { // TODO } public void dispose() { // TODO } public Object[] getElements( final Object parent ) { return getChildren( parent ); } public Object getParent( final Object child ) { if( child instanceof City ) { return ( ( City )child ).getParent(); } return null; } public Object[] getChildren( final Object parent ) { if( parent instanceof TreeObject ) { return ( ( TreeObject )parent ).getChildren(); } return new Object[ 0 ]; } public boolean hasChildren( final Object parent ) { if( parent instanceof TreeObject ) { return ( ( TreeObject )parent ).hasChildren(); } return false; } } }