/*
 * @(#)ZFileAction.java
 *
 * Copyright 2001 by Intelligent Technology Inc. All rights reserved.
 */
package jp.co.iti.fagot.action;

import java.awt.Frame;
import java.awt.Point;
import java.awt.event.ActionEvent;

import java.io.File;
import java.io.IOException;

import javax.swing.Action;
import javax.swing.JFileChooser;

import jp.co.iti.fagot.util.ZResource;
import jp.co.iti.fagot.util.ZFile;
import jp.co.iti.fagot.util.ZFileFilter;
import jp.co.iti.fagot.ZApp;
import jp.co.iti.fagot.IZApp;
import jp.co.iti.fagot.IZFileable;

import jp.co.iti.fagot.util.ZInstance;

import jp.co.nri.Ridual;
/**
 * 開く・上書き保存・名前を付けて保存アクション
 */
public class ZFileAction extends ZAction {
	/**
	 * デフォルトコンストラクタ(主にsave)
	 * @param app      アプリケーションクラス
	 * @param cmp      コンポーネント
	 * @param szAction アクション名
	 */
	public ZFileAction(IZApp app,IZFileable cmp,String szAction) {
    super(app,szAction);
	mCmp    = cmp ;
	}

	/**
	 * 最近使ったファイル用のコンストラクタ(主にopen)
	 * @param app      アプリケーションクラス
	 * @param cmp      コンポーネント
	 * @param szAction アクション名
	 * @param szFile   開くファイル名
	 */
	public ZFileAction(IZApp app,IZFileable cmp,String szAction,
		String szFile) {
    this(app,cmp,szAction);
	mFile = szFile ;
	}

	/**
	 * ファイルフィルタ設定用のコンストラクタ(主にsaveas)
	 * @param app      アプリケーションクラス
	 * @param cmp      コンポーネント
	 * @param szAction アクション名
	 * @param filter   ファイルフィルタ
	 */
	public ZFileAction(IZApp app,IZFileable cmp,String szAction,
		ZFileFilter filter) {
    this(app,cmp,szAction);
	mFileFilter = filter ;
	}

	/**
	 * リソースから直前に開いたファイルを取得する場合のキー＋
	 * ファイルフィルタ設定用のコンストラクタ(主にopen)
	 * @param app      アプリケーションクラス
	 * @param cmp      コンポーネント
	 * @param szAction アクション名
	 * @param szRecent リソースキー
	 * @param filter   ファイルフィルタ
	 */
	public ZFileAction(IZApp app,IZFileable cmp,String szAction,
		String szRecent,ZFileFilter filter) {
    this(app,cmp,szAction);
	mRecent     = szRecent;
	mFileFilter = filter  ;
	}

	/**
	 * アクション実行
	 */
	public void doAction(ActionEvent e) {
	if ( getActionName().equals( NEW ) ) {
		if ( getApp().preExit( false ) ) {
			mCmp.open( null );
		}
	} else if ( getActionName().equals( OPEN ) ) {
		if ( getApp().preExit( false ) ) {
			if ( mFile != null ) {
				mCmp.open( mFile );
			} else {
				open();
			}
		}
	} else if ( getActionName().equals( SAVE  ) ) {
		if ( checkLicense() ) {
			if ( mCmp.canSave() ) {
				mCmp.save();
			} else {
				saveAs();
			}
		}
	} else if ( getActionName().equals( SAVEAS ) ) {
		if ( checkLicense() ) {
			saveAs();
		}
	}
	}

	/**
	 * 開く
	 */
	protected void open() {
    Frame   frame = getApp().getFrame();

    if (mFileDialog == null) {
		createDialog();
	}

	// 位置修正
    Point p = frame.getLocationOnScreen();
    mFileDialog.setLocation(p.x + 10, p.y +10);

	// ダイアログを開く
	int nRet = mFileDialog.showOpenDialog(frame);
	if ( nRet == JFileChooser.APPROVE_OPTION) {
		// ファイルを開く
		File fFile = mFileDialog.getSelectedFile();
		String szFile = null ;
		try {
			szFile = fFile.getCanonicalPath();
	    } catch ( java.io.IOException e) {
			szFile = fFile.getAbsolutePath();
		}
		mCmp.open( szFile );
	}
	}

	/**
	 * 名前を付けて保存
	 */
	public boolean saveAs() {
    Frame   frame = getApp().getFrame();
    if (mFileDialog == null) {
		createDialog();
	}

	// 位置修正
    Point p = frame.getLocationOnScreen();
    mFileDialog.setLocation(p.x + 10, p.y +10);

	// ダイアログを開く
	int nRet = mFileDialog.showSaveDialog(frame);
	if ( nRet == JFileChooser.APPROVE_OPTION) {
		// ファイルを開く
		File fFile = mFileDialog.getSelectedFile();
		String szFile = null ;
		try {
			szFile = fFile.getCanonicalPath();
	    } catch ( java.io.IOException e) {
			szFile = fFile.getAbsolutePath();
		}
		return ( mCmp.saveAs( szFile ) );
	}
	return false;
	}

	/**
	 * ファイル選択ダイアログの作成
	 */
	protected void createDialog() {
	ZResource res = getApp().getResource();

	mFileDialog = new JFileChooser();
	// ファイルフィルタの設定
	if ( mFileFilter != null ) {
		mFileDialog.setFileFilter(mFileFilter);
	}

	// 初期ディレクトリの設定
	if ( mRecent != null ) {
		String szFile = res.getString(mRecent);
		if ( szFile != null ) {
			mFileDialog.setCurrentDirectory(
				new File(ZFile.getParent(szFile) ) );
		}
	}
	}

	/**
	 * ライセンスのチェック
	 */
	public boolean checkLicense() {
	Ridual app = (Ridual)ZApp.getTheApp();
	return app.checkLicense(true);
	}
	//## アトリビュート ###############################################
    /**
     * ダイアログボックス
     */
    protected JFileChooser mFileDialog = null;

    /**
     * コンポーネント
     */
	protected IZFileable mCmp = null ;

    /**
     * 開くファイル
     */
    protected String       mFile = null;

    /**
     * 直前に開いたファイルのキー
     */
	protected String       mRecent = null ;

    /**
     * ファイルフィルタ
     */
	protected ZFileFilter  mFileFilter = null ;

    /**
     * アクション名：新規作成
     */
	final static public String NEW    = "new" ;

    /**
     * アクション名：開く
     */
	final static public String OPEN   = "open" ;

    /**
     * アクション名：保存
     */
	final static public String SAVE   = "save" ;

    /**
     * アクション名：名前を付けて保存
     */
	final static public String SAVEAS = "saveas" ;
}
