swt table

来源:互联网 发布:懒人之家js轮播图 编辑:程序博客网 时间:2024/04/24 10:04

/*******************************************************************************
 * All Right Reserved. Copyright (c) 1998, 2004 Jackwind Li Guojie
 
 * Created on Mar 5, 2004 7:38:59 PM by JACK $Id$
 *  
 ******************************************************************************/



import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Vector;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.viewers.ViewerSorter;
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.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.ToolBar;

public class BugTrackerJFace {
  /**
   * Represents a bug report. 
   *
   */
  public static class Bug {
    // For the sake of simplicity, all variables are public.
    public String id;
    public String summary;
    public String assignedTo;
    public boolean isSolved;
    public Bug(String id, String summary, String assignedTo, boolean isSolved) {
      this.id = id;
      this.summary = summary;
      this.assignedTo = assignedTo;
      this.isSolved = isSolved;
    }

    public static Vector loadBugs(File file) {
      Vector v = new Vector();
      // Load bugs from a file.
      DataInputStream in = null;

      try {
        if (!file.exists())
          return v;
        in = new DataInputStream(new FileInputStream(file));

        while (true) {
          String id = in.readUTF();
          String summary = in.readUTF();
          String assignedTo = in.readUTF();
          boolean solved = in.readBoolean();
          v.add(new Bug(id, summary, assignedTo, solved));
        }
      catch (IOException ioe) {
        // Ignore.
      finally {
        try {
          if (in != null)
            in.close();
        catch (IOException e) {
          e.printStackTrace();
        }
      }
      return v;
    }
  }
  Display display = new Display();
  Shell shell = new Shell(display);
  Table table;
  TableViewer tableViewer;
  Vector bugs;
  Image bugIcon = new Image(shell.getDisplay()"java2s.gif");
  String[] colNames = new String[]{"ID""Summary""Assigned to""Solved"};

  // Sorter. 
  class BugSorter extends ViewerSorter {
    private String property;
    private int propertyIndex;
    public BugSorter(String sortByProperty) {
      for(int i=0; i<colNames.length; i++) {
        if(colNames[i].equals(sortByProperty)) {
          this.property = sortByProperty;
          this.propertyIndex = i;
          return;
        }
      }
      throw new IllegalArgumentException("Unrecognized property: " + sortByProperty);
    }
    /* (non-Javadoc)
     * @see org.eclipse.jface.viewers.ViewerSorter#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
     */
    public int compare(Viewer viewer, Object e1, Object e2) {
      Bug bug1 = (Bug)e1;
      Bug bug2 = (Bug)e2;
      switch(propertyIndex) {
        case 0:
          return bug1.id.compareTo(bug2.id);
        case 1:
          return bug1.summary.compareTo(bug2.summary);
        case 2:
          return bug1.assignedTo.compareTo(bug2.assignedTo);
        case 3:
          if(bug1.isSolved == bug2.isSolved)
            return 0;
          if(bug1.isSolved)
            return 1;
          else
            return -1;
        default:
          return 0;
      }
    }

  }  
  public BugTrackerJFace() {
    // Action.
    Action actionAddNew = new Action("New bug") {
      public void run() {
          // Append.
        Bug bug = new Bug(""""""false);
        bugs.add(bug);
        tableViewer.refresh(false);
      }
    };

    Action actionDelete = new Action("Delete selected") {
      public void run() {
        IStructuredSelection selection = (IStructuredSelection)tableViewer.getSelection();
        Bug bug = (Bug)selection.getFirstElement();
        if (bug == null) {
          System.out.println("Please select an item first. ");
          return;
        }
        MessageBox messageBox = new MessageBox(shell, SWT.YES | SWT.NO);
        messageBox.setText("Confirmation");
        messageBox.setMessage(
          "Are you sure to remove the bug with id #"
            + bug.id);
        if (messageBox.open() == SWT.YES) {
          bugs.remove(bug);
          tableViewer.refresh(false);
        }
      }
    };

    Action actionSave = new Action("Save") {
      public void run() {
        saveBugs(bugs);
      }
    };
    final ViewerFilter filter = new ViewerFilter() {
      public boolean select(
        Viewer viewer,
        Object parentElement,
        Object element) {
        if(((Bug)element).isSolved)
          return true;
        return false;
      }
    };
    Action actionShowUnsolvedOnly = new Action("Show unsolved only") {
      public void run() {
        if(! isChecked())
          tableViewer.removeFilter(filter);
        else
          tableViewer.addFilter(filter);
      }
    };
    actionShowUnsolvedOnly.setChecked(false);

    ToolBar toolBar = new ToolBar(shell, SWT.RIGHT | SWT.FLAT);

    ToolBarManager manager = new ToolBarManager(toolBar);
    manager.add(actionAddNew);
    manager.add(actionDelete);
    manager.add(new Separator());
    manager.add(actionSave);
    manager.add(new Separator());
    manager.add(actionShowUnsolvedOnly);
    manager.update(true);
    shell.setLayout(new GridLayout());
    table = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION);

    TableColumn tcID = new TableColumn(table, SWT.LEFT);
    tcID.setText(colNames[0]);

    TableColumn tcSummary = new TableColumn(table, SWT.NULL);
    tcSummary.setText(colNames[1]);

    TableColumn tcAssignedTo = new TableColumn(table, SWT.NULL);
    tcAssignedTo.setText(colNames[2]);

    TableColumn tcSolved = new TableColumn(table, SWT.NULL);
    tcSolved.setText(colNames[3]);

    tcID.setWidth(60);
    tcSummary.setWidth(200);
    tcAssignedTo.setWidth(80);
    tcSolved.setWidth(50);
    tableViewer = new TableViewer(table);
    tableViewer.getTable().setLinesVisible(true);
    tableViewer.getTable().setHeaderVisible(true);
    tableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
    // Sets the content provider. 
    tableViewer.setContentProvider(new IStructuredContentProvider() {
      public Object[] getElements(Object inputElement) {
        Vector v = (Vector)inputElement;
        return v.toArray();
      }

      public void dispose() {
        System.out.println("Disposing ...");
      }

      public void inputChanged(
        Viewer viewer,
        Object oldInput,
        Object newInput) {
          System.out.println("Input changed: old=" 
            oldInput + ", new=" + newInput);
      }
    });
    // Sets the label provider. 
    tableViewer.setLabelProvider(new ITableLabelProvider() {
      public Image getColumnImage(Object element, int columnIndex) {
        if(columnIndex == 0)
          return bugIcon;        return null;
      }

      public String getColumnText(Object element, int columnIndex) {
        Bug bug = (Bug)element;
        switch(columnIndex) {
          case 0:
            return bug.id;
          case 1:
            return bug.summary;
          case 2:
            return bug.assignedTo;
          case 3:
            return bug.isSolved ? "YES" "NO";
        }
        return null;
      }

      public void addListener(ILabelProviderListener listener) {
      }

      public void dispose() {
      }

      public boolean isLabelProperty(Object element, String property) {
        return false;
      }

      public void removeListener(ILabelProviderListener listener) {
      }
    });
    // Sets cell editors. 
    tableViewer.setColumnProperties(colNames);
    CellEditor[] cellEditors = new CellEditor[4];
    cellEditors[0new TextCellEditor(table);
    cellEditors[1= cellEditors[0];
    cellEditors[2= cellEditors[0];
    cellEditors[3new CheckboxCellEditor(table);
    tableViewer.setCellEditors(cellEditors);
    tableViewer.setCellModifier(new ICellModifier() {
      public boolean canModify(Object element, String property) {
        return true;
      }

      public Object getValue(Object element, String property) {
        // Get the index first. 
        int index = -1;
        for(int i=0; i<colNames.length; i++) {
          if(colNames[i].equals(property)) {
            index = i;
            break;
          }
        }
        Bug bug = (Bug)element;
        switch(index) {
          case 0:
            return bug.id;
          case 1:
            return bug.summary;
          case 2:
            return bug.assignedTo;
          case 3:
            return new Boolean(bug.isSolved);
        }
        return null;
      }

      public void modify(Object element, String property, Object value) {
        System.out.println("Modify: " + element + ", " + property + ", " + value);
        // Get the index first. 
        int index = -1;
        for(int i=0; i<colNames.length; i++) {
          if(colNames[i].equals(property)) {
            index = i;
            break;
          }
        }
        Bug bug = null;
        if(element instanceof Item) {
          TableItem item = (TableItem)element;
          bug = (Bug)item.getData();
        }else{
          bug = (Bug)element;
        }
        switch(index) {
          case 0:
            bug.id = (String)value;
            break;
          case 1:
            bug.summary = (String)value;
            break;
          case 2:
            bug.assignedTo = (String)value;
            break;
          case 3:
            bug.isSolved = ((Boolean)value).booleanValue();
            break;
        }
        tableViewer.update(bug, null);
      }
    });
    // Setting sorters. 
    tcID.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event event) {
        tableViewer.setSorter(new BugSorter(colNames[0]));
      }
    });
    tcSummary.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event event) {
        tableViewer.setSorter(new BugSorter(colNames[1]));
      }
    });
    tcAssignedTo.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event event) {
        tableViewer.setSorter(new BugSorter(colNames[2]));
      }
    });    
    tcSolved.addListener(SWT.Selection, new Listener() {
      public void handleEvent(Event event) {
        tableViewer.setSorter(new BugSorter(colNames[3]));
      }
    });
    bugs = Bug.loadBugs(new File("bugs.dat"));
    tableViewer.setInput(bugs);

    shell.pack();
    shell.open();
    //textUser.forceFocus();

    // Set up the event loop.
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()) {
        // If no more entries in event queue
        display.sleep();
      }
    }

    display.dispose();
  }
  private void saveBugs(Vector v) {
    // Save bugs to a file.
    DataOutputStream out = null;
    try {
      File file = new File("bugs.dat");

      out = new DataOutputStream(new FileOutputStream(file));

      for (int i = 0; i < v.size(); i++) {
        Bug bug = (Bug)v.elementAt(i);
        out.writeUTF(bug.id);
        out.writeUTF(bug.summary);
        out.writeUTF(bug.assignedTo);
        out.writeBoolean(bug.isSolved);
      }
    catch (IOException ioe) {
      // Ignore.
    finally {
      try {
        if (out != null)
          out.close();
      catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

  public static void main(String[] args) {
    new BugTrackerJFace();
  }
}