/**
* Copyright (C) 2006 Aelitis, 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; either version 2
* of the License, or (at your option) any later version.
* 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.
*
* AELITIS, SAS au capital de 63.529,40 euros
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*
*/
package com.aelitis.azureus.ui.swt.views.skin;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.*;
import org.eclipse.swt.widgets.Shell;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.util.AERunnable;
import org.gudy.azureus2.core3.util.SystemTime;
import org.gudy.azureus2.pluginsimpl.local.PluginInitializer;
import org.gudy.azureus2.ui.swt.SimpleTextEntryWindow;
import org.gudy.azureus2.ui.swt.Utils;
import com.aelitis.azureus.core.cnetwork.ContentNetwork;
import com.aelitis.azureus.core.messenger.config.PlatformConfigMessenger;
import com.aelitis.azureus.ui.common.RememberedDecisionsManager;
import com.aelitis.azureus.ui.mdi.*;
import com.aelitis.azureus.ui.swt.UIFunctionsManagerSWT;
import com.aelitis.azureus.ui.swt.UIFunctionsSWT;
import com.aelitis.azureus.ui.swt.browser.BrowserContext;
import com.aelitis.azureus.ui.swt.mdi.MultipleDocumentInterfaceSWT;
import com.aelitis.azureus.ui.swt.skin.*;
import com.aelitis.azureus.ui.swt.skin.SWTSkinButtonUtility.ButtonListenerAdapter;
import com.aelitis.azureus.ui.swt.views.skin.SkinnedDialog.SkinnedDialogClosedListener;
import com.aelitis.azureus.util.ConstantsVuze;
import com.aelitis.azureus.util.ContentNetworkUtils;
import org.gudy.azureus2.plugins.PluginInterface;
import org.gudy.azureus2.plugins.ui.*;
import org.gudy.azureus2.plugins.ui.menus.*;
/**
* @author TuxPaper
* @created Sep 30, 2006
*
*/
public class Browse
extends SkinView
implements MdiCloseListener
{
protected static final String CFG_SHOWCLOSE = "contentnetwork.close.reminder";
private SWTSkinObjectBrowser browserSkinObject;
public SWTSkinObjectBrowser getBrowserSkinObject() {
return browserSkinObject;
}
private SWTSkin skin;
private SWTSkinObject soMain;
private MdiEntryVitalityImage vitalityImage;
private ContentNetwork contentNetwork;
// Only accessed in SWT thread
private static List<Long> listAlreadyCalledLoginRPC = new ArrayList<Long>();
// @see com.aelitis.azureus.ui.swt.skin.SWTSkinObjectAdapter#skinObjectCreated(com.aelitis.azureus.ui.swt.skin.SWTSkinObject, java.lang.Object)
public Object skinObjectCreated(SWTSkinObject skinObject, Object params) {
MultipleDocumentInterfaceSWT mdi = UIFunctionsManagerSWT.getUIFunctionsSWT().getMDISWT();
if (mdi != null) {
MdiEntry entry = mdi.getEntryBySkinView(this);
if (entry != null) {
entry.addListener(this);
}
}
return super.skinObjectCreated(skinObject, params);
}
/* (non-Javadoc)
* @see com.aelitis.azureus.ui.swt.views.SkinView#showSupport(com.aelitis.azureus.ui.swt.skin.SWTSkinObject, java.lang.Object)
*/
public Object skinObjectInitialShow(SWTSkinObject skinObject, Object params) {
this.soMain = skinObject;
skin = skinObject.getSkin();
Object creationParams = skinObject.getData("CreationParams");
if (creationParams instanceof ContentNetwork) {
contentNetwork = (ContentNetwork) creationParams;
} else {
contentNetwork = ConstantsVuze.getDefaultContentNetwork();
}
// Vuze network login happens in Initializer. The rest can be initialized
// when browser area is created (here)
long cnID = contentNetwork.getID();
if (cnID != ContentNetwork.CONTENT_NETWORK_VUZE) {
if (!listAlreadyCalledLoginRPC.contains(new Long(cnID))) {
PlatformConfigMessenger.login(contentNetwork.getID(), 0);
listAlreadyCalledLoginRPC.add(new Long(cnID));
}
}
browserSkinObject = SWTSkinUtils.findBrowserSO(soMain);
final MultipleDocumentInterfaceSWT mdi = UIFunctionsManagerSWT.getUIFunctionsSWT().getMDISWT();
if (mdi != null) {
final MdiEntry entry = mdi.getEntryBySkinView(this);
if (entry != null) {
vitalityImage = entry.addVitalityImage("image.sidebar.vitality.dots");
vitalityImage.setVisible(false);
mdi.addListener(new MdiListener() {
long lastSelect = 0;
public void mdiEntrySelected(MdiEntry newEntry,
MdiEntry oldEntry) {
if (entry == newEntry) {
if (entry == oldEntry) {
if (lastSelect < SystemTime.getOffsetTime(-1000)) {
if (browserSkinObject != null) {
browserSkinObject.restart();
}
}
} else {
lastSelect = SystemTime.getCurrentTime();
}
}
}
});
}
}
browserSkinObject.addListener(new SWTSkinObjectListener() {
public Object eventOccured(SWTSkinObject skinObject, int eventType,
Object params) {
if (eventType == EVENT_SHOW) {
browserSkinObject.removeListener(this);
browserSkinObject.addListener(new BrowserContext.loadingListener() {
public void browserLoadingChanged(boolean loading, String url) {
if (vitalityImage != null) {
vitalityImage.setVisible(loading);
}
}
});
browserSkinObject.getContext().setContentNetworkID(contentNetwork.getID());
browserSkinObject.setStartURL(ContentNetworkUtils.getUrl(contentNetwork,
ContentNetwork.SERVICE_BIG_BROWSE));
}
return null;
}
});
PluginInterface pi = PluginInitializer.getDefaultInterface();
UIManager uim = pi.getUIManager();
MenuManager menuManager = uim.getMenuManager();
String menuID = "sidebar."
+ ContentNetworkUtils.getTarget(contentNetwork);
MenuItem item = menuManager.addMenuItem(menuID, "Button.reload");
item.addListener(new MenuItemListener() {
public void selected(MenuItem menu, Object target) {
browserSkinObject.refresh();
}
});
if (org.gudy.azureus2.core3.util.Constants.isCVSVersion()) {
MenuItem parent = menuManager.addMenuItem(menuID, "CVS Only");
parent.setStyle(MenuItem.STYLE_MENU);
MenuItem menuItem = menuManager.addMenuItem(parent, "Button.reset");
menuItem.addListener(new MenuItemListener() {
public void selected(MenuItem menu, Object target) {
browserSkinObject.getContext().executeInBrowser("sendMessage('display','reset-url', {});");
//browserSkinObject.restart();
}
});
menuItem = menuManager.addMenuItem(parent, "Tux RPC Test");
menuItem.addListener(new MenuItemListener() {
public void selected(MenuItem menu, Object target) {
browserSkinObject.setURL("c:\\test\\BrowserMessaging.html");
}
});
menuItem = menuManager.addMenuItem(parent, "URL..");
menuItem.addListener(new MenuItemListener() {
public void selected(MenuItem menu, Object target) {
SimpleTextEntryWindow entryWindow = new SimpleTextEntryWindow("", "!URL!");
entryWindow.prompt(new UIInputReceiverListener() {
public void UIInputReceiverClosed(UIInputReceiver entryWindow) {
if (entryWindow.hasSubmittedInput()) {
browserSkinObject.setURL(entryWindow.getSubmittedInput());
}
}
});
}
});
if (contentNetwork != ConstantsVuze.getDefaultContentNetwork()) {
menuItem = menuManager.addMenuItem(parent, "Remove HD Network");
menuItem.addListener(new MenuItemListener() {
public void selected(MenuItem menu, Object target) {
if (mdi != null) {
MdiEntry entry = mdi.getEntryBySkinView(Browse.this);
if (entry != null) {
entry.removeListener(Browse.this);
}
mdi.closeEntry(ContentNetworkUtils.getTarget(contentNetwork));
}
contentNetwork.remove();
}
});
menuItem = menuManager.addMenuItem(parent, "Reset IP Flag && Close");
menuItem.addListener(new MenuItemListener() {
public void selected(MenuItem menu, Object target) {
contentNetwork.setPersistentProperty(
ContentNetwork.PP_AUTH_PAGE_SHOWN, Boolean.FALSE);
if (mdi != null) {
MdiEntry entry = mdi.getEntryBySkinView(Browse.this);
if (entry != null) {
entry.removeListener(Browse.this);
}
mdi.closeEntry(ContentNetworkUtils.getTarget(contentNetwork));
}
}
});
}
menuItem = menuManager.addMenuItem(parent, "Source Ref: "
+ contentNetwork.getPersistentProperty(ContentNetwork.PP_SOURCE_REF));
menuItem.setEnabled(false);
}
return null;
}
public void mdiEntryClosed(MdiEntry entry, boolean userClosed) {
boolean wasActive = false;
Object prop = contentNetwork.getPersistentProperty(ContentNetwork.PP_ACTIVE);
if (prop instanceof Boolean) {
wasActive = ((Boolean) prop).booleanValue();
}
contentNetwork.setPersistentProperty(ContentNetwork.PP_ACTIVE,
Boolean.FALSE);
// send sidebar close event to webapp
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
Shell shell = null;
String url = ContentNetworkUtils.getUrl(contentNetwork,
ContentNetwork.SERVICE_SIDEBAR_CLOSE);
if (url == null) {
return;
}
UIFunctionsSWT uiFunctions = UIFunctionsManagerSWT.getUIFunctionsSWT();
if (uiFunctions != null) {
shell = uiFunctions.getMainShell();
}
if (shell == null) {
return;
}
final Browser browser = Utils.createSafeBrowser(shell, SWT.NONE);
if (browser == null) {
return;
}
browser.setVisible(false);
browser.addProgressListener(new ProgressListener() {
public void completed(ProgressEvent event) {
Utils.execSWTThreadLater(1000, new AERunnable() {
public void runSupport() {
if (browser.isDisposed() || browser.getShell().isDisposed()) {
return;
}
browser.setUrl("about:blank");
browser.dispose();
}
});
}
public void changed(ProgressEvent event) {
}
});
browser.setUrl(url);
}
});
if (!wasActive) {
return;
}
if (userClosed) {
int decision = RememberedDecisionsManager.getRememberedDecision(CFG_SHOWCLOSE);
if (decision != 1) {
final SkinnedDialog closeDialog = new SkinnedDialog(
"skin3_close_notification", "close-notification.body");
closeDialog.setTitle(MessageText.getString("v3.dialog.cnclose.title",
new String[] {
contentNetwork.getName()
}));
SWTSkin skin = closeDialog.getSkin();
SWTSkinObjectButton soButton = (SWTSkinObjectButton) skin.getSkinObject("close");
if (soButton != null) {
soButton.addSelectionListener(new ButtonListenerAdapter() {
public void pressed(SWTSkinButtonUtility buttonUtility,
SWTSkinObject skinObject, int stateMask) {
closeDialog.close();
}
});
}
closeDialog.addCloseListener(new SkinnedDialogClosedListener() {
public void skinDialogClosed(SkinnedDialog dialog) {
SWTSkin skin = closeDialog.getSkin();
SWTSkinObjectCheckbox soCheck = (SWTSkinObjectCheckbox) skin.getSkinObject("noshowagain");
if (soCheck != null && soCheck.isChecked()) {
RememberedDecisionsManager.setRemembered(CFG_SHOWCLOSE, 1);
}
}
});
closeDialog.open();
}
}
}
}