FileDocCategorySizeDatePackage
MotifGraphicsUtils.javaAPI DocJava SE 5 API14967Fri Aug 26 14:54:46 BST 2005com.sun.java.swing.plaf.motif

MotifGraphicsUtils

public class MotifGraphicsUtils extends Object implements SwingConstants

Fields Summary
private static final String
MAX_ACC_WIDTH
Constructors Summary
Methods Summary
public static voiddrawGroove(java.awt.Graphics g, int x, int y, int w, int h, java.awt.Color shadow, java.awt.Color highlight)

        Color oldColor = g.getColor();  // Make no net change to g
        g.translate(x, y);

        g.setColor(shadow);
        g.drawRect(0, 0, w-2, h-2);

        g.setColor(highlight);
        g.drawLine(1, h-3, 1, 1);
        g.drawLine(1, 1, w-3, 1);

        g.drawLine(0, h-1, w-1, h-1);
        g.drawLine(w-1, h-1, w-1, 0);

        g.translate(-x, -y);
        g.setColor(oldColor);
    
private static voiddrawMenuBezel(java.awt.Graphics g, java.awt.Color background, int x, int y, int width, int height)

      // shadowed button region
      g.setColor(background);
      g.fillRect(x,y,width,height);

      g.setColor(background.brighter().brighter());
      g.drawLine(x+1,       y+height-1,  x+width-1, y+height-1);
      g.drawLine(x+width-1, y+height-2,  x+width-1, y+1);
            
      g.setColor(background.darker().darker());
      g.drawLine(x,   y,   x+width-2, y);
      g.drawLine(x,   y+1, x,         y+height-2);
      
    
static voiddrawPoint(java.awt.Graphics g, int x, int y)
Draws the point (x, y) in the current color.

    
                  
            
        g.drawLine(x, y, x, y);
    
public static voiddrawStringInRect(java.awt.Graphics g, java.lang.String aString, int x, int y, int width, int height, int justification)
Draws aString in the rectangle defined by (x, y, width, height). justification specifies the text's justification, one of LEFT, CENTER, or RIGHT. drawStringInRect() does not clip to the rectangle, but instead uses this rectangle and the desired justification to compute the point at which to begin drawing the text.

see
#drawString

        drawStringInRect(null, g, aString, x, y, width, height, justification);
    
static voiddrawStringInRect(javax.swing.JComponent c, java.awt.Graphics g, java.lang.String aString, int x, int y, int width, int height, int justification)

        FontMetrics  fontMetrics;
        int          drawWidth, startX, startY, delta;

        if (g.getFont() == null) {
//            throw new InconsistencyException("No font set");
            return;
        }
        fontMetrics = SwingUtilities2.getFontMetrics(c, g);
        if (fontMetrics == null) {
//            throw new InconsistencyException("No metrics for Font " + font());
            return;
        }

        if (justification == CENTER) {
            drawWidth = SwingUtilities2.stringWidth(c, fontMetrics, aString);
            if (drawWidth > width) {
                drawWidth = width;
            }
            startX = x + (width - drawWidth) / 2;
        } else if (justification == RIGHT) {
            drawWidth = SwingUtilities2.stringWidth(c, fontMetrics, aString);
            if (drawWidth > width) {
                drawWidth = width;
            }
            startX = x + width - drawWidth;
        } else {
            startX = x;
        }

        delta = (height - fontMetrics.getAscent() - fontMetrics.getDescent()) / 2;
        if (delta < 0) {
            delta = 0;
        }

        startY = y + height - delta - fontMetrics.getDescent();

        SwingUtilities2.drawString(c, g, aString, startX, startY);
    
static booleanisLeftToRight(java.awt.Component c)

	return c.getComponentOrientation().isLeftToRight();
    
