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 + -
显示快捷键?