001package ca.bc.webarts.widgets;
002
003import java.awt.Color;
004import java.awt.GraphicsDevice;
005import java.awt.GraphicsEnvironment;
006import java.awt.GridBagLayout;
007import java.awt.event.ActionEvent;
008import java.awt.event.ActionListener;
009import java.awt.event.ComponentAdapter;
010import java.awt.event.ComponentEvent;
011import java.awt.event.KeyEvent;
012import java.awt.event.MouseAdapter;
013import java.awt.event.MouseEvent;
014import java.awt.geom.Ellipse2D;
015
016import javax.swing.JFrame;
017import javax.swing.JTextArea;
018import javax.swing.JButton;
019import javax.swing.SwingUtilities;
020
021import   ca.bc.webarts.tools.Log ;
022
023
024public class TranslucentCircularFrame extends JFrame
025
026implements ActionListener
027{
028    final JButton butM =  new JButton("Move Me");
029    final JButton butX =  new JButton("Close Me");
030    int posX=0,posY=0;
031    Log log_ = null;
032
033
034  /**
035   * Creates a frame containing a text area and a button. The frame has a
036   * circular shape and a 75% opacity.
037   */
038  public TranslucentCircularFrame()
039  {
040    super("Translucent Circular Frame");
041    log_ = Log.createLog( Log.DEBUG );
042    log_.debug("TranslucentCircularFrame()","Instantiate");
043
044    setLayout(new GridBagLayout());
045    final JTextArea textArea = new JTextArea(3, 50);
046    textArea.setBackground(Color.GREEN);
047    add(textArea);
048    butM.setActionCommand("move");
049    butX.setActionCommand("close");
050    butM.addActionListener(this);
051    butX.addActionListener(this);
052    //add(butM);
053    add(butX);
054    setUndecorated(true);
055
056    // set the window's shape in the componentResized method, so
057    // that if the window is resized, the shape will be recalculated
058    addComponentListener(new ComponentAdapter()
059    {
060       Log log_ = null;
061      @Override
062      public void componentResized(ComponentEvent e)
063      {
064        log_ = Log.createLog( Log.DEBUG );
065        log_.startMethod();
066        setShape(new Ellipse2D.Double(0, 0, getWidth(), getHeight()));
067        log_.endMethod();
068      }
069    } );
070
071    // Now the Mouse listeners so we can drag it around
072    addMouseListener(new MouseAdapter()
073    {
074       Log log_ = null;
075       public void mousePressed(MouseEvent e)
076       {
077          log_ = Log.createLog( Log.DEBUG );
078          log_.startMethod();
079          posX=e.getX();
080          posY=e.getY();
081          log_.endMethod();
082       }
083    });
084    addMouseMotionListener(new MouseAdapter()
085    {
086       Log log_ = null;
087       public void mouseDragged(MouseEvent evt)
088       {
089          log_ = Log.createLog( Log.DEBUG );
090          log_.startMethod();
091          //sets frame position when mouse dragged
092          setLocation (evt.getXOnScreen()-posX,evt.getYOnScreen()-posY);
093          log_.endMethod();
094       }
095    });
096
097    // make the window translucent
098    setOpacity(0.45f);
099
100    setLocationRelativeTo(null);
101    setSize(400, 250);
102    setDefaultCloseOperation(EXIT_ON_CLOSE);
103    setVisible(true);
104    log_.debug("TranslucentCircularFrame()","END Instantiate");
105  }
106
107
108  public void actionPerformed(ActionEvent e)
109  {
110        log_.startMethod();
111    if ("close".equals(e.getActionCommand()))
112    {
113        this.setVisible(false);
114        this.dispose();
115    }
116    else
117    {
118    }
119        log_.endMethod();
120  }
121
122  public static void main(String[] args)
123  {
124
125    // Create the GUI on the event-dispatching thread
126    SwingUtilities.invokeLater(new Runnable()
127    {
128      @Override
129      public void run()
130      {
131        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
132
133        // check if the OS supports translucency
134        if (ge.getDefaultScreenDevice().isWindowTranslucencySupported (GraphicsDevice.WindowTranslucency.TRANSLUCENT))
135        {
136          new TranslucentCircularFrame();
137        }
138      }
139    } );
140  }
141}