/*
Swing Hacks Tips and Tools for Killer GUIs
By Joshua Marinacci, Chris Adamson
First Edition June 2005
Series: Hacks
ISBN: 0-596-00907-0
Pages: 542
website: http://www.oreilly.com/catalog/swinghks/
*/
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class CalendarHack extends JPanel {
protected Image background = new ImageIcon("calendar.png").getImage();
protected Image highlight = new ImageIcon("highlight.png").getImage();
protected Image day_img = new ImageIcon("day.png").getImage();
protected SimpleDateFormat month = new SimpleDateFormat("MMMM");
protected SimpleDateFormat year = new SimpleDateFormat("yyyy");
protected SimpleDateFormat day = new SimpleDateFormat("d");
protected Date date = new Date();
public void setDate(Date date) {
this.date = date;
}
public CalendarHack() {
this.setPreferredSize(new Dimension(300, 280));
}
public void paintComponent(Graphics g) {
((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.drawImage(background, 0, 0, null);
g.setColor(Color.black);
g.setFont(new Font("SansSerif", Font.PLAIN, 18));
g.drawString(month.format(date), 34, 36);
g.setColor(Color.white);
g.drawString(year.format(date), 235, 36);
Calendar today = Calendar.getInstance();
today.setTime(date);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.DATE, 1);
cal.add(Calendar.DATE, -cal.get(Calendar.DAY_OF_WEEK) + 1);
for (int week = 0; week < 6; week++) {
for (int d = 0; d < 7; d++) {
Image img = day_img;
Color col = Color.black;
// only draw if it's actually in this month
if (cal.get(Calendar.MONTH) == today.get(Calendar.MONTH)) {
if (cal.equals(today)) {
img = highlight;
col = Color.white;
}
g.drawImage(img, d * 30 + 46, week * 29 + 81, null);
g.drawString(day.format(cal.getTime()), d * 30 + 46 + 4, week * 29 + 81 + 20);
}
cal.add(Calendar.DATE, +1);
}
}
}
public static void main(String[] args) {
JFrame frame = new JFrame();
CalendarHack ch = new CalendarHack();
ch.setDate(new Date());
frame.getContentPane().add(ch);
frame.setUndecorated(true);
MoveMouseListener mml = new MoveMouseListener(ch);
ch.addMouseListener(mml);
ch.addMouseMotionListener(mml);
frame.pack();
frame.setVisible(true);
}
}
class MoveMouseListener implements MouseListener, MouseMotionListener {
JComponent target;
Point start_drag;
Point start_loc;
public MoveMouseListener(JComponent target) {
this.target = target;
}
public static JFrame getFrame(Container target) {
if (target instanceof JFrame) {
return (JFrame) target;
}
return getFrame(target.getParent());
}
Point getScreenLocation(MouseEvent e) {
Point cursor = e.getPoint();
Point target_location = this.target.getLocationOnScreen();
return new Point((int) (target_location.getX() + cursor.getX()),
(int) (target_location.getY() + cursor.getY()));
}
public void mouseClicked(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
this.start_drag = this.getScreenLocation(e);
this.start_loc = this.getFrame(this.target).getLocation();
}
public void mouseReleased(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
Point current = this.getScreenLocation(e);
Point offset = new Point((int) current.getX() - (int) start_drag.getX(), (int) current.getY()
- (int) start_drag.getY());
JFrame frame = this.getFrame(target);
Point new_location = new Point((int) (this.start_loc.getX() + offset.getX()),
(int) (this.start_loc.getY() + offset.getY()));
frame.setLocation(new_location);
}
public void mouseMoved(MouseEvent e) {
}
}