private static java.lang.StringlayoutMenuItem(javax.swing.JComponent c, java.awt.FontMetrics fm, java.lang.String text, java.awt.FontMetrics fmAccel, java.lang.String acceleratorText, javax.swing.Icon icon, javax.swing.Icon checkIcon, javax.swing.Icon arrowIcon, int verticalAlignment, int horizontalAlignment, int verticalTextPosition, int horizontalTextPosition, java.awt.Rectangle viewR, java.awt.Rectangle iconR, java.awt.Rectangle textR, java.awt.Rectangle acceleratorR, java.awt.Rectangle checkIconR, java.awt.Rectangle arrowIconR, int textIconGap, int menuItemGap)
Compute and return the location of the icons origin, the location of origin of the text baseline, and a possibly clipped version of the compound labels string. Locations are computed relative to the viewR rectangle.


        SwingUtilities.layoutCompoundLabel(c,
                                           fm,
                                           text,
                                           icon,
                                           verticalAlignment, 
                                           horizontalAlignment,
                                           verticalTextPosition, 
                                           horizontalTextPosition,
                                           viewR,
                                           iconR,
                                           textR, 
                                           textIconGap);

        /* Initialize the acceelratorText bounds rectangle textR.  If a null 
         * or and empty String was specified we substitute "" here 
         * and use 0,0,0,0 for acceleratorTextR.
         */
        if( (acceleratorText == null) || acceleratorText.equals("") ) {
            acceleratorR.width = acceleratorR.height = 0;
            acceleratorText = "";
        }
        else {
            acceleratorR.width
                = SwingUtilities2.stringWidth(c, fmAccel, acceleratorText);
            acceleratorR.height = fmAccel.getHeight();
        }

        /* Initialize the checkIcon bounds rectangle checkIconR.
         */

        if (checkIcon != null) {
            checkIconR.width = checkIcon.getIconWidth();
            checkIconR.height = checkIcon.getIconHeight();
        } 
        else {
            checkIconR.width = checkIconR.height = 0;
        }

        /* Initialize the arrowIcon bounds rectangle arrowIconR.
         */

        if (arrowIcon != null) {
            arrowIconR.width = arrowIcon.getIconWidth();
            arrowIconR.height = arrowIcon.getIconHeight();
        } 
        else {
            arrowIconR.width = arrowIconR.height = 0;
        }
        

        Rectangle labelR = iconR.union(textR);
        if( MotifGraphicsUtils.isLeftToRight(c) ) {
            textR.x += checkIconR.width + menuItemGap;
            iconR.x += checkIconR.width + menuItemGap;

            // Position the Accelerator text rect
            acceleratorR.x = viewR.x + viewR.width - arrowIconR.width 
                             - menuItemGap - acceleratorR.width;

            // Position the Check and Arrow Icons
            checkIconR.x = viewR.x;
            arrowIconR.x = viewR.x + viewR.width - menuItemGap
                           - arrowIconR.width;
        } else {
            textR.x -= (checkIconR.width + menuItemGap);
            iconR.x -= (checkIconR.width + menuItemGap);

            // Position the Accelerator text rect
            acceleratorR.x = viewR.x + arrowIconR.width + menuItemGap;

            // Position the Check and Arrow Icons
            checkIconR.x = viewR.x + viewR.width - checkIconR.width;
            arrowIconR.x = viewR.x + menuItemGap;       
        }
        
        // Align the accelertor text and the check and arrow icons vertically
        // with the center of the label rect.  
        acceleratorR.y = labelR.y + (labelR.height/2) - (acceleratorR.height/2);
        arrowIconR.y = labelR.y + (labelR.height/2) - (arrowIconR.height/2);
        checkIconR.y = labelR.y + (labelR.height/2) - (checkIconR.height/2);
        
        /*
          System.out.println("Layout: v=" +viewR+"  c="+checkIconR+" i="+
          iconR+" t="+textR+" acc="+acceleratorR+" a="+arrowIconR);
          */
        return text;
    
