Java by API/org.eclipse.jface.viewers/ViewerSorter

Материал из Java эксперт
Перейти к: навигация, поиск

extends ViewerSorter (Sortable)

   <source lang="java">

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.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.rubo; import org.eclipse.swt.widgets.ruposite; 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; public class MainClass extends ApplicationWindow {

 private StudentTableModel model = new StudentTableModel();
 private TableViewer tv;
 public MainClass() {
   super(null);
   setBlockOnOpen(true);
   open();
   Display.getCurrent().dispose();
 }
 protected void configureShell(Shell shell) {
   super.configureShell(shell);
   shell.setSize(400, 400);
 }
 protected Control createContents(Composite parent) {
   Composite composite = new Composite(parent, SWT.NONE);
   composite.setLayout(new GridLayout(1, false));
   Combo combo = new Combo(composite, SWT.READ_ONLY);
   combo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
   tv = new TableViewer(composite);
   tv.setContentProvider(new PlayerContentProvider());
   tv.setLabelProvider(new PlayerLabelProvider());
   tv.setSorter(new StudentViewerSorter());
   Table table = tv.getTable();
   table.setLayoutData(new GridData(GridData.FILL_BOTH));
   TableColumn tc = new TableColumn(table, SWT.LEFT);
   tc.setText("First Name");
   tc.addSelectionListener(new SelectionAdapter() {
     public void widgetSelected(SelectionEvent event) {
       ((StudentViewerSorter) tv.getSorter()).doSort(Const.COLUMN_FIRST_NAME);
       tv.refresh();
     }
   });
   tc = new TableColumn(table, SWT.LEFT);
   tc.setText("Last Name");
   tc.addSelectionListener(new SelectionAdapter() {
     public void widgetSelected(SelectionEvent event) {
       ((StudentViewerSorter) tv.getSorter()).doSort(Const.COLUMN_LAST_NAME);
       tv.refresh();
     }
   });
   tc = new TableColumn(table, SWT.RIGHT);
   tc.setText("Math");
   tc.addSelectionListener(new SelectionAdapter() {
     public void widgetSelected(SelectionEvent event) {
       ((StudentViewerSorter) tv.getSorter()).doSort(Const.COLUMN_MATH);
       tv.refresh();
     }
   });
   tc = new TableColumn(table, SWT.RIGHT);
   tc.setText("CHEM");
   tc.addSelectionListener(new SelectionAdapter() {
     public void widgetSelected(SelectionEvent event) {
       ((StudentViewerSorter) tv.getSorter()).doSort(Const.COLUMN_CHEM);
       tv.refresh();
     }
   });
   tc = new TableColumn(table, SWT.RIGHT);
   tc.setText("AVE");
   tc.addSelectionListener(new SelectionAdapter() {
     public void widgetSelected(SelectionEvent event) {
       ((StudentViewerSorter) tv.getSorter()).doSort(Const.COLUMN_AVE);
       tv.refresh();
     }
   });
   for (int i = 0, n = model.teams.length; i < n; i++) {
     combo.add(model.teams[i].getName());
   }
   combo.addSelectionListener(new SelectionAdapter() {
     public void widgetSelected(SelectionEvent event) {
       update(model.teams[((Combo) event.widget).getSelectionIndex()]);
     }
   });
   combo.select(0);
   update(model.teams[0]);
   for (int i = 0, n = table.getColumnCount(); i < n; i++) {
     table.getColumn(i).pack();
   }
   table.setHeaderVisible(true);
   table.setLinesVisible(true);
   return composite;
 }
 private void update(HighSchool team) {
   getShell().setText(team.getYear() + " " + team.getName());
   tv.setInput(team);
 }
 public static void main(String[] args) {
   new MainClass();
 }

} class StudentTableModel {

 public HighSchool[] teams;
 public StudentTableModel() {
   teams = new HighSchool[3];
   teams[0] = new HighSchool("school 1", "1985-86");
   teams[0].add(new Student("A", "a", 25.8f, 9.8f, 6.8f));
   teams[0].add(new Student("B", "b", 21.3f, 8.1f, 2.7f));
   teams[0].add(new Student("C", "c", 16.1f, 9.5f, 1.8f));
   teams[1] = new HighSchool("school 2", "1995-96");
   teams[1].add(new Student("Michael", "Jordan", 30.4f, 6.6f, 4.3f));
   teams[1].add(new Student("Scottie", "Pippen", 19.4f, 6.4f, 5.9f));
   teams[1].add(new Student("Toni", "Kukoc", 13.1f, 4.0f, 3.5f));
   teams[2] = new HighSchool("scholl 3", "1987-1988");
   teams[2].add(new Student("Magic", "Johnson", 23.9f, 6.3f, 12.2f));
   teams[2].add(new Student("James", "Worthy", 19.4f, 5.7f, 2.8f));
 }

} class PlayerLabelProvider implements ITableLabelProvider {

 private Image ball;
 public PlayerLabelProvider() {
   try {
     ball = new Image(null, new FileInputStream("images/ball.png"));
   } catch (FileNotFoundException e) {
   }
 }
 public Image getColumnImage(Object arg0, int arg1) {
   Student player = (Student) arg0;
   Image image = null;
   switch (arg1) {
   case Const.COLUMN_MATH:
   case Const.COLUMN_CHEM:
   case Const.COLUMN_AVE:
     if (player.ledTeam(arg1))
       image = ball;
     break;
   }
   return image;
 }
 public String getColumnText(Object arg0, int arg1) {
   Student player = (Student) arg0;
   String text = "";
   switch (arg1) {
   case Const.COLUMN_FIRST_NAME:
     text = player.getFirstName();
     break;
   case Const.COLUMN_LAST_NAME:
     text = player.getLastName();
     break;
   case Const.COLUMN_MATH:
     text = String.valueOf(player.getMath());
     break;
   case Const.COLUMN_CHEM:
     text = String.valueOf(player.getChem());
     break;
   case Const.COLUMN_AVE:
     text = String.valueOf(player.getAve());
     break;
   }
   return text;
 }
 public void addListener(ILabelProviderListener arg0) {
 }
 public void dispose() {
   if (ball != null)
     ball.dispose();
 }
 public boolean isLabelProperty(Object arg0, String arg1) {
   return false;
 }
 public void removeListener(ILabelProviderListener arg0) {
 }

} class PlayerContentProvider implements IStructuredContentProvider {

 public Object[] getElements(Object arg0) {
   return ((HighSchool) arg0).getPlayers().toArray();
 }
 public void dispose() {
 }
 public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
 }

} class Const {

 public static final int COLUMN_FIRST_NAME = 0;
 public static final int COLUMN_LAST_NAME = 1;
 public static final int COLUMN_MATH = 2;
 public static final int COLUMN_CHEM = 3;
 public static final int COLUMN_AVE = 4;

} class HighSchool {

 private String name;
 private String year;
 private List players;
 public HighSchool(String name, String year) {
   this.name = name;
   this.year = year;
   players = new LinkedList();
 }
 public String getName() {
   return name;
 }
 public String getYear() {
   return year;
 }
 public boolean add(Student player) {
   boolean added = players.add(player);
   if (added)
     player.setSchool(this);
   return added;
 }
 public List getPlayers() {
   return Collections.unmodifiableList(players);
 }
 public boolean led(Student player, int column) {
   boolean led = true;
   for (int i = 0, n = players.size(); i < n && led; i++) {
     Student test = (Student) players.get(i);
     if (player == test)
       continue;
     switch (column) {
     case Const.COLUMN_MATH:
       if (player.getMath() < test.getMath())
         led = false;
       break;
     case Const.COLUMN_CHEM:
       if (player.getChem() < test.getChem())
         led = false;
       break;
     case Const.COLUMN_AVE:
       if (player.getAve() < test.getAve())
         led = false;
       break;
     }
   }
   return led;
 }

} class Student {

 private HighSchool team;
 private String lastName;
 private String firstName;
 private float math;
 private float chem;
 private float ave;
 public Student() {
   this(null, null, 0.0f, 0.0f, 0.0f);
 }
 public Student(String firstName, String lastName, float m, float c, float a) {
   setFirstName(firstName);
   setLastName(lastName);
   setMath(m);
   setChem(c);
   setAve(a);
 }
 public void setSchool(HighSchool team) {
   this.team = team;
 }
 public float getAve() {
   return ave;
 }
 public void setAve(float assists) {
   this.ave = assists;
 }
 public String getFirstName() {
   return firstName;
 }
 public void setFirstName(String firstName) {
   this.firstName = firstName;
 }
 public String getLastName() {
   return lastName;
 }
 public void setLastName(String lastName) {
   this.lastName = lastName;
 }
 public float getMath() {
   return math;
 }
 public void setMath(float points) {
   this.math = points;
 }
 public float getChem() {
   return chem;
 }
 public void setChem(float rebounds) {
   this.chem = rebounds;
 }
 public HighSchool getTeam() {
   return team;
 }
 public boolean ledTeam(int column) {
   return team.led(this, column);
 }

} class StudentViewerSorter extends ViewerSorter {

 private static final int ASCENDING = 0;
 private static final int DESCENDING = 1;
 private int column;
 private int direction;
 public void doSort(int column) {
   if (column == this.column) {
     direction = 1 - direction;
   } else {
     this.column = column;
     direction = ASCENDING;
   }
 }
 public int compare(Viewer viewer, Object e1, Object e2) {
   int rc = 0;
   Student p1 = (Student) e1;
   Student p2 = (Student) e2;
   switch (column) {
   case Const.COLUMN_FIRST_NAME:
     rc = collator.rupare(p1.getFirstName(), p2.getFirstName());
     break;
   case Const.COLUMN_LAST_NAME:
     rc = collator.rupare(p1.getLastName(), p2.getLastName());
     break;
   case Const.COLUMN_MATH:
     rc = p1.getMath() > p2.getMath() ? 1 : -1;
     break;
   case Const.COLUMN_CHEM:
     rc = p1.getChem() > p2.getChem() ? 1 : -1;
     break;
   case Const.COLUMN_AVE:
     rc = p1.getAve() > p2.getAve() ? 1 : -1;
     break;
   }
   if (direction == DESCENDING)
     rc = -rc;
   return rc;
 }

}

      </source>