import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
/**
* This class demonstrates TableViewers
*/
public class PlayerTable extends ApplicationWindow {
// The data model
private PlayerTableModel model;
// The table viewer
private TableViewer tv;
/**
* Constructs a PlayerTable
*/
public PlayerTable() {
super(null);
model = new PlayerTableModel();
}
/**
* Runs the application
*/
public void run() {
// Don't return from open() until window closes
setBlockOnOpen(true);
// Open the main window
open();
// Dispose the display
Display.getCurrent().dispose();
}
/**
* Configures the shell
*
* @param shell
* the shell
*/
protected void configureShell(Shell shell) {
super.configureShell(shell);
shell.setSize(400, 400);
}
/**
* Creates the main window's contents
*
* @param parent
* the main window
* @return Control
*/
protected Control createContents(Composite parent) {
// Create the composite to hold the controls
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new GridLayout(1, false));
// Create the combo to hold the team names
Combo combo = new Combo(composite, SWT.READ_ONLY);
combo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// Create the table viewer to display the players
tv = new TableViewer(composite);
// Set the content and label providers
tv.setContentProvider(new PlayerContentProvider());
tv.setLabelProvider(new PlayerLabelProvider());
tv.setSorter(new PlayerViewerSorter());
// Set up the table
Table table = tv.getTable();
table.setLayoutData(new GridData(GridData.FILL_BOTH));
// Add the first name column
TableColumn tc = new TableColumn(table, SWT.LEFT);
tc.setText("First Name");
tc.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
((PlayerViewerSorter) tv.getSorter())
.doSort(PlayerConst.COLUMN_FIRST_NAME);
tv.refresh();
}
});
// Add the last name column
tc = new TableColumn(table, SWT.LEFT);
tc.setText("Last Name");
tc.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
((PlayerViewerSorter) tv.getSorter())
.doSort(PlayerConst.COLUMN_LAST_NAME);
tv.refresh();
}
});
// Add the points column
tc = new TableColumn(table, SWT.RIGHT);
tc.setText("Points");
tc.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
((PlayerViewerSorter) tv.getSorter())
.doSort(PlayerConst.COLUMN_POINTS);
tv.refresh();
}
});
// Add the rebounds column
tc = new TableColumn(table, SWT.RIGHT);
tc.setText("Rebounds");
tc.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
((PlayerViewerSorter) tv.getSorter())
.doSort(PlayerConst.COLUMN_REBOUNDS);
tv.refresh();
}
});
// Add the assists column
tc = new TableColumn(table, SWT.RIGHT);
tc.setText("Assists");
tc.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
((PlayerViewerSorter) tv.getSorter())
.doSort(PlayerConst.COLUMN_ASSISTS);
tv.refresh();
}
});
// Add the team names to the combo
for (int i = 0, n = model.teams.length; i < n; i++) {
combo.add(model.teams[i].getName());
}
// Add a listener to change the tableviewer's input
combo.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
update(model.teams[((Combo) event.widget).getSelectionIndex()]);
}
});
// Select the first item
combo.select(0);
update(model.teams[0]);
// Pack the columns
for (int i = 0, n = table.getColumnCount(); i < n; i++) {
table.getColumn(i).pack();
}
// Turn on the header and the lines
table.setHeaderVisible(true);
table.setLinesVisible(true);
return composite;
}
/**
* Updates the application with the selected team
*
* @param team
* the team
*/
private void update(Team team) {
// Update the window's title bar with the new team
getShell().setText(team.getYear() + " " + team.getName());
// Set the table viewer's input to the team
tv.setInput(team);
}
/**
* The application entry point
*
* @param args
* the command line arguments
*/
public static void main(String[] args) {
new PlayerTable().run();
}
}
/**
* This class contains the data model for the PlayerTable
*/
class PlayerTableModel {
public Team[] teams;
/**
* Constructs a PlayerTableModel Fills the model with data
*/
public PlayerTableModel() {
teams = new Team[3];
teams[0] = new Team("Celtics", "1985-86");
teams[0].add(new Player("Larry", "Bird", 25.8f, 9.8f, 6.8f));
teams[0].add(new Player("Kevin", "McHale", 21.3f, 8.1f, 2.7f));
teams[0].add(new Player("Robert", "Parish", 16.1f, 9.5f, 1.8f));
teams[0].add(new Player("Dennis", "Johnson", 15.6f, 3.4f, 5.8f));
teams[0].add(new Player("Danny", "Ainge", 10.7f, 2.9f, 5.1f));
teams[0].add(new Player("Scott", "Wedman", 8.0f, 2.4f, 1.1f));
teams[0].add(new Player("Bill", "Walton", 7.6f, 6.8f, 2.1f));
teams[0].add(new Player("Jerry", "Sichting", 6.5f, 1.3f, 2.3f));
teams[0].add(new Player("David", "Thirdkill", 3.3f, 1.4f, 0.3f));
teams[0].add(new Player("Sam", "Vincent", 3.2f, 0.8f, 1.2f));
teams[0].add(new Player("Sly", "Williams", 2.8f, 2.5f, 0.3f));
teams[0].add(new Player("Rick", "Carlisle", 2.6f, 1.0f, 1.4f));
teams[0].add(new Player("Greg", "Kite", 1.3f, 2.0f, 1.3f));
teams[1] = new Team("Bulls", "1995-96");
teams[1].add(new Player("Michael", "Jordan", 30.4f, 6.6f, 4.3f));
teams[1].add(new Player("Scottie", "Pippen", 19.4f, 6.4f, 5.9f));
teams[1].add(new Player("Toni", "Kukoc", 13.1f, 4.0f, 3.5f));
teams[1].add(new Player("Luc", "Longley", 9.1f, 5.1f, 1.9f));
teams[1].add(new Player("Steve", "Kerr", 8.4f, 1.3f, 2.3f));
teams[1].add(new Player("Ron", "Harper", 7.4f, 2.7f, 2.6f));
teams[1].add(new Player("Dennis", "Rodman", 5.5f, 14.9f, 2.5f));
teams[1].add(new Player("Bill", "Wennington", 5.3f, 2.5f, 0.6f));
teams[1].add(new Player("Jack", "Haley", 5.0f, 2.0f, 0.0f));
teams[1].add(new Player("John", "Salley", 4.4f, 3.3f, 1.3f));
teams[1].add(new Player("Jud", "Buechler", 3.8f, 1.5f, 0.8f));
teams[1].add(new Player("Dickey", "Simpkins", 3.6f, 2.6f, 0.6f));
teams[1].add(new Player("James", "Edwards", 3.5f, 1.4f, 0.4f));
teams[1].add(new Player("Jason", "Caffey", 3.2f, 1.9f, 0.4f));
teams[1].add(new Player("Randy", "Brown", 2.7f, 1.0f, 1.1f));
teams[2] = new Team("Lakers", "1987-1988");
teams[2].add(new Player("Magic", "Johnson", 23.9f, 6.3f, 12.2f));
teams[2].add(new Player("James", "Worthy", 19.4f, 5.7f, 2.8f));
teams[2].add(new Player("Kareem", "Abdul-Jabbar", 17.5f, 6.7f, 2.6f));
teams[2].add(new Player("Byron", "Scott", 17.0f, 3.5f, 3.4f));
teams[2].add(new Player("A.C.", "Green", 10.8f, 7.8f, 1.1f));
teams[2].add(new Player("Michael", "Cooper", 10.5f, 3.1f, 4.5f));
teams[2].add(new Player("Mychal", "Thompson", 10.1f, 4.1f, 0.8f));
teams[2].add(new Player("Kurt", "Rambis", 5.7f, 5.8f, 0.8f));
teams[2].add(new Player("Billy", "Thompson", 5.6f, 2.9f, 1.0f));
teams[2].add(new Player("Adrian", "Branch", 4.3f, 1.7f, 0.5f));
teams[2].add(new Player("Wes", "Matthews", 4.2f, 0.9f, 2.0f));
teams[2].add(new Player("Frank", "Brickowski", 4.0f, 2.6f, 0.3f));
teams[2].add(new Player("Mike", "Smrek", 2.2f, 1.1f, 0.1f));
}
}
/**
* This class represents a player
*/
class Player {
private Team team;
private String lastName;
private String firstName;
private float points;
private float rebounds;
private float assists;
/**
* Constructs an empty Player
*/
public Player() {
this(null, null, 0.0f, 0.0f, 0.0f);
}
/**
* Constructs a Player
*
* @param firstName
* the first name
* @param lastName
* the last name
* @param points
* the points
* @param rebounds
* the rebounds
* @param assists
* the assists
*/
public Player(String firstName, String lastName, float points,
float rebounds, float assists) {
setFirstName(firstName);
setLastName(lastName);
setPoints(points);
setRebounds(rebounds);
setAssists(assists);
}
/**
* Sets the team for theo player
*
* @param team
* the team
*/
public void setTeam(Team team) {
this.team = team;
}
/**
* Gets the assists
*
* @return float
*/
public float getAssists() {
return assists;
}
/**
* Sets the assists
*
* @param assists
* The assists to set.
*/
public void setAssists(float assists) {
this.assists = assists;
}
/**
* Gets the first name
*
* @return String
*/
public String getFirstName() {
return firstName;
}
/**
* Sets the first name
*
* @param firstName
* The firstName to set.
*/
public void setFirstName(String firstName) {
this.firstName = firstName;
}
/**
* Gets the last name
*
* @return String
*/
public String getLastName() {
return lastName;
}
/**
* Sets the last name
*
* @param lastName
* The lastName to set.
*/
public void setLastName(String lastName) {
this.lastName = lastName;
}
/**
* Gets the points
*
* @return float
*/
public float getPoints() {
return points;
}
/**
* Sets the points
*
* @param points
* The points to set.
*/
public void setPoints(float points) {
this.points = points;
}
/**
* Gets the rebounds
*
* @return float
*/
public float getRebounds() {
return rebounds;
}
/**
* Sets the rebounds
*
* @param rebounds
* The rebounds to set.
*/
public void setRebounds(float rebounds) {
this.rebounds = rebounds;
}
/**
* Gets the team
*
* @return Team
*/
public Team getTeam() {
return team;
}
/**
* Returns whether this player led the team in the specified category
*
* @param column
* the column (category)
* @return boolean
*/
public boolean ledTeam(int column) {
return team.led(this, column);
}
}
/**
* This class represents a team
*/
class Team {
private String name;
private String year;
private List players;
/**
* Constructs a Team
*
* @param name
* the name
* @param year
* the year
*/
public Team(String name, String year) {
this.name = name;
this.year = year;
players = new LinkedList();
}
/**
* Gets the name
*
* @return String
*/
public String getName() {
return name;
}
/**
* Gets the year
*
* @return String
*/
public String getYear() {
return year;
}
/**
* Adds a player
*
* @param player
* the player to add
* @return boolean
*/
public boolean add(Player player) {
boolean added = players.add(player);
if (added)
player.setTeam(this);
return added;
}
/**
* Gets the players
*
* @return List
*/
public List getPlayers() {
return Collections.unmodifiableList(players);
}
/**
* Returns whether the specified player led his team in the specified
* category
*
* @param player
* the player
* @param column
* the category
* @return boolean
*/
public boolean led(Player player, int column) {
boolean led = true;
// Go through all the players on the team, comparing the specified
// player's
// stats with each other player.
for (int i = 0, n = players.size(); i < n && led; i++) {
Player test = (Player) players.get(i);
if (player == test)
continue;
switch (column) {
case PlayerConst.COLUMN_POINTS:
if (player.getPoints() < test.getPoints())
led = false;
break;
case PlayerConst.COLUMN_REBOUNDS:
if (player.getRebounds() < test.getRebounds())
led = false;
break;
case PlayerConst.COLUMN_ASSISTS:
if (player.getAssists() < test.getAssists())
led = false;
break;
}
}
return led;
}
}
/**
* This class implements the sorting for the Player Table
*/
class PlayerViewerSorter extends ViewerSorter {
private static final int ASCENDING = 0;
private static final int DESCENDING = 1;
private int column;
private int direction;
/**
* Does the sort. If it's a different column from the previous sort, do an
* ascending sort. If it's the same column as the last sort, toggle the sort
* direction.
*
* @param column
*/
public void doSort(int column) {
if (column == this.column) {
// Same column as last sort; toggle the direction
direction = 1 - direction;
} else {
// New column; do an ascending sort
this.column = column;
direction = ASCENDING;
}
}
/**
* Compares the object for sorting
*/
public int compare(Viewer viewer, Object e1, Object e2) {
int rc = 0;
Player p1 = (Player) e1;
Player p2 = (Player) e2;
// Determine which column and do the appropriate sort
switch (column) {
case PlayerConst.COLUMN_FIRST_NAME:
rc = collator.compare(p1.getFirstName(), p2.getFirstName());
break;
case PlayerConst.COLUMN_LAST_NAME:
rc = collator.compare(p1.getLastName(), p2.getLastName());
break;
case PlayerConst.COLUMN_POINTS:
rc = p1.getPoints() > p2.getPoints() ? 1 : -1;
break;
case PlayerConst.COLUMN_REBOUNDS:
rc = p1.getRebounds() > p2.getRebounds() ? 1 : -1;
break;
case PlayerConst.COLUMN_ASSISTS:
rc = p1.getAssists() > p2.getAssists() ? 1 : -1;
break;
}
// If descending order, flip the direction
if (direction == DESCENDING)
rc = -rc;
return rc;
}
}
/**
* This class contains constants for the PlayerTable application
*/
class PlayerConst {
// Column constants
public static final int COLUMN_FIRST_NAME = 0;
public static final int COLUMN_LAST_NAME = 1;
public static final int COLUMN_POINTS = 2;
public static final int COLUMN_REBOUNDS = 3;
public static final int COLUMN_ASSISTS = 4;
}
/**
* This class provides the labels for the person table
*/
class PersonLabelProvider implements ITableLabelProvider {
/**
* Returns the image
*
* @param element
* the element
* @param columnIndex
* the column index
* @return Image
*/
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
/**
* Returns the column text
*
* @param element
* the element
* @param columnIndex
* the column index
* @return String
*/
public String getColumnText(Object element, int columnIndex) {
Person person = (Person) element;
switch (columnIndex) {
case 0:
return person.getName();
case 1:
return Boolean.toString(person.isMale());
case 2:
return AgeRange.INSTANCES[person.getAgeRange().intValue()];
case 3:
return person.getShirtColor().toString();
}
return null;
}
/**
* Adds a listener
*
* @param listener
* the listener
*/
public void addListener(ILabelProviderListener listener) {
// Ignore it
}
/**
* Disposes any created resources
*/
public void dispose() {
// Nothing to dispose
}
/**
* Returns whether altering this property on this element will affect the
* label
*
* @param element
* the element
* @param property
* the property
* @return boolean
*/
public boolean isLabelProperty(Object element, String property) {
return false;
}
/**
* Removes a listener
*
* @param listener
* the listener
*/
public void removeListener(ILabelProviderListener listener) {
// Ignore
}
}
/**
* This class represents a person
*/
class Person {
private String name;
private boolean male;
private Integer ageRange;
private RGB shirtColor;
/**
* @return Returns the ageRange.
*/
public Integer getAgeRange() {
return ageRange;
}
/**
* @param ageRange
* The ageRange to set.
*/
public void setAgeRange(Integer ageRange) {
this.ageRange = ageRange;
}
/**
* @return Returns the male.
*/
public boolean isMale() {
return male;
}
/**
* @param male
* The male to set.
*/
public void setMale(boolean male) {
this.male = male;
}
/**
* @return Returns the name.
*/
public String getName() {
return name;
}
/**
* @param name
* The name to set.
*/
public void setName(String name) {
this.name = name;
}
/**
* @return Returns the shirtColor.
*/
public RGB getShirtColor() {
return shirtColor;
}
/**
* @param shirtColor
* The shirtColor to set.
*/
public void setShirtColor(RGB shirtColor) {
this.shirtColor = shirtColor;
}
}
/**
* This class encapsulates age ranges
*/
class AgeRange {
public static final String NONE = "";
public static final String BABY = "0 - 3";
public static final String TODDLER = "4 - 7";
public static final String CHILD = "8 - 12";
public static final String TEENAGER = "13 - 19";
public static final String ADULT = "20 - ?";
public static final String[] INSTANCES = { NONE, BABY, TODDLER, CHILD,
TEENAGER, ADULT };
}
/**
* This class provides the labels for PlayerTable
*/
class PlayerLabelProvider implements ITableLabelProvider {
// Image to display if the player led his team
private Image ball;
// Constructs a PlayerLabelProvider
public PlayerLabelProvider() {
// Create the image
try {
ball = new Image(null, new FileInputStream("images/ball.png"));
} catch (FileNotFoundException e) {
// Swallow it
}
}
/**
* Gets the image for the specified column
*
* @param arg0
* the player
* @param arg1
* the column
* @return Image
*/
public Image getColumnImage(Object arg0, int arg1) {
Player player = (Player) arg0;
Image image = null;
switch (arg1) {
// A player can't lead team in first name or last name
case PlayerConst.COLUMN_POINTS:
case PlayerConst.COLUMN_REBOUNDS:
case PlayerConst.COLUMN_ASSISTS:
if (player.ledTeam(arg1))
// Set the image
image = ball;
break;
}
return image;
}
/**
* Gets the text for the specified column
*
* @param arg0
* the player
* @param arg1
* the column
* @return String
*/
public String getColumnText(Object arg0, int arg1) {
Player player = (Player) arg0;
String text = "";
switch (arg1) {
case PlayerConst.COLUMN_FIRST_NAME:
text = player.getFirstName();
break;
case PlayerConst.COLUMN_LAST_NAME:
text = player.getLastName();
break;
case PlayerConst.COLUMN_POINTS:
text = String.valueOf(player.getPoints());
break;
case PlayerConst.COLUMN_REBOUNDS:
text = String.valueOf(player.getRebounds());
break;
case PlayerConst.COLUMN_ASSISTS:
text = String.valueOf(player.getAssists());
break;
}
return text;
}
/**
* Adds a listener
*
* @param arg0
* the listener
*/
public void addListener(ILabelProviderListener arg0) {
// Throw it away
}
/**
* Dispose any created resources
*/
public void dispose() {
// Dispose the image
if (ball != null)
ball.dispose();
}
/**
* Returns whether the specified property, if changed, would affect the
* label
*
* @param arg0
* the player
* @param arg1
* the property
* @return boolean
*/
public boolean isLabelProperty(Object arg0, String arg1) {
return false;
}
/**
* Removes the specified listener
*
* @param arg0
* the listener
*/
public void removeListener(ILabelProviderListener arg0) {
// Do nothing
}
}
/**
* This class provides the content for the table
*/
class PlayerContentProvider implements IStructuredContentProvider {
/**
* Gets the elements for the table
*
* @param arg0
* the model
* @return Object[]
*/
public Object[] getElements(Object arg0) {
// Returns all the players in the specified team
return ((Team) arg0).getPlayers().toArray();
}
/**
* Disposes any resources
*/
public void dispose() {
// We don't create any resources, so we don't dispose any
}
/**
* Called when the input changes
*
* @param arg0
* the parent viewer
* @param arg1
* the old input
* @param arg2
* the new input
*/
public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
// Nothing to do
}
}
|