File Source: ErrorListDialog.java
/*
P/P * Method: com.dmdirc.addons.ui_swing.dialogs.error.ErrorListDialog__static_init
*/
1 /*
2 * Copyright (c) 2006-2009 Chris Smith, Shane Mc Cormack, Gregory Holmes
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to deal
6 * in the Software without restriction, including without limitation the rights
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 * copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20 * SOFTWARE.
21 */
22
23 package com.dmdirc.addons.ui_swing.dialogs.error;
24
25 import com.dmdirc.addons.ui_swing.MainFrame;
26 import com.dmdirc.addons.ui_swing.components.StandardDialog;
27 import com.dmdirc.logger.ErrorManager;
28 import com.dmdirc.logger.ErrorReportStatus;
29 import com.dmdirc.logger.ProgramError;
30
31 import java.awt.Dimension;
32 import java.awt.event.ActionEvent;
33 import java.awt.event.ActionListener;
34
35 import java.util.concurrent.atomic.AtomicInteger;
36 import javax.swing.JButton;
37 import javax.swing.JPanel;
38 import javax.swing.JScrollPane;
39 import javax.swing.JSplitPane;
40 import javax.swing.event.ListSelectionEvent;
41 import javax.swing.event.ListSelectionListener;
42 import javax.swing.event.TableModelEvent;
43 import javax.swing.event.TableModelListener;
44
45 import net.miginfocom.layout.PlatformDefaults;
46 import net.miginfocom.swing.MigLayout;
47
48 /**
49 * Error list dialog.
50 */
51 public final class ErrorListDialog extends StandardDialog implements
52 ActionListener, ListSelectionListener, TableModelListener {
53
54 /**
55 * A version number for this class. It should be changed whenever the class
56 * structure is changed (or anything else that would prevent serialized
57 * objects being unserialized with the new class).
58 */
59 private static final long serialVersionUID = 5;
60 /** Table model. */
61 private final ErrorTableModel tableModel;
62 /** Table scrollpane. */
63 private JScrollPane scrollPane;
64 /** Error table. */
65 private ErrorTable table;
66 /** Error detail panel. */
67 private ErrorDetailPanel errorDetails;
68 /** Send button. */
69 private JButton sendButton;
70 /** Delete button. */
71 private JButton deleteButton;
72 /** Delete all button. */
73 private JButton deleteAllButton;
74 /** Selected row. */
75 private final AtomicInteger selectedRow = new AtomicInteger(-1);
76 /** Row being deleted. */
77 private boolean rowBeingDeleted = false;
78
79 /**
80 * Creates a new instance of ErrorListDialog.
81 *
82 * @param mainFrame Main frame
83 */
84 public ErrorListDialog(final MainFrame mainFrame) {
/*
P/P * Method: void com.dmdirc.addons.ui_swing.dialogs.error.ErrorListDialog(MainFrame)
*
* Presumptions:
* com.dmdirc.logger.ErrorManager:getErrors(...)@54 != null
* init'ed(java.awt.Dialog$ModalityType.MODELESS)
*
* Postconditions:
* this.deleteAllButton == &new JButton(initButtons#5)
* this.deleteButton == &new JButton(initButtons#4)
* this.errorDetails == &new ErrorDetailPanel(initComponents#4)
* init'ed(this.rowBeingDeleted)
* this.scrollPane == &new JScrollPane(initComponents#1)
* this.selectedRow == &new AtomicInteger(ErrorListDialog#1)
* this.sendButton == &new JButton(initButtons#3)
* this.table == &new ErrorTable(initComponents#2)
* this.tableModel == &new ErrorTableModel(ErrorListDialog#2)
* new AtomicInteger(ErrorListDialog#1) num objects == 1
* ...
*/
85 super(mainFrame, ModalityType.MODELESS);
86
87 setTitle("DMDirc: Error list");
88
89 tableModel = new ErrorTableModel();
90
91 initComponents();
92 layoutComponents();
93 initListeners();
94
95 selectedRow.set(table.getSelectedRow());
96
97 pack();
98 }
99
100 /** Initialises the components. */
101 private void initComponents() {
/*
P/P * Method: void initComponents()
*
* Preconditions:
* this.tableModel != null
* this.tableModel.errors != null
*
* Postconditions:
* this.deleteAllButton == &new JButton(initButtons#5)
* this.deleteButton == &new JButton(initButtons#4)
* this.errorDetails == &new ErrorDetailPanel(initComponents#4)
* this.scrollPane == &new JScrollPane(initComponents#1)
* this.sendButton == &new JButton(initButtons#3)
* this.table == &new ErrorTable(initComponents#2)
* new ErrorDetailPanel(initComponents#4) num objects == 1
* new ErrorTable(initComponents#2) num objects == 1
* new JButton(initButtons#3) num objects == 1
* new JButton(initButtons#4) num objects == 1
* ...
*/
102 initButtons();
103
104 scrollPane = new JScrollPane();
105
106 table = new ErrorTable(tableModel, scrollPane);
107
108 table.setPreferredScrollableViewportSize(new Dimension(600, 150));
109
110 scrollPane.setViewportView(table);
111
112 errorDetails = new ErrorDetailPanel();
113 }
114
115 /** Initialises the buttons. */
116 private void initButtons() {
/*
P/P * Method: void initButtons()
*
* Preconditions:
* this.tableModel != null
* this.tableModel.errors != null
*
* Presumptions:
* com.dmdirc.addons.ui_swing.dialogs.error.ErrorListDialog:getCancelButton(...)@119 != null
*
* Postconditions:
* this.deleteAllButton == &new JButton(initButtons#5)
* this.deleteButton == &new JButton(initButtons#4)
* this.sendButton == &new JButton(initButtons#3)
* new JButton(initButtons#3) num objects == 1
* new JButton(initButtons#4) num objects == 1
* new JButton(initButtons#5) num objects == 1
*
* Test Vectors:
* java.util.List:size(...)@86: {-231..0}, {1..232-1}
*/
117 orderButtons(new JButton(), new JButton());
118
119 getCancelButton().setText("Close");
120 sendButton = new JButton("Send");
121 deleteButton = new JButton("Delete");
122 deleteAllButton = new JButton("Delete All");
123
124 sendButton.setEnabled(false);
125 deleteButton.setEnabled(false);
126 if (tableModel.getRowCount() > 0) {
127 deleteAllButton.setEnabled(true);
128 } else {
129 deleteAllButton.setEnabled(false);
130 }
131 }
132
133 /** Initialises the listeners. */
134 private void initListeners() {
/*
P/P * Method: void initListeners()
*
* Preconditions:
* this.deleteAllButton != null
* this.deleteButton != null
* this.sendButton != null
* this.table != null
* this.tableModel != null
*
* Presumptions:
* com.dmdirc.addons.ui_swing.dialogs.error.ErrorListDialog:getCancelButton(...)@141 != null
* com.dmdirc.addons.ui_swing.dialogs.error.ErrorListDialog:getOkButton(...)@140 != null
* com.dmdirc.addons.ui_swing.dialogs.error.ErrorTable:getSelectionModel(...)@136 != null
*/
135 tableModel.addTableModelListener(this);
136 table.getSelectionModel().addListSelectionListener(this);
137 sendButton.addActionListener(this);
138 deleteButton.addActionListener(this);
139 deleteAllButton.addActionListener(this);
140 getOkButton().addActionListener(this);
141 getCancelButton().addActionListener(this);
142 }
143
144 /** Lays out the components. */
145 private void layoutComponents() {
/*
P/P * Method: void layoutComponents()
*
* Preconditions:
* init'ed(this.deleteAllButton)
* init'ed(this.deleteButton)
* init'ed(this.errorDetails)
* init'ed(this.scrollPane)
* init'ed(this.sendButton)
*
* Presumptions:
* (int) (net.miginfocom.layout.UnitValue:getValue(...)@161) in {-231..232-1}
* com.dmdirc.addons.ui_swing.dialogs.error.ErrorListDialog:getContentPane(...)@164 != null
* net.miginfocom.layout.PlatformDefaults:getPanelInsets(...)@161 != null
*/
146 final JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
147 true);
148 final JPanel panel = new JPanel();
149
150 panel.setLayout(new MigLayout("fill"));
151
152 panel.add(errorDetails, "wrap, grow, push");
153 panel.add(deleteAllButton, "split 4, tag left, sgx button");
154 panel.add(deleteButton, "tag other, sgx button");
155 panel.add(sendButton, "tag other, sgx button");
156 panel.add(getCancelButton(), "tag ok, sgx button");
157
158 splitPane.setTopComponent(scrollPane);
159 splitPane.setBottomComponent(panel);
160
161 splitPane.setDividerSize((int) PlatformDefaults.getPanelInsets(0).
162 getValue());
163
164 getContentPane().add(splitPane);
165 }
166
167 /** {@inheritDoc}. */
168 @Override
169 public void valueChanged(final ListSelectionEvent e) {
/*
P/P * Method: void valueChanged(ListSelectionEvent)
*
* Preconditions:
* e != null
* (soft) init'ed(this.rowBeingDeleted)
* (soft) this.deleteButton != null
* (soft) this.errorDetails != null
* (soft) this.selectedRow != null
* (soft) this.sendButton != null
* (soft) this.table != null
* (soft) this.tableModel != null
* (soft) this.tableModel.errors != null
*
* Presumptions:
* com.dmdirc.addons.ui_swing.dialogs.error.ErrorTable:getRowSorter(...)@173 != null
* com.dmdirc.addons.ui_swing.dialogs.error.ErrorTable:getSelectionModel(...)@190 != null
* init'ed(com.dmdirc.logger.ErrorReportStatus.FINISHED)
* init'ed(com.dmdirc.logger.ErrorReportStatus.NOT_APPLICABLE)
* java.util.List:get(...)@194 != null
*
* Postconditions:
* possibly_updated(this.errorDetails.error)
* init'ed(this.rowBeingDeleted)
*
* Test Vectors:
* this.rowBeingDeleted: {0}, {1}
* com.dmdirc.addons.ui_swing.dialogs.error.ErrorTable:getSelectedRow(...)@171: {-231..-1}, {0..232-1}
* javax.swing.event.ListSelectionEvent:getValueIsAdjusting(...)@170: {1}, {0}
*/
170 if (!e.getValueIsAdjusting()) {
171 final int localRow = table.getSelectedRow();
172 if (localRow > -1) {
173 final ProgramError error = tableModel.getError(
174 table.getRowSorter().convertRowIndexToModel(localRow));
175 errorDetails.setError(error);
176 deleteButton.setEnabled(true);
177 if (error.getReportStatus() == ErrorReportStatus.NOT_APPLICABLE ||
178 error.getReportStatus() == ErrorReportStatus.FINISHED) {
179 sendButton.setEnabled(false);
180 } else {
181 sendButton.setEnabled(true);
182 }
183 } else {
184 errorDetails.setError(null);
185 deleteButton.setEnabled(false);
186 sendButton.setEnabled(false);
187 }
188 synchronized (selectedRow) {
189 if (rowBeingDeleted) {
190 table.getSelectionModel().setSelectionInterval(selectedRow.
191 get(), selectedRow.get());
192 rowBeingDeleted = false;
193 }
194 selectedRow.set(localRow);
195 }
196 }
197 }
198
199 /**
200 * {@inheritDoc}.
201 *
202 * @param e Action event
203 */
204 @Override
205 public void actionPerformed(final ActionEvent e) {
/*
P/P * Method: void actionPerformed(ActionEvent)
*
* Preconditions:
* e != null
* (soft) init'ed(this.deleteAllButton)
* (soft) init'ed(this.deleteButton)
* (soft) init'ed(this.sendButton)
* (soft) this.table != null
* (soft) this.tableModel != null
* (soft) this.tableModel.errors != null
*
* Presumptions:
* com.dmdirc.addons.ui_swing.dialogs.error.ErrorTable:getRowSorter(...)@210 != null
* com.dmdirc.addons.ui_swing.dialogs.error.ErrorTable:getRowSorter(...)@216 != null
* com.dmdirc.logger.ErrorManager:getErrorManager(...)@210 != null
* com.dmdirc.logger.ErrorManager:getErrorManager(...)@216 != null
* com.dmdirc.logger.ErrorManager:getErrorManager(...)@221 != null
*/
206 if (e.getSource() == getCancelButton()) {
207 setVisible(false);
208 } else if (e.getSource() == deleteButton) {
209 synchronized (selectedRow) {
210 ErrorManager.getErrorManager().deleteError(tableModel.getError(
211 table.getRowSorter().convertRowIndexToModel(
212 table.getSelectedRow())));
213 }
214 } else if (e.getSource() == sendButton) {
215 synchronized (selectedRow) {
216 ErrorManager.getErrorManager().sendError(tableModel.getError(
217 table.getRowSorter().convertRowIndexToModel(
218 table.getSelectedRow())));
219 }
220 } else if (e.getSource() == deleteAllButton) {
221 ErrorManager.getErrorManager().deleteAll();
222 }
223 }
224
225 /**
226 * {@inheritDoc}
227 *
228 * @param e Table model event
229 */
230 @Override
231 public void tableChanged(final TableModelEvent e) {
/*
P/P * Method: void tableChanged(TableModelEvent)
*
* Preconditions:
* e != null
* this.deleteAllButton != null
* this.tableModel != null
* this.tableModel.errors != null
* (soft) this.selectedRow != null
* (soft) this.sendButton != null
* (soft) this.table != null
*
* Presumptions:
* com.dmdirc.addons.ui_swing.dialogs.error.ErrorTable:getSelectionModel(...)@238 != null
* com.dmdirc.addons.ui_swing.dialogs.error.ErrorTable:getSelectionModel(...)@246 != null
* init'ed(com.dmdirc.logger.ErrorReportStatus.FINISHED)
* init'ed(com.dmdirc.logger.ErrorReportStatus.NOT_APPLICABLE)
* java.util.List:get(...)@194 != null
* ...
*
* Postconditions:
* possibly_updated(this.rowBeingDeleted)
*
* Test Vectors:
* java.util.List:size(...)@86: {-231..0}, {1..232-1}
* javax.swing.event.TableModelEvent:getType(...)@232: {-1}, {0}, {1}, {-231..-2, 2..232-1}
*/
232 switch (e.getType()) {
233 case TableModelEvent.DELETE:
234 synchronized (selectedRow) {
235 if (selectedRow.get() >= tableModel.getRowCount()) {
236 selectedRow.set(tableModel.getRowCount() - 1);
237 }
238 table.getSelectionModel().setSelectionInterval(selectedRow.
239 get(),
240 selectedRow.get());
241 rowBeingDeleted = true;
242 }
243 break;
244 case TableModelEvent.INSERT:
245 synchronized (selectedRow) {
246 table.getSelectionModel().setSelectionInterval(selectedRow.
247 get(),
248 selectedRow.get());
249 }
250 break;
251 case TableModelEvent.UPDATE:
252 final int errorRow = e.getFirstRow();
253 final ProgramError error = tableModel.getError(errorRow);
254 if (errorRow == table.getSelectedRow()) {
255 if (error.getReportStatus() ==
256 ErrorReportStatus.NOT_APPLICABLE ||
257 error.getReportStatus() ==
258 ErrorReportStatus.FINISHED) {
259 sendButton.setEnabled(false);
260 } else {
261 sendButton.setEnabled(true);
262 }
263 }
264 break;
265 }
266 if (tableModel.getRowCount() > 0) {
267 deleteAllButton.setEnabled(true);
268 } else {
269 deleteAllButton.setEnabled(false);
270 }
271 }
272 }
SofCheck Inspector Build Version : 2.17854
| ErrorListDialog.java |
2009-Jun-25 01:54:24 |
| ErrorListDialog.class |
2009-Sep-02 17:04:14 |