📄 messageslideshell.java
字号:
} catch (Throwable t) {
// 3.0
Label linkLabel = new Label(cShell, SWT.WRAP);
gridData = new GridData(GridData.FILL_BOTH);
gridData.horizontalSpan = 3;
linkLabel.setLayoutData(gridData);
//<a href="http://atorre.s">test</A> and <a href="http://atorre.s">test2</A>
popupParams.text = Pattern.compile(REGEX_URLHTML,
Pattern.CASE_INSENSITIVE).matcher(popupParams.text).replaceAll(
"$2 ($1)");
if (sDetails == null) {
sDetails = popupParams.text;
} else {
sDetails = popupParams.text + "\n---------\n" + sDetails;
}
linkLabel.setForeground(display.getSystemColor(SWT.COLOR_BLACK));
linkLabel.setText(popupParams.text);
}
lblCloseIn = new Label(cShell, SWT.TRAIL);
lblCloseIn.setForeground(display.getSystemColor(SWT.COLOR_BLACK));
// Ensure computeSize computes for 2 lined label
lblCloseIn.setText("\n");
gridData = new GridData(SWT.FILL, SWT.TOP, true, false);
gridData.horizontalSpan = 3;
lblCloseIn.setLayoutData(gridData);
final Composite cButtons = new Composite(cShell, SWT.NULL);
GridLayout gridLayout = new GridLayout();
gridLayout.marginHeight = 0;
gridLayout.marginWidth = 0;
gridLayout.verticalSpacing = 0;
if (Constants.isOSX)
gridLayout.horizontalSpacing = 0;
gridLayout.numColumns = (idxHistory > 0) ? 3 : 2;
cButtons.setLayout(gridLayout);
gridData = new GridData(GridData.HORIZONTAL_ALIGN_END
| GridData.VERTICAL_ALIGN_CENTER);
gridData.horizontalSpan = 3;
cButtons.setLayoutData(gridData);
btnHideAll = new Button(cButtons, SWT.PUSH);
Messages.setLanguageText(btnHideAll, "popup.error.hideall");
btnHideAll.setVisible(false);
btnHideAll.setForeground(display.getSystemColor(SWT.COLOR_BLACK));
// XXX SWT.Selection doesn't work on latest GTK (2.8.17) & SWT3.2 for ON_TOP
btnHideAll.addListener(SWT.MouseUp, new Listener() {
public void handleEvent(Event arg0) {
cButtons.setEnabled(false);
shell.dispose();
}
});
if (idxHistory > 0) {
final Button btnPrev = new Button(cButtons, SWT.PUSH);
btnPrev.setForeground(display.getSystemColor(SWT.COLOR_BLACK));
btnPrev.setText(MessageText.getString("popup.previous", new String[] { ""
+ idxHistory }));
btnPrev.addListener(SWT.MouseUp, new Listener() {
public void handleEvent(Event arg0) {
disposeShell(shell);
int idx = historyList.indexOf(popupParams) - 1;
if (idx >= 0) {
PopupParams item = (PopupParams) historyList.get(idx);
showPopup(display, item, false);
disposeShell(shell);
}
}
});
}
btnNext = new Button(cButtons, SWT.PUSH);
btnNext.setForeground(display.getSystemColor(SWT.COLOR_BLACK));
int numAfter = historyList.size() - idxHistory - 1;
setButtonNextText(numAfter);
btnNext.addListener(SWT.MouseUp, new Listener() {
public void handleEvent(Event arg0) {
if (DEBUG)
System.out.println("Next Pressed");
if (idxHistory + 1 < historyList.size()) {
showPopup(display, (PopupParams) historyList.get(idxHistory + 1),
false);
}
disposeShell(shell);
}
});
// Image has gap for text at the top (with image at bottom left)
// trim top to height of shell
Point bestSize = cShell.computeSize(shellWidth, SWT.DEFAULT);
if (bestSize.y < SHELL_MIN_HEIGHT)
bestSize.y = SHELL_MIN_HEIGHT;
else if (bestSize.y > SHELL_MAX_HEIGHT) {
bestSize.y = SHELL_MAX_HEIGHT;
if (sDetails == null) {
sDetails = popupParams.text;
} else {
sDetails = popupParams.text + "\n===============\n" + sDetails;
}
}
if (imgPopup != null) {
// no text on the frog in the bottom left
int bottomHeight = cButtons.computeSize(SWT.DEFAULT, SWT.DEFAULT).y
+ lblCloseIn.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
if (bottomHeight < 50)
bestSize.y += 50 - bottomHeight;
final Image imgBackground = new Image(display, bestSize.x, bestSize.y);
disposeList.add(imgBackground);
GC gc = new GC(imgBackground);
int dstY = imgPopupBounds.height - bestSize.y;
if (dstY < 0)
dstY = 0;
gc.drawImage(imgPopup, 0, dstY, imgPopupBounds.width,
imgPopupBounds.height - dstY, 0, 0, bestSize.x, bestSize.y);
gc.dispose();
boolean bAlternateDrawing = true;
if (USE_SWT32_BG_SET) {
try {
shell.setBackgroundImage(imgBackground);
bAlternateDrawing = false;
} catch (NoSuchMethodError e) {
}
}
if (bAlternateDrawing) {
// Drawing of BG Image for pre SWT 3.2
cShell.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
e.gc.drawImage(imgBackground, e.x, e.y, e.width, e.height, e.x,
e.y, e.width, e.height);
}
});
Color colorBG = display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
final RGB bgRGB = colorBG.getRGB();
PaintListener paintListener = new PaintListener() {
// OSX: copyArea() causes a paint event, resulting in recursion
boolean alreadyPainting = false;
public void paintControl(PaintEvent e) {
if (alreadyPainting || e.width <= 0 || e.height <= 0) {
return;
}
alreadyPainting = true;
try {
Rectangle bounds = ((Control) e.widget).getBounds();
Image img = new Image(display, e.width, e.height);
e.gc.copyArea(img, e.x, e.y);
e.gc.drawImage(imgBackground, -bounds.x, -bounds.y);
// Set the background color to invisible. img.setBackground
// doesn't work, so change transparentPixel directly and roll
// a new image
ImageData data = img.getImageData();
data.transparentPixel = data.palette.getPixel(bgRGB);
Image imgTransparent = new Image(display, data);
// This is an alternative way of setting the transparency.
// Probably much slower
//int bgIndex = data.palette.getPixel(bgRGB);
//ImageData transparencyMask = data.getTransparencyMask();
//for (int y = 0; y < data.height; y++) {
// for (int x = 0; x < data.width; x++) {
// if (bgIndex == data.getPixel(x, y))
// transparencyMask.setPixel(x, y, 0);
// }
//}
//
//Image imgTransparent = new Image(display, data, transparencyMask);
e.gc.drawImage(imgTransparent, 0, 0, e.width, e.height, e.x, e.y,
e.width, e.height);
img.dispose();
imgTransparent.dispose();
} finally {
alreadyPainting = false;
}
}
};
shell.setBackground(colorBG);
cShell.setBackground(colorBG);
addPaintListener(cShell, paintListener, colorBG, true);
}
}
Rectangle bounds = null;
try {
UIFunctionsSWT uiFunctions = UIFunctionsManagerSWT.getUIFunctionsSWT();
if (uiFunctions != null) {
Shell mainShell = uiFunctions.getMainShell();
if (mainShell != null) {
bounds = mainShell.getMonitor().getClientArea();
}
} else {
Shell shell = display.getActiveShell();
if (shell != null) {
bounds = shell.getMonitor().getClientArea();
}
}
if (bounds == null) {
bounds = shell.getMonitor().getClientArea();
}
} catch (Exception e) {
}
if (bounds == null) {
bounds = display.getClientArea();
}
Rectangle endBounds;
if (bDisableSliding) {
endBounds = new Rectangle(((bounds.x + bounds.width) / 2)
- (bestSize.x / 2), ((bounds.y + bounds.height) / 2)
- (bestSize.y / 2), bestSize.x, bestSize.y);
} else {
int boundsX2 = bounds.x + bounds.width;
int boundsY2 = bounds.y + bounds.height;
endBounds = shell.computeTrim(boundsX2 - bestSize.x, boundsY2
- bestSize.y, bestSize.x, bestSize.y);
// bottom and right trim will be off the edge, calulate this trim
// and adjust it up and left (trim may not be the same size on all sides)
int diff = (endBounds.x + endBounds.width) - boundsX2;
if (diff >= 0)
endBounds.x -= diff + EDGE_GAP;
diff = (endBounds.y + endBounds.height) - boundsY2;
if (diff >= 0) {
endBounds.y -= diff + EDGE_GAP;
}
//System.out.println("best" + bestSize + ";mon" + bounds + ";end" + endBounds);
}
FormData data = new FormData(bestSize.x, bestSize.y);
cShell.setLayoutData(data);
btnDetails.setVisible(sDetails != null);
if (sDetails == null) {
gridData = new GridData();
gridData.widthHint = 0;
btnDetails.setLayoutData(gridData);
}
shell.layout();
btnNext.setFocus();
shell.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
Utils.disposeSWTObjects(disposeList);
if (currentPopupIndex == idxHistory) {
if (DEBUG)
System.out
.println("Clear #" + currentPopupIndex + "/" + idxHistory);
try {
monitor.enter();
currentPopupIndex = -1;
} finally {
monitor.exit();
}
}
}
});
shell.addListener(SWT.Traverse, new Listener() {
public void handleEvent(Event event) {
if (event.detail == SWT.TRAVERSE_ESCAPE) {
disposeShell(shell);
event.doit = false;
}
}
});
if (mouseAdapter != null)
addMouseTrackListener(shell, mouseAdapter);
runPopup(endBounds, idxHistory, bSlide);
}
/**
* @param numAfter
*/
private void setButtonNextText(int numAfter) {
if (numAfter <= 0)
Messages.setLanguageText(btnNext, "popup.error.hide");
else
Messages.setLanguageText(btnNext, "popup.next", new String[] { ""
+ numAfter });
cShell.layout(true);
}
/**
* Show the popup with the specified parameters.
*
* @param display Display to show on
* @param item popup to display. Must already exist in historyList
* @param bSlide Whether to slide in or show immediately
*/
private void showPopup(final Display display, final PopupParams item,
final boolean bSlide) {
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
new MessageSlideShell(display, item, bSlide);
}
});
}
/**
* Adds mousetracklistener to composite and all it's children
*
* @param parent Composite to start at
* @param listener Listener to add
*/
private void addMouseTrackListener(Composite parent,
MouseTrackListener listener) {
if (parent == null || listener == null || parent.isDisposed())
return;
parent.addMouseTrackListener(listener);
Control[] children = parent.getChildren();
for (int i = 0; i < children.length; i++) {
Control control = children[i];
if (control instanceof Composite)
addMouseTrackListener((Composite) control, listener);
else
control.addMouseTrackListener(listener);
}
}
private void addPaintListener(Composite parent, PaintListener listener,
Color colorBG, boolean childrenOnly) {
if (parent == null || listener == null || parent.isDisposed())
return;
if (!childrenOnly) {
parent.addPaintListener(listener);
parent.setBackground(colorBG);
}
Control[] children = parent.getChildren();
for (int i = 0; i < children.length; i++) {
Control control = children[i];
control.addPaintListener(listener);
control.setBackground(colorBG);
if (control instanceof Composite)
addPaintListener((Composite) control, listener, colorBG, true);
}
}
/**
* removes mousetracklistener from composite and all it's children
*
* @param parent Composite to start at
* @param listener Listener to remove
*/
private void removeMouseTrackListener(Composite parent,
MouseTrackListener listener) {
if (parent == null || listener == null || parent.isDisposed())
return;
Control[] children = parent.getChildren();
for (int i = 0; i < children.length; i++) {
Control control = children[i];
control.removeMouseTrackListener(listener);
if (control instanceof Composite)
removeMouseTrackListener((Composite) control, listener);
}
}
/**
* Start the slid in, wait specified time while notifying user of impending
* auto-close, then slide out. Run on separate thread, so this method
* returns immediately
*
* @param endBounds end location and size wanted
* @param idx Index in historyList of popup (Used to calculate # prev, next)
* @param bSlide Whether to slide in, or show immediately
*/
private void runPopup(final Rectangle endBounds, final int idx,
final boolean bSlide) {
if (shell == null || shell.isDisposed())
return;
final Display display = shell.getDisplay();
if (DEBUG)
System.out
.println("runPopup " + idx + ((bSlide) ? " Slide" : " Instant"));
AEThread thread = new AEThread("Slidey", true) {
private final static int PAUSE = 500;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -