255 lines · 8.2 KB · Java
RawDownload
/* * Copyright (c) 1998, 2009, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.  Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package javax.swing.plaf.metal; import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;import javax.swing.border.*;import javax.swing.plaf.basic.*;import java.beans.PropertyChangeListener;import java.beans.PropertyChangeEvent;import javax.swing.plaf.*; /** * Metal implementation of JInternalFrame. * <p> * * @author Steve Wilson */public class MetalInternalFrameUI extends BasicInternalFrameUI {   private static final PropertyChangeListener metalPropertyChangeListener =        new MetalPropertyChangeHandler();   private static final Border handyEmptyBorder = new EmptyBorder(0,0,0,0);   protected static String IS_PALETTE   = "JInternalFrame.isPalette";  private static String IS_PALETTE_KEY = "JInternalFrame.isPalette";  private static String FRAME_TYPE     = "JInternalFrame.frameType";  private static String NORMAL_FRAME   = "normal";  private static String PALETTE_FRAME  = "palette";  private static String OPTION_DIALOG  = "optionDialog";   public MetalInternalFrameUI(JInternalFrame b)   {    super(b);  }   public static ComponentUI createUI(JComponent c)    {      return new MetalInternalFrameUI( (JInternalFrame) c);  }   public void installUI(JComponent c) {    super.installUI(c);     Object paletteProp = c.getClientProperty(IS_PALETTE_KEY);    if ( paletteProp != null ) {        setPalette( ((Boolean)paletteProp).booleanValue() );    }     Container content = frame.getContentPane();    stripContentBorder(content);    //c.setOpaque(false);  }   public void uninstallUI(JComponent c) {      frame = (JInternalFrame)c;       Container cont = ((JInternalFrame)(c)).getContentPane();      if (cont instanceof JComponent) {        JComponent content = (JComponent)cont;        if ( content.getBorder() == handyEmptyBorder) {          content.setBorder(null);        }      }      super.uninstallUI(c);  }     protected void installListeners() {        super.installListeners();        frame.addPropertyChangeListener(metalPropertyChangeListener);    }     protected void uninstallListeners() {        frame.removePropertyChangeListener(metalPropertyChangeListener);        super.uninstallListeners();    }   protected void installKeyboardActions(){      super.installKeyboardActions();      ActionMap map = SwingUtilities.getUIActionMap(frame);      if (map != null) {          // BasicInternalFrameUI creates an action with the same name, we override          // it as Metal frames do not have system menus.          map.remove("showSystemMenu");      }  }   protected void uninstallKeyboardActions(){      super.uninstallKeyboardActions();  }     protected void uninstallComponents() {        titlePane = null;        super.uninstallComponents();    }   private void stripContentBorder(Object c) {        if ( c instanceof JComponent ) {            JComponent contentComp = (JComponent)c;            Border contentBorder = contentComp.getBorder();            if (contentBorder == null || contentBorder instanceof UIResource) {                contentComp.setBorder( handyEmptyBorder );            }        }  }    protected JComponent createNorthPane(JInternalFrame w) {      return new MetalInternalFrameTitlePane(w);  }    private void setFrameType( String frameType )  {      if ( frameType.equals( OPTION_DIALOG ) )      {          LookAndFeel.installBorder(frame, "InternalFrame.optionDialogBorder");          ((MetalInternalFrameTitlePane)titlePane).setPalette( false );      }      else if ( frameType.equals( PALETTE_FRAME ) )      {          LookAndFeel.installBorder(frame, "InternalFrame.paletteBorder");          ((MetalInternalFrameTitlePane)titlePane).setPalette( true );      }      else      {          LookAndFeel.installBorder(frame, "InternalFrame.border");          ((MetalInternalFrameTitlePane)titlePane).setPalette( false );      }  }   // this should be deprecated - jcs  public void setPalette(boolean isPalette) {    if (isPalette) {        LookAndFeel.installBorder(frame, "InternalFrame.paletteBorder");    } else {        LookAndFeel.installBorder(frame, "InternalFrame.border");    }    ((MetalInternalFrameTitlePane)titlePane).setPalette(isPalette);   }   private static class MetalPropertyChangeHandler implements        PropertyChangeListener  {      public void propertyChange(PropertyChangeEvent e)      {          String name = e.getPropertyName();          JInternalFrame jif = (JInternalFrame)e.getSource();           if (!(jif.getUI() instanceof MetalInternalFrameUI)) {              return;          }           MetalInternalFrameUI ui = (MetalInternalFrameUI)jif.getUI();           if ( name.equals( FRAME_TYPE ) )          {              if ( e.getNewValue() instanceof String )              {                  ui.setFrameType( (String) e.getNewValue() );              }          }          else if ( name.equals(IS_PALETTE_KEY) )          {              if ( e.getNewValue() != null )              {                  ui.setPalette( ((Boolean)e.getNewValue()).booleanValue() );              }              else              {                  ui.setPalette( false );              }          } else if ( name.equals( JInternalFrame.CONTENT_PANE_PROPERTY ) ) {              ui.stripContentBorder(e.getNewValue());          }      }  } // end class MetalPropertyChangeHandler      private class BorderListener1 extends BorderListener implements SwingConstants    {         Rectangle getIconBounds() {            boolean leftToRight = MetalUtils.isLeftToRight(frame);            int xOffset = leftToRight ? 5 : titlePane.getWidth() - 5;            Rectangle rect = null;             Icon icon = frame.getFrameIcon();            if ( icon != null ) {                if ( !leftToRight ) {                    xOffset -= icon.getIconWidth();                }                int iconY = ((titlePane.getHeight() / 2) - (icon.getIconHeight() /2));                rect = new Rectangle(xOffset, iconY,                    icon.getIconWidth(), icon.getIconHeight());            }            return rect;        }         public void mouseClicked(MouseEvent e) {            if (e.getClickCount() == 2 && e.getSource() == getNorthPane() &&                frame.isClosable() && !frame.isIcon()) {                Rectangle rect = getIconBounds();                if ((rect != null) && rect.contains(e.getX(), e.getY())) {                    frame.doDefaultCloseAction();                }                else {                    super.mouseClicked(e);                }            }            else {                super.mouseClicked(e);            }        }    };    /// End BorderListener Class      /**     * Returns the <code>MouseInputAdapter</code> that will be installed     * on the TitlePane.     *     * @param w the <code>JInternalFrame</code>     * @return the <code>MouseInputAdapter</code> that will be installed     * on the TitlePane.     * @since 1.6     */    protected MouseInputAdapter createBorderListener(JInternalFrame w) {        return new BorderListener1();    }}