public static voidpaintMenuItem(java.awt.Graphics g, javax.swing.JComponent c, javax.swing.Icon checkIcon, javax.swing.Icon arrowIcon, java.awt.Color background, java.awt.Color foreground, int defaultTextIconGap)


        JMenuItem b = (JMenuItem) c;
	ButtonModel model = b.getModel();
	
	Dimension size = b.getSize();
	Insets i = c.getInsets();
	
	Rectangle viewRect = new Rectangle(size);
	
	viewRect.x += i.left;
	viewRect.y += i.top;
	viewRect.width -= (i.right + viewRect.x);
	viewRect.height -= (i.bottom + viewRect.y);
	
	Rectangle iconRect = new Rectangle();
	Rectangle textRect = new Rectangle();
	Rectangle acceleratorRect = new Rectangle();
	Rectangle checkRect = new Rectangle();
	Rectangle arrowRect = new Rectangle();
	
	Font holdf = g.getFont();
	Font f = c.getFont();
	g.setFont(f);
	FontMetrics fm = SwingUtilities2.getFontMetrics(c, g, f);
	FontMetrics fmAccel = SwingUtilities2.getFontMetrics(
            c, g, UIManager.getFont("MenuItem.acceleratorFont"));
	
	if (c.isOpaque()) {
	    if (model.isArmed()|| (c instanceof JMenu && model.isSelected())) {
		g.setColor(background);
	    } else {
		g.setColor(c.getBackground());
	    }
	    g.fillRect(0,0, size.width, size.height);
	}
	
	// get Accelerator text
	KeyStroke accelerator =  b.getAccelerator();
	String acceleratorText = "";
	if (accelerator != null) {
	    int modifiers = accelerator.getModifiers();
	    if (modifiers > 0) {
		acceleratorText = KeyEvent.getKeyModifiersText(modifiers);
		acceleratorText += "+";
	    }
	    acceleratorText += KeyEvent.getKeyText(accelerator.getKeyCode());
	}
	
	// layout the text and icon
	String text = layoutMenuItem(c, fm, b.getText(), fmAccel,
				     acceleratorText, b.getIcon(),
				     checkIcon, arrowIcon,
				     b.getVerticalAlignment(), 
				     b.getHorizontalAlignment(),
				     b.getVerticalTextPosition(), 
				     b.getHorizontalTextPosition(),
				     viewRect, iconRect, 
				     textRect, acceleratorRect,
				     checkRect, arrowRect,
				     b.getText() == null 
				     ? 0 : defaultTextIconGap,
				     defaultTextIconGap
				     );
	
	// Paint the Check
	Color holdc = g.getColor();
	if (checkIcon != null) {
	    if(model.isArmed() || (c instanceof JMenu && model.isSelected()))
		g.setColor(foreground);
	    checkIcon.paintIcon(c, g, checkRect.x, checkRect.y);
	    g.setColor(holdc);
	}
	
	// Paint the Icon
	if(b.getIcon() != null) { 
	    Icon icon;
	    if(!model.isEnabled()) {
		icon = (Icon) b.getDisabledIcon();
	    } else if(model.isPressed() && model.isArmed()) {
		icon = (Icon) b.getPressedIcon();
		if(icon == null) {
		    // Use default icon
		    icon = (Icon) b.getIcon();
		} 
	    } else {
		icon = (Icon) b.getIcon();
	    }
	    
	    if (icon!=null) {
		icon.paintIcon(c, g, iconRect.x, iconRect.y);
	    }
	}
	
	// Draw the Text
	if(text != null && !text.equals("")) {
	    // Once BasicHTML becomes public, use BasicHTML.propertyKey
	    // instead of the hardcoded string below!
	    View v = (View) c.getClientProperty("html");
	    if (v != null) {
		v.paint(g, textRect);
	    } else {
		int mnemIndex = b.getDisplayedMnemonicIndex();

		if(!model.isEnabled()) {
		    // *** paint the text disabled
		    g.setColor(b.getBackground().brighter());
		    SwingUtilities2.drawStringUnderlineCharAt(b, g,text,
                        mnemIndex,
                        textRect.x, textRect.y + fmAccel.getAscent());
		    g.setColor(b.getBackground().darker());
		    SwingUtilities2.drawStringUnderlineCharAt(b, g,text,
                        mnemIndex,
                        textRect.x - 1, textRect.y + fmAccel.getAscent() - 1);
		    
		} else {
		    // *** paint the text normally
		    if (model.isArmed()|| (c instanceof JMenu && model.isSelected())) {
			g.setColor(foreground);
		    } else {
			g.setColor(b.getForeground());
		    }
		    SwingUtilities2.drawStringUnderlineCharAt(b, g,text, 
						  mnemIndex,
						  textRect.x,
						  textRect.y + fm.getAscent());
		}
	    }
	}
	
	// Draw the Accelerator Text
	if(acceleratorText != null && !acceleratorText.equals("")) {

	    //Get the maxAccWidth from the parent to calculate the offset.
	    int accOffset = 0;
	    Container parent = b.getParent();
	    if (parent != null && parent instanceof JComponent) {
		JComponent p = (JComponent) parent;
		Integer maxValueInt = (Integer) p.getClientProperty(MotifGraphicsUtils.MAX_ACC_WIDTH);
		int maxValue = maxValueInt != null ?
                    maxValueInt.intValue() : acceleratorRect.width;
		
		//Calculate the offset, with which the accelerator texts will be drawn with.
		accOffset = maxValue - acceleratorRect.width;
	    }

	    g.setFont( UIManager.getFont("MenuItem.acceleratorFont") );
	    if(!model.isEnabled()) {
		// *** paint the acceleratorText disabled
		g.setColor(b.getBackground().brighter());
		SwingUtilities2.drawString(c, g,acceleratorText,
					      acceleratorRect.x - accOffset, acceleratorRect.y + fm.getAscent());
		g.setColor(b.getBackground().darker());
		SwingUtilities2.drawString(c, g,acceleratorText,
					      acceleratorRect.x - accOffset - 1, acceleratorRect.y + fm.getAscent() - 1);
	    } else {
		// *** paint the acceleratorText normally
		if (model.isArmed()|| (c instanceof JMenu && model.isSelected()))
		    {
			g.setColor(foreground);
		    } else {
			g.setColor(b.getForeground());
		    }
		SwingUtilities2.drawString(c, g,acceleratorText,
					      acceleratorRect.x - accOffset,
					      acceleratorRect.y + fmAccel.getAscent());
	    }
	}
	
	// Paint the Arrow
	if (arrowIcon != null) {
	    if(model.isArmed() || (c instanceof JMenu && model.isSelected()))
		g.setColor(foreground);
	    if( !(b.getParent() instanceof JMenuBar) )
		arrowIcon.paintIcon(c, g, arrowRect.x, arrowRect.y);
	}
	
	g.setColor(holdc);
	g.setFont(holdf);