/**
* Created on Jul 3, 2008
*
* Copyright 2008 Vuze, Inc. All rights reserved.
* 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; version 2 of the License only.
*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.aelitis.azureus.ui.swt.views.skin;
import java.util.Map;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.disk.DiskManagerFileInfo;
import org.gudy.azureus2.core3.download.DownloadManager;
import org.gudy.azureus2.core3.torrent.TOTorrent;
import org.gudy.azureus2.core3.util.AERunnable;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.plugins.ui.UIPluginViewToolBarListener;
import org.gudy.azureus2.plugins.ui.tables.TableManager;
import org.gudy.azureus2.plugins.ui.tables.TableRow;
import org.gudy.azureus2.plugins.ui.tables.TableRowRefreshListener;
import org.gudy.azureus2.plugins.ui.toolbar.UIToolBarItem;
import org.gudy.azureus2.ui.swt.TorrentUtil;
import org.gudy.azureus2.ui.swt.Utils;
import org.gudy.azureus2.ui.swt.debug.ObfusticateImage;
import org.gudy.azureus2.ui.swt.plugins.UISWTInstance;
import org.gudy.azureus2.ui.swt.plugins.UISWTViewEvent;
import org.gudy.azureus2.ui.swt.plugins.UISWTViewEventListener;
import org.gudy.azureus2.ui.swt.pluginsimpl.UISWTViewImpl;
import org.gudy.azureus2.ui.swt.views.MyTorrentsSuperView;
import org.gudy.azureus2.ui.swt.views.MyTorrentsView;
import org.gudy.azureus2.ui.swt.views.table.TableRowSWT;
import org.gudy.azureus2.ui.swt.views.table.TableViewSWT;
import org.gudy.azureus2.ui.swt.views.table.utils.TableColumnCreator;
import org.gudy.azureus2.ui.swt.views.utils.ManagerUtils;
import com.aelitis.azureus.core.AzureusCore;
import com.aelitis.azureus.core.AzureusCoreFactory;
import com.aelitis.azureus.core.AzureusCoreRunningListener;
import com.aelitis.azureus.core.torrent.PlatformTorrentUtils;
import com.aelitis.azureus.ui.UIFunctions;
import com.aelitis.azureus.ui.UIFunctionsManager;
import com.aelitis.azureus.ui.common.ToolBarItem;
import com.aelitis.azureus.ui.common.table.TableColumnCore;
import com.aelitis.azureus.ui.common.table.TableRowCore;
import com.aelitis.azureus.ui.common.table.TableSelectionAdapter;
import com.aelitis.azureus.ui.common.table.impl.TableColumnManager;
import com.aelitis.azureus.ui.common.updater.UIUpdatable;
import com.aelitis.azureus.ui.selectedcontent.ISelectedContent;
import com.aelitis.azureus.ui.selectedcontent.ISelectedVuzeFileContent;
import com.aelitis.azureus.ui.selectedcontent.SelectedContentManager;
import com.aelitis.azureus.ui.swt.columns.utils.TableColumnCreatorV3;
import com.aelitis.azureus.ui.swt.skin.SWTSkinObject;
import com.aelitis.azureus.ui.swt.skin.SWTSkinObjectContainer;
import com.aelitis.azureus.ui.swt.skin.SWTSkinObjectTextbox;
import com.aelitis.azureus.util.DLReferals;
import com.aelitis.azureus.util.DataSourceUtils;
import com.aelitis.azureus.util.PlayUtils;
/**
* Classic My Torrents view wrapped in a SkinView
*
* @author TuxPaper
* @created Jul 3, 2008
*
*/
public class SBC_LibraryTableView
extends SkinView
implements UIUpdatable, ObfusticateImage, UIPluginViewToolBarListener
{
private final static String ID = "SBC_LibraryTableView";
private Composite viewComposite;
private TableViewSWT<?> tv;
protected int torrentFilterMode = SBC_LibraryView.TORRENTS_ALL;
private SWTSkinObject soParent;
private MyTorrentsView torrentView;
private UISWTViewEventListener swtViewListener;
private UISWTViewImpl view;
public Object skinObjectInitialShow(SWTSkinObject skinObject, Object params) {
soParent = skinObject.getParent();
AzureusCoreFactory.addCoreRunningListener(new AzureusCoreRunningListener() {
public void azureusCoreRunning(final AzureusCore core) {
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
if (soParent == null || soParent.isDisposed()) {
return;
}
initShow(core);
}
});
}
});
return null;
}
public void initShow(AzureusCore core) {
Object data = soParent.getControl().getData("TorrentFilterMode");
if (data instanceof Long) {
torrentFilterMode = (int) ((Long) data).longValue();
}
data = soParent.getControl().getData("DataSource");
boolean useBigTable = useBigTable();
SWTSkinObjectTextbox soFilter = (SWTSkinObjectTextbox) skin.getSkinObject(
"library-filter", soParent.getParent());
Text txtFilter = soFilter == null ? null : soFilter.getTextControl();
SWTSkinObjectContainer soCats = (SWTSkinObjectContainer) skin.getSkinObject(
"library-categories", soParent.getParent());
Composite cCats = soCats == null ? null : soCats.getComposite();
// columns not needed for small mode, all torrents
TableColumnCore[] columns = useBigTable
|| torrentFilterMode != SBC_LibraryView.TORRENTS_ALL ? getColumns()
: null;
if (null != columns) {
TableColumnManager tcManager = TableColumnManager.getInstance();
tcManager.addColumns(columns);
}
if (useBigTable) {
if (torrentFilterMode == SBC_LibraryView.TORRENTS_COMPLETE
|| torrentFilterMode == SBC_LibraryView.TORRENTS_INCOMPLETE
|| torrentFilterMode == SBC_LibraryView.TORRENTS_UNOPENED) {
swtViewListener = torrentView = new MyTorrentsView_Big(core, torrentFilterMode,
columns, txtFilter, cCats);
} else {
swtViewListener = torrentView = new MyTorrentsView_Big(core, torrentFilterMode,
columns, txtFilter, cCats);
}
} else {
String tableID = SB_Transfers.getTableIdFromFilterMode(
torrentFilterMode, false);
if (torrentFilterMode == SBC_LibraryView.TORRENTS_COMPLETE) {
swtViewListener = torrentView = new MyTorrentsView(core, tableID, true, columns, txtFilter,
cCats,true);
} else if (torrentFilterMode == SBC_LibraryView.TORRENTS_INCOMPLETE) {
swtViewListener = torrentView = new MyTorrentsView(core, tableID, false, columns, txtFilter,
cCats,true);
} else if (torrentFilterMode == SBC_LibraryView.TORRENTS_UNOPENED) {
swtViewListener = torrentView = new MyTorrentsView(core, tableID, true, columns, txtFilter,
cCats, true) {
public boolean isOurDownloadManager(DownloadManager dm) {
if (PlatformTorrentUtils.getHasBeenOpened(dm)) {
return false;
}
return super.isOurDownloadManager(dm);
}
};
} else {
swtViewListener = new MyTorrentsSuperView(txtFilter, cCats) {
public void initializeDone() {
MyTorrentsView seedingview = getSeedingview();
if (seedingview != null) {
seedingview.overrideDefaultSelected(new TableSelectionAdapter() {
public void defaultSelected(TableRowCore[] rows, int stateMask) {
doDefaultClick(rows, stateMask, false);
}
});
MyTorrentsView torrentview = getTorrentview();
if (torrentview != null) {
torrentview.overrideDefaultSelected(new TableSelectionAdapter() {
public void defaultSelected(TableRowCore[] rows, int stateMask) {
doDefaultClick(rows, stateMask, false);
}
});
}
}
}
};
}
if (torrentView != null) {
torrentView.overrideDefaultSelected(new TableSelectionAdapter() {
public void defaultSelected(TableRowCore[] rows, int stateMask) {
doDefaultClick(rows, stateMask, false);
}
});
}
}
if (torrentView != null) {
tv = torrentView.getTableView();
if (torrentFilterMode == SBC_LibraryView.TORRENTS_UNOPENED) {
torrentView.setRebuildListOnFocusGain(true);
}
}
try {
view = new UISWTViewImpl(UISWTInstance.VIEW_MAIN, ID + torrentFilterMode, swtViewListener, data);
} catch (Exception e) {
Debug.out(e);
}
SWTSkinObjectContainer soContents = new SWTSkinObjectContainer(skin,
skin.getSkinProperties(), getUpdateUIName(), "", soMain);
skin.layout();
viewComposite = soContents.getComposite();
viewComposite.setLayoutData(Utils.getFilledFormData());
GridLayout gridLayout = new GridLayout();
gridLayout.horizontalSpacing = gridLayout.verticalSpacing = gridLayout.marginHeight = gridLayout.marginWidth = 0;
viewComposite.setLayout(gridLayout);
view.initialize(viewComposite);
SWTSkinObject soSizeSlider = skin.getSkinObject("table-size-slider", soParent.getParent());
if (soSizeSlider instanceof SWTSkinObjectContainer) {
SWTSkinObjectContainer so = (SWTSkinObjectContainer) soSizeSlider;
if (tv != null && !tv.enableSizeSlider(so.getComposite(), 16, 100)) {
so.setVisible(false);
}
}
if (torrentFilterMode == SBC_LibraryView.TORRENTS_ALL
&& tv != null) {
tv.addRefreshListener(new TableRowRefreshListener() {
public void rowRefresh(TableRow row) {
TableRowSWT rowCore = (TableRowSWT)row;
Object ds = rowCore.getDataSource(true);
if (!(ds instanceof DownloadManager)) {
return;
}
DownloadManager dm = (DownloadManager) ds;
boolean changed = false;
boolean assumedComplete = dm.getAssumedComplete();
if (!assumedComplete) {
changed |= rowCore.setAlpha(160);
} else if (!PlatformTorrentUtils.getHasBeenOpened(dm)) {
changed |= rowCore.setAlpha(255);
} else {
changed |= rowCore.setAlpha(255);
}
}
});
}
viewComposite.getParent().layout(true);
}
public static void
doDefaultClick(
final TableRowCore[] rows,
final int stateMask,
final boolean neverPlay)
{
if (rows == null || rows.length != 1) {
return;
}
final Object ds = rows[0].getDataSource(true);
String mode = COConfigurationManager.getStringParameter("list.dm.dblclick");
if (mode.equals("1")) {
// OMG! Show Details! I <3 you!
DownloadManager dm = DataSourceUtils.getDM(ds);
if (dm != null) {
UIFunctionsManager.getUIFunctions().openView(UIFunctions.VIEW_DM_DETAILS, dm);
return;
}
DiskManagerFileInfo file = DataSourceUtils.getFileInfo(ds);
if (file != null) {
UIFunctionsManager.getUIFunctions().openView(UIFunctions.VIEW_DM_DETAILS, file.getDownloadManager());
return;
}
}else if (mode.equals("2")) {
// Show in explorer
DownloadManager dm = DataSourceUtils.getDM(ds);
if (dm != null) {
boolean openMode = COConfigurationManager.getBooleanParameter("MyTorrentsView.menu.show_parent_folder_enabled");
ManagerUtils.open(dm, openMode);
return;
}
DiskManagerFileInfo file = DataSourceUtils.getFileInfo(ds);
if (file != null) {
boolean openMode = COConfigurationManager.getBooleanParameter("MyTorrentsView.menu.show_parent_folder_enabled");
ManagerUtils.open(file, openMode);
return;
}
}else if (mode.equals("3")) {
// Launch
DownloadManager dm = DataSourceUtils.getDM(ds);
if (dm != null) {
TorrentUtil.runDataSources(new Object[]{ dm });
return;
}
DiskManagerFileInfo file = DataSourceUtils.getFileInfo(ds);
if (file != null) {
TorrentUtil.runDataSources(new Object[]{ file });
return;
}
}
if (neverPlay) {
return;
}
// fallback
if (PlayUtils.canPlayDS(ds, -1) || (stateMask & SWT.CONTROL) != 0) {
TorrentListViewsUtils.playOrStreamDataSource(ds,
DLReferals.DL_REFERAL_DBLCLICK, false, true );
return;
}
if (PlayUtils.canStreamDS(ds, -1)) {
TorrentListViewsUtils.playOrStreamDataSource(ds,
DLReferals.DL_REFERAL_DBLCLICK, true, false );
return;
}
DownloadManager dm = DataSourceUtils.getDM(ds);
DiskManagerFileInfo file = DataSourceUtils.getFileInfo(ds);
TOTorrent torrent = DataSourceUtils.getTorrent(ds);
if (torrent == null && file != null) {
DownloadManager dmFile = file.getDownloadManager();
if (dmFile != null) {
torrent = dmFile.getTorrent();
}
}
if (file != null && file.getDownloaded() == file.getLength()) {
TorrentUtil.runDataSources(new Object[] { file });
} else if (dm != null) {
TorrentUtil.runDataSources(new Object[] { dm });
}
}
// @see com.aelitis.azureus.ui.swt.utils.UIUpdatable#getUpdateUIName()
public String getUpdateUIName() {
return ID;
}
// @see com.aelitis.azureus.ui.swt.utils.UIUpdatable#updateUI()
public void updateUI() {
if (viewComposite == null || viewComposite.isDisposed()
|| !viewComposite.isVisible() || view == null) {
return;
}
view.triggerEvent(UISWTViewEvent.TYPE_REFRESH, null);
}
// @see com.aelitis.azureus.ui.swt.views.skin.SkinView#skinObjectShown(com.aelitis.azureus.ui.swt.skin.SWTSkinObject, java.lang.Object)
public Object skinObjectShown(SWTSkinObject skinObject, Object params) {
super.skinObjectShown(skinObject, params);
if (view != null) {
view.triggerEvent(UISWTViewEvent.TYPE_FOCUSGAINED, null);
}
Utils.execSWTThreadLater(0, new AERunnable() {
public void runSupport() {
updateUI();
}
});
return null;
}
// @see com.aelitis.azureus.ui.swt.views.skin.SkinView#skinObjectHidden(com.aelitis.azureus.ui.swt.skin.SWTSkinObject, java.lang.Object)
public Object skinObjectHidden(SWTSkinObject skinObject, Object params) {
if (view != null) {
view.triggerEvent(UISWTViewEvent.TYPE_FOCUSLOST, null);
}
return super.skinObjectHidden(skinObject, params);
}
public void refreshToolBarItems(Map<String, Long> list) {
if (!isVisible()) {
return;
}
if (view != null) {
view.refreshToolBarItems(list);
}
if (tv == null) {
return;
}
ISelectedContent[] currentContent = SelectedContentManager.getCurrentlySelectedContent();
boolean has1Selection = currentContent.length == 1;
list.put(
"play",
has1Selection
&& (!(currentContent[0] instanceof ISelectedVuzeFileContent))
&& PlayUtils.canPlayDS(currentContent[0],
currentContent[0].getFileIndex())
? UIToolBarItem.STATE_ENABLED : 0);
list.put(
"stream",
has1Selection
&& (!(currentContent[0] instanceof ISelectedVuzeFileContent))
&& PlayUtils.canStreamDS(currentContent[0],
currentContent[0].getFileIndex())
? UIToolBarItem.STATE_ENABLED : 0);
}
public boolean toolBarItemActivated(ToolBarItem item, long activationType, Object datasource) {
// currently stream and play are handled by ToolbarView..
if (isVisible() && view != null) {
return view.toolBarItemActivated(item, activationType, datasource);
}
return false;
}
/**
* Return either MODE_SMALLTABLE or MODE_BIGTABLE
* Subclasses may override
* @return
*/
protected int getTableMode() {
return SBC_LibraryView.MODE_SMALLTABLE;
}
/**
* Returns whether the big version of the tables should be used
* Subclasses may override
* @return
*/
protected boolean useBigTable() {
return false;
}
/**
* Returns the appropriate set of columns for the completed or incomplete torrents views
* Subclasses may override to return different sets of columns
* @return
*/
protected TableColumnCore[] getColumns() {
if (torrentFilterMode == SBC_LibraryView.TORRENTS_COMPLETE) {
return TableColumnCreator.createCompleteDM(TableManager.TABLE_MYTORRENTS_COMPLETE);
} else if (torrentFilterMode == SBC_LibraryView.TORRENTS_INCOMPLETE) {
return TableColumnCreator.createIncompleteDM(TableManager.TABLE_MYTORRENTS_INCOMPLETE);
} else if (torrentFilterMode == SBC_LibraryView.TORRENTS_UNOPENED) {
return TableColumnCreatorV3.createUnopenedDM(
TableManager.TABLE_MYTORRENTS_UNOPENED, false);
} else if (torrentFilterMode == SBC_LibraryView.TORRENTS_ALL) {
return TableColumnCreator.createCompleteDM(TableManager.TABLE_MYTORRENTS_ALL_BIG);
}
return null;
}
// @see com.aelitis.azureus.ui.swt.skin.SWTSkinObjectAdapter#skinObjectDestroyed(com.aelitis.azureus.ui.swt.skin.SWTSkinObject, java.lang.Object)
public Object skinObjectDestroyed(SWTSkinObject skinObject, Object params) {
if (view != null) {
view.triggerEvent(UISWTViewEvent.TYPE_DESTROY, null);
}
return super.skinObjectDestroyed(skinObject, params);
}
// @see org.gudy.azureus2.ui.swt.debug.ObfusticateImage#obfusticatedImage(org.eclipse.swt.graphics.Image, org.eclipse.swt.graphics.Point)
public Image obfusticatedImage(Image image) {
if (view instanceof ObfusticateImage) {
ObfusticateImage oi = (ObfusticateImage) view;
return oi.obfusticatedImage(image);
}
return image;
}
}