
import java.awt.*;
import java.awt.event.*;
import java.awt.image.ImageProducer;
import java.net.URL;
import java.util.Calendar;

@SuppressWarnings("serial")
public class Misaka extends Frame implements Runnable{
	Image[] im = new Image[2];
	Image waku = null;
	
	String[] week = new String[7];
	static int yea;
	static int mon;
	static int day;
	static int h;           //時を入れる変数を宣言
    static int m;           //分を入れる変数を宣言
    static int s;           //秒を入れる変数を宣言
    static int week_int;
    boolean a = true;
    Button[] b1 = new Button[5];
    Panel[] pnl = new Panel[1];
    boolean OnTop = true;
    boolean TopChecker;
    boolean BootCamp = false;
    boolean watch = true;
    int posX,posY;
    int character=0;
    boolean redraw=false;
 
    Calendar now = Calendar.getInstance();  
    public void Menu(){
    	if(OnTop==true){
        	this.setAlwaysOnTop(true);
        	b1[0].setLabel("最前表示On");
        }else if(OnTop==false){
        	this.setAlwaysOnTop(false);
        	b1[0].setLabel("最前表示OFF");
        }
    	if(BootCamp==true){
    		b1[1].setLabel("時差補正ON");
    	}else if(BootCamp==false){
    		b1[1].setLabel("時差補正OFF");
    	}
    	if(watch==true){
    		b1[2].setLabel("時計表示ON");
    	}else if(watch==false){
    		b1[2].setLabel("時計表示OFF");
    	}
    	if(character==0){
    		b1[3].setLabel("美琴にする");
    	}else if(character==1){
    		b1[3].setLabel("御坂妹にする");
    	}
    	b1[4].setLabel("終了");
    }
	public Misaka(){
		this.setSize(200,300);
		this.setBackground(new Color(0x00000000, true));//透過コード。Windowsは対応してないので黒になる。
		this.setUndecorated(true);						//枠無くします。windowsはデフォルトでは動かすことができないので外すこと奨励
		this.setLayout(null);
		pnl[0] = new Panel(new GridLayout(5 , 1));
		pnl[0].setLocation(100,30);
		pnl[0].setSize(90,120);
		pnl[0].setVisible(false);
		add(pnl[0]);
		for(int i=0;i<b1.length;i++){
			b1[i] = new Button("");
			b1[i].setSize(80,50);
			pnl[0].add(b1[i]);
		}
		b1[4].addActionListener(new MyActionAdapterGroup1());
		b1[0].addActionListener(new MyActionAdapterGroup2());
		b1[1].addActionListener(new MyActionAdapterGroup3());
		b1[2].addActionListener(new MyActionAdapterGroup4());
		b1[3].addActionListener(new MyActionAdapterGroup5());
		Menu();
		new Thread(this).start();
		
		URL url = this.getClass().getResource("/Misaka_S.png");
		URL mikoto = this.getClass().getResource("/mikoto.png");
		URL waku_ = this.getClass().getResource("/waku.png");
		try {
			im[0] = this.createImage((ImageProducer)url.getContent());		//表示キャラクター
			im[1] = this.createImage((ImageProducer)mikoto.getContent());
			waku = this.createImage((ImageProducer)waku_.getContent());
		}
		catch(Exception ex){}
		
		//×ボタン用
		this.addWindowListener(new WindowAdapter(){
		public void windowClosing(WindowEvent ev){
				System.exit(0);
			}
		});
		//ここまで×ボタン用
		
		addMouseListener(new MyMouseAdapter());//マウスリスナー
		addMouseMotionListener(new MyMouseAdapter());
		//常に最前表示
		this.setAlwaysOnTop(true);
		//表示
		this.setVisible(true);
	}
	public static void main(String[] args) {
		new Misaka();
	}
	public void paint(Graphics g){
		if(redraw==true){
			this.setBackground(new Color(0,0,0));
			this.setBackground(new Color(0x00000000, true));
			redraw=false;
		}
		
		//Show Image
		g.drawImage(im[character],0,25,this);
		
		if(watch==true){
			g.drawImage(waku,0,220,this);

			//Show Year
			g.setColor(Color.black);			
			g.drawString(yea + "年" , 10 , 235);
			g.drawString(mon + "/" + day + " (" + week[week_int -1] + ")",10,255);
			g.drawString(h + ":" + m + ":" + s,10,275);
		}
	}
	@SuppressWarnings("static-access")
	public void tokei(){
		yea = now.getInstance().get(now.YEAR);      //年を代入
		mon = now.getInstance().get(now.MONTH);		//月を代入
		day = now.getInstance().get(now.DATE);		//日を代入
        h = now.getInstance().get(now.HOUR_OF_DAY); //時を代入
        m = now.getInstance().get(now.MINUTE);      //分を代入
        s= now.getInstance().get(now.SECOND);       //秒を代入
        
        /*フォーマット
        DecimalFormat df = new DecimalFormat();
        df.applyLocalizedPattern("00") ;
        df.format(s);
        df.format(m);
        */
        mon = mon +1;
        
        week[0] = "日";
        week[1] = "月";
        week[2] = "火";
        week[3] = "水";
        week[4] = "木";
        week[5] = "金";
        week[6] = "土";

        week_int = now.get(now.DAY_OF_WEEK);//曜日を数値で取得
        
        if(BootCamp==true){
        	if(h<9){//日付の調整。
        		day = day - 1;
        		week_int -= 1;
        	}
        
        	h -= 9;
        
        	if(h == -1){//時の調整。
        		h = 23;
        	}else if(h == -2){
        		h = 22;
        	}else if(h == -3){
        		h = 21;
        	}else if(h == -4){
        		h = 20;
        	}else if(h == -5){
        		h = 19;
        	}else if(h == -6){
        		h = 18;
        	}else if(h == -7){
        		h = 17;
        	}else if(h == -8){
        		h = 16;
        	}else if(h == -9){
        		h = 15;
        	}
        }
	}
	public void run() {
		while(a==true){
			tokei(); 		
            repaint();
            try{
                Thread.sleep(1000);  //スリープ１秒
            }catch(InterruptedException e){}               
		}
	}
	class MyMouseAdapter extends MouseAdapter implements MouseMotionListener{
	    public void mouseClicked(MouseEvent e) {
	    	//擬似的に画像をクリックすればメニューがでてくるようにするコード
	    	posX = e.getX();//クリック時の座標習得
			posY = e.getY();
			if(posX < 100 && posY < 220){
				if(pnl[0].isVisible())
					pnl[0].setVisible(false);
				else
					pnl[0].setVisible(true);
			}
			System.out.println(posX +" " + posY);//デバッグ用。
	    }
	    public void mouseDragged(MouseEvent e){
	    }
	    public void mousePressed(MouseEvent e) {
	    }
	    public void mouseReleased(MouseEvent e) {
	    	if(TopChecker==true)
	    		OnTop = true;
	    	System.out.println("Release :" + OnTop);
	    }
		public void mouseMoved(MouseEvent e) {
		}
	}
	class MyActionAdapterGroup1 implements ActionListener {
		public void actionPerformed(ActionEvent ev) {
			System.exit(0);
		}
	}
	class MyActionAdapterGroup2 implements ActionListener {
		public void actionPerformed(ActionEvent ev) {
			if(OnTop==true){
            	OnTop=false;
            }else if(OnTop==false){
            	OnTop=true;
            }
			Menu();
		}
	}
	class MyActionAdapterGroup3 implements ActionListener {
		public void actionPerformed(ActionEvent ev) {
			if(BootCamp==true)
				BootCamp=false;
			else if(BootCamp==false)
				BootCamp=true;
			Menu();
		}
	}
	class MyActionAdapterGroup4 implements ActionListener {
		public void actionPerformed(ActionEvent ev) {
			if(watch==true){
				watch=false;
				redraw=true;
			}else if(watch==false)
				watch=true;
			Menu();
		}
	}
	class MyActionAdapterGroup5 implements ActionListener {
		public void actionPerformed(ActionEvent ev) {
			if(character==0){
				character=1;
			}else if(character==1){
				character=0;
			}
			redraw=true;
			Menu();
		}
	}
}
