/*

* Drawer.java

*

* Created on June 8, 2007, 11:52 PM

*

* To change this template, choose Tools | Template Manager

* and open the template in the editor.

*/

package dyno.swing.beans;


import java.awt.AlphaComposite;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.Image;

import java.awt.Rectangle;


import javax.swing.JComponent;



/**

* 该类是个辅助类,目的是实现动画状态时透明图像及组件的移动效果

* 像是一个抽屉,放应用程序的组件

*

* @author William Chen

*/

class Drawer extends JComponent {

   //目前抽屉抽开比例,同时是透明度值

   private double ratio = 1.0;


   //目前是否处于动画状态

   private boolean animating;


   //应用程序的组件

   private JComponent content;


   //保存有应用程序组件的虚屏图像

   private Image offImage;


   /** Creates a new instance of Drawer */

   Drawer(double r, JComponent comp) {

       this.ratio = r;

       this.content = comp;

       add(comp);

       setLayout(null);

   }


   int getContentHeight() {

       return content.getHeight();

   }


   int getContentWidth() {

       return content.getWidth();

   }

   void setContentWidth(int w){

       Rectangle bounds=content.getBounds();

       bounds.width=w;

       content.setBounds(bounds);

   }

   void setRatio(double ratio) {

       this.ratio = ratio;

       repaint();

   }


   double getRatio() {

       return this.ratio;

   }


   //覆盖父类的paintChildren

   protected void paintChildren(Graphics g) {

       if (animating) {

           //动画状态画出当前透明的应用程序组件以及抽拉状态

           Graphics2D g2d = (Graphics2D) g;

           g2d.setComposite(AlphaComposite.getInstance(

                   AlphaComposite.SRC_OVER, (float) ratio));

           g2d.drawImage(getOffImage(), 0, getHeight() - content.getHeight(),

               this);

       } else {

           //普通状态简单使用容器缺省的渲染

           super.paintChildren(g);

       }

   }


   void clearOffImage() {

       offImage = null;

   }


   void setAnimating(boolean animating) {

       this.animating = animating;

   }


   //创建应用程序组件的虚屏图像

   private Image getOffImage() {

       if (offImage == null) {

           int contentWidth = content.getWidth();

           int contentHeight = content.getHeight();


           if (offImage == null) {

               offImage = createImage(contentWidth, contentHeight);


               Graphics g = offImage.getGraphics();

               //使用Renderer机制

               content.paint(g);

           }

       }


       return offImage;

   }

}