📄 utils.java
字号:
if (event.data instanceof URLTransfer.URLType) {
if (((URLTransfer.URLType) event.data).linkURL != null)
url.setText(((URLTransfer.URLType) event.data).linkURL);
} else if (event.data instanceof String) {
String sURL = UrlUtils.parseTextForURL((String) event.data, true);
if (sURL != null) {
url.setText(sURL);
}
}
}
}
}
/**
* Force label to use more vertical space if wrapped and in a GridLayout
* Place this listener on the _parent_ of the label
* See Eclipse SWT Bug #9866 (GridLayout does not handle wrapped Label properly)
* This workaround only works for labels who:
* - horizontally span their whole parent
* (ie. the parent has 3 columns, the label must span 3 columns)
* - GridData style has GridData.FILL_HORIZONTAL
* - Label style has SWT.WRAP
*
* @author TuxPaper
* @note Bug 9866 fixed in 3105 and later
*/
public static class LabelWrapControlListener extends ControlAdapter{
public void controlResized(ControlEvent e){
if (SWT.getVersion() >= 3105)
return;
Composite parent = (Composite)e.widget;
Control children[] = parent.getChildren();
if (children.length > 0) {
GridLayout parentLayout = (GridLayout)parent.getLayout();
if (parentLayout != null) {
Point size;
int marginWidth = parentLayout.marginWidth;
Composite grandParent = parent.getParent();
if (grandParent instanceof ScrolledComposite) {
Composite greatGP = grandParent.getParent();
if (greatGP != null) {
size = greatGP.getSize();
if (greatGP.getLayout() instanceof GridLayout) {
marginWidth += ((GridLayout)greatGP.getLayout()).marginWidth;
}
} else {
// not tested
size = grandParent.getSize();
}
if (grandParent.getLayout() instanceof GridLayout) {
marginWidth += ((GridLayout)grandParent.getLayout()).marginWidth;
}
ScrollBar sb = grandParent.getVerticalBar();
if (sb != null) {
// I don't know why, but we have to remove one
size.x -= sb.getSize().x + 1;
}
} else
size = parent.getSize();
boolean oneChanged = false;
for (int i = 0; i < children.length; i++) {
if ((children[i] instanceof Label) &&
(children[i].getStyle() & SWT.WRAP) == SWT.WRAP) {
GridData gd = (GridData)children[i].getLayoutData();
if (gd != null &&
gd.horizontalAlignment == GridData.FILL) {
if (gd.horizontalSpan == parentLayout.numColumns) {
gd.widthHint = size.x - 2 * marginWidth;
oneChanged = true;
} else {
Point pt = children[i].getLocation();
gd.widthHint = size.x - pt.x - (2 * marginWidth);
oneChanged = true;
}
}
}
}
if (oneChanged) {
parent.layout(true);
if (grandParent instanceof ScrolledComposite) {
((ScrolledComposite)grandParent).setMinSize(parent.computeSize(SWT.DEFAULT, SWT.DEFAULT, true));
}
}
}
} // size
} // controlResized
} // class
public static void alternateRowBackground(TableItem item) {
if (Utils.TABLE_GRIDLINE_IS_ALTERNATING_COLOR) {
if (!item.getParent().getLinesVisible())
item.getParent().setLinesVisible(true);
return;
}
if (item == null || item.isDisposed())
return;
Color[] colors = { item.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND),
Colors.colorAltRow };
Color newColor = colors[ item.getParent().indexOf(item) % colors.length];
if (!item.getBackground().equals(newColor)) {
item.setBackground(newColor);
}
}
public static void alternateTableBackground(Table table) {
if (table == null || table.isDisposed())
return;
if (Utils.TABLE_GRIDLINE_IS_ALTERNATING_COLOR) {
if (!table.getLinesVisible())
table.setLinesVisible(true);
return;
}
int iTopIndex = table.getTopIndex();
int iBottomIndex = getTableBottomIndex(table, iTopIndex);
Color[] colors = { table.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND),
Colors.colorAltRow };
int iFixedIndex = iTopIndex;
for (int i = iTopIndex; i <= iBottomIndex; i++) {
TableItem row = table.getItem(i);
// Rows can be disposed!
if (!row.isDisposed()) {
Color newColor = colors[iFixedIndex % colors.length];
iFixedIndex++;
if (!row.getBackground().equals(newColor)) {
// System.out.println("setting "+rows[i].getBackground() +" to " + newColor);
row.setBackground(newColor);
}
}
}
}
/**
* <p>
* Set a MenuItem's image with the given ImageRepository key. In compliance with platform
* human interface guidelines, the images are not set under Mac OS X.
* </p>
* @param item SWT MenuItem
* @param repoKey ImageRepository image key
* @see <a href="http://developer.apple.com/documentation/UserExperience/Conceptual/OSXHIGuidelines/XHIGMenus/chapter_7_section_3.html#//apple_ref/doc/uid/TP30000356/TPXREF116">Apple HIG</a>
*/
public static void setMenuItemImage(final MenuItem item, final String repoKey)
{
if(!Constants.isOSX)
item.setImage(ImageRepository.getImage(repoKey));
}
public static void setMenuItemImage(final MenuItem item, final Image image)
{
if(!Constants.isOSX)
item.setImage(image);
}
/**
* Sets the shell's Icon(s) to the default Azureus icon. OSX doesn't require
* an icon, so they are skipped
*
* @param shell
*/
public static void setShellIcon(Shell shell) {
final String[] sImageNames = { "azureus", "azureus32", "azureus64",
"azureus128" };
if (Constants.isOSX)
return;
try {
ArrayList list = new ArrayList();
Image[] images = new Image[] { ImageRepository.getImage("azureus"),
ImageRepository.getImage("azureus32"),
ImageRepository.getImage("azureus64"),
ImageRepository.getImage("azureus128") };
for (int i = 0; i < images.length; i++) {
Image image = ImageRepository.getImage(sImageNames[i]);
if (image != null)
list.add(image);
}
if (list.size() == 0)
return;
shell.setImages((Image[]) list.toArray(new Image[0]));
} catch (NoSuchMethodError e) {
// SWT < 3.0
Image image = ImageRepository.getImage(sImageNames[0]);
if (image != null)
shell.setImage(image);
}
}
/**
* Execute code in the Runnable object using SWT's thread. If current
* thread it already SWT's thread, the code will run immediately. If the
* current thread is not SWT's, code will be run either synchronously or
* asynchronously on SWT's thread at the next reasonable opportunity.
*
* This method does not catch any exceptions.
*
* @param code code to run
* @param async true if SWT asyncExec, false if SWT syncExec
* @return success
*/
public static boolean execSWTThread(Runnable code,
boolean async) {
SWTThread swt = SWTThread.getInstance();
Display display;
if (swt == null) {
display = Display.getDefault();
if (display == null) {
System.err.println("SWT Thread not started yet!");
return false;
}
} else {
if (swt.isTerminated()) {
return false;
}
display = swt.getDisplay();
}
if (display == null || display.isDisposed() || code == null)
return false;
if (display.getThread() == Thread.currentThread()) {
code.run();
} else if (async) {
try {
display.asyncExec(code);
} catch (NullPointerException e) {
// If the display is being disposed of, asyncExec may give a null
// pointer error
return false;
}
} else {
display.syncExec(code);
}
return true;
}
/**
* Execute code in the Runnable object using SWT's thread. If current
* thread it already SWT's thread, the code will run immediately. If the
* current thread is not SWT's, code will be run asynchronously on SWT's
* thread at the next reasonable opportunity.
*
* This method does not catch any exceptions.
*
* @param code code to run
* @return success
*/
public static boolean execSWTThread(Runnable code) {
return execSWTThread(code, true);
}
public static boolean isThisThreadSWT() {
SWTThread swt = SWTThread.getInstance();
if (swt == null) {
System.err.println("SWT Thread not started yet");
return false;
}
Display display = swt.getDisplay();
if (display == null || display.isDisposed())
return false;
return (display.getThread() == Thread.currentThread());
}
/** Open a messagebox using resource keys for title/text
*
* @param parent Parent shell for messagebox
* @param style SWT styles for messagebox
* @param keyPrefix message bundle key prefix used to get title and text.
* Title will be keyPrefix + ".title", and text will be set to
* keyPrefix + ".text"
* @param textParams any parameters for text
*
* @return what the messagebox returns
*/
public static int openMessageBox(Shell parent, int style, String keyPrefix,
String[] textParams) {
MessageBox mb = new MessageBox(parent, style);
mb.setMessage(MessageText.getString(keyPrefix + ".text", textParams));
mb.setText(MessageText.getString(keyPrefix + ".title"));
return mb.open();
}
/** Open a messagebox with actual title and text
*
* @param parent
* @param style
* @param title
* @param text
* @return
*/
public static int openMessageBox(Shell parent, int style, String title,
String text) {
MessageBox mb = new MessageBox(parent, style);
mb.setMessage(text);
mb.setText(title);
return mb.open();
}
/**
* Bottom Index may be negative
*/
public static int getTableBottomIndex(Table table, int iTopIndex) {
// on Linux, getItemHeight is slow AND WRONG. so is getItem(x).getBounds().y
// getItem(Point) is slow on OSX
int itemCount = table.getItemCount();
if (!table.isVisible() || iTopIndex >= itemCount)
return -1;
if (Constants.isOSX) {
try {
TableItem item = table.getItem(iTopIndex);
Rectangle bounds = item.getBounds();
Rectangle clientArea = table.getClientArea();
int itemHeight = table.getItemHeight();
int iBottomIndex = Math.min(iTopIndex
+ (clientArea.height + clientArea.y - bounds.y - 1) / itemHeight,
itemCount - 1);
// System.out.println(bounds + ";" + clientArea + ";" + itemHeight + ";bi="
// + iBottomIndex + ";ti=" + iTopIndex + ";"
// + (clientArea.height + clientArea.y - bounds.y - 1));
return iBottomIndex;
} catch (NoSuchMethodError e) {
// item.getBounds is 3.2
return Math.min(iTopIndex
+ ((table.getClientArea().height - table.getHeaderHeight() - 1) /
table.getItemHeight()) + 1, table.getItemCount() - 1);
}
}
// getItem will return null if clientArea's height is smaller than
// header height.
int areaHeight = table.getClientArea().height;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -