BugTrackerJFace.java Source code

Java tutorial

Introduction

Here is the source code for BugTrackerJFace.java

Source

/*******************************************************************************
 * 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[0] = new TextCellEditor(table);
        cellEditors[1] = cellEditors[0];
        cellEditors[2] = cellEditors[0];
        cellEditors[3] = new 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();
    }
}