/*
* Created on Mar 19, 2008
* Created by Paul Gardner
*
* 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.plugins.net.buddy.swt;
import java.net.URL;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.util.*;
import org.gudy.azureus2.ui.swt.Utils;
import org.gudy.azureus2.ui.swt.plugins.UISWTInstance;
import org.gudy.azureus2.ui.swt.plugins.UISWTStatusEntry;
import org.gudy.azureus2.ui.swt.plugins.UISWTStatusEntryListener;
import org.gudy.azureus2.ui.swt.plugins.UISWTViewEvent;
import org.gudy.azureus2.ui.swt.plugins.UISWTViewEventListener;
import com.aelitis.azureus.core.security.CryptoHandler;
import com.aelitis.azureus.core.security.CryptoManager;
import com.aelitis.azureus.core.security.CryptoManagerFactory;
import com.aelitis.azureus.core.security.CryptoManagerKeyListener;
import com.aelitis.azureus.plugins.net.buddy.BuddyPlugin;
import com.aelitis.azureus.plugins.net.buddy.BuddyPluginAZ2;
import com.aelitis.azureus.plugins.net.buddy.BuddyPluginAZ2Listener;
import com.aelitis.azureus.plugins.net.buddy.BuddyPluginBuddy;
import com.aelitis.azureus.plugins.net.buddy.BuddyPluginListener;
import com.aelitis.azureus.plugins.net.buddy.tracker.BuddyPluginTracker;
import com.aelitis.azureus.plugins.net.buddy.tracker.BuddyPluginTrackerListener;
import com.aelitis.azureus.ui.swt.imageloader.ImageLoader;
public class
BuddyPluginView
implements UISWTViewEventListener
{
private BuddyPlugin plugin;
private UISWTInstance ui_instance;
private BuddyPluginViewInstance current_instance;
private Image iconNLI;
private Image iconIDLE;
private Image iconIN;
private Image iconOUT;
public
BuddyPluginView(
BuddyPlugin _plugin,
UISWTInstance _ui_instance )
{
plugin = _plugin;
ui_instance = _ui_instance;
plugin.getAZ2Handler().addListener(
new BuddyPluginAZ2Listener()
{
public void
chatCreated(
final BuddyPluginAZ2.chatInstance chat )
{
final Display display = ui_instance.getDisplay();
if ( !display.isDisposed()){
display.asyncExec(
new Runnable()
{
public void
run()
{
if ( !display.isDisposed()){
new BuddyPluginViewChat( plugin, display, chat );
}
}
});
}
}
public void
chatDestroyed(
BuddyPluginAZ2.chatInstance chat )
{
}
});
SimpleTimer.addEvent("BuddyStatusInit", SystemTime.getOffsetTime(1000),
new TimerEventPerformer() {
public void perform(
TimerEvent event )
{
UISWTStatusEntry label = ui_instance.createStatusEntry();
label.setText(MessageText.getString("azbuddy.tracker.bbb.status.title"));
new statusUpdater(ui_instance);
}
});
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
ImageLoader imageLoader = ImageLoader.getInstance();
iconNLI = imageLoader.getImage( "bbb_nli" );
iconIDLE = imageLoader.getImage( "bbb_idle" );
iconIN = imageLoader.getImage( "bbb_in" );
iconOUT = imageLoader.getImage( "bbb_out" );
}
});
}
public boolean
eventOccurred(
UISWTViewEvent event )
{
switch( event.getType() ){
case UISWTViewEvent.TYPE_CREATE:{
if ( current_instance != null ){
return( false );
}
break;
}
case UISWTViewEvent.TYPE_INITIALIZE:{
current_instance = new BuddyPluginViewInstance(plugin, ui_instance, (Composite)event.getData());
break;
}
case UISWTViewEvent.TYPE_CLOSE:
case UISWTViewEvent.TYPE_DESTROY:{
try{
if ( current_instance != null ){
current_instance.destroy();
}
}finally{
current_instance = null;
}
break;
}
}
return true;
}
protected class
statusUpdater
implements BuddyPluginTrackerListener
{
private UISWTStatusEntry label;
private UISWTStatusEntry status;
private BuddyPluginTracker tracker;
private TimerEventPeriodic update_event;
private CryptoManager crypto;
private boolean crypto_ok;
private boolean has_buddies;
protected
statusUpdater(
UISWTInstance instance )
{
status = ui_instance.createStatusEntry();
label = ui_instance.createStatusEntry();
label.setText( MessageText.getString( "azbuddy.tracker.bbb.status.title" ));
label.setTooltipText( MessageText.getString( "azbuddy.tracker.bbb.status.title.tooltip" ));
tracker = plugin.getTracker();
status.setText( "" );
status.setImageEnabled( true );
tracker.addListener( this );
has_buddies = plugin.getBuddies().size() > 0;
status.setVisible( tracker.isEnabled() && has_buddies);
label.setVisible( tracker.isEnabled() && has_buddies);
/*
MenuItem mi = plugin.getPluginInterface().getUIManager().getMenuManager().addMenuItem(
status.getMenuContext(),
"dweeble" );
mi.addListener(
new MenuItemListener()
{
public void
selected(
MenuItem menu,
Object target )
{
System.out.println( "whee" );
}
});
*/
UISWTStatusEntryListener click_listener =
new UISWTStatusEntryListener()
{
public void
entryClicked(
UISWTStatusEntry entry )
{
try{
plugin.getPluginInterface().getUIManager().openURL(
new URL( "http://wiki.vuze.com" ));
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
};
status.setListener( click_listener );
label.setListener( click_listener );
plugin.addListener(
new BuddyPluginListener()
{
public void
initialised(
boolean available )
{
}
public void
buddyAdded(
BuddyPluginBuddy buddy )
{
if ( !has_buddies ){
has_buddies = true;
updateStatus();
}
}
public void
buddyRemoved(
BuddyPluginBuddy buddy )
{
has_buddies = plugin.getBuddies().size() > 0;
if ( !has_buddies ){
updateStatus();
}
}
public void
buddyChanged(
BuddyPluginBuddy buddy )
{
}
public void
messageLogged(
String str,
boolean error )
{
}
public void
enabledStateChanged(
boolean enabled )
{
}
});
crypto = CryptoManagerFactory.getSingleton();
crypto.addKeyListener(
new CryptoManagerKeyListener()
{
public void
keyChanged(
CryptoHandler handler )
{
}
public void
keyLockStatusChanged(
CryptoHandler handler )
{
boolean ok = crypto.getECCHandler().isUnlocked();
if ( ok != crypto_ok ){
crypto_ok = ok;
updateStatus();
}
}
});
crypto_ok = crypto.getECCHandler().isUnlocked();
updateStatus();
}
public void
networkStatusChanged(
BuddyPluginTracker tracker,
int new_status )
{
updateStatus();
}
protected synchronized void
updateStatus()
{
if ( tracker.isEnabled() && has_buddies ){
status.setVisible( true );
label.setVisible( true );
if ( has_buddies && !crypto_ok ){
status.setImage( iconNLI );
status.setTooltipText( MessageText.getString( "azbuddy.tracker.bbb.status.nli" ));
disableUpdates();
}else{
int network_status = tracker.getNetworkStatus();
if ( network_status == BuddyPluginTracker.BUDDY_NETWORK_IDLE ){
status.setImage( iconIDLE );
status.setTooltipText( MessageText.getString( "azbuddy.tracker.bbb.status.idle" ));
disableUpdates();
}else if ( network_status == BuddyPluginTracker.BUDDY_NETWORK_INBOUND ){
status.setImage( iconIN );
enableUpdates();
}else{
status.setImage( iconOUT );
enableUpdates();
}
}
}else{
disableUpdates();
status.setVisible( false );
label.setVisible( false );
}
}
protected void
enableUpdates()
{
if ( update_event == null ){
update_event = SimpleTimer.addPeriodicEvent(
"Buddy:GuiUpdater",
2500,
new TimerEventPerformer()
{
public void
perform(
TimerEvent event )
{
synchronized( statusUpdater.this ){
if ( tracker.isEnabled() && ( crypto_ok || !has_buddies )){
String tt;
int ns = tracker.getNetworkStatus();
if ( ns == BuddyPluginTracker.BUDDY_NETWORK_IDLE ){
tt = MessageText.getString( "azbuddy.tracker.bbb.status.idle" );
}else if ( ns == BuddyPluginTracker.BUDDY_NETWORK_INBOUND ){
tt = MessageText.getString( "azbuddy.tracker.bbb.status.in" ) + ": " + DisplayFormatters.formatByteCountToKiBEtcPerSec( tracker.getNetworkReceiveBytesPerSecond());
}else{
tt = MessageText.getString( "azbuddy.tracker.bbb.status.out" ) + ": " + DisplayFormatters.formatByteCountToKiBEtcPerSec( tracker.getNetworkSendBytesPerSecond());
}
status.setTooltipText( tt );
}
}
}
});
}
}
protected void
disableUpdates()
{
if ( update_event != null ){
update_event.cancel();
update_event = null;
}
}
public void
enabledStateChanged(
BuddyPluginTracker tracker,
boolean enabled )
{
updateStatus();
}
}
}