metacity.java
来自「java jdk 1.4的源码」· Java 代码 · 共 453 行
JAVA
453 行
/* * @(#)Metacity.java 1.16 03/05/01 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package com.sun.java.swing.plaf.gtk;import java.awt.*;import java.awt.image.*;import java.io.*;import java.net.*;import java.security.*;import java.util.*;import javax.swing.*;import javax.swing.border.*;/** * @version 1.16, 05/01/03 */abstract class Metacity implements SynthConstants { static Metacity INSTANCE; static { String themeDir = null; String theme = getUserTheme(); if (theme == null) { theme = "Bluecurve"; themeDir = getThemeDir(theme); if (themeDir == null) { theme = "Crux"; themeDir = getThemeDir(theme); } if (themeDir == null) { theme = null; } } if (theme != null && themeDir == null) { themeDir = getThemeDir(theme); } if (themeDir != null) { if (theme.equals("Bluecurve")) { INSTANCE = new MetacityBluecurve(themeDir); } else if (theme.equals("Crux")) { INSTANCE = new MetacityCrux(themeDir); } } if (INSTANCE == null) { INSTANCE = new MetacityCrux(null); } } private FrameGeometry geometry; private static LayoutManager titlePaneLayout = new TitlePaneLayout(); private ColorizeImageFilter imageFilter = new ColorizeImageFilter(); protected String themeDir = null; protected SynthContext context; protected Metacity(String themeDir, FrameGeometry geometry) { this.themeDir = themeDir; this.geometry = geometry; } public static LayoutManager getTitlePaneLayout() { return titlePaneLayout; } abstract void paintButtonBackground(SynthContext context, Graphics g, int x, int y, int w,int h); abstract void paintFrameBorder(SynthContext context, Graphics g, int x0, int y0, int width, int height); abstract Insets getBorderInsets(SynthContext context, Insets insets); private static String getThemeDir(final String theme) { return (String)AccessController.doPrivileged(new PrivilegedAction() { public Object run() { String[] dirs = new String[] { "/usr/share/themes/"+theme+"/metacity-1", "/usr/gnome/share/themes/"+theme+"/metacity-1", "/opt/gnome2/share/themes/"+theme+"/metacity-1" }; for (int i = 0; i < dirs.length; i++) { if (new File(dirs[i], "metacity-theme-1.xml").canRead()) { return dirs[i]; } } return null; } }); } private static String getUserTheme() { return (String)AccessController.doPrivileged(new PrivilegedAction() { public Object run() { try { String theme = System.getProperty("swing.metacitythemename"); if (theme != null) { return theme; } String home = System.getProperty("user.home"); URL url = new URL("file:"+home+"/.gconf/apps/metacity/general/%25gconf.xml"); Reader reader = new InputStreamReader(url.openStream(), "ISO-8859-1"); char[] buf = new char[1024]; StringBuffer strBuf = new StringBuffer(); int n; while ((n = reader.read(buf)) >= 0) { strBuf.append(buf, 0, n); } reader.close(); String str = strBuf.toString(); if (str != null) { int i = str.toLowerCase().indexOf("<entry name=\"theme\""); if (i >= 0) { i = str.toLowerCase().indexOf("<stringvalue>", i); if (i > 0) { i += "<stringvalue>".length(); int i2 = str.indexOf("<", i); return str.substring(i, i2); } } } } catch (Exception ex) { // OK to just ignore. We'll use a fallback theme. } return null; } }); } protected void tileImage(Graphics g, Image image, int x0, int y0, int w, int h, float[] alphas) { Graphics2D g2 = (Graphics2D)g; Composite oldComp = g2.getComposite(); int sw = image.getWidth(null); int sh = image.getHeight(null); int y = y0; while (y < y0 + h) { sh = Math.min(sh, y0 + h - y); int x = x0; while (x < x0 + w) { float f = (alphas.length - 1.0F) * x / (x0 + w); int i = (int)f; f -= (int)f; float alpha = (1-f) * alphas[i] + f * alphas[i+1]; g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha)); int swm = Math.min(sw, x0 + w - x); g.drawImage(image, x, y, x+swm, y+sh, 0, 0, swm, sh, null); x += swm; } y += sh; } g2.setComposite(oldComp); } protected Color getColor(int state, ColorType type) { return ((GTKStyle)context.getStyle()).getGTKColor(context.getComponent(), context.getRegion(), state, type); } protected static Color shadeColor(Color c, float f) { return GTKColorType.adjustColor(c, 1.0F, f, f); } protected Color blendColor(Color bg, Color fg, float alpha) { return new Color((int)(bg.getRed() + ((fg.getRed() - bg.getRed()) * alpha)), (int)(bg.getRed() + ((fg.getRed() - bg.getRed()) * alpha)), (int)(bg.getRed() + ((fg.getRed() - bg.getRed()) * alpha))); } protected void tintRect(Graphics g, int x, int y, int w, int h, Color c, float alpha) { if (g instanceof Graphics2D) { Graphics2D g2 = (Graphics2D)g; Composite oldComp = g2.getComposite(); AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha); g2.setComposite(ac); g2.setColor(c); g2.fillRect(x, y, w, h); g2.setComposite(oldComp); } } protected void drawVerticalGradient(Graphics g, Color color1, Color color2, int x0, int y0, int width, int height, float alpha) { if (g instanceof Graphics2D) { Graphics2D g2 = (Graphics2D)g; Composite oldComp = g2.getComposite(); AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha); g2.setComposite(ac); g2.setPaint(new GradientPaint(x0, y0, color1, x0, y0 + height, color2)); g2.fillRect(x0, y0, width, height); g2.setComposite(oldComp); } } protected void drawVerticalGradient(Graphics g, Color color1, Color color2, int x0, int y0, int width, int height) { if (g instanceof Graphics2D) { Graphics2D g2 = (Graphics2D)g; g2.setPaint(new GradientPaint(x0, y0, color1, x0, y0 + height, color2)); g2.fillRect(x0, y0, width, height); } } protected void drawVerticalGradient(Graphics g, Color color1, Color color2, Color color3, int x0, int y0, int width, int height) { if (g instanceof Graphics2D) { Graphics2D g2 = (Graphics2D)g; g2.setPaint(new GradientPaint(x0, y0, color1, x0, y0 + height/2, color2)); g2.fillRect(x0, y0, width, height/2); g2.setPaint(new GradientPaint(x0, y0 + height/2, color2, x0, y0 + height, color3)); g2.fillRect(x0, y0 + height/2, width, height/2); } } protected void drawDiagonalGradient(Graphics g, Color color1, Color color2, int x0, int y0, int width, int height, float alpha) { if (g instanceof Graphics2D) { Graphics2D g2 = (Graphics2D)g; Composite oldComp = g2.getComposite(); AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha); g2.setComposite(ac); g2.setPaint(new GradientPaint(x0, y0, color1, x0 + width, y0 + height, color2)); g2.fillRect(x0, y0, width, height); g2.setComposite(oldComp); } } protected void drawDiagonalGradient(Graphics g, Color color1, Color color2, int x0, int y0, int width, int height) { if (g instanceof Graphics2D) { Graphics2D g2 = (Graphics2D)g; g2.setPaint(new GradientPaint(x0, y0, color1, x0 + width, y0 + height, color2)); g2.fillRect(x0, y0, width, height); } } protected Image colorizeImage(Image image, Color c) { return imageFilter.colorize(image, c); } private class ColorizeImageFilter extends RGBImageFilter { double cr, cg, cb; public ColorizeImageFilter() { canFilterIndexColorModel = true; } public void setColor(Color color) { cr = color.getRed() / 255.0; cg = color.getGreen() / 255.0; cb = color.getBlue() / 255.0; } public Image colorize(Image fromImage, Color c) { setColor(c); ImageProducer producer = new FilteredImageSource(fromImage.getSource(), this); return new ImageIcon(context.getComponent().createImage(producer)).getImage(); } public int filterRGB(int x, int y, int rgb) { // Assume all rgb values are shades of gray double grayLevel = 2 * (rgb & 0xff) / 255.0; double r, g, b; if (grayLevel <= 1.0) { r = cr * grayLevel; g = cg * grayLevel; b = cb * grayLevel; } else { grayLevel -= 1.0; r = cr + (1.0 - cr) * grayLevel; g = cg + (1.0 - cg) * grayLevel; b = cb + (1.0 - cb) * grayLevel; } return ((rgb & 0xff000000) + (((int)(r * 255)) << 16) + (((int)(g * 255)) << 8) + (int)(b * 255)); } } protected static JComponent findChild(JComponent parent, String name) { int n = parent.getComponentCount(); for (int i = 0; i < n; i++) { JComponent c = (JComponent)parent.getComponent(i); if (name.equals(c.getName())) { return c; } } return null; } protected static class TitlePaneLayout implements LayoutManager { public void addLayoutComponent(String name, Component c) {} public void removeLayoutComponent(Component c) {} public Dimension preferredLayoutSize(Container c) { return minimumLayoutSize(c); } public Dimension minimumLayoutSize(Container c) { JComponent titlePane = (JComponent)c; Container titlePaneParent = titlePane.getParent(); JInternalFrame frame; if (titlePaneParent instanceof JInternalFrame) { frame = (JInternalFrame)titlePaneParent; } else if (titlePaneParent instanceof JInternalFrame.JDesktopIcon) { frame = ((JInternalFrame.JDesktopIcon)titlePaneParent).getInternalFrame(); } else { return null; } FrameGeometry gm = INSTANCE.getFrameGeometry(); // Calculate width. int width = 22; if (frame.isClosable()) { width += 19; } if (frame.isMaximizable()) { width += 19; } if (frame.isIconifiable()) { width += 19; } FontMetrics fm = titlePane.getFontMetrics(titlePane.getFont()); String frameTitle = frame.getTitle(); int title_w = frameTitle != null ? fm.stringWidth(frameTitle) : 0; int title_length = frameTitle != null ? frameTitle.length() : 0; // Leave room for three characters in the title. if (title_length > 3) { int subtitle_w = fm.stringWidth(frameTitle.substring(0, 3) + "..."); width += (title_w < subtitle_w) ? title_w : subtitle_w; } else { width += title_w; } // Calculate height. Icon icon = frame.getFrameIcon(); int fontHeight = (fm.getHeight() + gm.title_vertical_pad + gm.title_border.top + gm.title_border.bottom); int iconHeight = 0; if (icon != null) { // SystemMenuBar forces the icon to be 16x16 or less. iconHeight = Math.min(icon.getIconHeight(), 16); } int height = Math.max(fontHeight, iconHeight+2); return new Dimension(width, height); } public void layoutContainer(Container c) { JComponent titlePane = (JComponent)c; Container titlePaneParent = titlePane.getParent(); JInternalFrame frame; if (titlePaneParent instanceof JInternalFrame) { frame = (JInternalFrame)titlePaneParent; } else if (titlePaneParent instanceof JInternalFrame.JDesktopIcon) { frame = ((JInternalFrame.JDesktopIcon)titlePaneParent).getInternalFrame(); } else { return; } boolean leftToRight = SynthLookAndFeel.isLeftToRight(frame); FrameGeometry gm = INSTANCE.getFrameGeometry(); int w = titlePane.getWidth(); int h = titlePane.getHeight(); JComponent menuButton = findChild(titlePane, "InternalFrameTitlePane.menuButton"); JComponent minimizeButton = findChild(titlePane, "InternalFrameTitlePane.iconifyButton"); JComponent maximizeButton = findChild(titlePane, "InternalFrameTitlePane.maximizeButton"); JComponent closeButton = findChild(titlePane, "InternalFrameTitlePane.closeButton"); int buttonGap = 0; int buttonHeight = h - gm.title_border.top - gm.title_border.bottom; int buttonWidth = (int)(buttonHeight / gm.aspect_ratio); Icon icon = frame.getFrameIcon(); int iconHeight = (icon != null) ? icon.getIconHeight() : buttonHeight; int x = (leftToRight) ? gm.left_titlebar_edge : w - buttonWidth - gm.right_titlebar_edge; int y = gm.title_border.top; menuButton.setBounds(x, y, buttonWidth, buttonHeight); x = (leftToRight) ? w - buttonWidth - gm.right_titlebar_edge : gm.left_titlebar_edge; if (frame.isClosable()) { closeButton.setBounds(x, y, buttonWidth, buttonHeight); x += (leftToRight) ? -(buttonWidth + buttonGap) : buttonWidth + buttonGap; } if (frame.isMaximizable()) { maximizeButton.setBounds(x, y, buttonWidth, buttonHeight); x += (leftToRight) ? -(buttonWidth + buttonGap) : buttonWidth + buttonGap; } if (frame.isIconifiable()) { minimizeButton.setBounds(x, y, buttonWidth, buttonHeight); } } } // end TitlePaneLayout protected FrameGeometry getFrameGeometry() { return geometry; } protected void setFrameGeometry(JComponent titlePane, FrameGeometry geometry) { this.geometry = geometry; if (geometry.top_height == 0) { geometry.top_height = titlePane.getHeight(); } } protected static class FrameGeometry { int left_width; int right_width; int top_height; int bottom_height; int left_titlebar_edge; int right_titlebar_edge; float aspect_ratio; int title_vertical_pad; Insets title_border; Insets button_border; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?