/*
* Created on Sep 13, 2012
* Created by Paul Gardner
*
* Copyright 2012 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.shells.main;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.torrent.impl.TorrentOpenOptions;
import org.gudy.azureus2.core3.util.*;
import org.gudy.azureus2.plugins.ui.toolbar.UIToolBarManager;
import org.gudy.azureus2.ui.swt.UIExitUtilsSWT;
import org.gudy.azureus2.ui.swt.Utils;
import org.gudy.azureus2.ui.swt.mainwindow.*;
import org.gudy.azureus2.ui.swt.minibar.AllTransfersBar;
import org.gudy.azureus2.ui.swt.plugins.UISWTInstance;
import org.gudy.azureus2.ui.swt.plugins.UISWTView;
import org.gudy.azureus2.ui.swt.plugins.UISWTViewEventListener;
import org.gudy.azureus2.ui.swt.pluginsimpl.UISWTInstanceImpl;
import org.gudy.azureus2.ui.swt.pluginsimpl.UISWTViewCore;
import org.gudy.azureus2.ui.systray.SystemTraySWT;
import com.aelitis.azureus.core.*;
import com.aelitis.azureus.ui.*;
import com.aelitis.azureus.ui.common.updater.UIUpdater;
import com.aelitis.azureus.ui.mdi.MultipleDocumentInterface;
import com.aelitis.azureus.ui.swt.UIFunctionsManagerSWT;
import com.aelitis.azureus.ui.swt.UIFunctionsSWT;
import com.aelitis.azureus.ui.swt.mdi.MultipleDocumentInterfaceSWT;
import com.aelitis.azureus.ui.swt.uiupdater.UIUpdaterSWT;
public class
MainWindowDelayStub
implements MainWindow
{
private Display display;
private IUIIntializer initialiser;
private Shell shell;
private AzureusCore core;
private AESemaphore core_sem = new AESemaphore("");
private volatile MainWindow main_window;
private SystemTraySWT swt_tray;
private UIFunctionsSWT delayed_uif = new UIFunctionsSWTImpl();
public
MainWindowDelayStub(
AzureusCore _core,
Display _display,
IUIIntializer _uiInitializer )
{
core = _core;
display = _display;
initialiser = _uiInitializer;
init();
core_sem.releaseForever();
}
public
MainWindowDelayStub(
Display _display,
IUIIntializer _uiInitializer )
{
display = _display;
initialiser = _uiInitializer;
init();
}
private void
init()
{
final AESemaphore sem = new AESemaphore( "shell:create" );
Utils.execSWTThread(
new Runnable()
{
public void
run()
{
try{
shell = new Shell(display, SWT.SHELL_TRIM);
UIFunctionsManagerSWT.setUIFunctions( delayed_uif );
boolean bEnableTray = COConfigurationManager.getBooleanParameter("Enable System Tray");
if ( bEnableTray ){
swt_tray = SystemTraySWT.getTray();
}
MainHelpers.initTransferBar();
if ( initialiser != null ){
initialiser.initializationComplete();
initialiser.abortProgress();
}
AERunStateHandler.addListener(
new AERunStateHandler.RunStateChangeListener()
{
private boolean handled = false;
public void
runStateChanged(
long run_state )
{
if ( AERunStateHandler.isDelayedUI() || handled ){
return;
}
handled = true;
checkMainWindow();
}
}, false );
}finally{
sem.release();
}
}
});
sem.reserve();
}
private void
log(
String str )
{
Debug.out( str );
}
public void
init(
AzureusCore _core )
{
core = _core;
core_sem.releaseForever();
}
// barp
private interface
Fixup
{
public void
fix(
MainWindow mw );
}
private interface
Fixup2
{
public Object
fix(
MainWindow mw );
}
private interface
Fixup3
{
public void
fix(
UIFunctionsSWT uif );
}
private interface
Fixup4
{
public Object
fix(
UIFunctionsSWT uif );
}
private void
checkMainWindow()
{
boolean activated = false;
synchronized( this ){
if ( main_window == null ){
final AESemaphore wait_sem = new AESemaphore( "cmw" );
AzureusCoreLifecycleListener listener =
new AzureusCoreLifecycleAdapter()
{
public void
componentCreated(
AzureusCore core,
AzureusCoreComponent component )
{
if ( component instanceof UIFunctions ){
wait_sem.release();
}
}
};
core.addLifecycleListener( listener );
main_window = new MainWindowImpl( core, display, null );
if ( !wait_sem.reserve( 30*1000 )){
Debug.out( "Gave up waiting for UIFunction component to be created" );
}
activated = true;
}
}
if ( activated ){
AERunStateHandler.setResourceMode( AERunStateHandler.RS_ALL_ACTIVE );
}
}
private void
fixup(
Fixup f )
{
core_sem.reserve();
checkMainWindow();
f.fix( main_window );
}
private Object
fixup(
Fixup2 f )
{
core_sem.reserve();
checkMainWindow();
return( f.fix( main_window ));
}
private void
fixup(
Fixup3 f )
{
core_sem.reserve();
checkMainWindow();
UIFunctionsSWT uif = UIFunctionsManagerSWT.getUIFunctionsSWT();
if ( uif == delayed_uif ){
Debug.out( "eh?" );
}else{
f.fix( uif );
}
}
private Object
fixup(
Fixup4 f )
{
core_sem.reserve();
checkMainWindow();
UIFunctionsSWT uif = UIFunctionsManagerSWT.getUIFunctionsSWT();
if ( uif == delayed_uif ){
Debug.out( "eh?" );
return( null );
}else{
return( f.fix( uif ));
}
}
// toot
public Shell
getShell()
{
return( shell );
}
public IMainMenu
getMainMenu()
{
return((IMainMenu)fixup( new Fixup2(){public Object fix( MainWindow mw){ return( mw.getMainMenu()); }}));
}
public IMainStatusBar
getMainStatusBar()
{
if ( main_window != null ){
return( main_window.getMainStatusBar());
}
return( null );
}
public boolean
isReady()
{
log( "isReady" );
return( false );
}
public void
setVisible(
final boolean visible,
final boolean tryTricks )
{
fixup( new Fixup(){public void fix( MainWindow mw){ mw.setVisible( visible, tryTricks ); }});
}
public UISWTInstanceImpl
getUISWTInstanceImpl()
{
log( "getUISWTInstanceImpl" );
return( null );
}
public void
setSelectedLanguageItem()
{
log( "setSelectedLanguageItem" );
}
public boolean
dispose(
final boolean for_restart,
final boolean close_already_in_progress )
{
if ( main_window != null ){
return( main_window.dispose(for_restart, close_already_in_progress));
}
log( "dispose" );
UIExitUtilsSWT.uiShutdown();
if ( swt_tray != null ){
swt_tray.dispose();
}
try{
AllTransfersBar transfer_bar = AllTransfersBar.getBarIfOpen(core.getGlobalManager());
if ( transfer_bar != null ){
transfer_bar.forceSaveLocation();
}
}catch( Exception ignore ){
}
if (!SWTThread.getInstance().isTerminated()) {
Utils.getOffOfSWTThread(new AERunnable() {
public void runSupport() {
if (!SWTThread.getInstance().isTerminated()) {
SWTThread.getInstance().getInitializer().stopIt( for_restart, false);
}
}
});
}
return true;
}
public boolean
isVisible(
int windowElement)
{
log( "isVisible" );
return( false );
}
public void
setVisible(
int windowElement,
boolean value )
{
log( "setVisible" );
}
public void
setHideAll(
boolean hide)
{
log( "setHideAll" );
}
public Rectangle
getMetrics(
int windowElement)
{
log( "getMetrics" );
return( null );
}
private class
UIFunctionsSWTImpl
implements UIFunctionsSWT
{
public void
bringToFront()
{
fixup( new Fixup3(){public void fix( UIFunctionsSWT uif){ uif.bringToFront(); }});
}
public void
bringToFront(
final boolean tryTricks)
{
fixup( new Fixup3(){public void fix( UIFunctionsSWT uif){ uif.bringToFront( tryTricks ); }});
}
public void
runOnUIThread(
final int ui_type,
final Runnable runnable )
{
fixup( new Fixup3(){public void fix( UIFunctionsSWT uif){ uif.runOnUIThread( ui_type, runnable ); }});
}
public void
refreshLanguage()
{
log( "refreshLanguage" );
}
public void
refreshIconBar()
{
log( "refreshIconBar" );
}
public void
setStatusText(
String string )
{
}
public void
setStatusText(
int statustype,
String string,
UIStatusTextClickListener l)
{
log( "setStatusText" );
}
public boolean
dispose(
boolean for_restart,
boolean close_already_in_progress )
{
return( MainWindowDelayStub.this.dispose( for_restart, close_already_in_progress ));
}
public boolean
viewURL(
String url,
String target,
int w,
int h,
boolean allowResize,
boolean isModal)
{
log( "viewURL" );
return( false );
}
public boolean
viewURL(
String url,
String target,
double wPct,
double hPct,
boolean allowResize,
boolean isModal)
{
log( "viewURL" );
return( false );
}
public void
viewURL(
String url,
String target,
String sourceRef)
{
log( "viewURL" );
}
public UIFunctionsUserPrompter
getUserPrompter(
String title,
String text,
String[] buttons,
int defaultOption)
{
log( "getUserPrompter" );
return( null );
}
public void
promptUser(
String title,
String text,
String[] buttons,
int defaultOption,
String rememberID,
String rememberText,
boolean bRememberByDefault,
int autoCloseInMS,
UserPrompterResultListener l)
{
log( "promptUser" );
}
public UIUpdater
getUIUpdater()
{
return( UIUpdaterSWT.getInstance());
}
public void
openView(
final int viewID,
final Object datasource )
{
// OSX Vuze->Preferences menu
fixup( new Fixup3(){public void fix( UIFunctionsSWT uif){ uif.openView( viewID, datasource ); }});
}
public void
doSearch(
String searchText )
{
log( "doSearch" );
}
public void
doSearch(
String searchText,
boolean toSubscribe )
{
log( "doSearch" );
}
public void
installPlugin(
String plugin_id,
String resource_prefix,
actionListener listener )
{
log( "installPlugin" );
}
public void
performAction(
final int action_id,
final Object args,
final actionListener listener )
{
// auto-update restart prompt (for example)
fixup( new Fixup3(){public void fix( UIFunctionsSWT uif){ uif.performAction( action_id, args, listener ); }});
}
public MultipleDocumentInterface
getMDI()
{
log( "getMDI" );
return( null );
}
public void
forceNotify(
int iconID,
String title,
String text,
String details,
Object[] relatedObjects,
int timeoutSecs)
{
log( "forceNotify" );
}
public Shell
getMainShell()
{
return( shell );
}
public void
addPluginView(
String viewID,
UISWTViewEventListener l)
{
log( "addPluginView" );
}
public void
closeDownloadBars()
{
}
public boolean
isGlobalTransferBarShown()
{
if (!AzureusCoreFactory.isCoreRunning()) {
return false;
}
return AllTransfersBar.getManager().isOpen(
AzureusCoreFactory.getSingleton().getGlobalManager());
}
public void
showGlobalTransferBar()
{
AllTransfersBar.open(getMainShell());
}
public void
closeGlobalTransferBar()
{
AllTransfersBar.closeAllTransfersBar();
}
public UISWTView[]
getPluginViews()
{
log( "getPluginViews" );
return( new UISWTView[0] );
}
public void
openPluginView(
String sParentID,
String sViewID,
UISWTViewEventListener l,
Object dataSource,
boolean bSetFocus)
{
log( "openPluginView" );
}
public void
openPluginView(
final UISWTViewCore view,
final String name)
{
log( "openPluginView" );
}
public void
removePluginView(
String viewID)
{
log( "removePluginView" );
}
public void
closePluginView(
UISWTViewCore view)
{
log( "closePluginView" );
}
public void
closePluginViews(
String sViewID )
{
log( "closePluginViews" );
}
public UISWTInstance
getUISWTInstance()
{
log( "getUISWTInstance" );
return( null );
}
public void
refreshTorrentMenu()
{
log( "refreshTorrentMenu" );
}
public IMainStatusBar
getMainStatusBar()
{
return( null );
}
public IMainMenu
createMainMenu(
final Shell shell)
{
// OSX Vuze->About menu
return((IMainMenu)fixup( new Fixup4(){public Object fix( UIFunctionsSWT uif){ return( uif.createMainMenu( shell )); }}));
}
public IMainWindow
getMainWindow()
{
return( MainWindowDelayStub.this );
}
public void
closeAllDetails()
{
log( "closeAllDetails" );
}
public boolean
hasDetailViews()
{
log( "hasDetailViews" );
return( false );
}
public Shell
showCoreWaitDlg()
{
return( null );
}
public boolean
isProgramInstalled(
final String extension,
final String name )
{
return((Boolean)fixup( new Fixup4(){public Object fix( UIFunctionsSWT uif){ return( uif.isProgramInstalled( extension, name )); }}));
}
public MultipleDocumentInterfaceSWT
getMDISWT()
{
log( "getMDISWT" );
return( null );
}
public void
promptForSearch()
{
log( "promptForSearch" );
}
public UIToolBarManager
getToolBarManager()
{
log( "getToolBarManager" );
return( null );
}
public void
openRemotePairingWindow()
{
log( "openRemotePairingWindow" );
}
public void
playOrStreamDataSource(
Object ds,
String referal,
boolean launch_already_checked,
boolean complete_only )
{
log( "playOrStreamDataSource" );
}
public void
setHideAll(
boolean hidden)
{
log( "setHideAll" );
}
public boolean addTorrentWithOptions(boolean force,
TorrentOpenOptions torrentOptions) {
log( "addTorrentWithOptions" );
return false;
}
public void showErrorMessage(String keyPrefix, String details,
String[] textParams) {
log( "showErrorMessage" );
}
public void openTorrentOpenOptions(Shell shell, String sPathOfFilesToOpen,
String[] sFilesToOpen, boolean defaultToStopped, boolean forceOpen) {
log("openTorrentOpenOptions");
}
public void openTorrentWindow() {
fixup( new Fixup3(){public void fix( UIFunctionsSWT uif){ uif.openTorrentWindow(); }});
}
}
}