亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? titlebar.java

?? Eclipse編程技術與實例一書配套的光盤代碼全部內容
?? JAVA
字號:
package org.test.custom.internal;

import java.util.Timer;
import java.util.TimerTask;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.*;

import org.test.custom.shell.DesktopForm;
import org.test.custom.shell.InternalShell;

public final class TitleBar extends Canvas {
	private static final long UPDATE_DELAY = 25;

	private static final int MINIMUM_GRAB_AREA = 2;

	private static final String ELLIPSIS = "...";

	private static final int LEFT_PADDING = 2;

	private static final int RIGHT_PADDING = 2;

	private static final int IMAGE_SIZE = 16;

	private static final int TOOL_SIZE = 14;

	private static final int TOP_PADDING = 1;

	private static final int BOTTOM_PADDING = 1;

	private int mouseDownOffsetX, mouseDownOffsetY, snapBackX, snapBackY;

	private boolean cancelled;

	private volatile long lastUpdate;

	private Timer timer = new Timer(true);

	private TimerTask timerTask;

	private final InternalShell ishell;

	private final DesktopForm desktop;

	private String text;

	private Image image;

	private final boolean styleClose, styleMax, styleTool, styleMin;

	private final Image closeImage, restoreImage, maximizeImage, minimizeImage;

	private final MenuItem restoreItem, closeItem, maximizeItem;

	private final Menu defaultPopup;

