You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by le...@apache.org on 2002/04/04 10:07:05 UTC

cvs commit: jakarta-avalon-excalibur/instrument-client/src/java/org/apache/avalon/excalibur/instrument/client LargeMenu.java MenuBar.java

leif        02/04/04 00:07:05

  Modified:    instrument-client/src/java/org/apache/avalon/excalibur/instrument/client
                        MenuBar.java
  Added:       instrument-client/src/java/org/apache/avalon/excalibur/instrument/client
                        LargeMenu.java
  Log:
  We had a case where the menu was very large and was not being displayed
  correctly with the default JMenu implementation.  The new one positions large
  menus correctly.
  
  Revision  Changes    Path
  1.7       +8 -8      jakarta-avalon-excalibur/instrument-client/src/java/org/apache/avalon/excalibur/instrument/client/MenuBar.java
  
  Index: MenuBar.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/instrument-client/src/java/org/apache/avalon/excalibur/instrument/client/MenuBar.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- MenuBar.java	3 Apr 2002 13:48:48 -0000	1.6
  +++ MenuBar.java	4 Apr 2002 08:07:05 -0000	1.7
  @@ -30,7 +30,7 @@
   /**
    *
    * @author <a href="mailto:leif@tanukisoftware.com">Leif Mortenson</a>
  - * @version CVS $Revision: 1.6 $ $Date: 2002/04/03 13:48:48 $
  + * @version CVS $Revision: 1.7 $ $Date: 2002/04/04 08:07:05 $
    * @since 4.1
    */
   public class MenuBar
  @@ -69,7 +69,7 @@
        *-------------------------------------------------------------*/
       private JMenu buildFileMenu()
       {
  -        m_menuFile = new JMenu( "File" );
  +        m_menuFile = (JMenu)new LargeMenu( "File" );
           m_menuFile.setMnemonic( 'F' );
           
           
  @@ -150,7 +150,7 @@
   
       private JMenu buildInstrumentManagerMenu()
       {
  -        m_menuInstrumentManagers = new JMenu( "Instrument Managers" );
  +        m_menuInstrumentManagers = new LargeMenu( "Instrument Managers" );
           m_menuInstrumentManagers.setMnemonic( 'I' );
   
           m_menuInstrumentManagers.addMenuListener( new MenuListener()
  @@ -208,7 +208,7 @@
                   };
                   action.putValue( "InstrumentManagerConnection", connection );
                   
  -                JMenu menu = new JMenu( action );
  +                JMenu menu = new LargeMenu( action );
   
                   // Set up a Listener to handle the selected event.
                   menu.addMenuListener( new MenuListener()
  @@ -312,7 +312,7 @@
                           action.putValue( "InstrumentManagerConnection", connection );
                           action.putValue( "InstrumentableDescriptor", descriptor );
           
  -                        JMenu menu = new JMenu( action );
  +                        JMenu menu = new LargeMenu( action );
           
                           // Set up a Listener to handle the selected event.
                           menu.addMenuListener( new MenuListener()
  @@ -382,7 +382,7 @@
                       action.putValue( "InstrumentableDescriptor", instrumentableDescriptor );
                       action.putValue( "InstrumentDescriptor", descriptor );
       
  -                    JMenu menu = new JMenu( action );
  +                    JMenu menu = new LargeMenu( action );
       
                       // Set up a Listener to handle the selected event.
                       menu.addMenuListener( new MenuListener()
  @@ -536,7 +536,7 @@
   
       private JMenu buildOptionsMenu()
       {
  -        m_menuOptions = new JMenu( "Options" );
  +        m_menuOptions = new LargeMenu( "Options" );
           m_menuOptions.setMnemonic( 'O' );
   
           // Show Unconfigured Profilables option
  @@ -549,7 +549,7 @@
   
       private JMenu buildWindowMenu()
       {
  -        m_menuWindow = new JMenu( "Window" );
  +        m_menuWindow = new LargeMenu( "Window" );
           m_menuWindow.setMnemonic( 'W' );
   
           m_menuWindow.addMenuListener( new MenuListener()
  
  
  
  1.1                  jakarta-avalon-excalibur/instrument-client/src/java/org/apache/avalon/excalibur/instrument/client/LargeMenu.java
  
  Index: LargeMenu.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.avalon.excalibur.instrument.client;
  
  import java.awt.Container;
  import java.awt.Dimension;
  import java.awt.Point;
  import java.awt.Toolkit;
  
  import javax.swing.Action;
  import javax.swing.JMenu;
  import javax.swing.JPopupMenu;
  import javax.swing.SwingUtilities;
  
  /**
   * The default JMenu class does not work correctly when the popup menu contains
   *  large numbers of elements.
   *
   * @author <a href="mailto:leif@tanukisoftware.com">Leif Mortenson</a>
   * @version CVS $Revision: 1.1 $ $Date: 2002/04/04 08:07:05 $
   * @since 4.1
   */
  public class LargeMenu
      extends JMenu
  {
      /*---------------------------------------------------------------
       * Constructors
       *-------------------------------------------------------------*/
      /**
       * Constructs a new <code>JMenu</code> with no text.
       */
      public LargeMenu()
      {
          super();
      }
      
      /**
       * Constructs a new <code>JMenu</code> with the supplied string
       * as its text.
       *
       * @param s  the text for the menu label
       */
      public LargeMenu( String s )
      {
          super( s );
      }
      
      /**
       * Constructs a menu whose properties are taken from the 
       * <code>Action</code> supplied.
       * @param a an <code>Action</code>
       */
      public LargeMenu( Action a )
      {
          super( a );
      }
      
      /**
       * Constructs a new <code>JMenu</code> with the supplied string as
       * its text and specified as a tear-off menu or not.
       *
       * @param s the text for the menu label
       * @param b can the menu be torn off (not yet implemented)
       */
      public LargeMenu( String s, boolean b )
      {
          super( s, b );
      }
  
      /*---------------------------------------------------------------
       * JMenu Methods
       *-------------------------------------------------------------*/
      /**
       * Computes the origin for the <code>JMenu</code>'s popup menu.
       * <p>
       * Code is copied from JDK1.3 source, but has been patched.
       *
       * @return a <code>Point</code> in the coordinate space of the
       *		menu which should be used as the origin
       * 		of the <code>JMenu</code>'s popup menu
       */
      protected Point getPopupMenuOrigin()
      {
          int x = 0;
          int y = 0;
          JPopupMenu pm = getPopupMenu();
          // Figure out the sizes needed to caclulate the menu position
          Dimension screenSize =Toolkit.getDefaultToolkit().getScreenSize();
          Dimension s = getSize();
          Dimension pmSize = pm.getSize();
          // For the first time the menu is popped up, 
          // the size has not yet been initiated
          if (pmSize.width==0)
          {
              pmSize = pm.getPreferredSize();
          }
          Point position = getLocationOnScreen();
          
          Container parent = getParent();
          if (parent instanceof JPopupMenu)
          {
              // We are a submenu (pull-right)
              
              // Can not call SwingUtilities.isLeftToRight(this) from here, so assume true.
              // First determine x:
              if (position.x+s.width + pmSize.width < screenSize.width)
              {
                  x = s.width;         // Prefer placement to the right
              }
              else
              {
                  x = 0-pmSize.width;  // Otherwise place to the left
              }
              
              // Then the y:
              if (position.y+pmSize.height < screenSize.height)
              {
                  y = 0;                       // Prefer dropping down
              }
              else
              {
                  // ****************
                  // This code was patched.
                  // ****************
                  // Old Code:
                  // y = s.height-pmSize.height;  // Otherwise drop 'up'
                  
                  // New Code:
                  if ( position.y + s.height - pmSize.height >= 0 )
                  {
                      // Fits in the screen when dripped up.
                      y = s.height - pmSize.height;
                  }
                  else
                  {
                      // Does not fit, so show it starting at the top of the screen.
                      // This is an offset.
                      y = 0 - position.y;
                  }
              }
          } else {
              // We are a toplevel menu (pull-down)
              
              // Can not call SwingUtilities.isLeftToRight(this) from here, so assume true.
              // First determine the x:
              if (position.x+pmSize.width < screenSize.width) {
                  x = 0;                     // Prefer extending to right 
              } else {
                  x = s.width-pmSize.width;  // Otherwise extend to left
              }
              
              // Then the y:
              if (position.y+s.height+pmSize.height < screenSize.height) {
                  y = s.height;          // Prefer dropping down
              } else {
                  // ****************
                  // This code was patched.
                  // ****************
                  // Old Code:
                  //y = 0-pmSize.height;   // Otherwise drop 'up'
                  
                  // New Code:
                  if ( position.y - pmSize.height >= 0 )
                  {
                      // Fits in the screen when dripped up.
                      y = 0 - pmSize.height;
                  }
                  else
                  {
                      // Does not fit, so show it starting at the top of the screen.
                      // This is an offset.
                      y = 0 - position.y;
                  }
              }
          }
          return new Point(x,y);
      }
  }
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>