001: /*
002: * Jacareto Copyright (c) 2002-2005
003: * Applied Computer Science Research Group, Darmstadt University of
004: * Technology, Institute of Mathematics & Computer Science,
005: * Ludwigsburg University of Education, and Computer Based
006: * Learning Research Group, Aachen University. All rights reserved.
007: *
008: * Jacareto is free software; you can redistribute it and/or
009: * modify it under the terms of the GNU General Public
010: * License as published by the Free Software Foundation; either
011: * version 2 of the License, or (at your option) any later version.
012: *
013: * Jacareto is distributed in the hope that it will be useful,
014: * but WITHOUT ANY WARRANTY; without even the implied warranty of
015: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
016: * General Public License for more details.
017: *
018: * You should have received a copy of the GNU General Public
019: * License along with Jacareto; if not, write to the Free
020: * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
021: *
022: */
023:
024: package jacareto.cleverphl.gui;
025:
026: import jacareto.cleverphl.CleverPHL;
027: import jacareto.cleverphl.session.Session;
028: import jacareto.cleverphl.session.SessionEvent;
029: import jacareto.cleverphl.session.SessionListener;
030: import jacareto.dataset.DataSet;
031: import jacareto.dataset.DataSetTableModel;
032: import jacareto.system.Environment;
033: import jacareto.system.Language;
034: import jacareto.toolkit.swing.JTableMouseListener;
035: import jacareto.toolkit.swing.PopupListener;
036:
037: import java.awt.FlowLayout;
038: import java.awt.event.KeyAdapter;
039: import java.awt.event.KeyEvent;
040:
041: import java.util.Hashtable;
042: import java.util.Vector;
043:
044: import javax.swing.JLabel;
045: import javax.swing.JPanel;
046: import javax.swing.JPopupMenu;
047: import javax.swing.JScrollPane;
048: import javax.swing.JTabbedPane;
049: import javax.swing.JTable;
050: import javax.swing.event.ChangeEvent;
051: import javax.swing.event.ChangeListener;
052: import javax.swing.event.ListSelectionEvent;
053: import javax.swing.event.ListSelectionListener;
054: import javax.swing.table.TableColumn;
055: import javax.swing.table.TableColumnModel;
056:
057: /**
058: * The tabbed pane for the data sets.
059: *
060: * @author <a href="mailto:cspannagel@web.de">Christian Spannagel</a>
061: * @version 1.01
062: */
063: public class DataSetPane extends JTabbedPane implements
064: SessionListener, ChangeListener, ListSelectionListener {
065: /** The CleverPHL instance. */
066: private CleverPHL cleverPHL;
067:
068: /** Hashtable of the JTables; maps the scroll pane to the tables. */
069: private Hashtable tables;
070:
071: /** The environment. */
072: private Environment env;
073:
074: /**
075: * Creates a new data set pane.
076: *
077: * @param cleverPHL the CleverPHL instance
078: * @param session the session this pane belongs to
079: */
080: public DataSetPane(CleverPHL cleverPHL, Session session) {
081: super ();
082: this .cleverPHL = cleverPHL;
083: this .env = cleverPHL.getEnvironment();
084: tables = new Hashtable();
085: session.addSessionListener(this );
086: addChangeListener(this );
087: }
088:
089: /**
090: * Invoked when the session state changed.
091: *
092: * @param event the session event
093: */
094: public void sessionStateChanged(SessionEvent event) {
095: Session session = event.getSession();
096: int ID = event.getID();
097: Vector dataSets = session.getDataSets();
098:
099: if (ID == SessionEvent.DATA_SET_ADDED) {
100: addDataSet((DataSet) dataSets.get(dataSets.size() - 1));
101: } else if (ID == SessionEvent.DATA_SET_REMOVED) {
102: remove(getSelectedIndex());
103: cleverPHL.getDataSetFrame().updateMenu(getTabCount() > 0);
104: }
105: }
106:
107: /**
108: * Called when the tabbed pane state has changed.
109: *
110: * @param e DOCUMENT ME!
111: */
112: public void stateChanged(ChangeEvent e) {
113: try {
114: JTable table = getActualTable();
115: updateMenuItems(!((table.getSelectedRowCount() == 0) && (table
116: .getSelectedColumnCount() == 0)));
117: } catch (Exception ex) {
118: ;
119: }
120: }
121:
122: /**
123: * Adds a data set.
124: *
125: * @param dataSet DOCUMENT ME!
126: */
127: public void addDataSet(DataSet dataSet) {
128: Language language = cleverPHL.getLanguage();
129:
130: if (dataSet.size() > 0) {
131: JTable table = new JTable(new DataSetTableModel(env,
132: dataSet)) {
133: public boolean isCellEditable(int row, int column) {
134: return false;
135: }
136: };
137:
138: table.setRowSelectionAllowed(true);
139: table.setColumnSelectionAllowed(false);
140:
141: JPopupMenu tablePopup = (JPopupMenu) cleverPHL
142: .getDataSetFrame().getCleverPHLMenuBar()
143: .getMenuComponentFromCustomization(
144: "CleverPHL.Menu.DataSetTablePopup");
145: table.addMouseListener(new JTableMouseListener(table));
146: table.addMouseListener(new PopupListener(tablePopup));
147: table.addKeyListener(new JTableKeyListener());
148:
149: JScrollPane scrollPane = new JScrollPane(table);
150: addTab(dataSet.getName(), scrollPane);
151: tables.put(scrollPane, table);
152: updateMenuItems(false);
153:
154: table.getSelectionModel().addListSelectionListener(this );
155: } else {
156: JPanel panel = new JPanel();
157: panel.setLayout(new FlowLayout(FlowLayout.LEFT));
158: panel
159: .add(new JLabel(
160: language
161: .getString("CleverPHL.DataSetPane.Msg.NoElements")));
162: addTab(dataSet.getName(), panel);
163: }
164:
165: setSelectedIndex(getTabCount() - 1);
166: cleverPHL.getDataSetFrame().updateMenu(true);
167: }
168:
169: /**
170: * Returns the actual JTable, or <code>null</code> if no table is shown.
171: *
172: * @return DOCUMENT ME!
173: */
174: public JTable getActualTable() {
175: try {
176: return (JTable) tables
177: .get(getComponentAt(getSelectedIndex()));
178: } catch (Exception r) {
179: return null;
180: }
181: }
182:
183: /**
184: * Called when the list selection has changed.
185: *
186: * @param e DOCUMENT ME!
187: */
188: public void valueChanged(ListSelectionEvent e) {
189: updateMenuItems(true);
190: }
191:
192: /**
193: * Deletes the selected elements (row or columns).
194: */
195: public void deleteSelected() {
196: JTable table = getActualTable();
197:
198: if (table.getRowSelectionAllowed()) {
199: deleteSelectedRows(table);
200: } else {
201: deleteSelectedColumns(table);
202: }
203:
204: updateMenuItems(false);
205: }
206:
207: /**
208: * Deletes the selected rows in the JTable.
209: *
210: * @param table DOCUMENT ME!
211: */
212: public void deleteSelectedRows(JTable table) {
213: DataSetTableModel model = (DataSetTableModel) table.getModel();
214: int[] rows = table.getSelectedRows();
215:
216: for (int i = rows.length - 1; i >= 0; i--) {
217: model.removeDataCase(rows[i]);
218: }
219: }
220:
221: /**
222: * Deletes the selected columns in the JTable.
223: *
224: * @param table DOCUMENT ME!
225: */
226: public void deleteSelectedColumns(JTable table) {
227: int[] cols = table.getSelectedColumns();
228:
229: for (int i = cols.length - 1; i >= 0; i--) {
230: DataSetTableModel model = (DataSetTableModel) table
231: .getModel();
232: TableColumnModel colModel = table.getColumnModel();
233: TableColumn column = colModel.getColumn(cols[i]);
234: String columnName = table.getColumnName(cols[i]);
235: table.removeColumn(column);
236: model.removeDataValue(columnName);
237: }
238: }
239:
240: /**
241: * Updates the menu items, belonging on the selection state.
242: *
243: * @param isEnabled DOCUMENT ME!
244: */
245: public void updateMenuItems(boolean isEnabled) {
246: cleverPHL.getDataSetFrame().getCleverPHLMenuBar().getMenuItem(
247: "CleverPHL.Menu.DeleteDataSetTableElements")
248: .setEnabled(isEnabled);
249: cleverPHL.getDataSetFrame().getCleverPHLMenuBar().getMenuItem(
250: "CleverPHL.Menu.DeleteDataSetTableElementsPopup")
251: .setEnabled(isEnabled);
252: }
253:
254: /**
255: * Listens for key events on the JTable.
256: */
257: class JTableKeyListener extends KeyAdapter {
258: //~ Constructors ---------------------------------------------------------------------------
259:
260: /**
261: * Creates a new JTableKeyListener.
262: */
263: public JTableKeyListener() {
264: }
265:
266: //~ Methods --------------------------------------------------------------------------------
267:
268: /**
269: * {@inheritDoc}
270: */
271: public void keyPressed(KeyEvent event) {
272: int keyCode = event.getKeyCode();
273:
274: switch (keyCode) {
275: case KeyEvent.VK_DELETE:
276: deleteSelected();
277:
278: break;
279: }
280: }
281: }
282: }
|