metacity.java
来自「JAVA 所有包」· Java 代码 · 共 2,097 行 · 第 1/5 页
JAVA
2,097 行
width, bottomTitlebarEdge, jif); drawPiece(frame_style, g, "title", titleRect.x, titleRect.y, titleRect.width, titleRect.height, jif); if (!minimized) { drawPiece(frame_style, g, "left_edge", 0, titleHeight, insets.left, height-titleHeight, jif); drawPiece(frame_style, g, "right_edge", width-insets.right, titleHeight, insets.right, height-titleHeight, jif); drawPiece(frame_style, g, "bottom_edge", 0, height - insets.bottom, width, insets.bottom, jif); drawPiece(frame_style, g, "overlay", 0, 0, width, height, jif); } g.setClip(oldClip); } } } g.translate(-x0, -y0); g.setFont(oldFont); } private static class Privileged implements PrivilegedAction { private static int GET_THEME_DIR = 0; private static int GET_USER_THEME = 1; private static int GET_IMAGE = 2; private int type; private Object arg; public Object doPrivileged(int type, Object arg) { this.type = type; this.arg = arg; return AccessController.doPrivileged(this); } public Object run() { if (type == GET_THEME_DIR) { String sep = File.separator; String[] dirs = new String[] { userHome + sep + ".themes", System.getProperty("swing.metacitythemedir"), "/usr/share/themes", "/usr/gnome/share/themes", // Debian/Redhat/Solaris "/opt/gnome2/share/themes" // SuSE }; URL themeDir = null; for (int i = 0; i < dirs.length; i++) { // System property may not be set so skip null directories. if (dirs[i] == null) { continue; } File dir = new File(dirs[i] + sep + arg + sep + "metacity-1"); if (new File(dir, "metacity-theme-1.xml").canRead()) { try { themeDir = dir.toURL(); } catch (MalformedURLException ex) { themeDir = null; } break; } } if (themeDir == null) { String filename = "resources/metacity/" + arg + "/metacity-1/metacity-theme-1.xml"; URL url = getClass().getResource(filename); if (url != null) { String str = url.toString(); try { themeDir = new URL(str.substring(0, str.lastIndexOf('/'))+"/"); } catch (MalformedURLException ex) { themeDir = null; } } } return themeDir; } else if (type == GET_USER_THEME) { try { // Set userHome here because we need the privilege userHome = System.getProperty("user.home"); String theme = System.getProperty("swing.metacitythemename"); if (theme != null) { return theme; } // Note: this is a small file (< 1024 bytes) so it's not worth // starting an XML parser or even to use a buffered reader. URL url = new URL(new File(userHome).toURL(), ".gconf/apps/metacity/general/%25gconf.xml"); // Pending: verify character encoding spec for gconf 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) { String strLowerCase = str.toLowerCase(); int i = strLowerCase.indexOf("<entry name=\"theme\""); if (i >= 0) { i = strLowerCase.indexOf("<stringvalue>", i); if (i > 0) { i += "<stringvalue>".length(); int i2 = str.indexOf("<", i); return str.substring(i, i2); } } } } catch (MalformedURLException ex) { // OK to just ignore. We'll use a fallback theme. } catch (IOException ex) { // OK to just ignore. We'll use a fallback theme. } return null; } else if (type == GET_IMAGE) { return new ImageIcon((URL)arg).getImage(); } else { return null; } } } private static URL getThemeDir(String themeName) { return (URL)new Privileged().doPrivileged(Privileged.GET_THEME_DIR, themeName); } private static String getUserTheme() { return (String)new Privileged().doPrivileged(Privileged.GET_USER_THEME, 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]; if (i+1 < alphas.length) { alpha += 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); } private HashMap<String, Image> images = new HashMap(); protected Image getImage(String key, Color c) { Image image = images.get(key+"-"+c.getRGB()); if (image == null) { image = imageFilter.colorize(getImage(key), c); if (image != null) { images.put(key+"-"+c.getRGB(), image); } } return image; } protected Image getImage(String key) { Image image = images.get(key); if (image == null) { if (themeDir != null) { try { URL url = new URL(themeDir, key); image = (Image)new Privileged().doPrivileged(Privileged.GET_IMAGE, url); } catch (MalformedURLException ex) { //log("Bad image url: "+ themeDir + "/" + key); } } if (image != null) { images.put(key, image); } } return image; } 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 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; } Dimension buttonDim = calculateButtonSize(titlePane); Insets title_border = (Insets)getFrameGeometry().get("title_border"); Insets button_border = (Insets)getFrameGeometry().get("button_border"); // Calculate width. int width = getInt("left_titlebar_edge") + buttonDim.width + getInt("right_titlebar_edge"); if (title_border != null) { width += title_border.left + title_border.right; } if (frame.isClosable()) { width += buttonDim.width; } if (frame.isMaximizable()) { width += buttonDim.width; } if (frame.isIconifiable()) { width += buttonDim.width; } FontMetrics fm = frame.getFontMetrics(titlePane.getFont()); String frameTitle = frame.getTitle(); int title_w = frameTitle != null ? SwingUtilities2.stringWidth( frame, fm, 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 = SwingUtilities2.stringWidth( frame, fm, frameTitle.substring(0, 3) + "..."); width += (title_w < subtitle_w) ? title_w : subtitle_w; } else { width += title_w; } // Calculate height. int titleHeight = fm.getHeight() + getInt("title_vertical_pad"); if (title_border != null) { titleHeight += title_border.top + title_border.bottom; } int buttonHeight = buttonDim.height; if (button_border != null) { buttonHeight += button_border.top + button_border.bottom; } int height = Math.max(buttonHeight, titleHeight); 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; } Map gm = 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; Insets button_border = (Insets)gm.get("button_border"); Dimension buttonDim = calculateButtonSize(titlePane); int x = getInt("left_titlebar_edge"); int y = (button_border != null) ? button_border.top : 0; menuButton.setBounds(x, y, buttonDim.width, buttonDim.height); x = w - buttonDim.width - getInt("right_titlebar_edge"); if (button_border != null) { x -= button_border.right; } if (frame.isClosable()) { closeButton.setBounds(x, y, buttonDim.width, buttonDim.height); x -= (buttonDim.width + buttonGap); } if (frame.isMaximizable()) { maximizeButton.setBounds(x, y, buttonDim.width, buttonDim.height); x -= (buttonDim.width + buttonGap); } if (frame.isIconifiable()) { minimizeButton.setBounds(x, y, buttonDim.width, buttonDim.height); } } } // end TitlePaneLayout protected Map getFrameGeometry() { return frameGeometry; } protected void setFrameGeometry(JComponent titlePane, Map gm) { this.frameGeometry = gm; if (getInt("top_height") == 0 && titlePane != null) { gm.put("top_height", new Integer(titlePane.getHeight())); } } protected int getInt(String key) { Integer i = (Integer)frameGeometry.get(key); if (i == null) { i = variables.get(key); } return (i != null) ? i.intValue() : 0; } protected boolean getBoolean(String key, boolean fallback) { Boolean b = (Boolean)frameGeometry.get(key); return (b != null) ? b.booleanValue() : fallback; } protected void drawArc(Node node, Graphics g) { NamedNodeMap attrs = node.getAttributes(); Color color = parseColor(getStringAttr(attrs, "color")); int x = aee.evaluate(getStringAttr(attrs, "x")); int y = aee.evaluate(getStringAttr(attrs, "y")); int w = aee.evaluate(getStringAttr(attrs, "width")); int h = aee.evaluate(getStringAttr(attrs, "height")); int start_angle = aee.evaluate(getStringAttr(attrs, "start_angle")); int extent_angle = aee.evaluate(getStringAttr(attrs, "extent_angle")); boolean filled = getBooleanAttr(node, "filled", false); if (getInt("width") == -1) { x -= w; } if (getInt("height") == -1) { y -= h; } g.setColor(color); if (filled) { g.fillArc(x, y, w, h, start_angle, extent_angle); } else { g.drawArc(x, y, w, h, start_angle, extent_angle); } } protected void drawLine(Node node, Graphics g) { NamedNodeMap attrs = node.getAttributes(); Color color = parseColor(getStringAttr(attrs, "color")); int x1 = aee.evaluate(getStringAttr(attrs, "x1")); int y1 = aee.evaluate(getStringAttr(attrs, "y1"));
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?