/**
  * Displays a message dialog containing the error specified in parameter.
  *
  * @param error a String representing an error message to display.
  */
 private void displayError(String error) {
   JOptionPane.showMessageDialog(
       mailsListPane.getParent(),
       error,
       String.format(
           i18n.get("mailslist.err.title"), Configuration.INSTANCE.get("application.name")),
       JOptionPane.ERROR_MESSAGE);
 }
  /**
   * Creates the table and sets its cells as non editable.
   *
   * <p>Adds some mouse events on the table, to display emails, when a user clicks on a specific
   * row.<br>
   * If the email can't be found, an error message will be displayed.<br>
   * The table will reset the size of its column every time the size of the table changed (for
   * example when the user maximizes the window).
   */
  public MailsListPane() {
    // Init desktop (Java 6 Desktop API)
    if (Desktop.isDesktopSupported()) {
      desktop = Desktop.getDesktop();
    }

    if (!ArgsHandler.INSTANCE.memoryModeEnabled()) {
      table.addMouseListener(
          new MouseListener() {
            @Override
            public void mouseReleased(MouseEvent e) {}

            @Override
            public void mousePressed(MouseEvent e) {}

            @Override
            public void mouseExited(MouseEvent e) {}

            @Override
            public void mouseEntered(MouseEvent e) {}

            @Override
            public void mouseClicked(MouseEvent e) {

              String emlViewer = ArgsHandler.INSTANCE.getEmlViewer();

              if (e.getClickCount() == 2 && (emlViewer != null || desktop != null)) {
                File file = null;
                JTable target = (JTable) e.getSource();
                String fileName = UIModel.INSTANCE.getListMailsMap().get(target.getSelectedRow());
                if (fileName == null) {
                  LOGGER.error(
                      "Can't find any associated email for row #{}", target.getSelectedRow());
                } else {
                  file = new File(fileName);
                }

                if (file != null && file.exists()) {
                  try {
                    if (emlViewer != null) {
                      Runtime.getRuntime().exec(emlViewer + " " + file.getAbsolutePath());
                    } else {
                      desktop.open(file);
                    }
                  } catch (IOException ioe) {
                    LOGGER.error("", ioe);
                    displayError(
                        String.format(i18n.get("mailslist.err.open"), file.getAbsolutePath()));
                  }
                } else {
                  displayError(
                      String.format(i18n.get("mailslist.err.find"), file.getAbsolutePath()));
                }
              }
            }
          });
    }

    // Auto scroll tab to bottom when a new element is inserted
    table.addComponentListener(
        new ComponentAdapter() {
          public void componentResized(ComponentEvent e) {
            table.scrollRectToVisible(new Rectangle(table.getCellRect(nbElements, 0, true)));
          }
        });

    model.addColumn(i18n.get("mailslist.col.received"));
    model.addColumn(i18n.get("mailslist.col.from"));
    model.addColumn(i18n.get("mailslist.col.to"));
    model.addColumn(i18n.get("mailslist.col.subject"));
    table.setModel(model);

    mailsListPane.addComponentListener(
        new ComponentAdapter() {
          public void componentResized(ComponentEvent e) {
            // When the width of a column is changed, only the columns to the left and right of the
            // margin change
            table.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);

            // Set width for each column
            int total = 0;
            int length = widths.length;
            for (int i = 0; i < length; i++) {
              table.getColumnModel().getColumn(i).setPreferredWidth(widths[i]);
              total += widths[i];
            }
            table.getColumnModel().getColumn(length).setPreferredWidth(table.getWidth() - total);
          }
        });
    mailsListPane.getViewport().add(table, null);
  }