/**
* Created on Jul 2, 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.HashMap;
import java.util.Locale;
import java.util.Map;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.gudy.azureus2.core3.category.Category;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.config.ParameterListener;
import org.gudy.azureus2.core3.disk.DiskManager;
import org.gudy.azureus2.core3.disk.DiskManagerFileInfo;
import org.gudy.azureus2.core3.download.DownloadManager;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.stats.transfer.OverallStats;
import org.gudy.azureus2.core3.stats.transfer.StatsFactory;
import org.gudy.azureus2.core3.util.AERunnable;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.core3.util.DisplayFormatters;
import org.gudy.azureus2.core3.util.SimpleTimer;
import org.gudy.azureus2.core3.util.SystemTime;
import org.gudy.azureus2.core3.util.TimeFormatter;
import org.gudy.azureus2.core3.util.TimerEvent;
import org.gudy.azureus2.core3.util.TimerEventPerformer;
import org.gudy.azureus2.core3.util.TimerEventPeriodic;
import org.gudy.azureus2.plugins.PluginInterface;
import org.gudy.azureus2.plugins.ui.*;
import org.gudy.azureus2.plugins.ui.toolbar.UIToolBarEnablerBase;
import org.gudy.azureus2.plugins.ui.toolbar.UIToolBarItem;
import org.gudy.azureus2.pluginsimpl.local.PluginInitializer;
import org.gudy.azureus2.ui.swt.Utils;
import org.gudy.azureus2.ui.swt.plugins.UISWTInstance;
import org.gudy.azureus2.ui.swt.views.ViewUtils;
import com.aelitis.azureus.core.AzureusCore;
import com.aelitis.azureus.core.AzureusCoreFactory;
import com.aelitis.azureus.core.AzureusCoreRunningListener;
import com.aelitis.azureus.core.tag.Tag;
import com.aelitis.azureus.ui.InitializerListener;
import com.aelitis.azureus.ui.UIFunctionsManager;
import com.aelitis.azureus.ui.common.ToolBarItem;
import com.aelitis.azureus.ui.mdi.MdiEntry;
import com.aelitis.azureus.ui.mdi.MultipleDocumentInterface;
import com.aelitis.azureus.ui.selectedcontent.ISelectedContent;
import com.aelitis.azureus.ui.selectedcontent.SelectedContentListener;
import com.aelitis.azureus.ui.selectedcontent.SelectedContentManager;
import com.aelitis.azureus.ui.skin.SkinConstants;
import com.aelitis.azureus.ui.swt.Initializer;
import com.aelitis.azureus.ui.swt.skin.SWTSkinButtonUtility;
import com.aelitis.azureus.ui.swt.skin.SWTSkinObject;
import com.aelitis.azureus.ui.swt.skin.SWTSkinObjectText;
import com.aelitis.azureus.ui.swt.utils.ColorCache;
import com.aelitis.azureus.ui.swt.views.skin.sidebar.SideBar;
/**
* @author TuxPaper
* @created Jul 2, 2008
*
*/
public class SBC_LibraryView
extends SkinView implements UIPluginViewToolBarListener
{
private final static String ID = "library-list";
public final static int MODE_BIGTABLE = 0;
public final static int MODE_SMALLTABLE = 1;
public static final int TORRENTS_ALL = 0;
public static final int TORRENTS_COMPLETE = 1;
public static final int TORRENTS_INCOMPLETE = 2;
public static final int TORRENTS_UNOPENED = 3;
private final static String[] modeViewIDs = {
SkinConstants.VIEWID_SIDEBAR_LIBRARY_BIG,
SkinConstants.VIEWID_SIDEBAR_LIBRARY_SMALL
};
private final static String[] modeIDs = {
"library.table.big",
"library.table.small"
};
private static boolean header_show_uptime;
private static volatile OverallStats totalStats;
private static volatile int selection_count;
private static volatile long selection_size;
private static volatile long selection_done;
static{
SimpleTimer.addPeriodicEvent(
"SBLV:updater",
60*1000,
new TimerEventPerformer()
{
public void
perform(
TimerEvent event )
{
if ( header_show_uptime ){
SB_Transfers.triggerCountRefreshListeners();
}
}
});
header_show_uptime = COConfigurationManager.getBooleanParameter( "MyTorrentsView.showuptime" );
COConfigurationManager.addParameterListener(
"MyTorrentsView.showuptime",
new ParameterListener()
{
public void
parameterChanged(
String name )
{
header_show_uptime = COConfigurationManager.getBooleanParameter( "MyTorrentsView.showuptime" );
SB_Transfers.triggerCountRefreshListeners();
}
});
AzureusCoreFactory.addCoreRunningListener(
new AzureusCoreRunningListener()
{
public void
azureusCoreRunning(
AzureusCore core)
{
totalStats = StatsFactory.getStats();
}
});
SelectedContentManager.addCurrentlySelectedContentListener(
new SelectedContentListener()
{
public void
currentlySelectedContentChanged(
ISelectedContent[] currentContent,
String viewId )
{
selection_count = currentContent.length;
long total_size = 0;
long total_done = 0;
for ( ISelectedContent sc: currentContent ){
DownloadManager dm = sc.getDownloadManager();
if ( dm != null ){
int file_index = sc.getFileIndex();
if ( file_index == -1 ){
DiskManagerFileInfo[] file_infos = dm.getDiskManagerFileInfoSet().getFiles();
for ( DiskManagerFileInfo file_info: file_infos ){
if ( !file_info.isSkipped()){
total_size += file_info.getLength();
total_done += file_info.getDownloaded();
}
}
}else{
DiskManagerFileInfo file_info = dm.getDiskManagerFileInfoSet().getFiles()[file_index];
if ( !file_info.isSkipped()){
total_size += file_info.getLength();
total_done += file_info.getDownloaded();
}
}
}
}
selection_size = total_size;
selection_done = total_done;
SB_Transfers.triggerCountRefreshListeners();
}
});
}
private int viewMode = -1;
private SWTSkinButtonUtility btnSmallTable;
private SWTSkinButtonUtility btnBigTable;
private SWTSkinObject soListArea;
private int torrentFilterMode = TORRENTS_ALL;
private String torrentFilter;
private SWTSkinObject soWait;
private SWTSkinObject soWaitProgress;
private SWTSkinObjectText soWaitTask;
private int waitProgress = 0;
private SWTSkinObjectText soLibraryInfo;
private Object datasource;
private MdiEntry currentEntry;
public void setViewMode(int viewMode, boolean save) {
if (viewMode >= modeViewIDs.length || viewMode < 0
|| viewMode == this.viewMode) {
return;
}
int oldViewMode = this.viewMode;
this.viewMode = viewMode;
if (oldViewMode >= 0 && oldViewMode < modeViewIDs.length) {
SWTSkinObject soOldViewArea = getSkinObject(modeViewIDs[oldViewMode]);
//SWTSkinObject soOldViewArea = skin.getSkinObjectByID(modeIDs[oldViewMode]);
if (soOldViewArea != null) {
soOldViewArea.setVisible(false);
}
}
SelectedContentManager.clearCurrentlySelectedContent();
SWTSkinObject soViewArea = getSkinObject(modeViewIDs[viewMode]);
if (soViewArea == null) {
soViewArea = skin.createSkinObject(modeIDs[viewMode] + torrentFilterMode,
modeIDs[viewMode], soListArea);
soViewArea.getControl().setData( "SBC_LibraryView:ViewMode", viewMode );
skin.layout();
soViewArea.setVisible(true);
soViewArea.getControl().setLayoutData(Utils.getFilledFormData());
} else {
soViewArea.setVisible(true);
}
if (save) {
COConfigurationManager.setParameter(torrentFilter + ".viewmode", viewMode);
}
String entryID = null;
if (torrentFilterMode == TORRENTS_ALL) {
entryID = SideBar.SIDEBAR_SECTION_LIBRARY;
} else if (torrentFilterMode == TORRENTS_COMPLETE) {
entryID = SideBar.SIDEBAR_SECTION_LIBRARY_CD;
} else if (torrentFilterMode == TORRENTS_INCOMPLETE) {
entryID = SideBar.SIDEBAR_SECTION_LIBRARY_DL;
} else if (torrentFilterMode == TORRENTS_UNOPENED) {
entryID = SideBar.SIDEBAR_SECTION_LIBRARY_UNOPENED;
}
if (entryID != null) {
MultipleDocumentInterface mdi = UIFunctionsManager.getUIFunctions().getMDI();
currentEntry = mdi.getEntry(entryID);
if (currentEntry != null) {
currentEntry.setLogID(entryID + "-" + viewMode);
}
}
SB_Transfers.triggerCountRefreshListeners();
}
// @see com.aelitis.azureus.ui.swt.views.skin.SkinView#showSupport(com.aelitis.azureus.ui.swt.skin.SWTSkinObject, java.lang.Object)
public Object skinObjectInitialShow(final SWTSkinObject skinObject, Object params) {
soWait = null;
try {
soWait = getSkinObject("library-wait");
soWaitProgress = getSkinObject("library-wait-progress");
soWaitTask = (SWTSkinObjectText) getSkinObject("library-wait-task");
if (soWaitProgress != null) {
soWaitProgress.getControl().addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
Control c = (Control) e.widget;
Point size = c.getSize();
e.gc.setBackground(ColorCache.getColor(e.display, "#23a7df"));
int breakX = size.x * waitProgress / 100;
e.gc.fillRectangle(0, 0, breakX, size.y);
e.gc.setBackground(ColorCache.getColor(e.display, "#cccccc"));
e.gc.fillRectangle(breakX, 0, size.x - breakX, size.y);
}
});
}
soLibraryInfo = (SWTSkinObjectText) getSkinObject("library-info");
if (soLibraryInfo != null) {
SB_Transfers.addCountRefreshListener(
new SB_Transfers.countRefreshListener()
{
final Map<Composite,ExtraInfoProvider> extra_info_map = new HashMap<Composite,ExtraInfoProvider>();
{
soLibraryInfo.getControl().getParent().setData( "ViewUtils:ViewTitleExtraInfo",
new ViewUtils.ViewTitleExtraInfo()
{
public void
update(
Composite reporter,
boolean seeding_view,
int count,
int active )
{
ExtraInfoProvider provider = getProvider( reporter );
if ( provider == null ){
return;
}
if ( provider.value != count || provider.active != active ){
provider.value = count;
provider.active = active;
if ( viewMode == provider.view_mode && provider.enabled ){
SB_Transfers.triggerCountRefreshListeners();
}
}
}
public void
setEnabled(
Composite reporter,
boolean seeding_view,
boolean enabled )
{
ExtraInfoProvider provider = getProvider( reporter );
if ( provider == null ){
return;
}
if ( provider.enabled != enabled ){
provider.enabled = enabled;
if ( viewMode == provider.view_mode ){
SB_Transfers.triggerCountRefreshListeners();
}
}
}
private ExtraInfoProvider
getProvider(
Composite reporter )
{
synchronized( extra_info_map ){
ExtraInfoProvider provider = extra_info_map.get( reporter );
if ( provider != null ){
return( provider );
}
Composite temp = reporter;
while( temp != null ){
Integer vm = (Integer)temp.getData( "SBC_LibraryView:ViewMode" );
if ( vm != null ){
provider = new ExtraInfoProvider( vm );
extra_info_map.put( reporter, provider );
return( provider );
}
temp = temp.getParent();
}
Debug.out( "No view mode found for " + reporter );
return( null );
}
}
});
}
// @see com.aelitis.azureus.ui.swt.views.skin.SBC_LibraryView.countRefreshListener#countRefreshed(com.aelitis.azureus.ui.swt.views.skin.SBC_LibraryView.stats, com.aelitis.azureus.ui.swt.views.skin.SBC_LibraryView.stats)
public void
countRefreshed(
SB_Transfers.stats statsWithLowNoise,
SB_Transfers.stats statsNoLowNoise)
{
SB_Transfers.stats stats = viewMode == MODE_SMALLTABLE? statsWithLowNoise : statsNoLowNoise;
String s;
if (torrentFilterMode == TORRENTS_INCOMPLETE) {
String id = "library.incomplete.header";
if (stats.numDownloading != 1) {
id += ".p";
}
s = MessageText.getString(id,
new String[] {
String.valueOf(stats.numDownloading),
String.valueOf(stats.numIncomplete - stats.numDownloading),
});
} else if (torrentFilterMode == TORRENTS_ALL) {
if (datasource instanceof Category) {
Category cat = (Category) datasource;
String id = "library.category.header";
s = MessageText.getString(id,
new String[] {
(cat.getType() != Category.TYPE_USER)
? MessageText.getString(cat.getName())
: cat.getName()
});
}else if (datasource instanceof Tag) {
Tag tag = (Tag) datasource;
String id = "library.tag.header";
s = MessageText.getString(id,
new String[] {
tag.getTagName( true ) });
} else {
String id = "library.all.header";
if (stats.numComplete + stats.numIncomplete != 1) {
id += ".p";
}
s = MessageText.getString(id,
new String[] {
String.valueOf(stats.numComplete + stats.numIncomplete),
String.valueOf(stats.numSeeding + stats.numDownloading),
});
if ( stats.numQueued > 0 ){
s += ", " +
MessageText.getString(
"label.num_queued", new String[]{ String.valueOf( stats.numQueued )});
}
}
} else if (torrentFilterMode == TORRENTS_UNOPENED) {
String id = "library.unopened.header";
if (stats.numUnOpened != 1) {
id += ".p";
}
s = MessageText.getString(id,
new String[] {
String.valueOf(stats.numUnOpened),
});
}else{
s = "";
}
synchronized( extra_info_map ){
int filter_total = 0;
int filter_active = 0;
boolean filter_enabled = false;
for ( ExtraInfoProvider provider: extra_info_map.values()){
if ( viewMode == provider.view_mode ){
if ( provider.enabled ){
filter_enabled = true;
filter_total += provider.value;
filter_active += provider.active;
}
}
}
if ( filter_enabled ){
String extra =
MessageText.getString(
"filter.header.matches2",
new String[]{ String.valueOf( filter_total ), String.valueOf( filter_active )});
s += " " + extra;
}
}
if ( selection_count > 1 ){
s += ", " +
MessageText.getString(
"label.num_selected", new String[]{ String.valueOf( selection_count )});
if ( selection_size > 0 ){
if ( selection_size == selection_done ){
s += " (" + DisplayFormatters.formatByteCountToKiBEtc( selection_size ) + ")";
}else{
s += " (" + DisplayFormatters.formatByteCountToKiBEtc( selection_done ) + "/" + DisplayFormatters.formatByteCountToKiBEtc( selection_size ) + ")";
}
}
}
if ( header_show_uptime && totalStats != null ){
long up_secs = (totalStats.getSessionUpTime()/60)*60;
String op;
if ( up_secs < 60 ){
up_secs = 60;
op = "<";
}else{
op = " ";
}
String up_str = TimeFormatter.format2( up_secs, false );
s += "; " +
MessageText.getString(
"label.uptime_coarse",
new String[]{ op, up_str } );
}
soLibraryInfo.setText(s);
}
class
ExtraInfoProvider
{
int view_mode;
boolean enabled;
int value;
int active;
private
ExtraInfoProvider(
int vm )
{
view_mode = vm;
}
}
});
}
} catch (Exception e) {
}
//AzureusCore core = AzureusCoreFactory.getSingleton();
if (!AzureusCoreFactory.isCoreRunning()) {
if (soWait != null) {
soWait.setVisible(true);
//soWait.getControl().getParent().getParent().getParent().layout(true, true);
}
final Initializer initializer = Initializer.getLastInitializer();
if (initializer != null) {
initializer.addListener(new InitializerListener() {
public void reportPercent(final int percent) {
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
if (soWaitProgress != null && !soWaitProgress.isDisposed()) {
waitProgress = percent;
soWaitProgress.getControl().redraw();
soWaitProgress.getControl().update();
}
}
});
if (percent > 100) {
initializer.removeListener(this);
}
}
public void reportCurrentTask(String currentTask) {
if (soWaitTask != null && !soWaitTask.isDisposed()) {
soWaitTask.setText(currentTask);
}
}
});
}
}
AzureusCoreFactory.addCoreRunningListener(new AzureusCoreRunningListener() {
public void azureusCoreRunning(final AzureusCore core) {
PluginInterface pi = PluginInitializer.getDefaultInterface();
final UIManager uim = pi.getUIManager();
uim.addUIListener(new UIManagerListener() {
public void UIDetached(UIInstance instance) {
}
public void UIAttached(UIInstance instance) {
if (instance instanceof UISWTInstance) {
uim.removeUIListener(this);
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
if (soWait != null) {
soWait.setVisible(false);
}
if ( !skinObject.isDisposed()){
setupView(core, skinObject);
}
}
});
}
}
});
}
});
return null;
}
private void setupView(AzureusCore core, SWTSkinObject skinObject) {
torrentFilter = skinObject.getSkinObjectID();
if (torrentFilter.equalsIgnoreCase(SideBar.SIDEBAR_SECTION_LIBRARY_DL)) {
torrentFilterMode = TORRENTS_INCOMPLETE;
} else if (torrentFilter.equalsIgnoreCase(SideBar.SIDEBAR_SECTION_LIBRARY_CD)) {
torrentFilterMode = TORRENTS_COMPLETE;
} else if (torrentFilter.equalsIgnoreCase(SideBar.SIDEBAR_SECTION_LIBRARY_UNOPENED)) {
torrentFilterMode = TORRENTS_UNOPENED;
}
soListArea = getSkinObject(ID + "-area");
soListArea.getControl().setData("TorrentFilterMode",
new Long(torrentFilterMode));
soListArea.getControl().setData("DataSource", datasource);
setViewMode(
COConfigurationManager.getIntParameter(torrentFilter + ".viewmode"),
false);
SWTSkinObject so;
so = getSkinObject(ID + "-button-smalltable");
if (so != null) {
btnSmallTable = new SWTSkinButtonUtility(so);
btnSmallTable.addSelectionListener(new SWTSkinButtonUtility.ButtonListenerAdapter() {
public void pressed(SWTSkinButtonUtility buttonUtility,
SWTSkinObject skinObject, int stateMask) {
setViewMode(MODE_SMALLTABLE, true);
}
});
}
so = getSkinObject(ID + "-button-bigtable");
if (so != null) {
btnBigTable = new SWTSkinButtonUtility(so);
btnBigTable.addSelectionListener(new SWTSkinButtonUtility.ButtonListenerAdapter() {
public void pressed(SWTSkinButtonUtility buttonUtility,
SWTSkinObject skinObject, int stateMask) {
setViewMode(MODE_BIGTABLE, true);
}
});
}
SB_Transfers.setupViewTitleWithCore(core);
}
/* (non-Javadoc)
* @see org.gudy.azureus2.plugins.ui.UIPluginViewToolBarListener#refreshToolBarItems(java.util.Map)
*/
public void refreshToolBarItems(Map<String, Long> list) {
long stateSmall = UIToolBarItem.STATE_ENABLED;
long stateBig = UIToolBarItem.STATE_ENABLED;
if (viewMode == MODE_BIGTABLE) {
stateBig |= UIToolBarItem.STATE_DOWN;
} else {
stateSmall |= UIToolBarItem.STATE_DOWN;
}
list.put("modeSmall", stateSmall);
list.put("modeBig", stateBig);
}
/* (non-Javadoc)
* @see org.gudy.azureus2.plugins.ui.toolbar.UIToolBarActivationListener#toolBarItemActivated(com.aelitis.azureus.ui.common.ToolBarItem, long, java.lang.Object)
*/
public boolean toolBarItemActivated(ToolBarItem item, long activationType,
Object datasource) {
String itemKey = item.getID();
if (itemKey.equals("modeSmall")) {
if (isVisible()) {
setViewMode(MODE_SMALLTABLE, true);
return true;
}
}
if (itemKey.equals("modeBig")) {
if (isVisible()) {
setViewMode(MODE_BIGTABLE, true);
return true;
}
}
return false;
}
// @see com.aelitis.azureus.ui.swt.skin.SWTSkinObjectAdapter#skinObjectHidden(com.aelitis.azureus.ui.swt.skin.SWTSkinObject, java.lang.Object)
public Object skinObjectHidden(SWTSkinObject skinObject, Object params) {
return super.skinObjectHidden(skinObject, params);
}
public Object dataSourceChanged(SWTSkinObject skinObject, Object params) {
datasource = params;
if (soListArea != null) {
soListArea.getControl().setData("DataSource",
params);
}
return null;
}
public int getViewMode() {
return viewMode;
}
protected void
addHeaderInfoExtender(
HeaderInfoExtender extender )
{
}
protected void
removeHeaderInfoExtender(
HeaderInfoExtender extender )
{
}
protected void
refreshHeaderInfo()
{
SB_Transfers.triggerCountRefreshListeners();
}
protected interface
HeaderInfoExtender
{
}
}