OverlayListener.java :  » Game » TV-Browser-3.0 » util » ui » Java Open Source

Java Open Source » Game » TV Browser 3.0 
TV Browser 3.0 » util » ui » OverlayListener.java
package util.ui;

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;

import javax.swing.JComponent;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.event.MouseInputAdapter;
import javax.swing.tree.TreePath;

/**
 *  A OverlayListener
 *  
 *  This Class shows partially visible JTree Nodes in a
 *  GlassPane.
 *  
 *  This Class was found at Santosh's Blog:
 *  http://www.jroller.com/page/santhosh/20050522#partially_visible_jtree_nodes
 */
public class OverlayListener extends MouseInputAdapter{ 
  private JTree mTree; 
  private Component mOldGlassPane; 
  private TreePath mPath; 
  private int mRow; 
  private Rectangle mBounds; 

  public OverlayListener(JTree tree){ 
      this.mTree = tree; 
      tree.addMouseListener(this); 
      tree.addMouseMotionListener(this); 
  } 

  JComponent c = new JComponent(){ 
      public void paint(Graphics g){ 
          boolean selected = mTree.isRowSelected(mRow); 
          Component renderer = mTree.getCellRenderer().getTreeCellRendererComponent(mTree, mPath.getLastPathComponent(), 
                  mTree.isRowSelected(mRow), mTree.isExpanded(mRow), mTree.getModel().isLeaf(mPath.getLastPathComponent()), mRow, 
                  selected);
          
          if(renderer instanceof JComponent) {
            ((JComponent)renderer).setOpaque(false);
          }
          
          c.setFont(mTree.getFont()); 
          Rectangle paintBounds = SwingUtilities.convertRectangle(mTree, mBounds, this);
          
          
          if(UIManager.getLookAndFeel().getClass().getCanonicalName().equals("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel")) {
            Color current = g.getColor();
            
            if(selected) {
              g.setColor(UIManager.getColor("Tree.selectionBackground"));
            }
            else {
              g.setColor(mTree.getBackground());
            }
            
            g.fillRect(paintBounds.x,paintBounds.y,paintBounds.width,paintBounds.height);
            
            g.setColor(current);
          }
          
          SwingUtilities.paintComponent(g, renderer, this, paintBounds); 
          
          if(selected) 
              return; 

          g.setColor(Color.blue); 
          ((Graphics2D)g).draw(paintBounds); 
       } 
  }; 

  public void mouseExited(MouseEvent e){ 
      resetGlassPane(); 
  } 

  private void resetGlassPane(){ 
      if(mOldGlassPane!=null){ 
          c.setVisible(false); 
          mTree.getRootPane().setGlassPane(mOldGlassPane); 
          mOldGlassPane = null; 
      } 
  } 

  public void mousePressed(MouseEvent e) {
    resetGlassPane();
    super.mousePressed(e);
  }
  
  public void mouseMoved(MouseEvent me){ 
      mPath = mTree.getPathForLocation(me.getX(), me.getY()); 
      if(mPath==null){ 
          resetGlassPane(); 
          return; 
      } 
      mRow = mTree.getRowForPath(mPath); 
      mBounds = mTree.getPathBounds(mPath); 
      if(!mTree.getVisibleRect().contains(mBounds)){ 
          if(mOldGlassPane==null){ 
              mOldGlassPane = mTree.getRootPane().getGlassPane(); 
              c.setOpaque(false); 
              mTree.getRootPane().setGlassPane(c); 
              c.setVisible(true); 
          }else 
              mTree.getRootPane().repaint(); 
      }else{ 
          resetGlassPane(); 
      } 
  } 
} 
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.