	public TitleBar(InternalShell parent, int style) {
		super(parent, checkStyle(style));
		this.ishell = parent;
		this.desktop = (DesktopForm) ishell.getParent();

		// 設置InternalShell的樣式
		this.styleClose = (style & SWT.CLOSE) != 0;
		this.styleMax = (style & SWT.MAX) != 0;
		this.styleMin = (style & SWT.MIN) != 0;
		this.styleTool = (style & SWT.TOOL) != 0;

		final Display display = getDisplay();
		final Shell shell = getShell();

		// 得到控件在不同情況下顏色
		final Color gradStartColor = display
				.getSystemColor(SWT.COLOR_TITLE_BACKGROUND);
		final Color gradEndColor = display
				.getSystemColor(SWT.COLOR_TITLE_BACKGROUND_GRADIENT);
		final Color textColor = display
				.getSystemColor(SWT.COLOR_TITLE_FOREGROUND);
		final Color inactiveGradStartColor = display
				.getSystemColor(SWT.COLOR_TITLE_INACTIVE_BACKGROUND);
		final Color inactiveGradEndColor = display
				.getSystemColor(SWT.COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT);
		final Color inactiveTextColor = display
				.getSystemColor(SWT.COLOR_TITLE_INACTIVE_FOREGROUND);

		GC gc = new GC(this);
		int imgHeight = gc.getFontMetrics().getHeight() - 1;
		if (imgHeight % 2 == 0)
			imgHeight--;
		gc.dispose();

		// 創建菜單圖形
		closeImage = createMenuImage(IMAGE_TYPE_CLOSE, imgHeight);
		restoreImage = createMenuImage(IMAGE_TYPE_RESTORE, imgHeight);
		maximizeImage = createMenuImage(IMAGE_TYPE_MAXIMIZE, imgHeight);
		minimizeImage = createMenuImage(IMAGE_TYPE_MINIMIZE, imgHeight);

		// 設置字體
		setFont(createTitleFont(getFont(), styleTool));

		// 創建菜單欄并且注冊事件偵聽器
		defaultPopup = new Menu(this);

		restoreItem = new MenuItem(defaultPopup, SWT.PUSH);
		restoreItem.setText(LocalizedStrings.POPUP_RESTORE);
		restoreItem.setImage(restoreImage);
		restoreItem.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event event) {
				ishell.setMaximized(false);
			}
		});

		MenuItem minimizeItem = new MenuItem(defaultPopup, SWT.PUSH);
		minimizeItem.setText(LocalizedStrings.POPUP_MINIMIZE);
		minimizeItem.setEnabled(styleMin);
		minimizeItem.setImage(minimizeImage);
		/*
		 * minimizeItem.addListener(SWT.Selection, new Listener() { public void
		 * handleEvent(Event event) { } });
		 */

		maximizeItem = new MenuItem(defaultPopup, SWT.PUSH);
		maximizeItem.setText(LocalizedStrings.POPUP_MAXIMIZE);
		maximizeItem.setImage(maximizeImage);
		maximizeItem.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event event) {
				ishell.setMaximized(true);
			}
		});

		new MenuItem(defaultPopup, SWT.SEPARATOR);

		closeItem = new MenuItem(defaultPopup, SWT.PUSH);
		closeItem.setText(LocalizedStrings.POPUP_CLOSE);
		closeItem.setEnabled(styleClose);
		closeItem.setImage(closeImage);
		closeItem.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event event) {
				ishell.close();
			}
		});

		// 注冊各種事件偵聽器
		addListener(SWT.Paint, new Listener() {
			public void handleEvent(Event event) {
				Rectangle r = getClientArea();
				if (r.width == 0 || r.height == 0)
					return;

				boolean active = (shell == display.getActiveShell() && ishell
						.isActiveShell());

				GC gc = event.gc;
				gc.setForeground(active ? gradStartColor
						: inactiveGradStartColor);
				gc.setBackground(active ? gradEndColor : inactiveGradEndColor);
				gc.fillGradientRectangle(r.x, r.y, r.width, r.height, false);

				int textLeftPadding = LEFT_PADDING;
				if (image != null) {
					Rectangle imageBounds = image.getBounds();
					if (imageBounds.width > IMAGE_SIZE
							|| imageBounds.height > IMAGE_SIZE)
						gc.drawImage(image, 0, 0, imageBounds.width,
								imageBounds.height, LEFT_PADDING, TOP_PADDING,
								IMAGE_SIZE, IMAGE_SIZE);
					else
						gc.drawImage(image, LEFT_PADDING
								+ (IMAGE_SIZE - imageBounds.width) / 2,
								(r.height - imageBounds.height) / 2);
					textLeftPadding += IMAGE_SIZE + LEFT_PADDING;
				}

				if (text != null && text.length() > 0) {
					gc.setForeground(active ? textColor : inactiveTextColor);
					String s = text;
					int availableWidth = r.width - textLeftPadding
							- RIGHT_PADDING;
					if (gc.textExtent(s, SWT.DRAW_TRANSPARENT).x > availableWidth) {
						int ellipsisWidth = gc.textExtent(ELLIPSIS,
								SWT.DRAW_TRANSPARENT).x;
						while (s.length() > 0) {
							s = s.substring(0, s.length() - 1);
							if (gc.textExtent(s, SWT.DRAW_TRANSPARENT).x
									+ ellipsisWidth <= availableWidth) {
								s += ELLIPSIS;
								break;
							}
						}
					}
					if (s.length() > 0)
						gc.drawString(s, textLeftPadding, (r.height - gc
								.getFontMetrics().getHeight()) / 2, true);
				}
			}
		});

		addListener(SWT.MouseDown, new Listener() {
			public void handleEvent(Event event) {
				if (event.button == 1) {
					if (image != null && event.x < LEFT_PADDING + IMAGE_SIZE) {
						cancelled = true;
						// left-clicking on the image always shows the default
						// popup menu
						instrumentDefaultPopup(true);
						defaultPopup.setLocation(toDisplay(0, getSize().y));
						defaultPopup.setVisible(true);
					} else {
						mouseDownOffsetX = event.x;
						mouseDownOffsetY = event.y;
						Point p = ishell.getLocation();
						snapBackX = p.x;
						snapBackY = p.y;
						cancelled = false;
					}
				} else if (event.button == 3) {
					if ((event.stateMask & SWT.BUTTON1) != 0
							&& snapBackX != Integer.MIN_VALUE
							&& snapBackY != Integer.MIN_VALUE) {
						ishell.setLocation(snapBackX, snapBackY);
						snapBackX = Integer.MIN_VALUE;
						snapBackY = Integer.MIN_VALUE;
						cancelled = true;
					} else {
					}
				}
			}
		});

		addListener(SWT.MenuDetect, new Listener() {
			public void handleEvent(Event event) {
				event.doit = false;
				Menu m = getMenu();
				if (m == null || m.isDisposed()) {
					m = defaultPopup;
					instrumentDefaultPopup(false);
				}
				m.setLocation(event.x, event.y);
				m.setVisible(true);
			}
		});

		addListener(SWT.MouseDoubleClick, new Listener() {
			public void handleEvent(Event event) {
				if (event.button == 1) {
					if (image != null && event.x < LEFT_PADDING + IMAGE_SIZE) {
						if (styleClose)
							ishell.close();
					} else {
						if (styleMax)
							ishell.setMaximized(!ishell.getMaximized());
					}
					cancelled = true;
				}
			}
		});

		addListener(SWT.MouseMove, new Listener() {
			public void handleEvent(final Event event) {
				if (!cancelled && (event.stateMask & SWT.BUTTON1) != 0
						&& !ishell.getMaximized()) {
					if (timerTask != null) {
						timerTask.cancel();
						timerTask = null;
					}
					long now = System.currentTimeMillis();
					if (lastUpdate + UPDATE_DELAY < now) {
						performMove(event);
						lastUpdate = now;
					} else {
						timerTask = new TimerTask() {
							public void run() {
								final TimerTask executingTask = this;
								event.display.asyncExec(new Runnable() {
									public void run() {
										if (executingTask != timerTask)
											return;
										performMove(event);
									}
								});
							}
						};
						timer.schedule(timerTask, UPDATE_DELAY);
					}
				}
			}
		});

		addListener(SWT.MouseUp, new Listener() {
			public void handleEvent(Event event) {
				if (ishell.getMaximized())
					return;
				if (image == null || event.x >= LEFT_PADDING + IMAGE_SIZE) {
					if (timerTask != null) {
						timerTask.cancel();
						timerTask = null;
					}
					if (!cancelled && (event.stateMask & SWT.BUTTON1) != 0) {
						performMove(event);
					}
				}
			}
		});

		final Listener activateListener = new Listener() {
			public void handleEvent(Event event) {
				redraw();
			}
		};
		final Listener deactivateListener = new Listener() {
			public void handleEvent(Event event) {
				redraw();
			}
		};
		shell.addListener(SWT.Activate, activateListener);
		shell.addListener(SWT.Deactivate, deactivateListener);

		addListener(SWT.Dispose, new Listener() {
			public void handleEvent(Event event) {
				timer.cancel();
				shell.removeListener(SWT.Activate, activateListener);
				shell.removeListener(SWT.Deactivate, deactivateListener);
				closeImage.dispose();
				maximizeImage.dispose();
				restoreImage.dispose();
				minimizeImage.dispose();
				defaultPopup.dispose();
			}
		});
	}

	// 重畫窗口,以實現移動的效果。
	private void performMove(Event event) {
		Point p = ishell.getLocation();
		int newX = p.x + event.x - mouseDownOffsetX;
		int newY = p.y + event.y - mouseDownOffsetY;

		// Make sure that the minimum grab area stays visible
		Rectangle deskCA = desktop.getClientArea();
		Rectangle bounds = getBounds();
		int rightMinGrab = MINIMUM_GRAB_AREA;
		if (image != null)
			rightMinGrab += LEFT_PADDING + IMAGE_SIZE;
		newX = Math.min(Math.max(newX, deskCA.x - bounds.x - bounds.width
				+ MINIMUM_GRAB_AREA), deskCA.x - bounds.x + deskCA.width
				- rightMinGrab);
		newY = Math.min(Math.max(newY, deskCA.y - bounds.y - bounds.height
				+ MINIMUM_GRAB_AREA), deskCA.y - bounds.y + deskCA.height
				- MINIMUM_GRAB_AREA);

		if (newX != p.x || newY != p.y)
			ishell.setLocation(newX, newY);
	}

	public Point computeSize(int wHint, int hHint, boolean changed) {
		checkWidget();
		if (wHint == SWT.DEFAULT)
			wHint = 50;
		if (hHint == SWT.DEFAULT) {
			GC gc = new GC(this);
			hHint = gc.getFontMetrics().getHeight();
			hHint = Math.max(hHint, styleTool ? TOOL_SIZE : IMAGE_SIZE);
			hHint += TOP_PADDING + BOTTOM_PADDING;
			gc.dispose();
		}
		return new Point(wHint, hHint);
	}

	private static int checkStyle(int style) {
		//int mask = SWT.SHADOW_IN | SWT.FLAT;
		//style &= mask;
		style = SWT.NO_FOCUS;
		return style;
	}

	public boolean setFocus() {
		checkWidget();
		return false;
	}

	public boolean isReparentable() {
		checkWidget();
		return false;
	}

	public void setText(String text) {
		checkWidget();
		this.text = text;
		redraw();
	}

	public String getText() {
		return text;
	}

	public void setImage(Image image) {
		checkWidget();
		if (styleTool)
			return;
		this.image = image;
		redraw();
	}

	public Image getImage() {
		return image;
	}

	private Font createTitleFont(Font f, boolean tool) {
		FontData[] fds = f.getFontData();

		int size = fds.length;
		int i = 0;

		for (; i < size; i++) {
			fds[i].setStyle(fds[i].getStyle() | SWT.BOLD);
			if (tool)
				fds[i].setHeight((int) (fds[i].getHeight() * 0.9));
		}
		return new Font(getDisplay(), fds);
	}

	private void instrumentDefaultPopup(boolean onImage) {
		restoreItem.setEnabled(styleMax && ishell.getMaximized());
		maximizeItem.setEnabled(styleMax && !ishell.getMaximized());
		MenuItem def = null;
		if (onImage) {
			if (styleClose)
				def = closeItem;
		} else if (styleMax) {
			def = ishell.getMaximized() ? restoreItem : maximizeItem;
		}
		defaultPopup.setDefaultItem(def);
	}

	private static final int IMAGE_TYPE_CLOSE = 1;

	private static final int IMAGE_TYPE_MAXIMIZE = 2;

	private static final int IMAGE_TYPE_RESTORE = 3;

	private static final int IMAGE_TYPE_MINIMIZE = 4;

	/**
	 * 創建菜單上的圖形顯示,例如最大化、最小化的按鈕等。
	 */
	private Image createMenuImage(int type, int height) {
		final Point size = new Point(height, height);
		final int imgWidth = height + height / 2;
		final Color fg = getForeground();
		final Color white = getDisplay().getSystemColor(SWT.COLOR_WHITE);
		final RGB blackRGB = new RGB(0, 0, 0);

		ImageData id = new ImageData(imgWidth, size.y, 1, new PaletteData(
				new RGB[] { blackRGB, fg.getRGB() }));
		ImageData maskid = new ImageData(imgWidth, size.y, 1, new PaletteData(
				new RGB[] { blackRGB, white.getRGB() }));

		Image img = new Image(getDisplay(), id);
		GC gc = new GC(img);
		gc.setForeground(fg);
		drawMenuImage(gc, size, type);
		gc.dispose();

		Image maskimg = new Image(getDisplay(), maskid);
		gc = new GC(maskimg);
		gc.setForeground(white);
		drawMenuImage(gc, size, type);
		gc.dispose();

		Image transp = new Image(getDisplay(), img.getImageData(), maskimg
				.getImageData());
		img.dispose();
		maskimg.dispose();
		return transp;
	}

	/**
	 * 實際上執行畫圖操作的私有方法。
	 */
	private void drawMenuImage(GC gc, Point size, int type) {
		switch (type) {
		case IMAGE_TYPE_CLOSE:
			gc.drawLine(1, 1, size.x - 2, size.y - 2);
			gc.drawLine(2, 1, size.x - 2, size.y - 3);
			gc.drawLine(1, 2, size.x - 3, size.y - 2);
			gc.drawLine(1, size.y - 2, size.x - 2, 1);
			gc.drawLine(1, size.y - 3, size.x - 3, 1);
			gc.drawLine(2, size.y - 2, size.x - 2, 2);
			break;

		case IMAGE_TYPE_RESTORE:
			gc.drawRectangle(0, 4, size.x - 4, size.y - 6);
			gc.drawLine(1, 5, size.x - 5, 5);
			gc.drawLine(2, 1, size.x - 2, 1);
			gc.drawLine(2, 2, size.x - 2, 2);
			gc.drawPoint(2, 3);
			gc.drawLine(size.x - 2, 3, size.x - 2, size.y - 5);
			gc.drawPoint(size.x - 3, size.y - 5);
			break;

		case IMAGE_TYPE_MAXIMIZE:
			gc.drawRectangle(0, 0, size.x - 2, size.y - 2);
			gc.drawLine(1, 1, size.x - 3, 1);
			break;

		case IMAGE_TYPE_MINIMIZE:
			gc.drawLine(1, size.y - 2, size.x - 4, size.y - 2);
			gc.drawLine(1, size.y - 3, size.x - 4, size.y - 3);
			break;
		}
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久国产三级精品| 欧美成人高清电影在线| 欧美日韩一区中文字幕| 久久久美女毛片| 一区二区三区免费看视频| 国产乱码字幕精品高清av | 亚洲天堂成人网| 精品一区二区影视| 欧美精品乱码久久久久久按摩| 国产午夜亚洲精品午夜鲁丝片 | 国产乱妇无码大片在线观看| 91黄色小视频| 国产精品久久久久久久久免费樱桃| 日本亚洲一区二区| 欧美专区亚洲专区| 亚洲同性同志一二三专区| 国产一区二区主播在线| 这里是久久伊人| 丝袜美腿亚洲综合| 欧美日韩日日夜夜| 亚洲综合丝袜美腿| 欧美中文字幕久久| 亚洲精品菠萝久久久久久久| 不卡av电影在线播放| 久久久国产一区二区三区四区小说 | 亚洲成人午夜影院| 色哟哟欧美精品| 亚洲色图都市小说| 不卡电影一区二区三区| 国产精品久久三| www.亚洲激情.com| 日韩一区在线免费观看| av一区二区三区四区| 国产精品久久久久久久浪潮网站 | 国产精品三级av在线播放| 国产成人av一区二区三区在线观看| 日韩一区二区三区免费看 | 欧美亚洲图片小说| 亚洲综合激情网| 欧美日韩aaaaa| 免费人成黄页网站在线一区二区| 欧美久久久久免费| 人人精品人人爱| 精品国产乱码久久久久久久久| 伦理电影国产精品| www久久久久| 波多野结衣精品在线| 亚洲色图欧洲色图婷婷| 欧美日韩国产综合一区二区| 日韩电影免费在线观看网站| 精品国产伦一区二区三区观看方式| 国模冰冰炮一区二区| 国产午夜亚洲精品理论片色戒 | 国内精品写真在线观看| 国产欧美一区二区在线观看| 94色蜜桃网一区二区三区| 亚洲一区二区四区蜜桃| 欧美一卡2卡3卡4卡| 久久99久久久欧美国产| 国产欧美一区视频| 欧美日韩在线直播| 国产在线精品不卡| 日韩理论电影院| 91精品国产欧美日韩| 国产69精品久久久久毛片 | 久久午夜色播影院免费高清| 99精品桃花视频在线观看| 亚洲国产精品久久久男人的天堂| 6080午夜不卡| eeuss鲁一区二区三区| 午夜精品久久久久久久久久| 精品国产123| 欧美午夜一区二区三区免费大片| 久久99精品视频| 亚洲美女淫视频| 久久综合久久99| 99国产精品国产精品毛片| 亚洲高清在线精品| 国产精品久久久久9999吃药| 欧美日韩aaa| 99麻豆久久久国产精品免费优播| 午夜精品国产更新| 国产精品视频麻豆| 日韩一区二区在线看| 97久久精品人人做人人爽| 久久福利资源站| 亚洲第一福利一区| 亚洲欧美日韩在线播放| 久久精品欧美一区二区三区麻豆| 精品视频一区二区不卡| av电影在线观看一区| 韩国一区二区在线观看| 天天免费综合色| 亚洲精品国产无套在线观| 国产视频一区在线播放| 日韩欧美一级二级三级| 欧美熟乱第一页| 99久久免费视频.com| 福利一区二区在线| 久久99国内精品| 免费视频一区二区| 亚洲超丰满肉感bbw| 亚洲精品免费电影| 亚洲日本在线视频观看| 亚洲视频 欧洲视频| 国产精品视频yy9299一区| 亚洲精品一区二区三区香蕉 | 国产精品一区二区三区四区| 蜜桃视频一区二区| 美女爽到高潮91| 日本女优在线视频一区二区| 亚洲国产视频一区| 亚洲国产三级在线| 亚洲18女电影在线观看| 午夜视频一区二区| 免费观看久久久4p| 男人的天堂久久精品| 麻豆精品视频在线观看免费| 日一区二区三区| 日韩和的一区二区| 免费成人美女在线观看.| 日本美女一区二区三区| 免费观看91视频大全| 久久不见久久见免费视频1| 精一区二区三区| 国产一区三区三区| 成人动漫一区二区| 色综合久久九月婷婷色综合| 91久久一区二区| 欧洲生活片亚洲生活在线观看| 在线免费av一区| 欧美日韩在线亚洲一区蜜芽| 这里只有精品电影| 国产欧美一区二区在线| 亚洲精品乱码久久久久久| 午夜久久久影院| 国产激情91久久精品导航| 高清不卡一二三区| 欧美最新大片在线看| 欧美videossexotv100| 国产午夜亚洲精品午夜鲁丝片| 国产精品福利一区二区| 亚洲午夜一区二区三区| 美女视频黄久久| 高清成人免费视频| 欧美日韩国产综合草草| 精品女同一区二区| 亚洲色图在线视频| 久久99热这里只有精品| 99精品欧美一区| 精品人在线二区三区| 亚洲精品日韩一| 久久国产日韩欧美精品| 91久久精品一区二区三区| 精品免费国产二区三区| 1024成人网| 裸体健美xxxx欧美裸体表演| 91香蕉视频黄| 日韩欧美国产三级电影视频| 自拍视频在线观看一区二区| 裸体一区二区三区| 一本大道久久a久久综合| 精品国产一区二区精华| 亚洲欧美日韩国产手机在线| 久久成人免费电影| 欧美午夜精品久久久久久超碰| 久久精品人人爽人人爽| 香蕉影视欧美成人| 97se亚洲国产综合自在线| 日韩精品专区在线影院观看| 亚洲免费在线观看| 国内精品国产成人国产三级粉色| 欧美性大战久久久久久久蜜臀| 国产日韩综合av| 极品少妇一区二区| 在线成人小视频| 一区二区三区免费观看| 成年人国产精品| 久久免费美女视频| 久久精品久久99精品久久| 欧美日韩国产在线播放网站| 亚洲视频网在线直播| 国产91色综合久久免费分享| 日韩欧美高清在线| 午夜精品久久久久| 欧美日韩色一区| 亚洲一区二区三区四区五区黄 | 8x8x8国产精品| 亚洲成人av一区二区三区| 欧美在线小视频| 亚洲在线免费播放| 欧洲一区二区三区免费视频| 一区二区三区加勒比av| 在线中文字幕一区| 亚洲一区二区偷拍精品| 欧美少妇性性性| 图片区小说区国产精品视频| 欧美日韩你懂的| 日韩中文字幕区一区有砖一区| 欧美三电影在线|