/*
 * @(#)ImportDialog.java
 *
 * Copyright 2001 Nomura Research Institute, LTD. All rights reserved.
 *
 * RID-X ：インポートダイアログ
 *
 * @author  Intelligent Technology Inc.
 * @version 1.01 2001/02/06
 */
package jp.co.nri.rid.environment;

import java.io.*;
import java.util.*;
import java.text.*;
import java.net.URL;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

import jp.co.nri.Ridual;
import jp.co.iti.fagot.ZApp;
import jp.co.iti.fagot.doc.DocDocument;
import jp.co.iti.fagot.doc.DocManager;
import jp.co.iti.fagot.util.ZDebug;
import jp.co.iti.fagot.util.ZResource;
import jp.co.iti.fagot.util.ZProperties;
import jp.co.iti.fagot.util.ZString;


/**
 * インポートダイアログ<br>
 * <br>
 * ・Ignoreキー（無視文字列）<br>
 * ・インポート（ページ／リソース／ドキュメント）<br>
 * ・インポート先Dir（fileChooserボタン付き）<br>
 *　　　インポートディレクトリが現在のプロジェクトと違う場合は""にする<br>
 *　　　ボタン押下：""の場合はカレントのディレクトリにする
 * ・コメント<br>
 */

public class ImportDialog {

    /** rid.ignore.prefixプロパティの定義   **/
    final static public String IGNORE_PREFIX        = "rid.ignore.prefix";
    /** import.pageプロパティの定義         **/
    final static public String IMPORT_PAGE          = "import.page";
    /** import.resourceプロパティの定義     **/
    final static public String IMPORT_RESOURCE      = "import.resource";
    /** import.documentプロパティの定義     **/
    final static public String IMPORT_DOCUMENT      = "import.document";
    /** import.dirプロパティの定義          **/
    final static public String IMPORT_DIR           = "import.dir";
    /** import.commentプロパティの定義      **/
    final static public String IMPORT_COMMENT       = "import.comment";
    /** rid.html.dirプロパティの定義        **/
//    final static public String RID_HTML_DIR         = "rid.html.dir";
    /** msg.import.titleプロパティの定義    **/
    final static public String MSG_IMPORT_TITLE     = "msg.import.title";
    /** msg.import.pageプロパティの定義     **/
    final static public String MSG_IMPORT_PAGE      = "msg.import.page";
    /** msg.import.resourceプロパティの定義 **/
    final static public String MSG_IMPORT_RESOURCE  = "msg.import.resource";
    /**msg.import.documentプロパティの定義  **/
    final static public String MSG_IMPORT_DOCUMENT  = "msg.import.document";
    /** msg.import.importプロパティの定義   **/
    final static public String MSG_IMPORT_IMPORT    = "msg.import.import";
    /** "msg.import.commentプロパティの定義 **/
    final static public String MSG_IMPORT_COMMENT   = "msg.import.comment";
    /** msg.import.dirプロパティの定義      **/
    final static public String MSG_IMPORT_DIR       = "msg.import.dir";
    /** msg.import.ignore"プロパティの定義  **/
    final static public String MSG_IMPORT_IGNORE   	= "msg.import.ignore";
    final static public String MSG_IMPORT_REF   	= "msg.import.ref";

    /** メインパネル                  **/
    protected JPanel      mPanel            = null;
    /** IgnorePrefix                  **/
    protected JTextField  mIgnorePrefix     = null;
    /** ページチェックボックス        **/
    protected JCheckBox   mImportPage       = null;
    /** リソースチェックボックス      **/
    protected JCheckBox   mImportResource   = null;
    /** ドキュメントチェックボックス  **/
    protected JCheckBox   mImportDocument   = null;
    /** ディレクトリ                  **/
    protected JTextField  mImportDir        = null;
    /** ディレクトリのパス            **/
    protected String      mImportPath       = null;
    /** ディレクトリのボタン          **/
    protected JButton     mImportDirButton  = null;
    /** コメント                      **/
    protected JTextField  mImportComment    = null;
    /** プロジェクトDIR               **/
    protected String      mProjectDir       = null;


    /**
      * デフォルトコンストラクタ
      */
      public ImportDialog() {}

