package com.aelitis.azureus.ui.swt.subscriptions;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.gudy.azureus2.core3.category.Category;
import org.gudy.azureus2.core3.category.CategoryManager;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.util.*;
import org.gudy.azureus2.plugins.PluginInterface;
import org.gudy.azureus2.plugins.ui.UIInputReceiver;
import org.gudy.azureus2.plugins.ui.UIInputReceiverListener;
import org.gudy.azureus2.plugins.ui.UIManager;
import org.gudy.azureus2.plugins.ui.menus.*;
import org.gudy.azureus2.pluginsimpl.local.PluginInitializer;
import org.gudy.azureus2.ui.swt.*;
import org.gudy.azureus2.ui.swt.mainwindow.TorrentOpener;
import org.gudy.azureus2.ui.swt.plugins.UISWTInputReceiver;
import org.gudy.azureus2.ui.swt.shells.MessageBoxShell;
import org.gudy.azureus2.ui.swt.views.IView;
import com.aelitis.azureus.core.metasearch.Engine;
import com.aelitis.azureus.core.metasearch.impl.web.WebEngine;
import com.aelitis.azureus.core.subs.*;
import com.aelitis.azureus.core.vuzefile.VuzeFile;
import com.aelitis.azureus.ui.UserPrompterResultListener;
import com.aelitis.azureus.ui.common.viewtitleinfo.ViewTitleInfoManager;
import com.aelitis.azureus.ui.mdi.MdiEntry;
import com.aelitis.azureus.ui.mdi.MdiEntryVitalityImage;
import com.aelitis.azureus.ui.swt.mdi.MdiEntrySWT;
public class SubscriptionMDIEntry implements SubscriptionListener
{
private static final String ALERT_IMAGE_ID = "image.sidebar.vitality.alert";
private static final String AUTH_IMAGE_ID = "image.sidebar.vitality.auth";
private final MdiEntry mdiEntry;
MdiEntryVitalityImage spinnerImage;
private MdiEntryVitalityImage warningImage;
private final Subscription subs;
private String key;
public SubscriptionMDIEntry(Subscription subs, MdiEntry entry) {
this.subs = subs;
this.mdiEntry = entry;
key = "Subscription_" + ByteFormatter.encodeString(subs.getPublicKey());
setupMdiEntry();
}
private void setupMdiEntry() {
if (mdiEntry == null) {
return;
}
mdiEntry.setImageLeftID("image.sidebar.subscriptions");
warningImage = mdiEntry.addVitalityImage( ALERT_IMAGE_ID );
spinnerImage = mdiEntry.addVitalityImage("image.sidebar.vitality.dots");
if (spinnerImage != null) {
spinnerImage.setVisible(false);
}
setWarning();
PluginInterface pi = PluginInitializer.getDefaultInterface();
UIManager uim = pi.getUIManager();
final MenuManager menuManager = uim.getMenuManager();
MenuItem menuItem;
menuItem = menuManager.addMenuItem("sidebar." + key,"Subscription.menu.forcecheck");
menuItem.setText(MessageText.getString("Subscription.menu.forcecheck"));
menuItem.addListener(new SubsMenuItemListener() {
public void selected(MdiEntry info, Subscription subs) {
try {
subs.getManager().getScheduler().downloadAsync( subs, true );
} catch (SubscriptionException e) {
Debug.out(e);
}
}
});
menuItem = menuManager.addMenuItem("sidebar." + key,"Subscription.menu.clearall");
menuItem.addListener(new SubsMenuItemListener() {
public void selected(MdiEntry info, Subscription subs) {
subs.getHistory().markAllResultsRead();
refreshView();
}
});
menuItem = menuManager.addMenuItem("sidebar." + key,"Subscription.menu.dirtyall");
menuItem.addListener(new SubsMenuItemListener() {
public void selected(MdiEntry info, Subscription subs) {
subs.getHistory().markAllResultsUnread();
refreshView();
}
});
menuItem = menuManager.addMenuItem("sidebar." + key,"Subscription.menu.deleteall");
menuItem.addListener(new SubsMenuItemListener() {
public void selected(MdiEntry info, Subscription subs) {
subs.getHistory().deleteAllResults();
refreshView();
}
});
menuItem = menuManager.addMenuItem("sidebar." + key,"Subscription.menu.reset");
menuItem.addListener(new SubsMenuItemListener() {
public void selected(MdiEntry info, Subscription subs) {
subs.getHistory().reset();
try{
subs.getEngine().reset();
}catch( Throwable e ){
Debug.printStackTrace(e);
}
try{
subs.getManager().getScheduler().downloadAsync(subs, true);
}catch( Throwable e ){
Debug.out(e);
}
}
});
try{
Engine engine = subs.getEngine();
if ( engine instanceof WebEngine ){
if (((WebEngine)engine).isNeedsAuth()){
menuItem = menuManager.addMenuItem("sidebar." + key,"Subscription.menu.resetauth");
menuItem.addListener(new SubsMenuItemListener() {
public void selected(MdiEntry info, Subscription subs) {
try{
Engine engine = subs.getEngine();
if ( engine instanceof WebEngine ){
((WebEngine)engine).setCookies( null );
}
}catch( Throwable e ){
Debug.printStackTrace(e);
}
try{
subs.getManager().getScheduler().downloadAsync(subs, true);
}catch( Throwable e ){
Debug.out(e);
}
}
});
menuItem = menuManager.addMenuItem("sidebar." + key,"Subscription.menu.setcookies");
menuItem.addListener(new SubsMenuItemListener() {
public void selected(MdiEntry info, final Subscription subs) {
try{
Engine engine = subs.getEngine();
if ( engine instanceof WebEngine ){
final WebEngine we = (WebEngine)engine;
UISWTInputReceiver entry = new SimpleTextEntryWindow();
String[] req = we.getRequiredCookies();
String req_str = "";
for ( String r:req ){
req_str += (req_str.length()==0?"":";") + r + "=?";
}
entry.setPreenteredText( req_str, true );
entry.maintainWhitespace(false);
entry.allowEmptyInput( false );
entry.setTitle("general.enter.cookies");
entry.prompt(new UIInputReceiverListener() {
public void UIInputReceiverClosed(UIInputReceiver entry) {
if (!entry.hasSubmittedInput()){
return;
}
try {
String input = entry.getSubmittedInput().trim();
if ( input.length() > 0 ){
we.setCookies( input );
subs.getManager().getScheduler().downloadAsync(subs, true);
}
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
});
}
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
});
}
}
}catch( Throwable e ){
Debug.printStackTrace(e);
}
// sep
menuManager.addMenuItem("sidebar." + key,"s1").setStyle( MenuItem.STYLE_SEPARATOR );
// category
menuItem = menuManager.addMenuItem("sidebar." + key, "MyTorrentsView.menu.setCategory");
menuItem.setStyle( MenuItem.STYLE_MENU );
menuItem.addFillListener(
new MenuItemFillListener()
{
public void
menuWillBeShown(
MenuItem menu,
Object data )
{
addCategorySubMenu( menuManager, menu );
}
});
if ( subs.isUpdateable()){
menuItem = menuManager.addMenuItem("sidebar." + key,"MyTorrentsView.menu.rename");
menuItem.addListener(new SubsMenuItemListener() {
public void selected(MdiEntry info, final Subscription subs) {
UISWTInputReceiver entry = new SimpleTextEntryWindow();
entry.setPreenteredText(subs.getName(), false );
entry.maintainWhitespace(false);
entry.allowEmptyInput( false );
entry.setLocalisedTitle(MessageText.getString("label.rename",
new String[] {
subs.getName()
}));
entry.prompt(new UIInputReceiverListener() {
public void UIInputReceiverClosed(UIInputReceiver entry) {
if (!entry.hasSubmittedInput()){
return;
}
String input = entry.getSubmittedInput().trim();
if ( input.length() > 0 ){
try{
subs.setName( input );
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
}
});
}
});
}
menuItem = menuManager.addMenuItem("sidebar." + key,"Subscription.menu.upgrade");
menuItem.addListener(new SubsMenuItemListener() {
public void selected(MdiEntry info, Subscription subs) {
subs.resetHighestVersion();
}
});
menuItem.addFillListener(
new MenuItemFillListener()
{
public void
menuWillBeShown(
MenuItem menu,
Object data )
{
menu.setVisible( subs.getHighestVersion() > subs.getVersion());
}
});
menuItem = menuManager.addMenuItem("sidebar." + key,"Subscription.menu.export");
menuItem.addListener(new SubsMenuItemListener() {
public void selected(MdiEntry info, Subscription subs) {
export();
}
});
// sep
menuManager.addMenuItem("sidebar." + key,"s2").setStyle( MenuItem.STYLE_SEPARATOR );
menuItem = menuManager.addMenuItem("sidebar." + key,"Subscription.menu.remove");
menuItem.addListener(new SubsMenuItemListener() {
public void selected(MdiEntry info, Subscription subs) {
removeWithConfirm();
}
});
menuManager.addMenuItem("sidebar." + key,"s3").setStyle( MenuItem.STYLE_SEPARATOR );
menuItem = menuManager.addMenuItem("sidebar." + key,"Subscription.menu.properties");
menuItem.addListener(new SubsMenuItemListener() {
public void selected(MdiEntry info, Subscription subs) {
showProperties();
}
});
subs.addListener(this);
}
public void subscriptionDownloaded(Subscription subs, boolean auto) {
}
public void subscriptionChanged(Subscription subs) {
mdiEntry.redraw();
ViewTitleInfoManager.refreshTitleInfo(mdiEntry.getViewTitleInfo());
}
protected void refreshView() {
if (!(mdiEntry instanceof MdiEntrySWT)) {
return;
}
IView iView = ((MdiEntrySWT)mdiEntry).getIView();
if (iView instanceof SubscriptionView) {
SubscriptionView subsView = (SubscriptionView) iView;
subsView.refreshView();
}
}
protected void
setWarning()
{
// possible during initialisation, status will be shown again on complete
if ( warningImage == null ){
return;
}
SubscriptionHistory history = subs.getHistory();
String last_error = history.getLastError();
boolean auth_fail = history.isAuthFail();
// don't report problem until its happened a few times, but not for auth fails as this is a perm error
if ( history.getConsecFails() < 3 && !auth_fail ){
last_error = null;
}
boolean trouble = last_error != null;
if ( trouble ){
warningImage.setToolTip( last_error );
warningImage.setImageID( auth_fail?AUTH_IMAGE_ID:ALERT_IMAGE_ID );
warningImage.setVisible( true );
}else{
warningImage.setVisible( false );
warningImage.setToolTip( "" );
}
}
private void
addCategorySubMenu(
MenuManager menu_manager,
MenuItem menu )
{
menu.removeAllChildItems();
Category[] categories = CategoryManager.getCategories();
Arrays.sort( categories );
MenuItem m;
if ( categories.length > 0 ){
String assigned_category = subs.getCategory();
final Category uncat = CategoryManager.getCategory( Category.TYPE_UNCATEGORIZED );
if ( uncat != null ){
m = menu_manager.addMenuItem( menu, uncat.getName());
m.setStyle( MenuItem.STYLE_RADIO );
m.setData( new Boolean( assigned_category == null ));
m.addListener(
new MenuItemListener()
{
public void
selected(
MenuItem menu,
Object target )
{
assignSelectedToCategory( uncat );
}
});
m = menu_manager.addMenuItem( menu, "sep1" );
m.setStyle( MenuItem.STYLE_SEPARATOR );
}
for ( int i=0; i<categories.length; i++ ){
final Category cat = categories[i];
if ( cat.getType() == Category.TYPE_USER) {
m = menu_manager.addMenuItem( menu, "!" + cat.getName() + "!" );
m.setStyle( MenuItem.STYLE_RADIO );
m.setData( new Boolean( assigned_category != null && assigned_category.equals( cat.getName())));
m.addListener(
new MenuItemListener()
{
public void
selected(
MenuItem menu,
Object target )
{
assignSelectedToCategory( cat );
}
});
}
}
m = menu_manager.addMenuItem( menu, "sep2" );
m.setStyle( MenuItem.STYLE_SEPARATOR );
}
m = menu_manager.addMenuItem( menu, "MyTorrentsView.menu.setCategory.add" );
m.addListener(
new MenuItemListener()
{
public void
selected(
MenuItem menu,
Object target )
{
addCategory( );
}
});
}
private void
addCategory()
{
CategoryAdderWindow adderWindow = new CategoryAdderWindow(Display.getDefault());
Category newCategory = adderWindow.getNewCategory();
if ( newCategory != null ){
assignSelectedToCategory( newCategory );
}
}
private void
assignSelectedToCategory(
Category category )
{
if ( category.getType() == Category.TYPE_UNCATEGORIZED ){
subs.setCategory( null );
}else{
subs.setCategory( category.getName());
}
}
protected void export() {
Utils.execSWTThread(
new AERunnable()
{
public void
runSupport()
{
FileDialog dialog =
new FileDialog( Utils.findAnyShell(), SWT.SYSTEM_MODAL | SWT.SAVE );
dialog.setFilterPath( TorrentOpener.getFilterPathData() );
dialog.setText(MessageText.getString("subscript.export.select.template.file"));
dialog.setFilterExtensions(new String[] {
"*.vuze",
"*.vuz",
Constants.FILE_WILDCARD
});
dialog.setFilterNames(new String[] {
"*.vuze",
"*.vuz",
Constants.FILE_WILDCARD
});
String path = TorrentOpener.setFilterPathData( dialog.open());
if ( path != null ){
String lc = path.toLowerCase();
if ( !lc.endsWith( ".vuze" ) && !lc.endsWith( ".vuz" )){
path += ".vuze";
}
try{
VuzeFile vf = subs.getVuzeFile();
vf.write( new File( path ));
}catch( Throwable e ){
Debug.out( e );
}
}
}
});
}
protected void
removeWithConfirm( )
{
MessageBoxShell mb =
new MessageBoxShell(
MessageText.getString("message.confirm.delete.title"),
MessageText.getString("message.confirm.delete.text",
new String[] {
subs.getName()
}),
new String[] {
MessageText.getString("Button.yes"),
MessageText.getString("Button.no")
},
1 );
mb.open(new UserPrompterResultListener() {
public void prompterClosed(int result) {
if (result == 0) {
subs.setSubscribed( false );
}
}
});
}
protected void
showProperties()
{
SubscriptionHistory history = subs.getHistory();
SimpleDateFormat df = new SimpleDateFormat();
String last_error = history.getLastError();
if ( last_error == null ){
last_error = "";
}
String engine_str;
String auth_str = String.valueOf(false);
try{
Engine engine = subs.getEngine();
engine_str = engine.getNameEx();
if ( engine instanceof WebEngine ){
WebEngine web_engine = (WebEngine)engine;
if ( web_engine.isNeedsAuth()){
auth_str = String.valueOf(true) + ": cookies=" + toString( web_engine.getRequiredCookies());
}
}
}catch( Throwable e ){
engine_str = "Unknown";
auth_str = "";
}
String[] keys = {
"subs.prop.enabled",
"subs.prop.is_public",
"subs.prop.is_auto",
"subs.prop.is_auto_ok",
"subs.prop.update_period",
"subs.prop.last_scan",
"subs.prop.last_result",
"subs.prop.next_scan",
"subs.prop.last_error",
"subs.prop.num_read",
"subs.prop.num_unread",
"subs.prop.assoc",
"subs.prop.version",
"subs.prop.high_version",
"subscriptions.listwindow.popularity",
"subs.prop.template",
"subs.prop.auth",
"TableColumn.header.category",
};
String category_str;
String category = subs.getCategory();
if ( category == null ){
category_str = MessageText.getString( "Categories.uncategorized" );
}else{
category_str = category;
}
int check_freq = history.getCheckFrequencyMins();
long last_new_result = history.getLastNewResultTime();
long next_scan = history.getNextScanTime();
String[] values = {
String.valueOf( history.isEnabled()),
String.valueOf( subs.isPublic()),
String.valueOf( history.isAutoDownload()),
String.valueOf( subs.isAutoDownloadSupported()),
(check_freq==Integer.MAX_VALUE?"":(String.valueOf( history.getCheckFrequencyMins() + " " + MessageText.getString( "ConfigView.text.minutes")))),
df.format(new Date( history.getLastScanTime())),
( last_new_result==0?"":df.format(new Date( last_new_result ))),
( next_scan == Long.MAX_VALUE?"":df.format(new Date( next_scan ))),
(last_error.length()==0?MessageText.getString("PeersView.uniquepiece.none"):last_error),
String.valueOf( history.getNumRead()),
String.valueOf( history.getNumUnread()),
String.valueOf( subs.getAssociationCount()),
String.valueOf( subs.getVersion()),
subs.getHighestVersion() > subs.getVersion()?String.valueOf( subs.getHighestVersion()):null,
subs.getCachedPopularity()<=1?null:String.valueOf( subs.getCachedPopularity()),
engine_str,
auth_str,
category_str,
};
new PropertiesWindow( subs.getName(), keys, values );
}
private String
toString(
String[] strs )
{
String res = "";
for(int i=0;i<strs.length;i++){
res += (i==0?"":",") + strs[i];
}
return( res );
}
public abstract static class SubsMenuItemListener implements MenuItemListener {
public final void selected(MenuItem menu, Object target) {
if (target instanceof MdiEntry) {
MdiEntry info = (MdiEntry) target;
Subscription subs = (Subscription) info.getDatasource();
try {
selected(info, subs);
} catch (Throwable t) {
Debug.out(t);
}
}
}
public abstract void selected(MdiEntry info, Subscription subs);
}
}