/*
* 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$
*/
package de.dal33t.powerfolder.ui.model;
import com.jgoodies.binding.value.ValueHolder;
import com.jgoodies.binding.value.ValueModel;
import de.dal33t.powerfolder.ui.PFUIComponent;
import de.dal33t.powerfolder.ui.util.DelayedUpdater;
import de.dal33t.powerfolder.ui.util.UIUtil;
import de.dal33t.powerfolder.disk.Folder;
import de.dal33t.powerfolder.disk.FolderRepository;
import de.dal33t.powerfolder.event.TransferManagerEvent;
import de.dal33t.powerfolder.event.TransferManagerListener;
import de.dal33t.powerfolder.transfer.DownloadManager;
import de.dal33t.powerfolder.transfer.TransferManager;
import de.dal33t.powerfolder.transfer.Upload;
import de.dal33t.powerfolder.ui.information.downloads.DownloadManagersTableModel;
import de.dal33t.powerfolder.ui.information.uploads.UploadsTableModel;
public class TransferManagerModel extends PFUIComponent {
private TransferManager transferManager;
private DownloadManagersTableModel downloadManagersTableModel;
private UploadsTableModel uploadsTableModel;
/** Value model with integer number of all displayed downloads. */
private final ValueModel allDownloadsCountVM = new ValueHolder();
/** Value model with integer number of all displayed uploads. */
private final ValueModel allUploadsCountVM = new ValueHolder();
/** Value model with integer number of active displayed uploads. */
private final ValueModel activeUploadsCountVM = new ValueHolder();
/** Value model with integer number of active displayed downloads. */
private final ValueModel activeDownloadsCountVM = new ValueHolder();
/** Value model with integer number of completed displayed uploads. */
private final ValueModel completedUploadsCountVM = new ValueHolder();
/** Value model with integer number of completed displayed uploads. */
private final ValueModel completedDownloadsCountVM = new ValueHolder();
private DelayedUpdater downloadsValueModelUpdater;
private DelayedUpdater uploadsValueModelUpdater;
public TransferManagerModel(TransferManager aTransferManager) {
super(aTransferManager.getController());
transferManager = aTransferManager;
downloadsValueModelUpdater = new DelayedUpdater(getController());
uploadsValueModelUpdater = new DelayedUpdater(getController());
downloadManagersTableModel = new DownloadManagersTableModel(this);
uploadsTableModel = new UploadsTableModel(this);
}
/**
* Initializes the listeners into the <code>TransferManager</code>.
*/
public void initialize() {
// Listen on transfer manager
transferManager.addListener(new MyTransferManagerListener());
try {
// Ensure that models are not modified out of EDT.
UIUtil.invokeAndWaitInEDT(new Runnable() {
public void run() {
uploadsTableModel.initialize();
downloadManagersTableModel.initialize();
}
});
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
updateDownloadsValueModels0();
updateUploadsValueModels0();
}
// Exposing ***************************************************************
public TransferManager getTransferManager() {
return getController().getTransferManager();
}
public DownloadManagersTableModel getDownloadsTableModel() {
return downloadManagersTableModel;
}
public UploadsTableModel getUploadsTableModel() {
return uploadsTableModel;
}
/**
* @param folder
* @return the visible completed downloads for a folder.
*/
public int countCompletedDownloads(Folder folder) {
int downloadCount = downloadManagersTableModel.getRowCount();
int completedDownloadCount = 0;
FolderRepository folderRepository = getController()
.getFolderRepository();
for (int i = 0; i < downloadCount; i++) {
DownloadManager dlm = downloadManagersTableModel
.getDownloadManagerAtRow(i);
Folder f = dlm.getFileInfo().getFolder(folderRepository);
if (f == null) {
continue;
}
if (dlm.isCompleted() && f.equals(folder)) {
completedDownloadCount++;
}
}
return completedDownloadCount;
}
/**
* Count visible completed downloads.
*
* @return
*/
public int countCompletedDownloads() {
int downloadCount = downloadManagersTableModel.getRowCount();
int completedDownloadCount = 0;
for (int i = 0; i < downloadCount; i++) {
DownloadManager dlm = downloadManagersTableModel
.getDownloadManagerAtRow(i);
if (dlm.isCompleted()) {
completedDownloadCount++;
}
}
return completedDownloadCount;
}
/**
* Count visible active downloads.
*
* @return
*/
public int countActiveDownloads() {
int downloadCount = downloadManagersTableModel.getRowCount();
int activeDownloadCount = 0;
for (int i = 0; i < downloadCount; i++) {
DownloadManager dlm = downloadManagersTableModel
.getDownloadManagerAtRow(i);
if (dlm.isStarted()) {
activeDownloadCount++;
}
}
return activeDownloadCount;
}
/**
* Count total visible downloads.
*
* @return
*/
public int countTotalDownloads() {
return downloadManagersTableModel.getRowCount();
}
/**
* Returns a value model with integer number of active displayed uploads.
*
* @return
*/
public ValueModel getActiveUploadsCountVM() {
return activeUploadsCountVM;
}
/**
* Returns a value model with integer number of active displayed downloads.
*
* @return
*/
public ValueModel getActiveDownloadsCountVM() {
return activeDownloadsCountVM;
}
/**
* Returns a value model with integer number of all displayed downloads.
*
* @return
*/
public ValueModel getAllDownloadsCountVM() {
return allDownloadsCountVM;
}
/**
* Returns a value model with integer number of all displayed uploads.
*
* @return
*/
public ValueModel getAllUploadsCountVM() {
return allUploadsCountVM;
}
/**
* Returns a value model with integer number of completed displayed uploads.
*
* @return
*/
public ValueModel getCompletedUploadsCountVM() {
return completedUploadsCountVM;
}
/**
* @return a value model with integer number of completed displayed
* downloads.
*/
public ValueModel getCompletedDownloadsCountVM() {
return completedDownloadsCountVM;
}
private void updateDownloadsValueModels() {
downloadsValueModelUpdater.schedule(new Runnable() {
public void run() {
updateDownloadsValueModels0();
}
});
}
private void updateDownloadsValueModels0() {
// Recalculate totals for downloads.
// int downloadCount = downloadManagersTableModel.getRowCount();
int completedDownloadsCount = getTransferManager().countCompletedDownloads();
int activeDownloadCount = getTransferManager().countActiveDownloads();
int allDownloadsCount = completedDownloadsCount + activeDownloadCount;
// for (int i = 0; i < downloadCount; i++) {
// DownloadManager dlm = downloadManagersTableModel
// .getDownloadManagerAtRow(i);
// if (dlm == null) {
// continue;
// }
// if (dlm.isStarted() && !dlm.isCompleted()) {
// activeDownloadCount++;
// } else if (dlm.isCompleted()) {
// completedDownloadsCount++;
// }
// allDownloadsCount++;
// }
allDownloadsCountVM.setValue(allDownloadsCount);
activeDownloadsCountVM.setValue(activeDownloadCount);
completedDownloadsCountVM.setValue(completedDownloadsCount);
}
private void updateUploadsValueModels() {
uploadsValueModelUpdater.schedule(new Runnable() {
public void run() {
updateUploadsValueModels0();
}
});
}
private void updateUploadsValueModels0() {
// Recalculate total and active uploads.
int uploadCount = uploadsTableModel.getRowCount();
int activeUploadCount = 0;
int allUploadCount = 0;
int completedUploadCount = 0;
for (int i = 0; i < uploadCount; i++) {
Upload ul = uploadsTableModel.getUploadAtRow(i);
if (ul.isStarted() && !ul.isCompleted() && !ul.isBroken()
&& !ul.isAborted())
{
activeUploadCount++;
} else if (ul.isCompleted()) {
completedUploadCount++;
}
allUploadCount++;
}
allUploadsCountVM.setValue(allUploadCount);
activeUploadsCountVM.setValue(activeUploadCount);
completedUploadsCountVM.setValue(completedUploadCount);
}
// Inner classes **********************************************************
/**
* Listens on transfermanager and fires change events on tree
*
* @author <a href="mailto:totmacher@powerfolder.com">Christian Sprajc </a>
*/
private class MyTransferManagerListener implements TransferManagerListener {
public void downloadRequested(TransferManagerEvent event) {
updateDownloadsValueModels();
}
public void downloadQueued(TransferManagerEvent event) {
updateDownloadsValueModels();
}
public void downloadStarted(TransferManagerEvent event) {
updateDownloadsValueModels();
}
public void downloadAborted(TransferManagerEvent event) {
updateDownloadsValueModels();
}
public void downloadBroken(TransferManagerEvent event) {
updateDownloadsValueModels();
}
public void downloadCompleted(TransferManagerEvent event) {
updateDownloadsValueModels();
}
public void completedDownloadRemoved(TransferManagerEvent event) {
updateDownloadsValueModels();
}
public void pendingDownloadEnqueued(TransferManagerEvent event) {
updateUploadsValueModels();
}
public void uploadRequested(TransferManagerEvent event) {
updateUploadsValueModels();
}
public void uploadStarted(TransferManagerEvent event) {
updateUploadsValueModels();
}
public void uploadAborted(TransferManagerEvent event) {
updateUploadsValueModels();
}
public void uploadBroken(TransferManagerEvent event) {
updateUploadsValueModels();
}
public void uploadCompleted(TransferManagerEvent event) {
updateUploadsValueModels();
}
public boolean fireInEventDispatchThread() {
// Not required to be executed in EDT, because DelayedUpdater is
// used.
return false;
}
public void completedUploadRemoved(TransferManagerEvent event) {
updateUploadsValueModels();
}
}
}