    /**
      * インポートダイアログ生成
      *
      * @param  String            プロジェクトディレクトリ
      * @return boolean     ボタンの状態true(OK)/false(Cancel)
      */
    public boolean show(String pro_dir) {

        ZResource res = ZApp.getTheApp().getResource();

        //プロジェクトDIR
        mProjectDir = pro_dir;

        JFrame frame = (JFrame)ZApp.getTheApp().getFrame();
        EnvDialog gdlg = new EnvDialog(frame, res.getString(MSG_IMPORT_TITLE));

        //メインコンポーネント
        mPanel = new JPanel();

        // Layoutを「GridBagLayout」にする
        GridBagLayout mLayout = new GridBagLayout();
        mPanel.setLayout(mLayout);

        // Layout制約の作成
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill       = GridBagConstraints.BOTH;
        gbc.insets     = new Insets(10,10,10,10) ;

        //ラベル
        gbc.gridy      = 0;
        gbc.gridx      = 0;
        JLabel label;
        label = new JLabel(res.getString(MSG_IMPORT_IGNORE));
        mLayout.setConstraints(label, gbc);
        mPanel.add( label );

        //IgnorePrefix
        gbc.gridy      = 0;
        gbc.gridx      = 1;
        gbc.gridwidth  = 3;
        mIgnorePrefix = createIgnorePrefix();
        mLayout.setConstraints(mIgnorePrefix, gbc);
        mPanel.add( mIgnorePrefix );


        //ラベル
        gbc.gridy      = 1;
        gbc.gridx      = 0;
        gbc.gridwidth  = 1;
        gbc.gridheight = 1;
        label = new JLabel(res.getString(MSG_IMPORT_IMPORT));
        mLayout.setConstraints(label, gbc);
        mPanel.add( label );

        //ページチェックボックス生成
        gbc.gridy      = 1;
        gbc.gridx      = 1;
        mImportPage = createImporCheckBox(res.getString(MSG_IMPORT_PAGE),IMPORT_PAGE);
        mLayout.setConstraints(mImportPage, gbc);
        mPanel.add( mImportPage );

        //リソースチェックボックス生成
        gbc.gridy      = 1;
        gbc.gridx      = 2;
        mImportResource = createImporCheckBox(res.getString(MSG_IMPORT_RESOURCE), IMPORT_RESOURCE);
        mLayout.setConstraints(mImportResource, gbc);
        mPanel.add( mImportResource );

        //ドキュメントチェックボックス生成
        gbc.gridy      = 1;
        gbc.gridx      = 3;
        mImportDocument = createImporCheckBox(res.getString(MSG_IMPORT_DOCUMENT), IMPORT_DOCUMENT);
        mLayout.setConstraints(mImportDocument, gbc);
        mPanel.add( mImportDocument );

        //ディレクトリ
        gbc.gridy      = 2;
        gbc.gridx      = 0;
        gbc.gridwidth  = 1;
        gbc.gridheight = 1;
        label = new JLabel(res.getString(MSG_IMPORT_DIR));
        mLayout.setConstraints(label, gbc);
        mPanel.add( label );

        //Importディレクトリ
        gbc.gridy      = 2;
        gbc.gridx      = 1;
        gbc.gridwidth  = 3;
        gbc.gridheight = 1;
        JPanel      pane= createImportDir();
        mLayout.setConstraints(pane, gbc);
        mPanel.add( pane );

        //コメント
        gbc.gridy      = 3;
        gbc.gridx      = 0;
        gbc.gridwidth  = 1;
        gbc.gridheight = 1;
        label = new JLabel(res.getString(MSG_IMPORT_COMMENT));
        mLayout.setConstraints(label, gbc);
        mPanel.add( label );

        //IgnorePrefix
        gbc.gridy      = 3;
        gbc.gridx      = 1;
        gbc.gridwidth  = 3;
        mImportComment = createImportComment();
        mLayout.setConstraints(mImportComment, gbc);
        mPanel.add( mImportComment );

        // [メインコンポーネント]と[OK][CENCEL]
        gdlg.setControlPanel(mPanel);

        //ダイアログを表示する（モーダル）
        gdlg.doModal();

        // [生成]ボタンが押された場合に変更する
        boolean ret = gdlg.isOK();
        if (ret){
            setImportResource();
        }   
        return ret;
    }


    /**
      * Ignoreキー文字列のJTextFieldを生成
      *
      * @return JTextField
      */
    private JTextField createIgnorePrefix() {
        ZResource res = ZApp.getTheApp().getResource();
        String  ignore_prefix = res.getString(IGNORE_PREFIX);
        JTextField text = new JTextField(ignore_prefix);
        return text;
    }

    /**
      * Ignoreキーの文字列取得
      *
      * @return String  gnoreキーの文字列
      */
    private String getIgnorePrefix(){
        String szTmp = mIgnorePrefix.getText();
        if ( szTmp == null || szTmp.equals("") ) {  return null;  }
        return szTmp;
    }


    /**
      * インポートのチェックボックス作成
      *
      * @param  String      label           ラベル
      * @param  String      resource        プロパティ名
      * @return JCheckBox
      */
    private JCheckBox createImporCheckBox(String label, String resource) {
        ZResource res = ZApp.getTheApp().getResource();
        boolean selected = res.getBoolean(resource);
        JCheckBox chk = new JCheckBox(label);
        chk.setSelected(selected);
        return chk;
    }


    /**
      * インポートパスのJPanelを生成
      *
      * @return JPanel
      */
    public JPanel createImportDir() {

        int ret;
        ZResource res = ZApp.getTheApp().getResource();
        mImportPath = res.getString(IMPORT_DIR);
        if (mImportPath == null) mImportPath ="";

        //インポートディレクトリが現在のプロジェクトと違う場合は""にする
        String compare = mImportPath.substring(0, Math.min(mProjectDir.length(),mImportPath.length()));
        if (!compare.equalsIgnoreCase(mProjectDir)) {
            mImportPath ="";
        }

        // パネルの生成
        JPanel panel = new JPanel();

        // Layoutを「GridBagLayout」にする
        GridBagLayout mLayout = new GridBagLayout();
        panel.setLayout(mLayout);

        // Layout制約の作成
        GridBagConstraints gbc = new GridBagConstraints();

        // TextFieldの生成
        mImportDir = new JTextField(mImportPath);
        panel.add(mImportDir);

        gbc.anchor  = GridBagConstraints.NORTHWEST;
        gbc.fill    = GridBagConstraints.BOTH;
        gbc.weightx = 1.0;
        gbc.gridx   = 0;
        mLayout.setConstraints(mImportDir, gbc);

        mImportDirButton = new JButton(res.getString(MSG_IMPORT_REF));
        mImportDirButton.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) { fileChooser(); }
            }
        );
        gbc.fill    = GridBagConstraints.NONE;
        gbc.weightx = 0.0;
        gbc.gridx   = 1;
        mLayout.setConstraints(mImportDirButton, gbc);
        panel.add(mImportDirButton);
        return panel;
    }

    /**
      * インポートパスのボタンリスナー
      *
      * @return void
      */
    public void fileChooser() {

        //インポートディレクトリが""の場合はカレントのディレクトリにする
        mImportPath = getImportPath();
        if (mImportPath == null) {
            ZResource res = ZApp.getTheApp().getResource();
//            mImportPath = mProjectDir + File.separator + res.getString(RID_HTML_DIR); 
            mImportPath = Ridual.getHtmlDir(); 
        }

        // FileChooser
        EnvFileChooser fileChooser = new EnvFileChooser();
        String szFile = fileChooser.show(mPanel, mImportPath, JFileChooser.DIRECTORIES_ONLY);
        if (szFile != null) {
            // [OK]ボタンの場合、テキストフィールドにディレクトリを設定、ディレクトリパスを変更     
            mImportDir.setText(szFile);
            mImportPath = szFile;
        }

    }


    /**
      * インポートパスの文字列を取得
      *
      * @return String  インポートパスの文字列
      */
    private String getImportPath(){
        String szTmp = mImportDir.getText();
        if ( szTmp == null || szTmp.equals("") ) {  return null;  }
        return szTmp;
    }


    /**
      * コメント文字列のJTextFieldを生成
      *
      * @return JTextField
      */
    private JTextField createImportComment() {

        ZResource res = ZApp.getTheApp().getResource();
        String  comment = res.getString(IMPORT_COMMENT);
        JTextField text = new JTextField(comment);
        return text;
    }


    /**
      * コメント文字列の取得
      *
      * @return String  コメント文字列
      */
    private String getImportComment(){
        String szTmp = mImportComment.getText();
        if ( szTmp == null || szTmp.equals("") ) {  return null;  }
        return szTmp;
    }

    /**
      * プロパティを設定する
      *
      * @return void
      */
    private void setImportResource() {

        ZResource res = ZApp.getTheApp().getResource();

        /* [gnore.prefix]を設定 */
        res.putString(IGNORE_PREFIX, getIgnorePrefix());

        /* [import.page]を設定 */
        res.putBoolean(IMPORT_PAGE, mImportPage.isSelected());

        /* [import.resource]を設定 */
        res.putBoolean(IMPORT_RESOURCE, mImportResource.isSelected());

        /* [import.document]を設定 */
        res.putBoolean(IMPORT_DOCUMENT, mImportDocument.isSelected());

        /* [import.dir]を設定 */
        String sss = getImportPath();
        res.putString(IMPORT_DIR, getImportPath());

        /* [import.comment]を設定 */
        res.putString(IMPORT_COMMENT, getImportComment() );
    }
}
