001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: package threaddemo.apps.index;
043:
044: import java.awt.event.WindowAdapter;
045: import java.awt.event.WindowEvent;
046: import java.util.Map;
047: import java.util.SortedMap;
048: import java.util.TreeMap;
049: import javax.swing.JFrame;
050: import javax.swing.JScrollPane;
051: import javax.swing.JTable;
052: import javax.swing.SwingUtilities;
053: import javax.swing.WindowConstants;
054: import javax.swing.event.ChangeEvent;
055: import javax.swing.event.ChangeListener;
056: import javax.swing.table.DefaultTableColumnModel;
057: import javax.swing.table.DefaultTableModel;
058: import javax.swing.table.TableColumn;
059: import threaddemo.locking.LockAction;
060: import threaddemo.model.Phadhail;
061:
062: /**
063: * Launcher + GUI class for the index.
064: * @author Jesse Glick
065: */
066: public class IndexApp extends JFrame {
067:
068: private final Index index;
069: private final DefaultTableModel tableModel;
070:
071: public IndexApp(Phadhail root) {
072: super ("XML Element Index [" + root.getPath() + "]");
073: index = new IndexImpl(root);
074: index.addChangeListener(new ChangeListener() {
075: public void stateChanged(ChangeEvent ev) {
076: refreshTable();
077: }
078: });
079: tableModel = new DefaultTableModel(0, 2);
080: DefaultTableColumnModel columns = new DefaultTableColumnModel();
081: TableColumn column = new TableColumn(0);
082: column.setHeaderValue("XML Element Name");
083: columns.addColumn(column);
084: column = new TableColumn(1);
085: column.setHeaderValue("Occurrences");
086: columns.addColumn(column);
087: index.start();
088: getContentPane().add(
089: new JScrollPane(new JTable(tableModel, columns)));
090: setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
091: addWindowListener(new WindowAdapter() {
092: public void windowClosing(WindowEvent ev) {
093: index.cancel();
094: }
095: });
096: pack();
097: }
098:
099: private void refreshTable() {
100: final SortedMap<String, Integer> data = index.getLock().read(
101: new LockAction<SortedMap<String, Integer>>() {
102: public SortedMap<String, Integer> run() {
103: return new TreeMap<String, Integer>(index
104: .getData());
105: }
106: });
107: SwingUtilities.invokeLater(new Runnable() {
108: public void run() {
109: // XXX clumsy
110: int rows = tableModel.getRowCount();
111: for (int i = 0; i < rows; i++) {
112: tableModel.removeRow(0);
113: }
114: for (Map.Entry<String, Integer> entry : data.entrySet()) {
115: tableModel.addRow(new Object[] { entry.getKey(),
116: entry.getValue(), });
117: }
118: }
119: });
120: }
121:
122: }
|