📄 utils.java
字号:
if (areaHeight <= table.getHeaderHeight())
return -1;
// 2 offset to be on the safe side
TableItem bottomItem = table.getItem(new Point(2,
table.getClientArea().height - 1));
int iBottomIndex = (bottomItem != null) ? table.indexOf(bottomItem) :
itemCount - 1;
return iBottomIndex;
}
public static void launch(String sFile) {
if (sFile == null) {
return;
}
if (SWT.getVersion() >= 3315 || SWT.getVersion() < 3300
|| UrlUtils.isURL(sFile) || sFile.startsWith("mailto:")) {
Program.launch(sFile);
} else {
if (Constants.isOSX) {
Program.launch("file://" + sFile.replaceAll(" ", "%20"));
} else {
Program.launch(sFile);
}
}
}
/**
* Sets the checkbox in a Virtual Table while inside a SWT.SetData listener
* trigger. SWT 3.1 has an OSX bug that needs working around.
*
* @param item
* @param checked
*/
public static void setCheckedInSetData(final TableItem item,
final boolean checked) {
if (DIRECT_SETCHECKED) {
item.setChecked(checked);
} else {
item.setChecked(!checked);
item.getDisplay().asyncExec(new AERunnable() {
public void runSupport() {
item.setChecked(checked);
}
});
}
if (Constants.isWindowsXP || isGTK) {
Rectangle r = item.getBounds(0);
Table table = item.getParent();
Rectangle rTable = table.getClientArea();
r.y += VerticalAligner.getTableAdjustVerticalBy(table);
table.redraw(0, r.y, rTable.width, r.height, true);
}
}
public static boolean linkShellMetricsToConfig(final Shell shell,
final String sConfigPrefix) {
String windowRectangle = COConfigurationManager.getStringParameter(
sConfigPrefix + ".rectangle", null);
boolean bDidResize = false;
if (null != windowRectangle) {
int i = 0;
int[] values = new int[4];
StringTokenizer st = new StringTokenizer(windowRectangle, ",");
try {
while (st.hasMoreTokens() && i < 4) {
values[i++] = Integer.valueOf(st.nextToken()).intValue();
}
if (i == 4) {
Rectangle shellBounds = new Rectangle(values[0], values[1],
values[2], values[3]);
shell.setBounds(shellBounds);
verifyShellRect(shell, true);
bDidResize = true;
}
} catch (Exception e) {
}
}
boolean isMaximized = COConfigurationManager.getBooleanParameter(
sConfigPrefix + ".maximized", false);
shell.setMaximized(isMaximized);
new ShellMetricsResizeListener(shell, sConfigPrefix);
return bDidResize;
}
private static class ShellMetricsResizeListener implements Listener {
private int state = -1;
private String sConfigPrefix;
private Rectangle bounds = null;
ShellMetricsResizeListener(Shell shell, String sConfigPrefix) {
this.sConfigPrefix = sConfigPrefix;
state = calcState(shell);
if (state == SWT.NONE)
bounds = shell.getBounds();
shell.addListener(SWT.Resize, this);
shell.addListener(SWT.Move, this);
shell.addListener(SWT.Dispose, this);
}
private int calcState(Shell shell) {
return shell.getMinimized() ? SWT.MIN : shell.getMaximized() ? SWT.MAX
: SWT.NONE;
}
private void saveMetrics() {
COConfigurationManager.setParameter(sConfigPrefix + ".maximized",
state == SWT.MAX);
if (bounds == null)
return;
COConfigurationManager.setParameter(sConfigPrefix + ".rectangle",
bounds.x + "," + bounds.y + "," + bounds.width + "," + bounds.height);
}
public void handleEvent(Event event) {
Shell shell = (Shell) event.widget;
state = calcState(shell);
if (event.type != SWT.Dispose && state == SWT.NONE)
bounds = shell.getBounds();
if (event.type == SWT.Dispose)
saveMetrics();
}
}
public static GridData setGridData(Composite composite, int gridStyle,
Control ctrlBestSize, int maxHeight) {
GridData gridData = new GridData(gridStyle);
gridData.heightHint = ctrlBestSize.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
if (gridData.heightHint > maxHeight && maxHeight > 0)
gridData.heightHint = maxHeight;
composite.setLayoutData(gridData);
return gridData;
}
public static FormData getFilledFormData() {
FormData formData = new FormData();
formData.top = new FormAttachment(0, 0);
formData.left = new FormAttachment(0, 0);
formData.right = new FormAttachment(100, 0);
formData.bottom = new FormAttachment(100, 0);
return formData;
}
public static int pixelsToPoint(int pixels, int dpi) {
int ret = (int) Math.round((pixels * 72.0) / dpi);
return isGTK ? ret - 2 : ret;
}
public static int pixelsToPoint(double pixels, int dpi) {
int ret = (int) Math.round((pixels * 72.0) / dpi);
return isGTK ? ret - 2 : ret;
}
public static boolean drawImage(GC gc, Image image, Rectangle dstRect,
Rectangle clipping, int hOffset, int vOffset, boolean clearArea)
{
return drawImage(gc, image, new Point(0, 0), dstRect, clipping, hOffset,
vOffset, clearArea);
}
public static boolean drawImage(GC gc, Image image, Rectangle dstRect,
Rectangle clipping, int hOffset, int vOffset)
{
return drawImage(gc, image, new Point(0, 0), dstRect, clipping, hOffset,
vOffset, false);
}
public static boolean drawImage(GC gc, Image image, Point srcStart,
Rectangle dstRect, Rectangle clipping, int hOffset, int vOffset,
boolean clearArea)
{
Rectangle srcRect;
Point dstAdj;
if (clipping == null) {
dstAdj = new Point(0, 0);
srcRect = new Rectangle(srcStart.x, srcStart.y, dstRect.width,
dstRect.height);
} else {
if (!dstRect.intersects(clipping)) {
return false;
}
dstAdj = new Point(Math.max(0, clipping.x - dstRect.x), Math.max(0,
clipping.y - dstRect.y));
srcRect = new Rectangle(0, 0, 0, 0);
srcRect.x = srcStart.x + dstAdj.x;
srcRect.y = srcStart.y + dstAdj.y;
srcRect.width = Math.min(dstRect.width - dstAdj.x, clipping.x
+ clipping.width - dstRect.x);
srcRect.height = Math.min(dstRect.height - dstAdj.y, clipping.y
+ clipping.height - dstRect.y);
}
if (!srcRect.isEmpty()) {
try {
if (clearArea) {
gc.fillRectangle(dstRect.x + dstAdj.x + hOffset, dstRect.y + dstAdj.y
+ vOffset, srcRect.width, srcRect.height);
}
gc.drawImage(image, srcRect.x, srcRect.y, srcRect.width,
srcRect.height, dstRect.x + dstAdj.x + hOffset, dstRect.y
+ dstAdj.y + vOffset, srcRect.width, srcRect.height);
} catch (Exception e) {
System.out.println("drawImage: " + e.getMessage() + ": " + image + ", " + srcRect
+ ", " + (dstRect.x + dstAdj.y + hOffset) + ","
+ (dstRect.y + dstAdj.y + vOffset) + "," + srcRect.width + ","
+ srcRect.height + "; imageBounds = " + image.getBounds());
}
}
return true;
}
/**
* @param area
* @param event id
* @param listener
*/
public static void addListenerAndChildren(Composite area, int event,
Listener listener)
{
area.addListener(event, listener);
Control[] children = area.getChildren();
for (int i = 0; i < children.length; i++) {
Control child = children[i];
if (child instanceof Composite) {
addListenerAndChildren((Composite)child, event, listener);
} else {
child.addListener(event, listener);
}
}
}
public static Shell findAnyShell() {
// Pick the main shell if we can
UIFunctionsSWT uiFunctions = UIFunctionsManagerSWT.getUIFunctionsSWT();
if (uiFunctions != null) {
Shell shell = uiFunctions.getMainShell();
if (shell != null && shell.isDisposed()) {
return shell;
}
}
// Get active shell from current display if we can
Display current = Display.getCurrent();
if (current == null) {
return null;
}
Shell shell = current.getActiveShell();
if (shell != null && !shell.isDisposed()) {
return shell;
}
// Get first shell of current display if we can
Shell[] shells = current.getShells();
if (shells.length == 0) {
return null;
}
if (shells[0] != null && !shells[0].isDisposed()) {
return shells[0];
}
return null;
}
/**
* @param listener
*/
public static boolean verifyShellRect(Shell shell, boolean bAdjustIfInvalid) {
boolean bMetricsOk;
try {
bMetricsOk = false;
Point ptTopLeft = shell.getLocation();
Monitor[] monitors = shell.getDisplay().getMonitors();
for (int j = 0; j < monitors.length && !bMetricsOk; j++) {
Rectangle bounds = monitors[j].getBounds();
bMetricsOk = bounds.contains(ptTopLeft);
}
} catch (NoSuchMethodError e) {
Rectangle bounds = shell.getDisplay().getBounds();
bMetricsOk = shell.getBounds().intersects(bounds);
}
if (!bMetricsOk && bAdjustIfInvalid) {
centreWindow(shell);
}
return bMetricsOk;
}
/**
* Relayout all composites up from control until there's enough room for the
* control to fit
*
* @param control Control that had it's sized changed and needs more room
*/
public static void relayout(Control control) {
if (control == null || control.isDisposed()) {
return;
}
Point size = control.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
Composite parent = control.getParent();
while (parent != null) {
parent.layout(true);
parent = parent.getParent();
Point newSize = control.getSize();
if (newSize.y >= size.y && newSize.x >= size.x) {
break;
}
}
if (parent != null) {
parent.layout();
}
}
/**
*
*/
public static void beep() {
execSWTThread(new AERunnable() {
public void runSupport() {
Display display = Display.getDefault();
if (display != null) {
display.beep();
}
}
});
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -