/*
* Copyright 2004 - 2008 Christian Sprajc. All rights reserved.
*
* This file is part of PowerFolder.
*
* PowerFolder 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.
*
* PowerFolder 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 PowerFolder. If not, see <http://www.gnu.org/licenses/>.
*
* $Id: UploadsTablePanel.java 5457 2008-10-17 14:25:41Z harry $
*/
package de.dal33t.powerfolder.ui.information.uploads;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelListener;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import de.dal33t.powerfolder.Controller;
import de.dal33t.powerfolder.light.FileInfo;
import de.dal33t.powerfolder.transfer.Upload;
import de.dal33t.powerfolder.ui.PFUIComponent;
import de.dal33t.powerfolder.ui.model.TransferManagerModel;
import de.dal33t.powerfolder.ui.util.SwingWorker;
import de.dal33t.powerfolder.ui.util.UIUtil;
public class UploadsTablePanel extends PFUIComponent {
private JPanel uiComponent;
private JScrollPane tablePane;
private UploadsTable table;
private UploadsTableModel tableModel;
private Action clearCompletedUploadsAction;
private Action addIgnoreAction;
private JPopupMenu fileMenu;
/**
* Constructor.
*
* @param controller
*/
public UploadsTablePanel(Controller controller,
Action clearCompletedUploadsAction, Action addIgnoreAction)
{
super(controller);
this.clearCompletedUploadsAction = clearCompletedUploadsAction;
this.addIgnoreAction = addIgnoreAction;
}
/**
* Returns the ui component.
*
* @return
*/
public JComponent getUIComponent() {
if (uiComponent == null) {
initialize();
buildUIComponent();
}
return uiComponent;
}
/**
* Initialize components
*/
private void initialize() {
TransferManagerModel transferManagerModel = getUIController()
.getTransferManagerModel();
table = new UploadsTable(transferManagerModel);
table.getTableHeader().addMouseListener(new TableHeaderMouseListener());
tablePane = new JScrollPane(table);
tableModel = (UploadsTableModel) table.getModel();
table.addMouseListener(new TableMouseListener());
table.registerKeyboardAction(new SelectAllAction(), KeyStroke
.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK),
JComponent.WHEN_FOCUSED);
// Whitestrip & set sizes
UIUtil.whiteStripTable(table);
UIUtil.setZeroHeight(tablePane);
UIUtil.removeBorder(tablePane);
}
/**
* Add a selection listener to the table.
*
* @param l
*/
public void addListSelectionListener(ListSelectionListener l) {
getUIComponent();
table.getSelectionModel().addListSelectionListener(l);
}
/**
* Add a table model listener to the model.
*
* @param l
*/
public void addTableModelListener(TableModelListener l) {
getUIComponent();
tableModel.addTableModelListener(l);
}
/**
* Clears old uploads.
*/
public void clearUploads() {
// Clear completed uploads
SwingWorker worker = new SwingWorker() {
public Object construct() {
int rowCount = table.getRowCount();
if (rowCount == 0) {
return null;
}
// If no rows are selected,
// arrange for all uploads to be cleared.
boolean noneSelected = true;
for (int i = 0; i < table.getRowCount(); i++) {
if (table.isRowSelected(i)) {
noneSelected = false;
break;
}
}
// Do in two passes so changes to the model do not affect
// the process.
List<Upload> uploadsToClear = new ArrayList<Upload>();
for (int i = 0; i < table.getRowCount(); i++) {
if (noneSelected || table.isRowSelected(i)) {
Upload ul = tableModel.getUploadAtRow(i);
if (ul.isCompleted()) {
uploadsToClear.add(ul);
}
}
}
for (Upload ul : uploadsToClear) {
getController().getTransferManager().clearCompletedUpload(
ul);
}
return null;
}
};
worker.start();
}
/**
* Build the ui component tab pane.
*/
private void buildUIComponent() {
FormLayout layout = new FormLayout("fill:pref:grow", "fill:0:grow");
PanelBuilder builder = new PanelBuilder(layout);
CellConstraints cc = new CellConstraints();
builder.add(tablePane, cc.xy(1, 1));
buildPopupMenus();
uiComponent = builder.getPanel();
}
/**
* Builds the popup menus
*/
private void buildPopupMenus() {
fileMenu = new JPopupMenu();
fileMenu.add(clearCompletedUploadsAction);
fileMenu.add(addIgnoreAction);
}
public FileInfo getSelectdFile() {
if (table == null || tableModel == null) {
return null;
}
int[] rows = table.getSelectedRows();
if (rows.length == 1) {
Upload ul = (Upload) tableModel.getValueAt(rows[0],
UploadsTableModel.COLPROGRESS);
return ul != null ? ul.getFile() : null;
}
return null;
}
public int countActiveUploadCount() {
int count = 0;
for (int i = 0; i < tableModel.getRowCount(); i++) {
Upload ul = tableModel.getUploadAtRow(i);
if (ul.isStarted() && !ul.isCompleted()) {
count++;
}
}
return count;
}
public int countCompletedUploadCount() {
int count = 0;
for (int i = 0; i < tableModel.getRowCount(); i++) {
Upload ul = tableModel.getUploadAtRow(i);
if (ul.isCompleted()) {
count++;
}
}
return count;
}
public Upload[] getSelectedRows() {
int[] ints = table.getSelectedRows();
return tableModel.getUploadsAtRows(ints);
}
/**
* Listener on table header, takes care about the sorting of table
*
* @author <a href="mailto:totmacher@powerfolder.com">Christian Sprajc </a>
*/
private static class TableHeaderMouseListener extends MouseAdapter {
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
JTableHeader tableHeader = (JTableHeader) e.getSource();
int columnNo = tableHeader.columnAtPoint(e.getPoint());
TableColumn column = tableHeader.getColumnModel().getColumn(
columnNo);
int modelColumnNo = column.getModelIndex();
TableModel model = tableHeader.getTable().getModel();
if (model instanceof UploadsTableModel) {
UploadsTableModel uploadsTableModel = (UploadsTableModel) model;
boolean freshSorted = uploadsTableModel
.sortBy(modelColumnNo);
if (!freshSorted) {
// reverse list
uploadsTableModel.reverseList();
}
}
}
}
}
private class TableMouseListener extends MouseAdapter {
public void mousePressed(MouseEvent e) {
if (e.isPopupTrigger()) {
showContextMenu(e);
}
}
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger()) {
showContextMenu(e);
}
}
private void showContextMenu(MouseEvent evt) {
fileMenu.show(evt.getComponent(), evt.getX(), evt.getY());
}
}
private class SelectAllAction extends AbstractAction {
public void actionPerformed(ActionEvent e) {
table.selectAll();
}
}
}