home *** CD-ROM | disk | FTP | other *** search
/ BUG 4 / BUGCD1997_05.BIN / aplic / visualj / vjtrial.exe / RCDATA / CABINET / devjava.pkg / TEMPLATE / 106 < prev   
Text File  |  1997-01-28  |  5KB  |  162 lines

  1. // This is a part of the Microsoft Visual J++ library.
  2. // Copyright (C) 1996 Microsoft Corporation
  3. // All rights reserved.
  4.  
  5. import java.util.Hashtable;
  6. import java.awt.LayoutManager;
  7. import java.awt.Component;
  8. import java.awt.Container;
  9. import java.awt.Dimension;
  10. import java.awt.Rectangle;
  11. import java.awt.FontMetrics;
  12. import java.awt.Insets;
  13. import java.awt.Label;
  14.  
  15. //
  16. // class DialogLayout
  17. //
  18. // DialogLayout is a simple layout manager which works with what the Win32
  19. // API calls "dialog logical units" (DLUs).  DLUs are resolution independent
  20. // coordinates which work well for laying out controls on a dialog box.  The
  21. // mapping from DLUs to pixels is based on the font in use in the dialog box.
  22. // An x-coordinate DLU is described as 1/4 (.25) of the of the average character
  23. // width of the font used in the dialog.  A y-coordinate DLU is described as
  24. // 1/8 (.125) of the character height used in the dialog.  One tricky issue to
  25. // note: The average character width is not the average of all characters --
  26. // rather it is the average of all alpha characters both uppercase and
  27. // lowercase. That is, it is the extent of the string "a...zA...Z" divided
  28. // by 52.
  29. //
  30. // This class allows you to associate a Rectangle (x, y, width, height) with a
  31. // Component in a Container.  If called upon to layout the container, this
  32. // layout manager will layout based on the translation of dialog units to
  33. // pixels.
  34. //
  35.  
  36. public class DialogLayout
  37.     implements LayoutManager
  38. {
  39.     protected Hashtable m_map = new Hashtable();
  40.     protected int m_width;
  41.     protected int m_height;
  42.  
  43.     // DialogLayout methods
  44.  
  45.     public DialogLayout(Container parent, int width, int height)
  46.     {
  47.         Construct(parent, width, height);
  48.     }
  49.  
  50.     public DialogLayout(Container parent, Dimension d)
  51.     {
  52.         Construct(parent, d.width, d.height);
  53.     }
  54.  
  55.     public void setShape(Component comp, int x, int y, int width, int height)
  56.     {
  57.         m_map.put(comp, new Rectangle(x, y, width, height));
  58.     }
  59.  
  60.     public void setShape(Component comp, Rectangle rect)
  61.     {
  62.         m_map.put(comp, new Rectangle(rect.x, rect.y, rect.width, rect.height));
  63.     }
  64.  
  65.     public Rectangle getShape(Component comp)
  66.     {
  67.         Rectangle rect = (Rectangle)m_map.get(comp);
  68.         return new Rectangle(rect.x, rect.y, rect.width, rect.height);
  69.     }
  70.  
  71.     public Dimension getDialogSize()
  72.     {
  73.         return new Dimension(m_width, m_height);
  74.     }
  75.  
  76.     // LayoutManager Methods
  77.  
  78.     public void addLayoutComponent(String name, Component comp) { }
  79.     public void removeLayoutComponent(Component comp) { }
  80.  
  81.     public Dimension preferredLayoutSize(Container parent)
  82.     {
  83.         return new Dimension(m_width, m_height);
  84.     }
  85.  
  86.     public Dimension minimumLayoutSize(Container parent)
  87.     {
  88.         return new Dimension(m_width, m_height);
  89.     }
  90.  
  91.     public void layoutContainer(Container parent)
  92.     {
  93.         int count = parent.countComponents();
  94.         Rectangle rect = new Rectangle();
  95.         int charHeight = getCharHeight(parent);
  96.         int charWidth = getCharWidth(parent);
  97.         Insets insets = parent.insets();
  98.         FontMetrics m = parent.getFontMetrics(parent.getFont());
  99.         
  100.         for (int i = 0; i < count; i++)
  101.         {
  102.             Component c = parent.getComponent(i);
  103.             Rectangle r = (Rectangle)m_map.get(c);
  104.             if (r != null)
  105.             {
  106.                 rect.x = r.x;
  107.                 rect.y = r.y;
  108.                 rect.height = r.height;
  109.                 rect.width = r.width;
  110.                 mapRectangle(rect, charWidth, charHeight);
  111.                 if (c instanceof Label)
  112.                 {
  113.                     // Adjusts for space at left of Java labels.
  114.                     rect.x     -= 12;
  115.                     rect.width += 12;
  116.                 }
  117.  
  118.                 rect.x += insets.left;
  119.                 rect.y += insets.top;
  120.                 c.reshape(rect.x, rect.y, rect.width, rect.height);
  121.             }
  122.         }
  123.     }
  124.  
  125.     // Implementation Helpers
  126.  
  127.     protected void Construct(Container parent, int width, int height)
  128.     {
  129.         Rectangle rect = new Rectangle(0, 0, width, height);
  130.         mapRectangle(rect, getCharWidth(parent), getCharHeight(parent));
  131.         m_width = rect.width;
  132.         m_height = rect.height;
  133.     }
  134.  
  135.     protected int getCharWidth(Container parent)
  136.     {
  137.         FontMetrics m = parent.getFontMetrics(parent.getFont());
  138.         String s     = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  139.         int    width = m.stringWidth(s) / s.length();
  140.  
  141.         if (width <= 0)
  142.             width = 1;
  143.         return width;
  144.     }
  145.  
  146.     protected int getCharHeight(Container parent)
  147.     {
  148.         FontMetrics m = parent.getFontMetrics(parent.getFont());
  149.         int height = m.getHeight();
  150.         return height;
  151.     }
  152.  
  153.     protected void mapRectangle(Rectangle rect, int charWidth, int charHeight)
  154.     {
  155.         rect.x      = (rect.x      * charWidth)  / 4;
  156.         rect.y      = (rect.y      * charHeight) / 8;
  157.         rect.width  = (rect.width  * charWidth)  / 4;
  158.         rect.height = (rect.height * charHeight) / 8;
  159.     }
  160. }
  161.  
  162.