Package frost.gui

Source Code of frost.gui.AddNewDownloadsDialog$AddNewDownloadsTable

/*
  AddNewDownloadsDialog.java / Frost
  Copyright (C) 2010  Frost Project <jtcfrost.sourceforge.net>

  This program is free software; you can redistribute it and/or
  modify it under the terms of the GNU General Public License as
  published by the Free Software Foundation; either version 2 of
  the License, or (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package frost.gui;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;

import frost.Core;
import frost.SettingsClass;
import frost.fileTransfer.FileTransferManager;
import frost.fileTransfer.FreenetPriority;
import frost.fileTransfer.download.FrostDownloadItem;
import frost.gui.model.SortedTableModel;
import frost.gui.model.TableMember;
import frost.storage.perst.TrackDownloadKeys;
import frost.storage.perst.TrackDownloadKeysStorage;
import frost.util.DateFun;
import frost.util.FormatterUtils;
import frost.util.gui.BooleanCell;
import frost.util.gui.JSkinnablePopupMenu;
import frost.util.gui.MiscToolkit;
import frost.util.gui.translation.Language;

@SuppressWarnings("serial")
public class AddNewDownloadsDialog extends javax.swing.JFrame {

  private final Language language;

  private final TrackDownloadKeysStorage trackDownloadKeysStorage;

  private AddNewDownloadsTableModel addNewDownloadsTableModel;
  private AddNewDownloadsTable addNewDownloadsTable;
  private JButton removeAlreadyDownloadedButton;
  private JButton removeAlreadyExistsButton;
  private JButton okButton;
  private JButton cancelButton;
  private JSkinnablePopupMenu tablePopupMenu;

  private final Frame parentFrame;


  public AddNewDownloadsDialog(final JFrame frame) {
    parentFrame = frame;
   
    language = Language.getInstance();
    trackDownloadKeysStorage = TrackDownloadKeysStorage.inst();

    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

    initGUI();
  }

  private void initGUI() {
    try {
      setTitle(language.getString("AddNewDownloadsDialog.title"));
     
      int width = (int) (parentFrame.getWidth() * 0.75);
      int height = (int) (parentFrame.getHeight() * 0.75);

      if( width < 1000 ) {
        Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();

        if( screenSize.width > 1300 ) {
          width = 1200;

        } else if( screenSize.width > 1000 ) {
          width = (int) (parentFrame.getWidth() * 0.99);
        }
      }

      if( height < 500 ) {
        Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();

        if( screenSize.width > 900 ) {
          height = 800;
        } else {
          height = (int) (screenSize.width * 0.85);
        }
      }

      setSize(width, height);

      this.setResizable(true);
     
      setIconImage(MiscToolkit.loadImageIcon("/data/toolbar/document-save-as.png").getImage());
     
     
      // Remove already Downloaded Button
      removeAlreadyDownloadedButton = new JButton(language.getString("AddNewDownloadsDialog.button.removeAlreadyDownloadedButton"));
      removeAlreadyDownloadedButton.setToolTipText(language.getString("AddNewDownloadsDialog.buttonTooltip.removeAlreadyDownloadedButton"));
      removeAlreadyDownloadedButton.addActionListener( new java.awt.event.ActionListener() {
        public void actionPerformed(final ActionEvent e) {
          removeAlreadyDownloadedButton_actionPerformed(e);
        }
      });

      // Remove already exists Button
      removeAlreadyExistsButton = new JButton(language.getString("AddNewDownloadsDialog.button.removeAlreadyExistsButton"));
      removeAlreadyExistsButton.setToolTipText(language.getString("AddNewDownloadsDialog.buttonTooltip.removeAlreadyExistsButton"));
      removeAlreadyExistsButton.addActionListener( new java.awt.event.ActionListener() {
        public void actionPerformed(final ActionEvent e) {
          removeAlreadyExistsButton_actionPerformed(e);
        }
      });

      // OK Button
      okButton = new JButton(language.getString("Common.ok"));
      okButton.addActionListener( new java.awt.event.ActionListener() {
        public void actionPerformed(final ActionEvent e) {
          FileTransferManager.inst().getDownloadManager().getModel().addDownloadItemList(getDownloads());
         
          dispose();
        }
      });

      // Cancel Button
      cancelButton = new JButton(language.getString("Common.cancel"));
      cancelButton.addActionListener( new java.awt.event.ActionListener() {
        public void actionPerformed(final ActionEvent e) {
          addNewDownloadsTableModel.clearDataModel();
          dispose();
        }
      });

      // Button row
      final JPanel buttonsPanel = new JPanel(new BorderLayout());
      buttonsPanel.setLayout( new BoxLayout( buttonsPanel, BoxLayout.X_AXIS ));

      buttonsPanel.add( removeAlreadyDownloadedButton );
      buttonsPanel.add(Box.createRigidArea(new Dimension(10,3)));
      buttonsPanel.add( removeAlreadyExistsButton );
      buttonsPanel.add(Box.createRigidArea(new Dimension(10,3)));

      buttonsPanel.add( Box.createHorizontalGlue() );

      buttonsPanel.add( cancelButton );
      buttonsPanel.add(Box.createRigidArea(new Dimension(10,3)));
      buttonsPanel.add( okButton );
      buttonsPanel.setBorder(BorderFactory.createEmptyBorder(10,0,0,0));

      // Download Table
      addNewDownloadsTableModel = new AddNewDownloadsTableModel();
      addNewDownloadsTable = new AddNewDownloadsTable( addNewDownloadsTableModel );
      addNewDownloadsTable.setRowSelectionAllowed(true);
      addNewDownloadsTable.setSelectionMode( ListSelectionModel.MULTIPLE_INTERVAL_SELECTION );
      addNewDownloadsTable.setRowHeight(18);
      final JScrollPane scrollPane = new JScrollPane(addNewDownloadsTable);
      scrollPane.setWheelScrollingEnabled(true);
     
      // main panel
      final JPanel mainPanel = new JPanel(new BorderLayout());
      mainPanel.add( scrollPane, BorderLayout.CENTER );
      mainPanel.add( buttonsPanel, BorderLayout.SOUTH );
      mainPanel.setBorder(BorderFactory.createEmptyBorder(5,7,7,7));

      this.getContentPane().setLayout(new BorderLayout());
      this.getContentPane().add(mainPanel, null);
     
      // Init popup menu
      this.initPopupMenu();
     
      // Init HotKeys
      this.initHotKeyListener();
     
      addNewDownloadsTable.setAutoResizeMode( JTable.AUTO_RESIZE_NEXT_COLUMN);
      int tableWidth = getWidth();
     
      TableColumnModel headerColumnModel = addNewDownloadsTable.getTableHeader().getColumnModel();
      int defaultColumnWidthRatio[] = addNewDownloadsTableModel.getDefaultColumnWidthRatio();
      for(int i = 0 ; i < defaultColumnWidthRatio.length ; i++) {
        headerColumnModel.getColumn(i).setMinWidth(5);
        int ratio = tableWidth * defaultColumnWidthRatio[i] /100;
        headerColumnModel.getColumn(i).setPreferredWidth(ratio);
      }

    } catch (final Exception e) {
      e.printStackTrace();
    }
  }
 
  private List<FrostDownloadItem> getDownloads() {
    List<FrostDownloadItem> frostDownloadItmeList = new LinkedList<FrostDownloadItem>();
    final int numberOfRows = addNewDownloadsTableModel.getRowCount();
    for( int indexPos = 0; indexPos < numberOfRows; indexPos++) {
      frostDownloadItmeList.add( addNewDownloadsTableModel.getRow(indexPos).getDownloadItem() );
    }
    return frostDownloadItmeList;
  }

  public void startDialog(List<FrostDownloadItem> frostDownloadItmeList) {
    // load data into table
    this.loadNewDownloadsIntoTable(frostDownloadItmeList);
    setLocationRelativeTo(parentFrame);

    // display table
    setVisible(true); // blocking!
  }

  private void loadNewDownloadsIntoTable(final List<FrostDownloadItem> frostDownloadItmeList) {
    this.addNewDownloadsTableModel.clearDataModel();
    for( final FrostDownloadItem froDownloadItem : frostDownloadItmeList) {
      this.addNewDownloadsTableModel.addRow(new AddNewDownloadsTableMember(froDownloadItem));
    }
  }
 
 
  private void initHotKeyListener() {
    addNewDownloadsTable.addKeyListener( new KeyListener() {
     
      @Override
      public void keyTyped(KeyEvent e) {
        // Nothing to do
      }

      @Override
      public void keyReleased(KeyEvent e) {
        if( ! e.isShiftDown() && e.getKeyCode() == KeyEvent.VK_DELETE) {
          // remove selected
          addNewDownloadsTable.removeSelected();

        } else if( e.isShiftDown() && e.getKeyCode() == KeyEvent.VK_DELETE) {
          // remove but selected
          addNewDownloadsTable.removeButSelected();

        } else if( e.getKeyCode() == KeyEvent.VK_D) {
          // change directory
          changeDownloadDir_actionPerformed();

        } else if( e.getKeyCode() == KeyEvent.VK_R) {
          // rename
          addNewDownloadsTable.new SelectedItemsAction() {
            protected void action(AddNewDownloadsTableMember addNewDownloadsTableMember) {
              String newName = askForNewname(addNewDownloadsTableMember.getDownloadItem().getUnprefixedFilename());
              if( newName != null ) {
                addNewDownloadsTableMember.getDownloadItem().setFileName(newName);
              }
              addNewDownloadsTableMember.updateExistsCheck();
            }
          };

        } else if( e.getKeyCode() == KeyEvent.VK_P) {
          // prefix
          final String prefix = JOptionPane.showInputDialog(
              AddNewDownloadsDialog.this,
              language.getString("AddNewDownloadsDialog.prefixFilenameDialog.dialogBody"),
              language.getString("AddNewDownloadsDialog.prefixFilenameDialog.dialogTitle"),
              JOptionPane.QUESTION_MESSAGE
          );

          addNewDownloadsTable.new SelectedItemsAction() {
            protected void action(AddNewDownloadsTableMember addNewDownloadsTableMember) {
              addNewDownloadsTableMember.getDownloadItem().setFilenamePrefix(prefix);
            }
          };

        } else if( e.getKeyCode() == KeyEvent.VK_ENTER) {
          // Ok
          FileTransferManager.inst().getDownloadManager().getModel().addDownloadItemList(getDownloads());
          dispose();

        } else if( e.getKeyCode() == KeyEvent.VK_ESCAPE) {
          // Cancel
          addNewDownloadsTableModel.clearDataModel();
          dispose();
       
        } else {
          // priority
          for(final FreenetPriority priority : FreenetPriority.values()) {
            if(e.getKeyChar() == String.valueOf(priority.getNumber()).charAt(0) ) {
              addNewDownloadsTable.new SelectedItemsAction() {
                protected void action(AddNewDownloadsTableMember addNewDownloadsTableMember) {
                  addNewDownloadsTableMember.getDownloadItem().setPriority(priority);
                }
              };
              break;
            }
          }
        }
      }

      @Override
      public void keyPressed(KeyEvent e) {
        // Nothing to do
      }
    });
  }

  private void initPopupMenu() {

    // Rename file
    final JMenuItem renameFile = new JMenuItem(language.getString("AddNewDownloadsDialog.button.renameFile"));
    renameFile.addActionListener( new java.awt.event.ActionListener() {
      public void actionPerformed(final ActionEvent actionEvent) {
        addNewDownloadsTable.new SelectedItemsAction() {
          protected void action(AddNewDownloadsTableMember addNewDownloadsTableMember) {
            String newName = askForNewname(addNewDownloadsTableMember.getDownloadItem().getUnprefixedFilename());
            if( newName != null ) {
              addNewDownloadsTableMember.getDownloadItem().setFileName(newName);
            }
            addNewDownloadsTableMember.updateExistsCheck();
          }
        };
      }
    });
   
    // prefix Filename
    final JMenuItem prefixFilename = new JMenuItem(language.getString("AddNewDownloadsDialog.button.prefixFilename"));
    prefixFilename.addActionListener( new java.awt.event.ActionListener() {
      public void actionPerformed(final ActionEvent actionEvent) {
        final String prefix = JOptionPane.showInputDialog(
          AddNewDownloadsDialog.this,
          language.getString("AddNewDownloadsDialog.prefixFilenameDialog.dialogBody"),
          language.getString("AddNewDownloadsDialog.prefixFilenameDialog.dialogTitle"),
          JOptionPane.QUESTION_MESSAGE
        );

        addNewDownloadsTable.new SelectedItemsAction() {
          protected void action(AddNewDownloadsTableMember addNewDownloadsTableMember) {
            addNewDownloadsTableMember.getDownloadItem().setFilenamePrefix(prefix);
          }
        };
      }
    });

    // Change Download Directory
    final JMenuItem changeDownloadDir = new JMenuItem(language.getString("AddNewDownloadsDialog.button.changeDownloadDir"));
    changeDownloadDir.addActionListener( new java.awt.event.ActionListener() {
      public void actionPerformed(final ActionEvent actionEvent) {
        changeDownloadDir_actionPerformed();
      }
    });
   

    // Remove item item(s) list
    final JMenuItem removeDownload = new JMenuItem(language.getString("AddNewDownloadsDialog.button.removeDownload"));
    removeDownload.addActionListener( new java.awt.event.ActionListener() {
      public void actionPerformed(final ActionEvent actionEvent) {
        addNewDownloadsTable.removeSelected();
      }
    });

    // Remove but selected item(s) from list
    final JMenuItem removeButSelectedDownload = new JMenuItem(language.getString("AddNewDownloadsDialog.button.removeButSelectedDownload"));
    removeButSelectedDownload.addActionListener( new java.awt.event.ActionListener() {
      public void actionPerformed(final ActionEvent actionEvent) {
        addNewDownloadsTable.removeButSelected();
      }
    });

    // Change Priority
    final JMenu changePriorityMenu = new JMenu(language.getString("Common.priority.changePriority"));
    for(final FreenetPriority priority : FreenetPriority.values()) {
      JMenuItem priorityMenuItem = new JMenuItem(priority.getName());
      priorityMenuItem.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(final ActionEvent actionEvent) {
          addNewDownloadsTable.new SelectedItemsAction() {
            protected void action(AddNewDownloadsTableMember addNewDownloadsTableMember) {
              addNewDownloadsTableMember.getDownloadItem().setPriority(priority);
            }
          };
        }
      });
      changePriorityMenu.add(priorityMenuItem);
    }
   
    // Enable download
    final JMenuItem enableDownloadMenuItem = new JMenuItem(language.getString("AddNewDownloadsDialog.popupMenu.enableDownload"));
    enableDownloadMenuItem.addActionListener( new java.awt.event.ActionListener() {
      public void actionPerformed(final ActionEvent actionEvent) {
        addNewDownloadsTable.new SelectedItemsAction() {
          protected void action(AddNewDownloadsTableMember addNewDownloadsTableMember) {
            addNewDownloadsTableMember.getDownloadItem().setEnabled(true);
          }
        };
      }
    });
   
   
    // Disable download
    final JMenuItem disableDownloadMenuItem = new JMenuItem(language.getString("AddNewDownloadsDialog.popupMenu.disableDownload"));
    disableDownloadMenuItem.addActionListener( new java.awt.event.ActionListener() {
      public void actionPerformed(final ActionEvent actionEvent) {
        addNewDownloadsTable.new SelectedItemsAction() {
          protected void action(AddNewDownloadsTableMember addNewDownloadsTableMember) {
            addNewDownloadsTableMember.getDownloadItem().setEnabled(false);
          }
        };
      }
    });
   
    // recent download directory
    final JMenu downloadDirRecentMenu = new JMenu(language.getString("DownloadPane.toolbar.downloadDirMenu.setDownloadDirTo"));
    JMenuItem item = new JMenuItem(Core.frostSettings.getValue(SettingsClass.DIR_DOWNLOAD));
    item.addActionListener( new java.awt.event.ActionListener() {
      public void actionPerformed(final ActionEvent actionEvent) {
        setDownloadDir(Core.frostSettings.getValue(SettingsClass.DIR_DOWNLOAD));
      }
    });
    downloadDirRecentMenu.add(item);
    final LinkedList<String> dirs = FileTransferManager.inst().getDownloadManager().getRecentDownloadDirs();
    if( dirs.size() > 0 ) {
      downloadDirRecentMenu.addSeparator();
      final ListIterator<String> iter = dirs.listIterator(dirs.size());
      while (iter.hasPrevious()) {
        final String dir = (String) iter.previous();
       
        item = new JMenuItem(dir);
        item.addActionListener( new java.awt.event.ActionListener() {
          public void actionPerformed(final ActionEvent actionEvent) {
            setDownloadDir(dir);
          }
        });
        downloadDirRecentMenu.add(item);
      }
    }

    // Compose popup menu
    tablePopupMenu = new JSkinnablePopupMenu();
    tablePopupMenu.add(renameFile);
    tablePopupMenu.add(prefixFilename);
    tablePopupMenu.addSeparator();
    tablePopupMenu.add(changeDownloadDir);
    tablePopupMenu.addSeparator();
    tablePopupMenu.add(removeDownload);
    tablePopupMenu.add(removeButSelectedDownload);
    tablePopupMenu.addSeparator();
    tablePopupMenu.add(changePriorityMenu);
    tablePopupMenu.addSeparator();
    tablePopupMenu.add(enableDownloadMenuItem);
    tablePopupMenu.add(disableDownloadMenuItem);
    tablePopupMenu.addSeparator();
    tablePopupMenu.add(downloadDirRecentMenu);
   
    this.addNewDownloadsTable.addMouseListener(new TablePopupMenuMouseListener());
  }

  private void removeAlreadyDownloadedButton_actionPerformed(final ActionEvent actionEvent) {
    final int numberOfRows = addNewDownloadsTableModel.getRowCount();
    addNewDownloadsTable.clearSelection();
    for( int indexPos = numberOfRows -1; indexPos >= 0; indexPos--) {
      final AddNewDownloadsTableMember addNewDownloadsTableMember =
        addNewDownloadsTableModel.getRow(indexPos);
      if( trackDownloadKeysStorage.searchItemKey( addNewDownloadsTableMember.getDownloadItem().getKey() ) ) {
        addNewDownloadsTableModel.deleteRow(addNewDownloadsTableMember);
      }
    }
  }

  private void removeAlreadyExistsButton_actionPerformed(final ActionEvent actionEvent) {
    final int numberOfRows = addNewDownloadsTableModel.getRowCount();
    addNewDownloadsTable.clearSelection();
    for( int indexPos = numberOfRows -1; indexPos >= 0; indexPos--) {
      final AddNewDownloadsTableMember addNewDownloadsTableMember =
        addNewDownloadsTableModel.getRow(indexPos);
      final FrostDownloadItem frostDownloadItem = addNewDownloadsTableMember.getDownloadItem();
      if(new java.io.File(frostDownloadItem.getDownloadDir() + frostDownloadItem.getFileName()).exists() ) {
        addNewDownloadsTableModel.deleteRow(addNewDownloadsTableMember);
      }
    }
  }
 
  private String askForNewname(final String oldName) {
    return (String) JOptionPane.showInputDialog(
        this,
        language.getString("AddNewDownloadsDialog.renameFileDialog.dialogBody"),
        language.getString("AddNewDownloadsDialog.renameFileDialog.dialogTitle"),
        JOptionPane.QUESTION_MESSAGE,
        null,
        null,
        oldName
    );
  }
  private void changeDownloadDir_actionPerformed() {
    // Open dialog to request dir
    final JFileChooser chooser = new JFileChooser();
    chooser.setCurrentDirectory(
        new java.io.File(
            Core.frostSettings.getDefaultValue(SettingsClass.DIR_DOWNLOAD)
        )
    );
    chooser.setDialogTitle(language.getString("AddNewDownloadsDialog.changeDirDialog.title"));
    chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
    chooser.setAcceptAllFileFilterUsed(false);
    if (chooser.showOpenDialog(this) != JFileChooser.APPROVE_OPTION) {
      return;
    }
   
    // Set dir for selected items
    setDownloadDir(chooser.getSelectedFile().toString());
  }
 
 
  private void setDownloadDir(final String downloadDir) {
    addNewDownloadsTable.new SelectedItemsAction() {
      protected void action(AddNewDownloadsTableMember addNewDownloadsTableMember) {
        addNewDownloadsTableMember.getDownloadItem().setDownloadDir(downloadDir);
      }
    };
  }

 
  private static class AddNewDownloadsTableModel extends SortedTableModel<AddNewDownloadsTableMember>{
    private Language language = null;

    protected  static String columnNames[];

    protected final static Class<?> columnClasses[] = {
      String.class,
      String.class,
      String.class,
      String.class,
      Boolean.class,
      String.class,
      String.class,
    };
   
    private final int[] defaultColumnWidthRatio = {
        35,
        10,
        10,
        35,
        5,
        5,
      };


    public AddNewDownloadsTableModel() {
      super();
      language = Language.getInstance();
      refreshLanguage();
      assert columnClasses.length == columnNames.length;
    }

    private void refreshLanguage() {
      columnNames = new String[] {
        language.getString("AddNewDownloadsDialog.table.name"),
        language.getString("AddNewDownloadsDialog.table.key"),
        language.getString("Common.priority"),
        language.getString("AddNewDownloadsDialog.table.downloadDir"),
        language.getString("Common.enabled"),
        language.getString("AddNewDownloadsDialog.table.downloaded"),
        language.getString("AddNewDownloadsDialog.table.exists"),
      };
    }

    @Override
    public boolean isCellEditable(int row, int col) {
      switch(col){
        case 0:
        case 1:
        case 2:
        case 3:
        case 5:
        case 6:
          return false;
        case 4:
          return true;
        default:
          return false;
      }
    }

    @Override
    public String getColumnName(int column) {
      if( column >= 0 && column < columnNames.length )
        return columnNames[column];
      return null;
    }

    @Override
    public int getColumnCount() {
      return columnNames.length;
    }

    @Override
    public Class<?> getColumnClass(int column) {
      if( column >= 0 && column < columnClasses.length )
        return columnClasses[column];
      return null;
    }
   
    @Override
    public void setValueAt(Object aValue, int row, int column) {
      switch(column){
        case 0:
        case 1:
        case 2:
        case 3:
        case 5:
        case 6:
          return;
        case 4:
          getRow(row).getDownloadItem().setEnabled((Boolean) aValue);
          return;
        default:
          return;
      }
    }
   
    public int[] getDefaultColumnWidthRatio() {
      return defaultColumnWidthRatio;
    }
  }

  private class AddNewDownloadsTableMember extends TableMember.BaseTableMember<AddNewDownloadsTableMember> {

    private FrostDownloadItem frostDownloadItem;
    private boolean downloaded;
    private String downloadedTooltip;
    private boolean exists;
    private String existsTooltip;

    public AddNewDownloadsTableMember(final FrostDownloadItem frostDownloadItem){
      this.frostDownloadItem = frostDownloadItem;
      TrackDownloadKeys trackDownloadKeys = trackDownloadKeysStorage.getItemByKey(frostDownloadItem.getKey());
      downloaded = trackDownloadKeys != null;
      if( downloaded ) {
        final long date = trackDownloadKeys.getDownloadFinishedTime();
        downloadedTooltip = new StringBuilder("<html>")
            .append(language.getString("ManageDownloadTrackingDialog.table.finished"))
            .append(": ")
            .append(DateFun.FORMAT_DATE_VISIBLE.print(date))
            .append(" ")
            .append(DateFun.FORMAT_TIME_VISIBLE.print(date))
            .append("<br />\n")
            .append(language.getString("ManageDownloadTrackingDialog.table.board"))
            .append(": ")
            .append(trackDownloadKeys.getBoardName())
            .append("<br />\n")
            .append(language.getString("ManageDownloadTrackingDialog.table.size"))
            .append(": ")
            .append(FormatterUtils.formatSize(trackDownloadKeys.getFileSize()))
            .append("</html>")
            .toString();
      } else {
        downloadedTooltip = "";
      }
      updateExistsCheck();
    }

    @Override
    public Comparable<?> getValueAt(final int column) {
      switch( column ) {
        case 0:
          return frostDownloadItem.getFileName();
        case 1:
          return frostDownloadItem.getKey();
        case 2:
          return frostDownloadItem.getPriority().getName();
        case 3:
          return frostDownloadItem.getDownloadDir();
        case 4:
          return frostDownloadItem.isEnabled();
        case 5:
          return downloaded ? "X" : "";
        case 6:
          return exists ? "X" : "";
        default :
          throw new RuntimeException("Unknown Column pos");
      }
    }

    public void updateExistsCheck() {
      File existingFile = new java.io.File(frostDownloadItem.getDownloadDir() + frostDownloadItem.getFileName());
      exists = existingFile.exists();
      if( exists) {
        final long date = existingFile.lastModified();
        existsTooltip = new StringBuilder("<html>")
        .append(language.getString("AddNewDownloadsDialog.table.lastModifiedTooltip"))
        .append(": ")
        .append(DateFun.FORMAT_DATE_VISIBLE.print(date))
        .append(" ")
        .append(DateFun.FORMAT_TIME_VISIBLE.print(date))
        .append("<br />\n")
        .append(language.getString("AddNewDownloadsDialog.table.fileSizeTooltip"))
        .append(": ")
        .append(FormatterUtils.formatSize(existingFile.length()))
        .append("</html>")
        .toString();
      } else {
        existsTooltip = "";
      }
    }

    public FrostDownloadItem getDownloadItem(){
      return frostDownloadItem;
    }
  }

  private class TablePopupMenuMouseListener implements MouseListener {
    @Override
    public void mouseReleased(final MouseEvent event) {
      maybeShowPopup(event);
    }
    @Override
    public void mousePressed(final MouseEvent event) {
      maybeShowPopup(event);
    }
    @Override
    public void mouseClicked(final MouseEvent event) {}
    @Override
    public void mouseEntered(final MouseEvent event) {}
    @Override
    public void mouseExited(final MouseEvent event) {}

    protected void maybeShowPopup(final MouseEvent e) {
      if( e.isPopupTrigger() ) {
        if( addNewDownloadsTable.getSelectedRowCount() > 0 ) {
          tablePopupMenu.show(addNewDownloadsTable, e.getX(), e.getY());
        }
      }
    }
  }
 
  private class AddNewDownloadsTable extends SortedTable<AddNewDownloadsTableMember> {

    private CenterCellRenderer centerCellRenderer;
   
    private final String[] columnTooltips = {
      null,
      null,
      null,
      null,
      null,
      language.getString("AddNewDownloadsDialog.tableToolltip.downloaded"),
      language.getString("AddNewDownloadsDialog.tableToolltip.exists"),
    };
   
   
    public AddNewDownloadsTable(final AddNewDownloadsTableModel addNewDownloadsTableModel) {
      super(addNewDownloadsTableModel);
      this.setIntercellSpacing(new Dimension(5, 1));
      centerCellRenderer = new CenterCellRenderer();
    }

    @Override
    public String getToolTipText(final MouseEvent mouseEvent) {
      final java.awt.Point point = mouseEvent.getPoint();
      final int rowIndex = rowAtPoint(point);
      final int colIndex = columnAtPoint(point);
      final int realColumnIndex = convertColumnIndexToModel(colIndex);
      final AddNewDownloadsTableModel tableModel = (AddNewDownloadsTableModel) getModel();
      switch(realColumnIndex){
        case 0:
        case 1:
        case 2:
        case 3:
        case 4:
          return tableModel.getValueAt(rowIndex, realColumnIndex).toString();
        case 5:
          return addNewDownloadsTableModel.getRow(rowIndex).downloadedTooltip;
        case 6:
          return addNewDownloadsTableModel.getRow(rowIndex).existsTooltip;
        default:
          assert false;
      }
      return tableModel.getValueAt(rowIndex, realColumnIndex).toString();
    }
   
    @Override
    public TableCellRenderer getCellRenderer(final int rowIndex, final int columnIndex) {
      switch(columnIndex){
        case 0:
        case 1:
        case 2:
        case 3:
          return super.getCellRenderer(rowIndex, columnIndex);
        case 4:
          return BooleanCell.RENDERER;
        case 5:
        case 6:
          return centerCellRenderer;
        default:
          assert false;
      }
      return super.getCellRenderer(rowIndex, columnIndex);
    }
   
    @Override
    public TableCellEditor getCellEditor(final int rowIndex, final int columnIndex ) {
      switch(columnIndex){
        case 0:
        case 1:
        case 2:
        case 3:
        case 5:
        case 6:
          return super.getCellEditor(rowIndex, columnIndex);
        case 4:
          return BooleanCell.EDITOR;
        default:
          assert false;
      }
      return super.getCellEditor(rowIndex, columnIndex);
    }
   
    private class CenterCellRenderer extends JLabel implements TableCellRenderer {
      public Component getTableCellRendererComponent(final JTable table,
          final Object value, final boolean isSelected, final boolean hasFocus,
          final int row, final int column) {
        this.setText(value.toString());
        this.setHorizontalAlignment(SwingConstants.CENTER);
        return this;
      }
    }
   
    @Override
    protected JTableHeader createDefaultTableHeader() {
      return new JTableHeader(columnModel) {
        public String getToolTipText(final MouseEvent e) {
          final java.awt.Point p = e.getPoint();
          final int index = columnModel.getColumnIndexAtX(p.x);
          final int realIndex = columnModel.getColumn(index).getModelIndex();
          return columnTooltips[realIndex];
        }
      };
    }

  }
}
TOP

Related Classes of frost.gui.AddNewDownloadsDialog$AddNewDownloadsTable

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.