Package frost.gui

Source Code of frost.gui.ManageTrackedDownloads$TrackedDownloadsTable

/*
  ManageTrackedDownloads.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.*;
import java.awt.event.*;
import java.io.*;

import javax.swing.*;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;

import frost.*;
import frost.fcp.*;
import frost.gui.model.*;
import frost.storage.perst.*;
import frost.util.*;
import frost.util.gui.*;
import frost.util.gui.translation.*;

public class ManageTrackedDownloads extends javax.swing.JDialog {
  private final Language language;
  private final TrackDownloadKeysStorage trackDownloadKeysStorage;

  private TrackedDownloadsModel trackedDownloadsModel;
  private TrackedDownloadsTable trackedDownloadsTable;

  private JTextField maxAgeTextField;
  private JButton maxAgeButton;
  private JButton addKeysButton;
  private JButton closeButton;

  private JSkinnablePopupMenu tablePopupMenu;

  private static final long serialVersionUID = 1L;

  public ManageTrackedDownloads(final JFrame frame) {
    super(frame);
    setModal(true);
    language = Language.getInstance();
    trackDownloadKeysStorage = TrackDownloadKeysStorage.inst();

    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

    initGUI();
  }

  private void initGUI() {
    try {
      setTitle(language.getString("ManageDownloadTrackingDialog.title"));
      setSize(800, 600);
      this.setResizable(true);

      // Max Age
      final JLabel maxAgeLabel = new JLabel(language.getString("ManageDownloadTrackingDialog.button.maxAge"));
      maxAgeTextField = new JTextField(6);
      maxAgeTextField.setText("100");
      maxAgeTextField.setMaximumSize(new Dimension(30,20));
      maxAgeButton = new JButton(language.getString("ManageDownloadTrackingDialog.button.maxAgeButton"));
      maxAgeButton.addActionListener( new java.awt.event.ActionListener() {
        public void actionPerformed(final ActionEvent e) {
          maxAgeButton_actionPerformed(e);
        }
      });
      maxAgeButton.setToolTipText(language.getString("ManageDownloadTrackingDialog.buttonTooltip.maxAgeButton"));

      // Load files
      addKeysButton = new JButton(language.getString("ManageDownloadTrackingDialog.button.addKeys"));
      addKeysButton.addActionListener( new java.awt.event.ActionListener() {
        public void actionPerformed(final ActionEvent e) {
          addKeysButton_actionPerformed(e);
        }
      });
      addKeysButton.setToolTipText(language.getString("ManageDownloadTrackingDialog.buttonTooltip.addKeys"));

      // Close Button
      closeButton = new JButton(language.getString("Common.close"));
      closeButton.addActionListener( new java.awt.event.ActionListener() {
        public void actionPerformed(final ActionEvent e) {
          dispose();
        }
      });

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

      buttonsPanel.add( maxAgeLabel );
      buttonsPanel.add(Box.createRigidArea(new Dimension(10,3)));
      buttonsPanel.add( maxAgeTextField );
      buttonsPanel.add(Box.createRigidArea(new Dimension(10,3)));
      buttonsPanel.add( maxAgeButton );

      buttonsPanel.add( Box.createHorizontalGlue() );

      buttonsPanel.add( addKeysButton );
      buttonsPanel.add(Box.createRigidArea(new Dimension(20,3)));
      buttonsPanel.add( closeButton );

      // Download Table
      trackedDownloadsModel = new TrackedDownloadsModel();
      trackedDownloadsTable = new TrackedDownloadsTable( trackedDownloadsModel );
      trackedDownloadsTable.setRowSelectionAllowed(true);
      trackedDownloadsTable.setSelectionMode( ListSelectionModel.MULTIPLE_INTERVAL_SELECTION );
      trackedDownloadsTable.setRowHeight(18);
      final JScrollPane scrollPane = new JScrollPane(trackedDownloadsTable);
      scrollPane.setWheelScrollingEnabled(true);

      // main panel
      final JPanel mainPanel = new JPanel(new BorderLayout());
      mainPanel.add( scrollPane, BorderLayout.CENTER );
      mainPanel.setBorder(BorderFactory.createEmptyBorder(5,7,7,7));

      this.getContentPane().setLayout(new BorderLayout());
      mainPanel.add( buttonsPanel, BorderLayout.SOUTH );
      this.getContentPane().add(mainPanel, null);

      this.initPopupMenu();
    } catch (final Exception e) {
      e.printStackTrace();
    }
  }

  private void initPopupMenu() {
    tablePopupMenu = new JSkinnablePopupMenu();

    // remove
    final JMenuItem removeMenuItem = new JMenuItem(language.getString("ManageDownloadTrackingDialog.button.remove"));
    removeMenuItem.addActionListener( new java.awt.event.ActionListener() {
      public void actionPerformed(final ActionEvent actionEvent) {
        removeMenuItem_actionPerformed(actionEvent);
      }
    });

    // remove all from same Board
    final JMenuItem removeSameBoardMenuItem = new JMenuItem(language.getString("ManageDownloadTrackingDialog.button.removeSameBoard"));
    removeSameBoardMenuItem.addActionListener( new java.awt.event.ActionListener() {
      public void actionPerformed(final ActionEvent actionEvent) {
        removeSameBoardMenuItem_actionPerformed(actionEvent);
      }
    });

    // Compose popup menu
    tablePopupMenu.add(removeMenuItem);
    tablePopupMenu.addSeparator();
    tablePopupMenu.add(removeSameBoardMenuItem);

    this.trackedDownloadsTable.addMouseListener(new TablePopupMenuMouseListener());
  }

  public void startDialog(final Frame owner) {
    this.loadTrackedDownloadsIntoTable();
    setLocationRelativeTo(owner);

    setVisible(true); // blocking!
  }

  private void loadTrackedDownloadsIntoTable() {
    this.trackedDownloadsModel.clearDataModel();
    for( final TrackDownloadKeys trackDownloadkey : trackDownloadKeysStorage.getDownloadKeyList()) {
      final TrackedDownloadTableMember trackedDownloadTableMember = new TrackedDownloadTableMember(trackDownloadkey);
      this.trackedDownloadsModel.addRow(trackedDownloadTableMember);
    }
  }

  private void removeMenuItem_actionPerformed(final ActionEvent e) {
    final int[] selectedRows = trackedDownloadsTable.getSelectedRows();

    if( selectedRows.length > 0 ) {
      for( int z = selectedRows.length - 1; z > -1; z-- ) {
        final int rowIx = selectedRows[z];

        if( rowIx >= trackedDownloadsModel.getRowCount() ) {
          continue; // paranoia
        }

        final TrackedDownloadTableMember row = (TrackedDownloadTableMember) trackedDownloadsModel.getRow(rowIx);
        trackDownloadKeysStorage.removeItemByKey(row.getTrackDownloadKeys().getChkKey());
        trackedDownloadsModel.deleteRow(row);
      }
      trackedDownloadsTable.clearSelection();
    }
  }

  private void removeSameBoardMenuItem_actionPerformed(final ActionEvent e) {
    final int selectedRowIdx = trackedDownloadsTable.getSelectedRow();
    if( selectedRowIdx < 0 || selectedRowIdx >= trackedDownloadsModel.getRowCount()) {
      return;
    }
    final TrackedDownloadTableMember selectedRow = (TrackedDownloadTableMember) trackedDownloadsModel.getRow(selectedRowIdx);
    if( selectedRow == null ) {
      return;
    }
    final String boardName = selectedRow.getTrackDownloadKeys().getBoardName();

    for( int z = trackedDownloadsModel.getRowCount() -1 ; z >= 0; z--) {
      final TrackedDownloadTableMember row = (TrackedDownloadTableMember) trackedDownloadsModel.getRow(z);
      if( boardName.compareTo(row.getTrackDownloadKeys().getBoardName()) == 0 ) {
        trackDownloadKeysStorage.removeItemByKey(row.getTrackDownloadKeys().getChkKey());
        trackedDownloadsModel.deleteRow(row);
      }
    }
    trackedDownloadsTable.clearSelection();
  }

  private void addKeysButton_actionPerformed(final ActionEvent e) {
    // Open choose Directory dialog
    final JFileChooser fileChooser = new JFileChooser();
    fileChooser.setCurrentDirectory(
      new java.io.File(
        Core.frostSettings.getDefaultValue(SettingsClass.DIR_DOWNLOAD)
      )
    );
    fileChooser.setDialogTitle(language.getString("AddNewDownloadsDialog.changeDirDialog.title"));
    fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
    fileChooser.setAcceptAllFileFilterUsed(false);
    if (fileChooser.showOpenDialog(this) != JFileChooser.APPROVE_OPTION) {
      return;
    }

    try {
      final File selectedFile =fileChooser.getSelectedFile();
      final FileInputStream fileInputStrem = new FileInputStream(selectedFile);
      final DataInputStream dataInputStream = new DataInputStream(fileInputStrem);
      final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(dataInputStream));
      String strLine;
      while ((strLine = bufferedReader.readLine()) != null)   {
        if( strLine.startsWith("CHK@") && FreenetKeys.isValidKey(strLine) ) {
          final String fileName = strLine.substring(strLine.lastIndexOf("/")+1);
          trackDownloadKeysStorage.storeItem(new TrackDownloadKeys(strLine, fileName, "", selectedFile.length(), System.currentTimeMillis()));
        }
      }
    } catch(final FileNotFoundException ex) {
      ex.printStackTrace();
    } catch (final IOException ex) {
      ex.printStackTrace();
    }
    loadTrackedDownloadsIntoTable();
  }

  private void maxAgeButton_actionPerformed(final ActionEvent e) {
    int max_age = 4;
    try {
      max_age = Integer.parseInt(this.maxAgeTextField.getText());
    } catch( final NumberFormatException ex ) {
      return;
    }

    if( max_age < 0) {
      return;
    }

    trackDownloadKeysStorage.cleanupTable(max_age);
    loadTrackedDownloadsIntoTable();
  }
 
  private static class TrackedDownloadsModel extends SortedTableModel<TrackedDownloadTableMember> {
    private static final long serialVersionUID = 1L;

    private Language language = null;

    protected final static String columnNames[] = new String[5];

    protected final static Class<?> columnClasses[] {
      String.class,
      String.class,
      String.class,
      String.class,
      String.class
    };

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

    private void refreshLanguage() {
      columnNames[0] = language.getString("ManageDownloadTrackingDialog.table.name");
      columnNames[1] = language.getString("ManageDownloadTrackingDialog.table.key");
      columnNames[2] = language.getString("ManageDownloadTrackingDialog.table.board");
      columnNames[3] = language.getString("ManageDownloadTrackingDialog.table.size");
      columnNames[4] = language.getString("ManageDownloadTrackingDialog.table.finished");
    }

    public boolean isCellEditable(int row, int col) {
      return false;
    }

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

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

    public Class<?> getColumnClass(int column) {
      if( column >= 0 && column < columnClasses.length )
        return columnClasses[column];
      return null;
    }
  }
 

  private class TrackedDownloadTableMember extends TableMember.BaseTableMember<TrackedDownloadTableMember> {

    TrackDownloadKeys trackDownloadKey;

    public TrackedDownloadTableMember(final TrackDownloadKeys trackDownloadkey){
      this.trackDownloadKey = trackDownloadkey;
    }

    public Comparable<?> getValueAt(final int column) {
      switch( column ) {
        case 0:
          return trackDownloadKey.getFileName();
        case 1:
          return trackDownloadKey.getChkKey();
        case 2:
          return trackDownloadKey.getBoardName();
        case 3:
          return FormatterUtils.formatSize(trackDownloadKey.getFileSize());
        case 4:
          final long date = trackDownloadKey.getDownloadFinishedTime();
          return new StringBuilder()
          .append(DateFun.FORMAT_DATE_VISIBLE.print(date))
          .append(" ")
          .append(DateFun.FORMAT_TIME_VISIBLE.print(date))
          .toString();
        default :
          throw new RuntimeException("Unknown Column pos");
      }
    }

    public TrackDownloadKeys getTrackDownloadKeys() {
      return this.trackDownloadKey;
    }
  }

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

    protected void maybeShowPopup(final MouseEvent e) {
      if( e.isPopupTrigger() ) {
        if( trackedDownloadsTable.getSelectedRowCount() > 0 ) {
          tablePopupMenu.show(trackedDownloadsTable, e.getX(), e.getY());
        }
      }
    }
  }
 
 
  private class TrackedDownloadsTable extends SortedTable<TrackedDownloadTableMember> {
    private static final long serialVersionUID = 1L;
   
    final TableCellRenderer sizeColumnRenderer;

    public TrackedDownloadsTable(final TrackedDownloadsModel trackDownloadsModel) {
      super(trackDownloadsModel);
      this.setIntercellSpacing(new Dimension(5, 1));
     
      sizeColumnRenderer = new SizeColumnTableCellRenderer();
    }

    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 TableModel tableModel = getModel();
      return tableModel.getValueAt(rowIndex, realColumnIndex).toString();
    }
   
    public TableCellRenderer getCellRenderer(final int row, final int column) {
      if(column == 3) {
        return sizeColumnRenderer;
      }
      return super.getCellRenderer(row, column);
    }
   
    private class SizeColumnTableCellRenderer extends JLabel implements TableCellRenderer {
      private static final long serialVersionUID = 1L;

      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.RIGHT);
        return this;
      }
    }
  }
}
TOP

Related Classes of frost.gui.ManageTrackedDownloads$TrackedDownloadsTable

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.