mainwindow.java
来自「Azureus is a powerful, full-featured, cr」· Java 代码 · 共 1,776 行 · 第 1/4 页
JAVA
1,776 行
/*
* Created on Jun 25, 2003
* Modified Apr 13, 2004 by Alon Rohter
* Modified Apr 17, 2004 by Olivier Chalouhi (OSX system menu)
* Copyright (C) 2004 Aelitis, All Rights Reserved.
*
*/
package org.gudy.azureus2.ui.swt.mainwindow;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Iterator;
import java.util.StringTokenizer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabFolderAdapter;
import org.eclipse.swt.custom.CTabFolderEvent;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetAdapter;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.ProgressBar;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import com.aelitis.azureus.core.*;
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.*;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.logging.LGLogger;
import org.gudy.azureus2.core3.security.SESecurityManager;
import org.gudy.azureus2.core3.util.*;
import org.gudy.azureus2.plugins.*;
import org.gudy.azureus2.plugins.update.UpdateCheckInstance;
import org.gudy.azureus2.plugins.update.UpdateCheckInstanceListener;
import org.gudy.azureus2.plugins.update.UpdateChecker;
import org.gudy.azureus2.plugins.update.UpdateCheckerListener;
import org.gudy.azureus2.plugins.update.UpdateManagerListener;
import org.gudy.azureus2.ui.swt.config.wizard.ConfigureWizard;
import org.gudy.azureus2.ui.swt.donations.DonationWindow2;
import org.gudy.azureus2.ui.swt.wizard.WizardListener;
import org.gudy.azureus2.ui.swt.maketorrent.NewTorrentWizard;
import org.gudy.azureus2.ui.swt.BlockedIpsWindow;
import org.gudy.azureus2.ui.swt.IconBar;
import org.gudy.azureus2.ui.swt.IconBarEnabler;
import org.gudy.azureus2.ui.swt.ImageRepository;
import org.gudy.azureus2.ui.swt.Messages;
import org.gudy.azureus2.ui.swt.MinimizedWindow;
import org.gudy.azureus2.ui.swt.PasswordWindow;
import org.gudy.azureus2.ui.swt.Tab;
import org.gudy.azureus2.ui.swt.TrayWindow;
import org.gudy.azureus2.ui.swt.URLTransfer;
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.systray.SystemTraySWT;
import org.gudy.azureus2.ui.swt.sharing.progress.*;
import org.gudy.azureus2.ui.swt.update.*;
/**
* @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, AzureusCoreListener {
private static MainWindow window;
private Initializer initializer;
private GUIUpdater updater;
private AzureusCore azureus_core;
//Package visibility for GUIUpdater
GlobalManager globalManager;
//NICO handle swt on macosx
public static boolean isAlreadyDead = false;
public static boolean isDisposeFromListener = false;
private Display display;
private Shell mainWindow;
private MainMenu mainMenu;
private IconBar iconBar;
private boolean useCustomTab;
private Composite folder;
private UpdateWindow updateWindow;
private Composite statusArea;
StackLayout layoutStatusAera;
private CLabel statusText;
private String statusTextKey = "";
private Composite statusUpdate;
private Label statusUpdateLabel;
private ProgressBar statusUpdateProgressBar;
//Package visibility for GUIUpdater
CLabel ipBlocked;
CLabel statusDown;
CLabel statusUp;
private TrayWindow tray;
SystemTraySWT systemTraySWT;
private HashMap downloadViews;
private AEMonitor downloadViews_mon = new AEMonitor( "MainWindow:dlviews" );
HashMap downloadBars;
AEMonitor downloadBars_mon = new AEMonitor( "MainWindow:dlbars" );
private Tab mytorrents;
private Tab my_tracker_tab;
private Tab my_shares_tab;
private Tab stats_tab;
private Tab console;
private Tab config;
private ArrayList update_stack = new ArrayList();
protected AEMonitor this_mon = new AEMonitor( "MainWindow" );
public
MainWindow(
AzureusCore _azureus_core,
Initializer _initializer)
{
try{
LGLogger.log("MainWindow start");
azureus_core = _azureus_core;
globalManager = azureus_core.getGlobalManager();
initializer = _initializer;
display = SWTThread.getInstance().getDisplay();
window = this;
initializer.addListener(this);
display.syncExec(this);
}catch( AzureusCoreException e ){
Debug.printStackTrace( e );
}
}
public void runSupport() {
try{
useCustomTab = COConfigurationManager.getBooleanParameter("useCustomTab");
COConfigurationManager.addParameterListener( "config.style.useSIUnits", this );
mytorrents = null;
my_tracker_tab = null;
console = null;
config = null;
downloadViews = new HashMap();
downloadBars = new HashMap();
//The Main Window
mainWindow = new Shell(display, SWT.RESIZE | SWT.BORDER | SWT.CLOSE | SWT.MAX | SWT.MIN);
mainWindow.setText("Azureus"); //$NON-NLS-1$
if(Constants.isOSX) {
//Do nothing in fact, windows don't need images on OS X
} else {
mainWindow.setImages(new Image[] {
ImageRepository.getImage("azureus"),
ImageRepository.getImage("azureus32"),
ImageRepository.getImage("azureus64"),
ImageRepository.getImage("azureus128"),
}); //$NON-NLS-1$
}
//The Torrent Opener
TorrentOpener.init(mainWindow,globalManager);
mainMenu = new MainMenu(this);
mainMenu.
buildMenu(MessageText.getLocales());
createDropTarget(mainWindow);
FormLayout mainLayout = new FormLayout();
FormData formData;
mainLayout.marginHeight = 0;
mainLayout.marginWidth = 0;
try {
mainLayout.spacing = 0;
} catch (NoSuchFieldError e) { /* Pre SWT 3.0 */ }
mainWindow.setLayout(mainLayout);
Label separator = new Label(mainWindow,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);
this.iconBar = new IconBar(mainWindow);
this.iconBar.setCurrentEnabler(this);
formData = new FormData();
formData.top = new FormAttachment(separator);
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
this.iconBar.setLayoutData(formData);
separator = new Label(mainWindow,SWT.SEPARATOR | SWT.HORIZONTAL);
formData = new FormData();
formData.top = new FormAttachment(iconBar.getCoolBar());
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);
if(!useCustomTab) {
folder = new TabFolder(mainWindow, SWT.V_SCROLL);
} else {
folder = new CTabFolder(mainWindow, SWT.CLOSE | SWT.FLAT);
}
Tab.setFolder(folder);
SelectionAdapter selectionAdapter = new SelectionAdapter() {
public void widgetSelected(final SelectionEvent event) {
if(display != null && ! display.isDisposed())
display.asyncExec(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
}
}
}
iconBar.setCurrentEnabler(MainWindow.this);
}
});
}
};
if(!useCustomTab) {
Tab.addTabKeyListenerToComposite(folder);
((TabFolder)folder).addSelectionListener(selectionAdapter);
} else {
try {
((CTabFolder)folder).MIN_TAB_WIDTH = 75;
} catch (Exception e) {
LGLogger.log(LGLogger.ERROR, "Can't set MIN_TAB_WIDTH");
Debug.printStackTrace( e );
}
//try {
/// TabFolder2ListenerAdder.add((CTabFolder)folder);
//} catch (NoClassDefFoundError e) {
((CTabFolder)folder).addCTabFolderListener(new CTabFolderAdapter() {
public void itemClosed(CTabFolderEvent event) {
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),
folder.getBackground() },
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 **/
}
}
Composite statusBar = new Composite(mainWindow, SWT.SHADOW_IN);
formData = new FormData();
formData.bottom = new FormAttachment(100, 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
statusBar.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(separator);
formData.bottom = new FormAttachment(statusBar);
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);
GridLayout layout_status = new GridLayout();
layout_status.numColumns = 4;
layout_status.horizontalSpacing = 1;
layout_status.verticalSpacing = 0;
layout_status.marginHeight = 0;
layout_status.marginWidth = 0;
statusBar.setLayout(layout_status);
GridData gridData;
gridData = new GridData(GridData.FILL_HORIZONTAL);
//Composite with StackLayout
statusArea = new Composite(statusBar, SWT.NULL);
statusArea.setLayoutData(gridData);
layoutStatusAera = new StackLayout();
statusArea.setLayout(layoutStatusAera);
//Either the Status Text
statusText = new CLabel(statusArea, SWT.SHADOW_IN);
int height = statusText.computeSize(150,SWT.DEFAULT).y;
Listener listener = new Listener() {
public void handleEvent(Event e) {
if(updateWindow != null) {
updateWindow.show();
}
}
};
statusText.addListener(SWT.MouseUp,listener);
statusText.addListener(SWT.MouseDoubleClick,listener);
//Or a composite with a label, a progressBar and a button
statusUpdate = new Composite(statusArea, SWT.NULL);
statusUpdate.setSize(SWT.DEFAULT,height);
FormLayout layoutStatusUpdate = new FormLayout();
layoutStatusUpdate.marginHeight = 0;
layoutStatusUpdate.marginWidth = 0;
try {
layoutStatusUpdate.spacing = 5;
} catch (NoSuchFieldError e) { /* Pre SWT 3.0 */ }
statusUpdate.setLayout(layoutStatusUpdate);
statusUpdateLabel = new Label(statusUpdate,SWT.NULL);
Messages.setLanguageText(statusUpdateLabel, "MainWindow.statusText.checking");
Messages.setLanguageText(statusUpdateLabel,"MainWindow.status.update.tooltip");
statusUpdateLabel.addMouseListener(new MouseAdapter() {
public void mouseDoubleClick(MouseEvent arg0) {
showUpdateProgressWindow();
}
});
statusUpdateProgressBar = new ProgressBar(statusUpdate,SWT.HORIZONTAL);
Messages.setLanguageText(statusUpdateProgressBar,"MainWindow.status.update.tooltip");
statusUpdateProgressBar.addMouseListener(new MouseAdapter() {
public void mouseDoubleClick(MouseEvent arg0) {
showUpdateProgressWindow();
}
});
/*statusUpdateButton = new Button(statusUpdate,SWT.PUSH);
Messages.setLanguageText(statusUpdateButton,"Button.cancel");*/
int ctrlHeight,top;
formData = new FormData();
formData.left = new FormAttachment(0, 0);
ctrlHeight = statusUpdateLabel.computeSize(100,SWT.DEFAULT).y;
top = (height - ctrlHeight) / 2;
formData.top = new FormAttachment(0,top);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?