📄 utils.java
字号:
/*
* File : Utils.java
* Created : 25 sept. 2003 16:15:07
* By : Olivier
*
* Azureus - a Java Bittorrent client
*
* 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.
*
* 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 ( see the LICENSE file ).
*
* 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 org.gudy.azureus2.ui.swt;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.dnd.*;
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.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.program.Program;
import org.eclipse.swt.widgets.*;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.util.AERunnable;
import org.gudy.azureus2.core3.util.Constants;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.core3.util.UrlUtils;
import org.gudy.azureus2.ui.swt.mainwindow.Colors;
import org.gudy.azureus2.ui.swt.mainwindow.SWTThread;
import org.gudy.azureus2.ui.swt.mainwindow.TorrentOpener;
import org.gudy.azureus2.ui.swt.views.utils.VerticalAligner;
import com.aelitis.azureus.core.impl.AzureusCoreImpl;
import com.aelitis.azureus.ui.swt.UIFunctionsManagerSWT;
import com.aelitis.azureus.ui.swt.UIFunctionsSWT;
/**
* @author Olivier
*
*/
public class Utils {
public static final boolean isGTK = SWT.getPlatform().equals("gtk");
/** Some platforms expand the last column to fit the remaining width of
* the table.
*/
public static final boolean LAST_TABLECOLUMN_EXPANDS = isGTK;
/** GTK already handles alternating background for tables */
public static final boolean TABLE_GRIDLINE_IS_ALTERNATING_COLOR = isGTK;
private static final boolean DIRECT_SETCHECKED = !Constants.isOSX
|| SWT.getVersion() >= 3212;
public static final boolean SWT32_TABLEPAINT = false; //SWT.getVersion() >= 3200;
public static void disposeComposite(Composite composite,boolean disposeSelf) {
if(composite == null || composite.isDisposed())
return;
Control[] controls = composite.getChildren();
for(int i = 0 ; i < controls.length ; i++) {
Control control = controls[i];
if(control != null && ! control.isDisposed()) {
if(control instanceof Composite) {
disposeComposite((Composite) control,true);
}
try {
control.dispose();
} catch (SWTException e) {
Debug.printStackTrace( e );
}
}
}
// It's possible that the composite was destroyed by the child
if (!composite.isDisposed() && disposeSelf)
try {
composite.dispose();
} catch (SWTException e) {
Debug.printStackTrace( e );
}
}
public static void disposeComposite(Composite composite) {
disposeComposite(composite,true);
}
/**
* Dispose of a list of SWT objects
*
* @param disposeList
*/
public static void disposeSWTObjects(List disposeList) {
disposeSWTObjects(disposeList.toArray());
disposeList.clear();
}
public static void disposeSWTObjects(Object[] disposeList) {
boolean bResourceObjectExists = SWT.getVersion() >= 3129;
for (int i = 0; i < disposeList.length; i++) {
Object o = disposeList[i];
if (o instanceof Widget && !((Widget) o).isDisposed())
((Widget) o).dispose();
else if (bResourceObjectExists && (o instanceof Resource)
&& !((Resource) o).isDisposed())
((Resource) o).dispose();
else {
try {
// For Pre-SWT 3.1
if ((o instanceof Cursor) && !((Cursor)o).isDisposed()) {
((Cursor)o).dispose();
} else if ((o instanceof Font) && !((Font)o).isDisposed()) {
((Font)o).dispose();
} else if ((o instanceof GC) && !((GC)o).isDisposed()) {
((GC)o).dispose();
} else if ((o instanceof Image) && !((Image)o).isDisposed()) {
((Image)o).dispose();
} else if ((o instanceof Region) && !((Region)o).isDisposed()) {
((Region)o).dispose(); // 3.0
} else if ((o instanceof TextLayout) && !((TextLayout)o).isDisposed()) {
((TextLayout) o).dispose(); // 3.0
}
} catch (NoClassDefFoundError e) {
// ignore
}
// Path, Pattern, Transform are all 3.1, which will be instances of
// Resource
}
}
}
/**
* Initializes the URL dialog with http://
* If a valid link is found in the clipboard, it will be inserted
* and the size (and location) of the dialog is adjusted.
* @param shell to set the dialog location if needed
* @param url the URL text control
* @param accept_magnets
*
* @author Rene Leonhardt
*/
public static void
setTextLinkFromClipboard(
final Shell shell, final Text url, boolean accept_magnets ) {
String link = getLinkFromClipboard(shell.getDisplay(),accept_magnets);
if (link != null)
url.setText(link);
}
/**
* <p>Gets an URL from the clipboard if a valid URL for downloading has been copied.</p>
* <p>The supported protocols currently are http, https, and magnet.</p>
* @param display
* @param accept_magnets
* @return first valid link from clipboard, else "http://"
*/
public static String
getLinkFromClipboard(
Display display,
boolean accept_magnets )
{
final Clipboard cb = new Clipboard(display);
final TextTransfer transfer = TextTransfer.getInstance();
String data = (String)cb.getContents(transfer);
String text = UrlUtils.parseTextForURL(data, accept_magnets);
if (text == null) {
return "http://";
}
return text;
}
public static void centreWindow(Shell shell) {
Rectangle displayArea; // area to center in
try {
displayArea = shell.getMonitor().getClientArea();
} catch (NoSuchMethodError e) {
displayArea = shell.getDisplay().getClientArea();
}
Rectangle shellRect = shell.getBounds();
if (shellRect.height > displayArea.height) {
shellRect.height = displayArea.height;
}
if (shellRect.width > displayArea.width - 50) {
shellRect.width = displayArea.width;
}
shellRect.x = displayArea.x
+ (displayArea.width - shellRect.width) / 2;
shellRect.y = displayArea.y
+ (displayArea.height - shellRect.height) / 2;
shell.setBounds(shellRect);
}
/**
* Centers a window relative to a control. That is to say, the window will be located at the center of the control.
* @param window
* @param control
*/
public static void centerWindowRelativeTo(final Shell window, final Control control)
{
final Rectangle bounds = control.getBounds();
final Point shellSize = window.getSize();
window.setLocation(
bounds.x + (bounds.width / 2) - shellSize.x / 2,
bounds.y + (bounds.height / 2) - shellSize.y / 2
);
}
public static void createTorrentDropTarget(Composite composite,
boolean bAllowShareAdd) {
try {
createDropTarget(composite, bAllowShareAdd, null);
} catch (Exception e) {
Debug.out(e);
}
}
/**
* @param control the control (usually a Shell) to add the DropTarget
* @param url the Text control where to set the link text
*
* @author Rene Leonhardt
*/
public static void createURLDropTarget(Composite composite,
Text url) {
try {
createDropTarget(composite, false, url);
} catch (Exception e) {
Debug.out(e);
}
}
private static void createDropTarget(Composite composite,
final boolean bAllowShareAdd, final Text url,
DropTargetListener dropTargetListener) {
Transfer[] transferList;
if (SWT.getVersion() >= 3107) {
transferList = new Transfer[] { HTMLTransfer.getInstance(),
URLTransfer.getInstance(), FileTransfer.getInstance(),
TextTransfer.getInstance() };
} else {
transferList = new Transfer[] { URLTransfer.getInstance(),
FileTransfer.getInstance(), TextTransfer.getInstance() };
}
final DropTarget dropTarget = new DropTarget(composite, DND.DROP_DEFAULT
| DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK | DND.DROP_TARGET_MOVE);
dropTarget.setTransfer(transferList);
dropTarget.addDropListener(dropTargetListener);
composite.addListener(SWT.Dispose, new Listener() {
public void handleEvent(Event event) {
if (dropTarget != null && !dropTarget.isDisposed())
dropTarget.dispose();
}
});
// On Windows, dropping on children moves up to parent
// On OSX, each child needs it's own drop.
if (Constants.isWindows)
return;
Control[] children = composite.getChildren();
for (int i = 0; i < children.length; i++) {
Control control = children[i];
if (!control.isDisposed()) {
if (control instanceof Composite) {
createDropTarget((Composite) control, bAllowShareAdd, url,
dropTargetListener);
} else {
final DropTarget dropTarget2 = new DropTarget(control,
DND.DROP_DEFAULT | DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK
| DND.DROP_TARGET_MOVE);
dropTarget2.setTransfer(transferList);
dropTarget2.addDropListener(dropTargetListener);
control.addListener(SWT.Dispose, new Listener() {
public void handleEvent(Event event) {
if (dropTarget2 != null && !dropTarget2.isDisposed())
dropTarget2.dispose();
}
});
}
}
}
}
private static void createDropTarget(Composite composite,
boolean bAllowShareAdd, Text url) {
URLDropTarget target = new URLDropTarget(url, bAllowShareAdd);
createDropTarget(composite, bAllowShareAdd, url, target);
}
private static class URLDropTarget extends DropTargetAdapter {
private final Text url;
private final boolean bAllowShareAdd;
public URLDropTarget(Text url, boolean bAllowShareAdd) {
this.url = url;
this.bAllowShareAdd = bAllowShareAdd;
}
public void dropAccept(DropTargetEvent event) {
event.currentDataType = URLTransfer.pickBestType(event.dataTypes,
event.currentDataType);
}
public void dragOver(DropTargetEvent event) {
// skip setting detail if user is forcing a drop type (ex. via the
// ctrl key), providing that the operation is valid
if (event.detail != DND.DROP_DEFAULT
&& ((event.operations & event.detail) > 0))
return;
if ((event.operations & DND.DROP_LINK) > 0)
event.detail = DND.DROP_LINK;
else if ((event.operations & DND.DROP_DEFAULT) > 0)
event.detail = DND.DROP_DEFAULT;
else if ((event.operations & DND.DROP_COPY) > 0)
event.detail = DND.DROP_COPY;
}
public void drop(DropTargetEvent event) {
if (url == null || url.isDisposed()) {
TorrentOpener.openDroppedTorrents(AzureusCoreImpl.getSingleton(),
event, bAllowShareAdd);
} else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -