/**
* Created on Feb 24, 2009
*
* 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.devices;
import java.util.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.pluginsimpl.local.PluginInitializer;
import org.gudy.azureus2.ui.swt.IconBarEnabler;
import org.gudy.azureus2.ui.swt.Utils;
import org.gudy.azureus2.ui.swt.shells.MessageBoxShell;
import org.gudy.azureus2.ui.swt.views.table.impl.TableViewSWTImpl;
import com.aelitis.azureus.core.*;
import com.aelitis.azureus.core.devices.*;
import com.aelitis.azureus.ui.UIFunctions;
import com.aelitis.azureus.ui.UIFunctionsManager;
import com.aelitis.azureus.ui.UserPrompterResultListener;
import com.aelitis.azureus.ui.common.ToolBarEnabler;
import com.aelitis.azureus.ui.common.table.*;
import com.aelitis.azureus.ui.common.table.impl.TableColumnManager;
import com.aelitis.azureus.ui.common.updater.UIUpdatable;
import com.aelitis.azureus.ui.selectedcontent.SelectedContentManager;
import com.aelitis.azureus.ui.swt.UIFunctionsManagerSWT;
import com.aelitis.azureus.ui.swt.columns.torrent.ColumnThumbnail;
import com.aelitis.azureus.ui.swt.devices.columns.*;
import com.aelitis.azureus.ui.swt.mdi.MdiEntrySWT;
import com.aelitis.azureus.ui.swt.mdi.MultipleDocumentInterfaceSWT;
import com.aelitis.azureus.ui.swt.skin.SWTSkinObject;
import com.aelitis.azureus.ui.swt.views.skin.SkinView;
import org.gudy.azureus2.plugins.ui.UIManager;
import org.gudy.azureus2.plugins.ui.tables.*;
public class
SBC_DevicesODView
extends SkinView
implements UIUpdatable, ToolBarEnabler
{
public static final String TABLE_RCM = "DevicesOD";
private static boolean columnsAdded = false;
private DeviceOfflineDownloader device;
private TableViewSWTImpl<DeviceOfflineDownload> tv_downloads;
private MdiEntrySWT mdi_entry;
private Composite control_parent;
public Object
skinObjectInitialShow(
SWTSkinObject skinObject, Object params )
{
AzureusCoreFactory.addCoreRunningListener(
new AzureusCoreRunningListener()
{
public void
azureusCoreRunning(
AzureusCore core )
{
initColumns( core );
}
});
MultipleDocumentInterfaceSWT mdi = UIFunctionsManagerSWT.getUIFunctionsSWT().getMDISWT();
if ( mdi != null ){
mdi_entry = mdi.getCurrentEntrySWT();
mdi_entry.addToolbarEnabler( this );
device = (DeviceOfflineDownloader)mdi_entry.getDatasource();
}
return null;
}
private void
initColumns(
AzureusCore core )
{
synchronized( SBC_DevicesODView.class ){
if ( columnsAdded ){
return;
}
columnsAdded = true;
}
UIManager uiManager = PluginInitializer.getDefaultInterface().getUIManager();
TableManager tableManager = uiManager.getTableManager();
tableManager.registerColumn(
DeviceOfflineDownload.class, ColumnThumbnail.COLUMN_ID,
new TableColumnCreationListener() {
public void tableColumnCreated(TableColumn column) {
new ColumnThumbnail(column);
column.setWidth(70);
}
});
tableManager.registerColumn(
DeviceOfflineDownload.class, ColumnOD_Name.COLUMN_ID,
new TableColumnCreationListener() {
public void tableColumnCreated(TableColumn column) {
new ColumnOD_Name(column);
}
});
tableManager.registerColumn(
DeviceOfflineDownload.class, ColumnOD_Status.COLUMN_ID,
new TableColumnCreationListener() {
public void tableColumnCreated(TableColumn column) {
new ColumnOD_Status(column);
}
});
tableManager.registerColumn(
DeviceOfflineDownload.class, ColumnOD_Completion.COLUMN_ID,
new TableColumnCreationListener() {
public void tableColumnCreated(TableColumn column) {
new ColumnOD_Completion(column);
}
});
tableManager.registerColumn(
DeviceOfflineDownload.class, ColumnOD_Remaining.COLUMN_ID,
new TableColumnCreationListener() {
public void tableColumnCreated(TableColumn column) {
new ColumnOD_Remaining(column);
}
});
TableColumnManager tcm = TableColumnManager.getInstance();
TableColumnCore[] allTCs = tcm.getAllTableColumnCoreAsArray(
DeviceOfflineDownload.class, TABLE_RCM);
// for now, all columns are default
ArrayList<String> names = new ArrayList<String>();
for (int i = 0; i < allTCs.length; i++) {
TableColumn tc = allTCs[i];
if (tc.isVisible()) {
names.add(tc.getName());
}
}
tcm.setDefaultColumnNames(TABLE_RCM, names.toArray(new String[0]));
}
public Object
skinObjectShown(
SWTSkinObject skinObject,
Object params )
{
super.skinObjectShown(skinObject, params);
SWTSkinObject so_list = getSkinObject("devicesod-list");
if ( so_list != null ){
initTable((Composite) so_list.getControl());
}
return null;
}
public Object
skinObjectHidden(
SWTSkinObject skinObject,
Object params )
{
synchronized( this ){
if ( tv_downloads != null ){
tv_downloads.delete();
tv_downloads = null;
}
}
Utils.disposeSWTObjects(new Object[] {
control_parent,
});
return( super.skinObjectHidden(skinObject, params));
}
public Object
skinObjectDestroyed(
SWTSkinObject skinObject,
Object params )
{
synchronized( this ){
if ( tv_downloads != null ){
tv_downloads.delete();
tv_downloads = null;
}
}
Utils.disposeSWTObjects(new Object[] {
control_parent,
});
return( super.skinObjectDestroyed(skinObject, params));
}
private void
initTable(
final Composite control )
{
control_parent = new Composite(control, SWT.NONE);
control_parent.setLayoutData(Utils.getFilledFormData());
final StackLayout stack_layout = new StackLayout();
control_parent.setLayout( stack_layout );
// enabled
final Composite enabled_device_parent = new Composite( control_parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.marginHeight = layout.marginWidth = layout.verticalSpacing = layout.horizontalSpacing = 0;
enabled_device_parent.setLayout(layout);
tv_downloads =
new TableViewSWTImpl<DeviceOfflineDownload>(
DeviceOfflineDownload.class,
TABLE_RCM,
TABLE_RCM,
new TableColumnCore[0],
ColumnOD_Name.COLUMN_ID,
SWT.MULTI | SWT.FULL_SELECTION | SWT.VIRTUAL );
tv_downloads.setRowDefaultHeight(50);
tv_downloads.setHeaderVisible(true);
tv_downloads.addSelectionListener(
new TableSelectionListener()
{
public void
selected(
TableRowCore[] row )
{
refreshIconBar();
}
public void
mouseExit(
TableRowCore row )
{
}
public void
mouseEnter(
TableRowCore row )
{
}
public void
focusChanged(
TableRowCore focus )
{
refreshIconBar();
}
public void
deselected(
TableRowCore[] rows)
{
refreshIconBar();
}
public void
defaultSelected(TableRowCore[] rows, int stateMask)
{
refreshIconBar();
}
protected void
refreshIconBar()
{
SelectedContentManager.clearCurrentlySelectedContent();
UIFunctions uiFunctions = UIFunctionsManager.getUIFunctions();
if (uiFunctions != null) {
uiFunctions.refreshIconBar();
}
}
}, false );
tv_downloads.addLifeCycleListener(
new TableLifeCycleListener()
{
private final TableViewSWTImpl<DeviceOfflineDownload> f_table = tv_downloads;
private Set<DeviceOfflineDownload> download_set = new HashSet<DeviceOfflineDownload>();
private boolean destroyed;
private DeviceOfflineDownloaderListener od_listener =
new DeviceOfflineDownloaderListener()
{
public void
downloadAdded(
final DeviceOfflineDownload download )
{
synchronized( download_set ){
if ( destroyed ){
return;
}
if ( download_set.contains( download )){
return;
}
download_set.add( download );
}
Utils.execSWTThread(
new Runnable()
{
public void
run()
{
if ( tv_downloads == f_table && !f_table.isDisposed()){
synchronized( download_set ){
if ( destroyed ){
return;
}
}
f_table.addDataSources( new DeviceOfflineDownload[]{ download });
}
}
});
}
public void
downloadChanged(
final DeviceOfflineDownload download )
{
synchronized( download_set ){
if ( destroyed ){
return;
}
if ( !download_set.contains( download )){
return;
}
}
Utils.execSWTThread(
new Runnable()
{
public void
run()
{
if ( tv_downloads == f_table && !f_table.isDisposed()){
synchronized( download_set ){
if ( destroyed ){
return;
}
}
TableRowCore row = f_table.getRow( download );
if ( row != null ){
row.refresh(true );
}
}
}
});
}
public void
downloadRemoved(
final DeviceOfflineDownload download )
{
synchronized( download_set ){
if ( destroyed ){
return;
}
if ( !download_set.remove( download )){
return;
}
}
Utils.execSWTThread(
new Runnable()
{
public void
run()
{
if ( tv_downloads == f_table && !f_table.isDisposed()){
synchronized( download_set ){
if ( destroyed ){
return;
}
}
f_table.removeDataSources( new DeviceOfflineDownload[]{ download });
}
}
});
}
};
public void
tableViewInitialized()
{
device.addListener( od_listener );
DeviceOfflineDownload[] downloads = device.getDownloads();
final ArrayList<DeviceOfflineDownload> new_downloads = new ArrayList<DeviceOfflineDownload>( downloads.length );
synchronized( download_set ){
if ( destroyed ){
return;
}
for ( DeviceOfflineDownload download: downloads ){
if ( !download_set.contains( download )){
download_set.add( download );
new_downloads.add( download );
}
}
}
if ( new_downloads.size() > 0 ){
Utils.execSWTThread(
new Runnable()
{
public void
run()
{
if ( tv_downloads == f_table && !f_table.isDisposed()){
synchronized( download_set ){
if ( destroyed ){
return;
}
}
f_table.addDataSources( new_downloads.toArray( new DeviceOfflineDownload[ new_downloads.size()]));
}
}
});
}
}
public void
tableViewDestroyed()
{
device.removeListener( od_listener );
synchronized( download_set ){
destroyed = true;
download_set.clear();
}
}
});
tv_downloads.initialize( enabled_device_parent );
// disabled
final Composite disabled_device_parent = new Composite( control_parent, SWT.NONE);
layout = new GridLayout();
layout.marginHeight = layout.marginWidth = layout.verticalSpacing = layout.horizontalSpacing = 0;
disabled_device_parent.setLayout(layout);
Label l = new Label( disabled_device_parent, SWT.NULL );
GridData grid_data = new GridData( GridData.FILL_HORIZONTAL );
grid_data.horizontalIndent = 5;
l.setLayoutData( grid_data );
l.setText( MessageText.getString( "device.is.disabled" ));
device.addListener(
new DeviceListener()
{
public void
deviceChanged(
Device d )
{
Composite x = device.isEnabled()?enabled_device_parent:disabled_device_parent;
if ( x.isDisposed()){
device.removeListener( this );
}else{
if ( x != stack_layout.topControl ){
Utils.execSWTThread(
new Runnable()
{
public void
run()
{
Composite x = device.isEnabled()?enabled_device_parent:disabled_device_parent;
if ( !x.isDisposed() && x != stack_layout.topControl ){
stack_layout.topControl = x;
control.layout( true, true );
}
}
});
}
}
}
});
stack_layout.topControl = device.isEnabled()?enabled_device_parent:disabled_device_parent;
control.layout(true);
}
public void refreshToolBar(Map<String, Boolean> list) {
list.put("remove", true);
}
public boolean toolBarItemActivated(String itemKey) {
if (itemKey.equals("remove")) {
MessageBoxShell mb =
new MessageBoxShell(
MessageText.getString("message.confirm.delete.title"),
MessageText.getString("message.confirm.delete.text",
new String[] {
device.getName()
}),
new String[] {
MessageText.getString("Button.yes"),
MessageText.getString("Button.no")
},
1 );
mb.open(new UserPrompterResultListener() {
public void prompterClosed(int result) {
if (result == 0) {
device.remove();
}
}
});
return true;
}
return false;
}
public String
getUpdateUIName()
{
return( "DevicesODView" );
}
public void
updateUI()
{
if ( tv_downloads != null ){
tv_downloads.refreshTable( false );
}
}
}