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