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.queue;
016    
017    import java.util.Arrays;
018    import java.util.Iterator;
019    
020    import javax.swing.JTable;
021    import javax.swing.ListSelectionModel;
022    
023    import org.tastybug.bugwerk.blueprint.event.TicketChangeListener;
024    import org.tastybug.bugwerk.blueprint.model.Incident;
025    import org.tastybug.bugwerk.blueprint.model.Ticket;
026    import org.tastybug.bugwerk.blueprint.model.TicketQueue;
027    import org.tastybug.bugwerk.bugtrap.base.worker.QueueWorker;
028    import org.tastybug.bugwerk.bugtrap.base.worker.QueueWorkerListener;
029    
030    /**
031     * This table shows the content of a <code>TicketQueue</code>, listing all
032     * contained <code>Ticket</code> instances.
033     * <br>
034     * The table is a <code>QueueWorker</code> implementation and thus listens for
035     * activity on the queue, displaying changes upon necessity.
036     * <br>  
037     * Use it like this:
038     * <pre>
039     * TicketQueueTable table = new TicketQueueTable();
040     * table.connectQueue(Adapters.getAdapter("myProject").getTicketQueue());
041     * 
042     * // get informed about ticket selections:
043     * table.getSelectionModel().addListSelectionListener(yourSelectionListener); 
044     * </pre>
045     * <br>
046     * 
047     * <hr>
048     * Copyright 2006 Philipp Bartsch.<br>
049     * <a href="http://www.tastybug.com">www.tastybug.com</a><br>
050     * <hr>
051     * Created on Feb 8, 2006<br>
052     * @author Philipp Bartsch, philipp.bartsch{at}tastybug{dot}com</a>
053     */
054    public class TicketQueueTable extends JTable implements QueueWorker, TicketChangeListener {
055        
056        /**The <code>serialVersionUID</code>*/
057        private static final long serialVersionUID = 536742784785681779L;
058        
059        private TicketQueue                 ticketQueue;
060        private TicketQueueTableModel       tableModel;
061        private TicketQueueTableRenderer    tableRenderer;
062        
063        /**
064         * Initialises the table, using an empty model that is replaced as soon as a
065         * ticket queue is connected.
066         */
067        public TicketQueueTable () {
068            super (new Object[0][0], TicketQueueTableModel.columns);
069            setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
070        }
071        
072        /**
073         * Updates table model and UI.
074         *
075         * @see org.tastybug.bugwerk.blueprint.event.TicketQueueChangeListener#performTicketRemovedEvent(org.tastybug.bugwerk.blueprint.event.TicketQueueChangeListener.TicketQueueEvent)
076         */
077        public void performTicketRemovedEvent(TicketQueueEvent event) {
078            tableModel.update();
079            tableRenderer.update();
080            updateUI(); 
081        }
082    
083        /**
084         * Updates table model and UI.
085         *
086         * @see org.tastybug.bugwerk.blueprint.event.TicketQueueChangeListener#performTicketAddedEvent(org.tastybug.bugwerk.blueprint.event.TicketQueueChangeListener.TicketQueueEvent)
087         */
088        public void performTicketAddedEvent(TicketQueueEvent event) {
089            tableModel.update();
090            tableRenderer.update();
091            updateUI();
092        }
093    
094        /**
095         * Updates table model and UI.
096         *
097         * @see org.tastybug.bugwerk.blueprint.event.TicketChangeListener#performIncidentRemovedEvent(org.tastybug.bugwerk.blueprint.event.TicketChangeListener.IncidentEvent)
098         */
099        public void performIncidentRemovedEvent(IncidentEvent event) {
100            updateUI();
101        }
102    
103        /**
104         * Updates table model and UI.
105         *
106         * @see org.tastybug.bugwerk.blueprint.event.TicketChangeListener#performIncidentAddedEvent(org.tastybug.bugwerk.blueprint.event.TicketChangeListener.IncidentEvent)
107         */
108        public void performIncidentAddedEvent(IncidentEvent event) {
109            updateUI();
110        }
111    
112        /**
113         * Updates table model and UI.
114         *
115         * @see org.tastybug.bugwerk.blueprint.event.TicketChangeListener#performTicketChangedEvent(org.tastybug.bugwerk.blueprint.event.TicketChangeListener.TicketChangeEvent)
116         */
117        public void performTicketChangedEvent(TicketChangeEvent event) {
118            updateUI();
119        }
120    
121        /**
122         * Connects a ticket queue; results in the (re-)creation of the table model.
123         *
124         * @see org.tastybug.bugwerk.bugtrap.base.worker.QueueWorker#connectQueue(org.tastybug.bugwerk.blueprint.model.TicketQueue)
125         */
126        public void connectQueue(TicketQueue queue) {
127            if (ticketQueue != null)
128                for (Iterator tickets = Arrays.asList(ticketQueue.getTickets()).iterator(); tickets.hasNext();)
129                    ((Ticket)tickets.next()).removeTicketChangeListener(this);
130            
131            ticketQueue = queue;
132            tableModel = new TicketQueueTableModel(ticketQueue);
133            tableRenderer = new TicketQueueTableRenderer(ticketQueue);
134            
135            setModel(tableModel);
136            setDefaultRenderer(String.class, tableRenderer);
137            
138            // als listener an der queue anmelden
139            ticketQueue.addTicketQueueChangeListener(this);
140            
141            for (Iterator tickets = Arrays.asList(ticketQueue.getTickets()).iterator(); tickets.hasNext();)
142                ((Ticket)tickets.next()).addTicketChangeListener(this);
143            
144            updateUI();
145        }
146        
147        /**
148         * Does nothing, you cannot listen at this worker.
149         *
150         * @see org.tastybug.bugwerk.bugtrap.base.worker.QueueWorker#addQueueWorkerListener(org.tastybug.bugwerk.bugtrap.base.worker.QueueWorkerListener)
151         */
152        public void addQueueWorkerListener(QueueWorkerListener qwListener) {
153            //
154        }
155    
156        /**
157         * Returns always <code>false</code> as you cannot listen at this worker.
158         *
159         * @see org.tastybug.bugwerk.bugtrap.base.worker.QueueWorker#removeQueueWorkerListener(org.tastybug.bugwerk.bugtrap.base.worker.QueueWorkerListener)
160         */
161        public boolean removeQueueWorkerListener(QueueWorkerListener qwListener) {
162            return false;
163        }
164    
165        /**
166         * Returns always an empty array as you cannot listen at this worker.
167         *
168         * @see org.tastybug.bugwerk.bugtrap.base.worker.QueueWorker#removeQueueWorkerListener(org.tastybug.bugwerk.bugtrap.base.worker.QueueWorkerListener)
169         */
170        public QueueWorkerListener[] getQueueWorkerListeners() {
171            return new QueueWorkerListener[0];
172        }
173    
174        /**
175         * Updates table model and UI.
176         *
177         * @see org.tastybug.bugwerk.bugtrap.base.worker.QueueWorker#processQueue(boolean)
178         */
179        public void processQueue(boolean isUserDriven) {
180            updateUI();
181        }
182    
183        /**
184         * Does nothing.
185         *
186         * @see org.tastybug.bugwerk.bugtrap.base.worker.QueueWorker#fireIncidentProcessedEvent(org.tastybug.bugwerk.blueprint.model.Incident, boolean, java.lang.String)
187         */
188        public void fireIncidentProcessedEvent(Incident arg0, boolean arg1, String arg2) {
189            //
190        }
191    
192        /**
193         * Does nothing.
194         *
195         * @see org.tastybug.bugwerk.bugtrap.base.worker.QueueWorker#fireTicketProcessedEvent(org.tastybug.bugwerk.blueprint.model.Ticket, boolean, java.lang.String)
196         */
197        public void fireTicketProcessedEvent(Ticket arg0, boolean arg1, String arg2) {
198            updateUI();
199        }
200    }