package tomojavalib.usbcamera;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Vector;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;

import tomojavalib.p2cad.Youso;
import tomojavalib.util.Dir;

/**
 * ファイル選択するためのフレーム
 * @author tomo
 *
 */
public class FrameFileSelect extends JFrame  {
public TeitenCamera tc = null;
String[] filelist = null;
BufferedImage[] gazoulist = null;
JButton[] button = null;

public FrameFileSelect( TeitenCamera oyaframe , String fileholder ){
  //フレーム内のすべてのフォントを設定
  setUIFont(new javax.swing.plaf.FontUIResource("ＭＳ ゴシック", Font.PLAIN, 12));
  this.setTitle("元画像選択");
  tc = oyaframe;
  this.setBounds( tc.getX()+100, tc.getY()+30, 200, 600);
  //Ver96全体ではなく中身のサイズで定義する
  this.getContentPane().setPreferredSize(new Dimension(200-8,600-27)); this.pack();
  //System.out.println( this.getWidth()+" "+this.getHeight() );
  this.setBackground(Color.WHITE);
  //大きさ変更不可
  this.setResizable(false);
  //常に上に置く
  this.setAlwaysOnTop( true );
  //該当フォルダ内の画像ファイルリストを取得する
  filelist = this.getGazouList( fileholder );
  //該当ホルダ内の画像イメージリストを取得する
  gazoulist = this.getImgList( fileholder , filelist );
  //ボタンを配置する
  this.lyoutComponents();
  //イベントを配置する
  this.setEvent();
  //可視化
  this.setVisible(true);
}

private void setEvent(){
 //ボタンにイベントを設定(元画像の差し替え）
for(int i=0;i<button.length;i++){
 this.button[i].addMouseListener(
  new MouseAdapter(){public void mouseClicked(MouseEvent e){
  int i = Integer.parseInt( e.getComponent().getName() );
  FrameFileSelect.this.tc.dimg = FrameFileSelect.this.gazoulist[i];
  FrameFileSelect.this.tc.dfilename = FrameFileSelect.this.filelist[i];
  FrameFileSelect.this.dispose();
  } } );
}
return;
}


/**
 * コンポーネント上にボタン類を配置する
 */
private void lyoutComponents(){
//入力部分
Container contentPane = this.getContentPane();
button = new JButton[ this.gazoulist.length ];
 JPanel panel = new JPanel();
panel.setBackground(Color.WHITE);
panel.setLayout(new FlowLayout());
panel.setPreferredSize( new Dimension( 150, button.length * 125+30 ) );
//画像の数だけボタンを用意して、画像を埋め込む
for(int i=0;i<button.length;i++){
 button[i]= new JButton( new ImageIcon( this.setGazouScaleXY( 160 , 120 , this.gazoulist[i] ) ) );
 button[i].setToolTipText( this.filelist[i] );
 button[i].setPreferredSize(new Dimension(160, 120));
 //Nameに番号を仕込んでおく
 button[i].setName( "" + i );
 panel.add(button[i]);
}
 JScrollPane sp = new JScrollPane(panel,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
 contentPane.add( sp , FlowLayout.LEFT);
 return;
}


/**
 * 画像を指定の幅、高さ(ピクセル）拡大縮小します
 * @param w 変更後の幅
 * @param h　変更後の高さ
 */
private Image setGazouScaleXY( int w , int h , BufferedImage img ){
 java.awt.Image simg = img.getScaledInstance( w , h , Image.SCALE_SMOOTH  );
 java.awt.image.BufferedImage ssimg = new java.awt.image.BufferedImage( w , h , img.getType() );
 java.awt.Graphics g = ssimg.getGraphics() ;
 g.drawImage(simg, 0, 0, java.awt.Color.white, null) ;
 return ssimg;
}


/**
 * ファイルリストから、画像イメージリストを取得する
 * @param holder
 * @param filelist
 * @return
 */
private BufferedImage[] getImgList( String holder , String[] filelist ){
BufferedImage image[] = new BufferedImage[ filelist.length ];
for(int i=0;i<filelist.length;i++){
 try{
  // System.out.println( holder + "/" + filelist[i] );
  image[i] = ImageIO.read( new File( holder + "/" + filelist[i] ));
 }catch(Exception e){System.out.println("画像が読めませんでした");}
}
return image;
}

/**指定ホルダー内の画像リストを取り出す
 * @param holder　調べるホルダー
 * @return　画像ファイルのリスト
 */
private String[] getGazouList(String holder){
 String[] lists = null;
 Dir dir = new Dir();
 lists = dir.readFiles(holder);
 //for(int i=0;i<lists.length;i++){ System.out.println( lists[i] ); }
 //画像ファイルだけ抽出
 Vector v = new Vector();
 boolean flug = false;
 for(int i=0;i<lists.length;i++){
  flug = false;
  if( lists[i].indexOf("png")>-1 ){ flug = true; }
  if( lists[i].indexOf("jpg")>-1 ){ flug = true; }
  if(flug){ v.add( (Object)( lists[i] ) ); }
 }
 //配列割り当て
 String[] list = new String[ v.size() ];
 for(int i=0;i<v.size();i++){ list[i] = (String)v.get(i); }
 for(int i=0;i<list.length;i++){ System.out.println( list[i] ); }
 //リストを返す
 return list;
}



/**
 * フレームのすべてのフォントを一括変更する
 * @param f
 */
public static void setUIFont (javax.swing.plaf.FontUIResource f){
 java.util.Enumeration keys = UIManager.getDefaults().keys();
 while (keys.hasMoreElements()) {
  Object key = keys.nextElement();
  Object value = UIManager.get (key);
  if (value instanceof javax.swing.plaf.FontUIResource)
 UIManager.put (key, f);
 }
}


}
