📄 mainwindow.java
字号:
/*
* Created on Jun 25, 2003
* Modified Apr 13, 2004 by Alon Rohter
* Modified Apr 17, 2004 by Olivier Chalouhi (OSX system menu)
* Copyright (C) 2003, 2004, 2005, 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 46,603.30 euros
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*
*/
package org.gudy.azureus2.ui.swt.mainwindow;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.*;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.config.ParameterListener;
import org.gudy.azureus2.core3.download.DownloadManager;
import org.gudy.azureus2.core3.download.DownloadManagerListener;
import org.gudy.azureus2.core3.global.GlobalManager;
import org.gudy.azureus2.core3.global.GlobalManagerListener;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.logging.LogEvent;
import org.gudy.azureus2.core3.logging.LogIDs;
import org.gudy.azureus2.core3.logging.Logger;
import org.gudy.azureus2.core3.security.SESecurityManager;
import org.gudy.azureus2.core3.tracker.client.TRTrackerScraperResponse;
import org.gudy.azureus2.core3.util.*;
import org.gudy.azureus2.ui.swt.*;
import org.gudy.azureus2.ui.swt.associations.AssociationChecker;
import org.gudy.azureus2.ui.swt.components.ColorUtils;
import org.gudy.azureus2.ui.swt.components.shell.ShellManager;
import org.gudy.azureus2.ui.swt.config.wizard.ConfigureWizard;
import org.gudy.azureus2.ui.swt.debug.ObfusticateImage;
import org.gudy.azureus2.ui.swt.debug.ObfusticateShell;
import org.gudy.azureus2.ui.swt.debug.ObfusticateTab;
import org.gudy.azureus2.ui.swt.maketorrent.NewTorrentWizard;
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.UISWTViewImpl;
import org.gudy.azureus2.ui.swt.sharing.progress.ProgressWindow;
import org.gudy.azureus2.ui.swt.update.UpdateWindow;
import org.gudy.azureus2.ui.swt.views.*;
import org.gudy.azureus2.ui.swt.views.stats.StatsView;
import org.gudy.azureus2.ui.swt.views.table.utils.TableColumnManager;
import org.gudy.azureus2.ui.swt.welcome.WelcomeWindow;
import org.gudy.azureus2.ui.swt.wizard.WizardListener;
import org.gudy.azureus2.ui.systray.SystemTraySWT;
import com.aelitis.azureus.core.AzureusCore;
import com.aelitis.azureus.core.AzureusCoreException;
import com.aelitis.azureus.ui.UIFunctionsManager;
import com.aelitis.azureus.ui.swt.UIFunctionsManagerSWT;
import com.aelitis.azureus.ui.swt.UIFunctionsSWT;
import org.gudy.azureus2.plugins.PluginEvent;
/**
* @author Olivier
* Runnable : so that GUI initialization is done via asyncExec(this)
* STProgressListener : To make it visible once initialization is done
*/
public class
MainWindow
extends AERunnable
implements GlobalManagerListener, DownloadManagerListener,
ParameterListener, IconBarEnabler, AEDiagnosticsEvidenceGenerator,
ObfusticateShell
{
private static final LogIDs LOGID = LogIDs.GUI;
private static MainWindow window;
private Initializer initializer;
private GUIUpdater updater;
private AzureusCore azureus_core;
private GlobalManager globalManager;
//NICO handle swt on macosx
public static boolean isAlreadyDead = false;
public static boolean isDisposeFromListener = false;
private Display display;
private Composite parent;
private Shell shell;
private MainMenu mainMenu;
private IconBar iconBar;
private boolean useCustomTab;
private Composite folder;
/**
* Handles initializing and refreshing the status bar (w/help of GUIUpdater)
*/
private MainStatusBar mainStatusBar;
private TrayWindow downloadBasket;
private SystemTraySWT systemTraySWT;
private HashMap downloadViews;
private AEMonitor downloadViews_mon = new AEMonitor( "MainWindow:dlviews" );
private Tab mytorrents;
private Tab my_tracker_tab;
private Tab my_shares_tab;
private Tab stats_tab;
private Tab console;
private Tab config;
private ConfigView config_view;
protected AEMonitor this_mon = new AEMonitor( "MainWindow" );
private UISWTInstanceImpl uiSWTInstanceImpl = null;
private ArrayList events;
private UIFunctionsSWT uiFunctions;
private boolean bIconBarEnabled = false;
private boolean bShowMainWindow;
public
MainWindow(
AzureusCore _azureus_core,
Initializer _initializer,
ArrayList events)
{
bShowMainWindow = true;
try{
if (Logger.isEnabled())
Logger.log(new LogEvent(LOGID, "MainWindow start"));
AEDiagnostics.addEvidenceGenerator( this );
azureus_core = _azureus_core;
globalManager = azureus_core.getGlobalManager();
initializer = _initializer;
display = SWTThread.getInstance().getDisplay();
window = this;
this.events = events;
display.asyncExec(this);
}catch( AzureusCoreException e ){
Debug.printStackTrace( e );
}
}
/**
* runSupport() MUST BE CALLED TO FINISH INITIALIZATION
* @param _azureus_core
* @param _initializer
* @param shell
* @param parent
*/
public MainWindow(AzureusCore _azureus_core, Initializer _initializer,
Shell shell, Composite parent, UISWTInstanceImpl swtinstance) {
this.shell = shell;
this.parent = parent;
bShowMainWindow = true;
try {
if (Logger.isEnabled())
Logger.log(new LogEvent(LOGID, "MainWindow start"));
AEDiagnostics.addEvidenceGenerator(this);
azureus_core = _azureus_core;
globalManager = azureus_core.getGlobalManager();
initializer = _initializer;
display = SWTThread.getInstance().getDisplay();
window = this;
uiSWTInstanceImpl = swtinstance;
} catch (AzureusCoreException e) {
Debug.printStackTrace(e);
}
}
public void setShowMainWindow(boolean b) {
bShowMainWindow = b;
}
public void runSupport() {
FormData formData;
try{
uiFunctions = UIFunctionsManagerSWT.getUIFunctionsSWT();
if (uiFunctions == null) {
uiFunctions = new UIFunctionsImpl(this);
UIFunctionsManager.setUIFunctions(uiFunctions);
} else {
uiFunctions = new UIFunctionsImpl(this);
}
globalManager.loadExistingTorrentsNow(null, true);
useCustomTab = COConfigurationManager.getBooleanParameter("useCustomTab");
COConfigurationManager.addParameterListener( "config.style.useSIUnits", this );
mytorrents = null;
my_tracker_tab = null;
console = null;
config = null;
config_view = null;
downloadViews = new HashMap();
Control attachToTopOf = null;
Control controlAboveFolder = null;
Control controlBelowFolder = null;
//The Main Window
if (shell == null) {
shell = new Shell(display, SWT.RESIZE | SWT.BORDER | SWT.CLOSE
| SWT.MAX | SWT.MIN);
shell.setData("class", this);
shell.setText("Azureus"); //$NON-NLS-1$
Utils.setShellIcon(shell);
if (parent == null) {
parent = shell;
}
// register window
ShellManager.sharedManager().addWindow(shell);
mainMenu = new MainMenu(this);
FormLayout mainLayout = new FormLayout();
mainLayout.marginHeight = 0;
mainLayout.marginWidth = 0;
try {
mainLayout.spacing = 0;
} catch (NoSuchFieldError e) { /* Pre SWT 3.0 */
}
shell.setLayout(mainLayout);
Utils.linkShellMetricsToConfig(shell, "window");
//NICO catch the dispose event from file/quit on osx
shell.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent event) {
if (!isAlreadyDead) {
isDisposeFromListener = true;
if (shell != null) {
shell.removeDisposeListener(this);
dispose(false, false);
}
isAlreadyDead = true;
}
}
});
shell.addShellListener(new ShellAdapter() {
public void shellClosed(ShellEvent event) {
if (systemTraySWT != null
&& COConfigurationManager.getBooleanParameter("Enable System Tray")
&& COConfigurationManager.getBooleanParameter("Close To Tray")) {
minimizeToTray(event);
} else {
event.doit = dispose(false, false);
}
}
public void shellIconified(ShellEvent event) {
if (systemTraySWT != null
&& COConfigurationManager.getBooleanParameter("Enable System Tray")
&& COConfigurationManager.getBooleanParameter(
"Minimize To Tray")) {
minimizeToTray(event);
}
}
});
shell.addListener(SWT.Deiconify, new Listener() {
public void handleEvent(Event e) {
if (Constants.isOSX
&& COConfigurationManager.getBooleanParameter(
"Password enabled", false)) {
e.doit = false;
shell.setVisible(false);
PasswordWindow.showPasswordWindow(display);
}
}
});
// Separator between menu and icon bar
Label separator = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL);
formData = new FormData();
formData.top = new FormAttachment(0, 0); // 2 params for Pre SWT 3.0
formData.left = new FormAttachment(0, 0); // 2 params for Pre SWT 3.0
formData.right = new FormAttachment(100, 0); // 2 params for Pre SWT 3.0
separator.setLayoutData(formData);
attachToTopOf = separator;
mainStatusBar = new MainStatusBar();
Composite statusBar = mainStatusBar.initStatusBar(azureus_core,
globalManager, display, shell);
controlAboveFolder = attachToTopOf;
controlBelowFolder = statusBar;
}
try {
Utils.createTorrentDropTarget(parent, true);
} catch (Throwable e) {
Logger.log(new LogEvent(LOGID, "Drag and Drop not available", e));
}
if(!useCustomTab) {
folder = new TabFolder(parent, SWT.V_SCROLL);
} else {
folder = new CTabFolder(parent, SWT.CLOSE | SWT.FLAT);
final Color bg = ColorUtils.getShade(folder.getBackground(), (Constants.isOSX) ? -25 : -6);
final Color fg = ColorUtils.getShade(folder.getForeground(), (Constants.isOSX) ? 25 : 6);
folder.setBackground(bg);
folder.setForeground(fg);
((CTabFolder)folder).setBorderVisible(false);
folder.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent event) {
bg.dispose();
fg.dispose();
}
});
((CTabFolder)folder).addCTabFolder2Listener(new CTabFolder2Adapter() {
public void close(CTabFolderEvent event) {
if (!Tab.closed((Item)event.item)) {
event.doit = false;
}
}
});
}
formData = new FormData();
if (controlAboveFolder == null) {
formData.top = new FormAttachment(0,0);
} else {
formData.top = new FormAttachment(controlAboveFolder);
}
if (controlBelowFolder == null) {
formData.bottom = new FormAttachment(100,0);
} else {
formData.bottom = new FormAttachment(controlBelowFolder);
}
formData.left = new FormAttachment(0, 0); // 2 params for Pre SWT 3.0
formData.right = new FormAttachment(100, 0); // 2 params for Pre SWT 3.0
folder.setLayoutData(formData);
Tab.initialize(this, folder);
folder.getDisplay().addFilter(SWT.KeyDown, new Listener() {
public void handleEvent(Event event) {
// Another window has control, skip filter
Control focus_control = display.getFocusControl();
if (focus_control != null && focus_control.getShell() != shell)
return;
int key = event.character;
if ((event.stateMask & SWT.MOD1) != 0 && event.character <= 26
&& event.character > 0)
key += 'a' - 1;
// ESC or CTRL+F4 closes current Tab
if (key == SWT.ESC
|| (event.keyCode == SWT.F4 && event.stateMask == SWT.CTRL)) {
Tab.closeCurrent();
event.doit = false;
} else if (event.keyCode == SWT.F6
|| (event.character == SWT.TAB && (event.stateMask & SWT.CTRL) != 0)) {
// F6 or Ctrl-Tab selects next Tab
// On Windows the tab key will not reach this filter, as it is
// processed by the traversal TRAVERSE_TAB_NEXT. It's unknown
// what other OSes do, so the code is here in case we get TAB
if ((event.stateMask & SWT.SHIFT) == 0) {
event.doit = false;
Tab.selectNextTab(true);
// Shift+F6 or Ctrl+Shift+Tab selects previous Tab
} else if (event.stateMask == SWT.SHIFT) {
Tab.selectNextTab(false);
event.doit = false;
}
} else if (key == 'l' && (event.stateMask & SWT.MOD1) != 0) {
// Ctrl-L: Open URL
OpenTorrentWindow.invokeURLPopup(shell, globalManager);
event.doit = false;
}
}
});
SelectionAdapter selectionAdapter = new SelectionAdapter() {
public void widgetSelected(final SelectionEvent event) {
if(display != null && ! display.isDisposed())
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
if(useCustomTab) {
CTabItem item = (CTabItem) event.item;
if(item != null && ! item.isDisposed() && ! folder.isDisposed()) {
try {
((CTabFolder)folder).setSelection(item);
Control control = item.getControl();
if (control != null) {
control.setVisible(true);
control.setFocus();
}
} catch(Throwable e) {
Debug.printStackTrace( e );
//Do nothing
}
}
}
if (iconBar != null)
iconBar.setCurrentEnabler(MainWindow.this);
}
});
}
};
if(!useCustomTab) {
((TabFolder)folder).addSelectionListener(selectionAdapter);
} else {
try {
((CTabFolder)folder).setMinimumCharacters( 75 );
} catch (Exception e) {
Logger.log(new LogEvent(LOGID, "Can't set MIN_TAB_WIDTH", e));
}
//try {
/// TabFolder2ListenerAdder.add((CTabFolder)folder);
//} catch (NoClassDefFoundError e) {
((CTabFolder)folder).addCTabFolderListener(new CTabFolderAdapter() {
public void itemClosed(CTabFolderEvent event) {
if (!event.doit) {
return;
}
Tab.closed((CTabItem) event.item);
event.doit = true;
((CTabItem) event.item).dispose();
}
});
//}
((CTabFolder)folder).addSelectionListener(selectionAdapter);
try {
((CTabFolder)folder).setSelectionBackground(
new Color[] {display.getSystemColor(SWT.COLOR_LIST_BACKGROUND),
display.getSystemColor(SWT.COLOR_LIST_BACKGROUND),
display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND) },
new int[] {10, 90}, true);
} catch (NoSuchMethodError e) {
/** < SWT 3.0M8 **/
((CTabFolder)folder).setSelectionBackground(new Color[] {display.getSystemColor(SWT.COLOR_LIST_BACKGROUND) },
new int[0]);
}
((CTabFolder)folder).setSelectionForeground(display.getSystemColor(SWT.COLOR_LIST_FOREGROUND));
try {
/* Pre 3.0M8 doesn't have Simple-mode (it's always simple mode)
in 3.0M9, it was called setSimpleTab(boolean)
in 3.0RC1, it's called setSimple(boolean)
Prepare for the future, and use setSimple()
*/
((CTabFolder)folder).setSimple(!COConfigurationManager.getBooleanParameter("GUI_SWT_bFancyTab"));
} catch (NoSuchMethodError e) {
/** < SWT 3.0RC1 **/
}
}
if (Logger.isEnabled())
Logger.log(new LogEvent(LOGID, "Initializing GUI complete"));
globalManager.addListener(this);
azureus_core.getPluginManager().firePluginEvent(
PluginEvent.PEV_CONFIGURATION_WIZARD_STARTS);
if (!COConfigurationManager
.getBooleanParameter("Wizard Completed")) {
ConfigureWizard wizard = new ConfigureWizard(getAzureusCore(), display);
wizard.addListener(new WizardListener() {
public void closed() {
azureus_core.getPluginManager().firePluginEvent(
PluginEvent.PEV_CONFIGURATION_WIZARD_COMPLETES);
}
});
} else {
azureus_core.getPluginManager().firePluginEvent(
PluginEvent.PEV_CONFIGURATION_WIZARD_COMPLETES);
}
// attach the UI to plugins
// Must be done before initializing views, since plugins may register
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -