📄 clabel.java
字号:
/******************************************************************************* * Copyright (c) 2000, 2004 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/package org.eclipse.swt.custom;import org.eclipse.swt.*;import org.eclipse.swt.widgets.*;import org.eclipse.swt.graphics.*;import org.eclipse.swt.events.*;import org.eclipse.swt.accessibility.*;/** * A Label which supports aligned text and/or an image and different border styles. * <p> * If there is not enough space a CLabel uses the following strategy to fit the * information into the available space: * <pre> * ignores the indent in left align mode * ignores the image and the gap * shortens the text by replacing the center portion of the label with an ellipsis * shortens the text by removing the center portion of the label * </pre> * <p> * <dl> * <dt><b>Styles:</b> * <dd>LEFT, RIGHT, CENTER, SHADOW_IN, SHADOW_OUT, SHADOW_NONE</dd> * <dt><b>Events:</b> * <dd></dd> * </dl> * * </p><p> * IMPORTANT: This class is <em>not</em> intended to be subclassed. * </p> */public class CLabel extends Canvas { /** Gap between icon and text */ private static final int GAP = 5; /** Left and right margins */ private static final int INDENT = 3; /** a string inserted in the middle of text that has been shortened */ private static final String ELLIPSIS = "..."; //$NON-NLS-1$ // could use the ellipsis glyph on some platforms "\u2026" /** the alignment. Either CENTER, RIGHT, LEFT. Default is LEFT*/ private int align = SWT.LEFT; private int hIndent = INDENT; private int vIndent = INDENT; /** the current text */ private String text; /** the current icon */ private Image image; // The tooltip is used for two purposes - the application can set // a tooltip or the tooltip can be used to display the full text when the // the text has been truncated due to the label being too short. // The appToolTip stores the tooltip set by the application. Control.tooltiptext // contains whatever tooltip is currently being displayed. private String appToolTipText; private Image backgroundImage; private Color[] gradientColors; private int[] gradientPercents; private boolean gradientVertical;/** * Constructs a new instance of this class given its parent * and a style value describing its behavior and appearance. * <p> * The style value is either one of the style constants defined in * class <code>SWT</code> which is applicable to instances of this * class, or must be built by <em>bitwise OR</em>'ing together * (that is, using the <code>int</code> "|" operator) two or more * of those <code>SWT</code> style constants. The class description * lists the style constants that are applicable to the class. * Style bits are also inherited from superclasses. * </p> * * @param parent a widget which will be the parent of the new instance (cannot be null) * @param style the style of widget to construct * * @exception IllegalArgumentException <ul> * <li>ERROR_NULL_ARGUMENT - if the parent is null</li> * </ul> * @exception SWTException <ul> * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li> * </ul> * * @see SWT#LEFT * @see SWT#RIGHT * @see SWT#CENTER * @see SWT#SHADOW_IN * @see SWT#SHADOW_OUT * @see SWT#SHADOW_NONE * @see #getStyle() */public CLabel(Composite parent, int style) { super(parent, checkStyle(style)); if ((style & SWT.CENTER) != 0) align = SWT.CENTER; if ((style & SWT.RIGHT) != 0) align = SWT.RIGHT; if ((style & SWT.LEFT) != 0) align = SWT.LEFT; addPaintListener(new PaintListener(){ public void paintControl(PaintEvent event) { onPaint(event); } }); addDisposeListener(new DisposeListener(){ public void widgetDisposed(DisposeEvent event) { onDispose(event); } }); initAccessible();}/** * Check the style bits to ensure that no invalid styles are applied. */private static int checkStyle (int style) { if ((style & SWT.BORDER) != 0) style |= SWT.SHADOW_IN; int mask = SWT.SHADOW_IN | SWT.SHADOW_OUT | SWT.SHADOW_NONE | SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT; style = style & mask; style |= SWT.NO_FOCUS; if ((style & (SWT.CENTER | SWT.RIGHT)) == 0) style |= SWT.LEFT; //TEMPORARY CODE /* * The default background on carbon and some GTK themes is not a solid color * but a texture. To show the correct default background, we must allow * the operating system to draw it and therefore, we can not use the * NO_BACKGROUND style. The NO_BACKGROUND style is not required on platforms * that use double buffering which is true in both of these cases. */ String platform = SWT.getPlatform(); if ("carbon".equals(platform) || "gtk".equals(platform)) return style; //$NON-NLS-1$ //$NON-NLS-2$ return style | SWT.NO_BACKGROUND;}//protected void checkSubclass () {// String name = getClass().getName ();// String validName = CLabel.class.getName();// if (!validName.equals(name)) {// SWT.error (SWT.ERROR_INVALID_SUBCLASS);// }//}public Point computeSize(int wHint, int hHint, boolean changed) { checkWidget(); Point e = getTotalSize(image, text); if (wHint == SWT.DEFAULT){ e.x += 2*hIndent; } else { e.x = wHint; } if (hHint == SWT.DEFAULT) { e.y += 2*vIndent; } else { e.y = hHint; } return e;}/** * Draw a rectangle in the given colors. */private void drawBevelRect(GC gc, int x, int y, int w, int h, Color topleft, Color bottomright) { gc.setForeground(bottomright); gc.drawLine(x+w, y, x+w, y+h); gc.drawLine(x, y+h, x+w, y+h); gc.setForeground(topleft); gc.drawLine(x, y, x+w-1, y); gc.drawLine(x, y, x, y+h-1);}/** * Returns the alignment. * The alignment style (LEFT, CENTER or RIGHT) is returned. * * @return SWT.LEFT, SWT.RIGHT or SWT.CENTER */public int getAlignment() { //checkWidget(); return align;}/** * Return the CLabel's image or <code>null</code>. * * @return the image of the label or null */public Image getImage() { //checkWidget(); return image;}/** * Compute the minimum size. */private Point getTotalSize(Image image, String text) { Point size = new Point(0, 0); if (image != null) { Rectangle r = image.getBounds(); size.x += r.width; size.y += r.height; } GC gc = new GC(this); if (text != null && text.length() > 0) { Point e = gc.textExtent(text); size.x += e.x; size.y = Math.max(size.y, e.y); if (image != null) size.x += GAP; } else { size.y = Math.max(size.y, gc.getFontMetrics().getHeight()); } gc.dispose(); return size;}public void setToolTipText (String string) { super.setToolTipText (string); appToolTipText = super.getToolTipText();} /** * Return the Label's text. * * @return the text of the label or null */public String getText() { //checkWidget(); return text;}public String getToolTipText () { checkWidget(); return appToolTipText;}/** * Paint the Label's border. */private void paintBorder(GC gc, Rectangle r) { Display disp= getDisplay(); Color c1 = null; Color c2 = null; int style = getStyle(); if ((style & SWT.SHADOW_IN) != 0) { c1 = disp.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW); c2 = disp.getSystemColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW); } if ((style & SWT.SHADOW_OUT) != 0) { c1 = disp.getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW); c2 = disp.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW); } if (c1 != null && c2 != null) { gc.setLineWidth(1); drawBevelRect(gc, r.x, r.y, r.width-1, r.height-1, c1, c2); }}private void initAccessible() { Accessible accessible = getAccessible(); accessible.addAccessibleListener(new AccessibleAdapter() { public void getName(AccessibleEvent e) { e.result = getText(); } public void getHelp(AccessibleEvent e) { e.result = getToolTipText(); } }); accessible.addAccessibleControlListener(new AccessibleControlAdapter() { public void getChildAtPoint(AccessibleControlEvent e) { Point pt = toControl(new Point(e.x, e.y)); e.childID = (getBounds().contains(pt)) ? ACC.CHILDID_SELF : ACC.CHILDID_NONE; } public void getLocation(AccessibleControlEvent e) { Rectangle location = getBounds(); Point pt = toDisplay(new Point(location.x, location.y)); e.x = pt.x; e.y = pt.y; e.width = location.width; e.height = location.height; } public void getChildCount(AccessibleControlEvent e) { e.detail = 0; } public void getRole(AccessibleControlEvent e) { e.detail = ACC.ROLE_LABEL; } public void getState(AccessibleControlEvent e) { e.detail = ACC.STATE_READONLY; } public void getValue(AccessibleControlEvent e) { e.result = getText(); } });}void onDispose(DisposeEvent event) { gradientColors = null; gradientPercents = null; backgroundImage = null; text = null; image = null; appToolTipText = null;}/* * Process the paint event */void onPaint(PaintEvent event) { Rectangle rect = getClientArea(); if (rect.width == 0 || rect.height == 0) return; boolean shortenText = false; String t = text; Image img = image; int availableWidth = rect.width - 2*hIndent; Point extent = getTotalSize(img, t); if (extent.x > availableWidth) { img = null; extent = getTotalSize(img, t); if (extent.x > availableWidth) { shortenText = true; } } GC gc = event.gc; // shorten the text if (shortenText) { t = shortenText(gc, text, availableWidth); extent = getTotalSize(img, t); if (appToolTipText == null) { super.setToolTipText(text); } } else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -