001 /*
002 * This program is free software; you can redistribute it and/or modify
003 * it under the terms of the GNU General Public License as published by
004 * the Free Software Foundation; version 2 of the License.
005 *
006 * This program is distributed in the hope that it will be useful,
007 * but WITHOUT ANY WARRANTY; without even the implied warranty of
008 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
009 * GNU General Public License for more details.
010 *
011 * You should have received a copy of the GNU General Public License along
012 * with this program; if not, write to the Free Software Foundation, Inc.,
013 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
014 */
015 package org.tastybug.bugwerk.bugtrail.widget.composition;
016
017 import java.awt.BorderLayout;
018 import java.awt.Dimension;
019 import java.awt.Font;
020
021 import javax.swing.BorderFactory;
022 import javax.swing.JPanel;
023 import javax.swing.JScrollPane;
024 import javax.swing.border.EtchedBorder;
025 import javax.swing.border.TitledBorder;
026 import javax.swing.event.ListSelectionEvent;
027 import javax.swing.event.ListSelectionListener;
028
029 import org.tastybug.bugwerk.blueprint.model.Ticket;
030 import org.tastybug.bugwerk.blueprint.model.TicketQueue;
031 import org.tastybug.bugwerk.bugtrail.widget.queue.TicketQueueStatisticsTable;
032 import org.tastybug.bugwerk.bugtrail.widget.queue.TicketQueueTable;
033 import org.tastybug.bugwerk.bugtrail.widget.queue.TicketQueueTableModel;
034 import org.tastybug.bugwerk.bugtrail.widget.ticket.TicketDisplayTabPane;
035
036 /**
037 * This pane is a composition of 3 widgets: <code>TicketQueueStatisticsTable</code>,
038 * <code>TicketQueueTable</code> and <code>TicketDisplayTabPane</code> and thus displays
039 * the content of one ticket queue.
040 * <br>
041 * The pane listens for selection events on the tables and propagates the changes
042 * to the other widgets upon necessity.
043 * <br>
044 * To use it, call
045 * <pre>
046 * String projectName = "myProject";
047 * // obtain the adapter for your project
048 * QueueAdapter adapter = Adapters.getAdapter(projectName);
049 * // create the pane
050 * QueueInspectorPane inspector = new QueueInspectorPane();
051 * // declare the ticket queue
052 * inspector.connectQueue(adapter.getTicketQueue());
053 * </pre>
054 *
055 * The layout looks like this:
056 * <pre>
057 * +----------------------------+
058 * | |
059 * | TicketQueueStatisticsTable |
060 * | |
061 * +----------------------------+
062 * | |
063 * | TicketQueueTable |
064 * | |
065 * +----------------------------+
066 * | |
067 * | TicketDisplayTabPane |
068 * | |
069 * | |
070 * | |
071 * +----------------------------+
072 * </pre>
073 *
074 * <hr>
075 * Copyright 2006 Philipp Bartsch.<br>
076 * <a href="http://www.tastybug.com">www.tastybug.com</a><br>
077 * <hr>
078 * Created on Feb 9, 2006<br>
079 * @author Philipp Bartsch, philipp.bartsch{at}tastybug{dot}com</a>
080 */
081 public class QueueInspectorPane extends JPanel implements ListSelectionListener {
082
083 /**The <code>serialVersionUID</code>*/
084 private static final long serialVersionUID = -7305228423069744563L;
085
086 private TicketQueueStatisticsTable table;
087 private TicketQueueTable table2;
088 private TicketDisplayTabPane tabPane1;
089
090 /**
091 * Creates the pane; creates all subwidgets.
092 */
093 public QueueInspectorPane () {
094 super (new BorderLayout());
095
096 /*
097 * creates the statistical panel: it lists the number of tickets
098 */
099 JPanel northernStatisticalPane = new JPanel(new BorderLayout());
100 northernStatisticalPane.setBorder(BorderFactory.createTitledBorder(new EtchedBorder(EtchedBorder.LOWERED),
101 "Statistics",
102 TitledBorder.DEFAULT_JUSTIFICATION,
103 TitledBorder.DEFAULT_POSITION,
104 new Font("Arial", Font.BOLD, 9)));
105 table = new TicketQueueStatisticsTable();
106
107 northernStatisticalPane.add(table, BorderLayout.CENTER);
108
109 add(northernStatisticalPane, BorderLayout.NORTH);
110
111 /*
112 * creates the panel for ticket queue table and ticket display
113 */
114 JPanel centerQueueListPane = new JPanel(new BorderLayout(2,2));
115 centerQueueListPane.setBorder(BorderFactory.createTitledBorder(new EtchedBorder(EtchedBorder.LOWERED),
116 "Ticket List",
117 TitledBorder.DEFAULT_JUSTIFICATION,
118 TitledBorder.DEFAULT_POSITION,
119 new Font("Arial", Font.BOLD, 9)));
120 /*
121 * ticket queue table (lists the tickets of the queue)
122 */
123 table2 = new TicketQueueTable();
124 table2.getSelectionModel().addListSelectionListener(this);
125 JScrollPane scroller = new JScrollPane(table2);
126 table2.setPreferredScrollableViewportSize(new Dimension(400, 70));
127 centerQueueListPane.add(scroller, BorderLayout.CENTER);
128
129 //
130 tabPane1 = new TicketDisplayTabPane(new Dimension(400, 150));
131 centerQueueListPane.add(tabPane1, BorderLayout.SOUTH);
132
133 add(centerQueueListPane, BorderLayout.CENTER);
134 }
135
136 /**
137 * Declares the queue that is to be displayed.
138 *
139 * @param queue the queue
140 */
141 public void setQueue(TicketQueue queue) {
142
143 table.connectQueue(queue);
144 table2.connectQueue(queue);
145 }
146
147 /**
148 * Propagates the selection changes between the different widgets (e.g. selecting a
149 * ticket in the ticket queue table results in the display of the ticket in ticket display table).
150 *
151 * @see javax.swing.event.ListSelectionListener#valueChanged(javax.swing.event.ListSelectionEvent)
152 */
153 public void valueChanged(ListSelectionEvent e) {
154 // ich geh mal davon aus, das es der TicketQueueTable ist, der sich hier meldet
155
156 // erst dann den event annehmen, wenns der letzte ist der reihe der events ist.
157 // bsp: wird reihe 1 deselektiert und reihe 2 selektiert, interessiert mich nur der
158 // event bez. reihe 2
159 if (!e.getValueIsAdjusting()) {
160 Ticket ticket;
161 if (table2.getSelectionModel().isSelectedIndex(e.getFirstIndex())) {
162 ticket = ((TicketQueueTableModel)table2.getModel()).getTicketAt(e.getFirstIndex());
163 } else if (table2.getSelectionModel().isSelectedIndex(e.getLastIndex())) {
164 ticket = ((TicketQueueTableModel)table2.getModel()).getTicketAt(e.getLastIndex());
165 } else {
166 ticket = null;
167 }
168 tabPane1.setTicket(ticket);
169 }
170 }
171 }