/*
 * @(#)GeneratorDialog
 *
 * Copyright 2001 Nomura Research Institute, LTD. All rights reserved.
 *
 * RID-X : Generator Dialog
 *
 * @author  Intelligent Technology Inc.
 * @version 1.01 2002/08/14
 */
package jp.co.nri.rid.generator;

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

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;
import jp.co.nri.rid.environment.*;

/**
 * Rid Generator Dialog
 */

public class GeneratorDialog {

    /** generate.pageプロパティ  **/
    final static public String GENERATE_PAGE          = "generate.page";
    /** generate.productプロパティ  **/
//    final static public String GENERATE_PRODUCT       = "generate.product";
    /** generate.presentプロパティ  **/
//    final static public String GENERATE_PRESENT       = "generate.present";
    /** generate.sitemapプロパティ  **/
    final static public String GENERATE_SITEMAP       = "generate.sitemap";
    /** generate.browserプロパティ  **/
    final static public String GENERATE_BROWSER       = "generate.browser";
    /** generate.browser.execプロパティ  **/
//    final static public String GENERATE_BROWSER_EXEC  = "generate.browser.exec";
    /** msg.generate.titleプロパティ  **/
    final static public String MSG_GENERATE_TITLE     = "msg.generate.title";
    /** msg.generate.pageプロパティ  **/
    final static public String MSG_GENERATE_PAGE      = "msg.generate.page";
    /** msg.generate.generateプロパティ  **/
    final static public String MSG_GENERATE_GENERATE  = "msg.generate.generate";
    /** msg.generate.productプロパティ  **/
//    final static public String MSG_GENERATE_PRODUCT   = "msg.generate.product";
    /** snapshot.commentプロパティ  **/
//    final static public String MSG_GENERATE_PRESENT   = "msg.generate.present";
    /** snapshot.commentプロパティ  **/
    final static public String MSG_GENERATE_SITEMAP   = "msg.generate.sitemap";
    /** snapshot.commentプロパティ  **/
    final static public String MSG_GENERATE_BROWSER   = "msg.generate.browser";

    /** メインパネル  **/
    protected JPanel      mPanel          = null;
    /** ブラウザ実行  **/
    protected JCheckBox   mBrowser        = null;
    /** ブラウザリスト  **/
    protected JComboBox   mBrowserLst     = null;
    /** ページ生成実行  **/
    protected JCheckBox   mPage           = null;
    /** 製作指示書実行  **/
//    protected JCheckBox   mProduct        = null;
    /** 紙芝居実行 **/
//    protected JCheckBox   mPresent        = null;
    /** サイトマップ実行  **/
    protected JCheckBox   mSitemap        = null;
    /** ラジオボタン  **/
//    protected ButtonGroup mGroup          = new ButtonGroup();
    /** ラジオボタン（製作指示書）  **/
//    protected JRadioButton mRadioProduct  = null;
    /** ラジオボタン（紙芝居） **/
//    protected JRadioButton mRadioPresent  = null;
    /** ラジオボタン（サイトマップ）  **/
//    protected JRadioButton mRadioSitemap  = null;

    /** 実行タイプ  **/
//    private static final String[] radioSelected = { "Product", "Present", "Sitemap"};

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

    /**
      * 生成ダイアログ
      * @return boolean     ボタンの状態true(OK)/false(Cancel)
      */
    public boolean show() {

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

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

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

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

        // Layout制約の作成
        GridBagConstraints label_gbc = createLabelConstraints();
        GridBagConstraints compo_gbc = createComponentConstraints();

        // 生成
        label_gbc.gridy      = 0;
        label_gbc.gridx      = 0;
        JLabel label = new JLabel(res.getString(MSG_GENERATE_GENERATE));
        mLayout.setConstraints(label, label_gbc);
        mPanel.add( label );

        // 生成チェックボックス
        compo_gbc.gridy      = 0;
        compo_gbc.gridx      = 1;
        JPanel panelGenerate = generateCheckBox();
        mLayout.setConstraints(panelGenerate, compo_gbc);
        mPanel.add( panelGenerate );

        //ブラウザ
        label_gbc.gridy      = 1;
        label_gbc.gridx      = 0;
        label = new JLabel(res.getString(MSG_GENERATE_BROWSER));
        mLayout.setConstraints(label, label_gbc);
        mPanel.add( label );

        // ブラウザリスト
        compo_gbc.gridy      = 1;
        compo_gbc.gridx      = 1;
        JPanel panelBrowser  = browserCheckBox();
        mLayout.setConstraints(panelBrowser, compo_gbc);
        mPanel.add( panelBrowser );

        //ブラウザのラジオボタン
/*
        compo_gbc.gridy      = 2;
        compo_gbc.gridx      = 1;
        JPanel panelBrowserRB  = browserRadioButton();
        mLayout.setConstraints(panelBrowserRB, compo_gbc);
        mPanel.add( panelBrowserRB );
*/
		
        // [メインコンポーネント]と[OK][CENCEL]
        gdlg.setControlPanel(mPanel);

        //ボタンの制御
//        ctlInit();

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

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


    /**
      * 生成　対象選択（製作指示書／紙芝居／サイトマップ）
      * @return JPanel 
      */
    private JPanel generateCheckBox() {

        //
        JPanel panelCB = new JPanel();
        GridBagLayout layoutCB = new GridBagLayout();
        panelCB.setLayout(layoutCB);

        // Layout制約の作成
        GridBagConstraints compo_gbc = createComponentConstraints();

        //ページチェックボックス生成
        compo_gbc.gridy      = 0;
        compo_gbc.gridx      = 0;
        mPage = createGenerateCheckBox(MSG_GENERATE_PAGE, GENERATE_PAGE);
        layoutCB.setConstraints(mPage, compo_gbc);
        panelCB.add( mPage );

        //製作指示書チェックボックス生成
/*
        compo_gbc.gridy      = 0;
        compo_gbc.gridx      = 1;
        mProduct = createGenerateCheckBox(MSG_GENERATE_PRODUCT, GENERATE_PRODUCT);
        layoutCB.setConstraints(mProduct, compo_gbc);
        panelCB.add( mProduct );
*/
		
/*
        //紙芝居チェックボックス生成
        compo_gbc.gridy      = 0;
        compo_gbc.gridx      = 2;
        mPresent = createGenerateCheckBox(MSG_GENERATE_PRESENT, GENERATE_PRESENT);
        layoutCB.setConstraints(mPresent, compo_gbc);
        panelCB.add( mPresent );
*/
		
        //サイトマップチェックボックス生成
        compo_gbc.gridy      = 0;
//        compo_gbc.gridx      = 3;
        compo_gbc.gridx      = 1;
        mSitemap = createGenerateCheckBox(MSG_GENERATE_SITEMAP, GENERATE_SITEMAP);
        layoutCB.setConstraints(mSitemap, compo_gbc);
        panelCB.add( mSitemap );

/*
        //製作指示書のリスナー
        mProduct.addActionListener(
          new ActionListener() {
              public void actionPerformed(ActionEvent e) { ctlProduct(); }
          }
        );
*/
/*
        //紙芝居のリスナー
        mPresent.addActionListener(
          new ActionListener() {
              public void actionPerformed(ActionEvent e) { ctlPresent(); }
          }
        );
*/
		
        //サイトマップのリスナー
/*
        mSitemap.addActionListener(
          new ActionListener() {
              public void actionPerformed(ActionEvent e) { ctlSitemap(); }
          }
        );
*/
        return panelCB;
    }


    /**
      * チェックボックス作成
      * @param  String      res_label     ラベル
      * @param  String      res_selected  リソース名
      * @return JCheckBox 
      */
    private JCheckBox createGenerateCheckBox(String res_label, String res_selected) {
        ZResource res = ZApp.getTheApp().getResource();
        boolean selected = res.getBoolean(res_selected);
        String label = res.getString(res_label);
        JCheckBox chk = new JCheckBox(label);
        chk.setSelected(selected);
        return chk;
    }



    /**
      * ブラウザ表示　選択／対象ブラウザ指定
      * @return JPanel 
      */
    private JPanel browserCheckBox() {

        JPanel panelCB = new JPanel();
        GridBagLayout layoutCB = new GridBagLayout();
        panelCB.setLayout(layoutCB);

        // Layout制約の作成
        GridBagConstraints compo_gbc = createComponentConstraints();

        compo_gbc.gridy = 0;
        compo_gbc.gridx = 0;
        mBrowser = createBrowserCheckBox();
        layoutCB.setConstraints(mBrowser, compo_gbc);
        panelCB.add( mBrowser );

        compo_gbc.gridy = 0;
        compo_gbc.gridx = 1;
        compo_gbc.gridheight = 1;
        compo_gbc.gridwidth  = 2;
        mBrowserLst = createBrowserComboBox();
        layoutCB.setConstraints(mBrowserLst, compo_gbc);
        panelCB.add( mBrowserLst );
        
        return panelCB;

    }


    /**
      * ブラウザのチェックボックス作成
      */
    private JCheckBox createBrowserCheckBox() {
        ZResource res = ZApp.getTheApp().getResource();
        boolean browser = res.getBoolean(GENERATE_BROWSER);
        JCheckBox chk = new JCheckBox();
        chk.setSelected(browser);
        return chk;
    }

    /**
      * ブラウザのコンボボックス作成
      */
    private JComboBox createBrowserComboBox() {

        // Create JComboBox
        JComboBox comboBox = new JComboBox();

        //リソースファイルからブラウザコマンドのリストを設定する
        ZResource res = ZApp.getTheApp().getResource();
        for ( int i = 1; ; i++ ) {
            String  command = "generate.browser_command." + Integer.toString(i);
            String  browser_command = res.getString(command);
            if (browser_command == null) break;
            //項目の追加
            comboBox.addItem(makeObj(browser_command));
        }
        return comboBox;
    }
   
    /**
      * StringをObjectへ変換する
      */
    private Object makeObj(final String item)  {
        return new Object() { public String toString() { return item; } };
    }



    /**
      * ブラウザ表示　表示対象選択（製作指示書／紙芝居／サイトマップ）
      */
/*
    private JPanel browserRadioButton() {

        JPanel panelRB = new JPanel();
        GridBagLayout layoutRB = new GridBagLayout();
        panelRB.setLayout(layoutRB);

        // Layout制約の作成
        GridBagConstraints compo_gbc = createComponentConstraints();

         // ラジオボタンコントロールの生成
        ZResource res = ZApp.getTheApp().getResource();
        String browser_exec = res.getString(GENERATE_BROWSER_EXEC);

        //ラジオボタン（製作指示書）
        compo_gbc.gridy = 0;
        compo_gbc.gridx = 0;
        mRadioProduct =  new JRadioButton(res.getString(MSG_GENERATE_PRODUCT));
        mGroup.add( mRadioProduct );
        layoutRB.setConstraints(mRadioProduct, compo_gbc);
        panelRB.add( mRadioProduct );
        // 選択状態
        if (browser_exec.equals(radioSelected[0])) {
            mRadioProduct.setSelected(true);
        }
        //ラジオボタン（紙芝居）
        compo_gbc.gridy = 0;
        compo_gbc.gridx = 1;
        mRadioPresent =  new JRadioButton(res.getString(MSG_GENERATE_PRESENT));
        mGroup.add( mRadioPresent );
        layoutRB.setConstraints(mRadioPresent, compo_gbc);
        panelRB.add( mRadioPresent );
        // 選択状態
        if (browser_exec.equals(radioSelected[1])) {
            mRadioPresent.setSelected(true);
        }
		
        //ラジオボタン（サイトマップ）
        compo_gbc.gridy = 0;
        compo_gbc.gridx = 2;
        mRadioSitemap =  new JRadioButton(res.getString(MSG_GENERATE_SITEMAP));
        mGroup.add( mRadioSitemap );
        layoutRB.setConstraints(mRadioSitemap, compo_gbc);
        panelRB.add( mRadioSitemap );
        // 選択状態
        if (browser_exec.equals(radioSelected[2])) {
            mRadioSitemap.setSelected(true);
        }
        return panelRB;
    }
*/
	

    /**
      * [Resource]を設定
      */
    private void setGenerate() {

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

        /*** 生成 ***/
        /* [generate.page]を設定 */
        res.putBoolean(GENERATE_PAGE, mPage.isSelected());

        /* [generate.product]を設定 */
//        res.putBoolean(GENERATE_PRODUCT, mProduct.isSelected());

        /* [generate.present]を設定 */
//        res.putBoolean(GENERATE_PRESENT, mPresent.isSelected());

        /* [generate.sitemap]を設定 */
        res.putBoolean(GENERATE_SITEMAP, mSitemap.isSelected());

        /*** ブラウザ ***/
        /* [generate.browser]を設定 */
        res.putBoolean(GENERATE_BROWSER, mBrowser.isSelected());

        /* [generate.browser_command]を設定 */
        /* 選ばれたブラウザのコマンドを取得して設定する */
        int index = mBrowserLst.getSelectedIndex();
        String command = "generate.browser_command." + Integer.toString(index+1);
        res.putString("generate.browser_command", res.getString(command));

        /* [generate.browser_exec]を設定 */
/*
        Enumeration elm = mGroup.getElements();
        int i =0;
        while ( elm.hasMoreElements() ) {
            JRadioButton radio = (JRadioButton)elm.nextElement();
            if ( radio.isSelected() ) break;
            i++;
        }
        res.putString(GENERATE_BROWSER_EXEC, radioSelected[i]);
*/
    }


    /**
      * ラベル用レイアウト制約の作成
      */
    private GridBagConstraints createLabelConstraints() {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor  = GridBagConstraints.NORTHWEST;
        gbc.weightx = 0.0 ;
        gbc.insets  = new Insets(10,10,0,10) ;
        return gbc;
    }


    /**
      * コンポーネント用レイアウト制約の作成
      */
    private GridBagConstraints createComponentConstraints() {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill    = GridBagConstraints.BOTH;
        gbc.weightx = 1.0 ;
        gbc.insets    = new Insets(10,10,0,10) ;
        return gbc;
    }

    /**
      * チェックボックス／ラジオボタンの制御
      */
/*
    private void ctlInit() {
//        ctlProduct();
//        ctlPresent();
//        ctlSitemap();
    }
*/

    /**
      * 製作指示書のチェックボックス制御<br>
      *   選択状態の場合は、　ブラウザ表示の製作指示書：有効<br>
      *   非選択状態の場合は、ブラウザ表示の製作指示書：無効<br>
      */
/*
    private void ctlProduct() {
        if (mProduct.isSelected()) {
            mRadioProduct.setEnabled(true);
            mRadioProduct.setSelected(true);
        } else {
            mRadioProduct.setEnabled(false);
        }
        //ブラウザ表示の制御
        ctlBrowser();       
    }
*/
	
    /**
      * 紙芝居のチェックボックス制御<br>
      *   選択状態の場合は、　ブラウザ表示の紙芝居：有効<br>
      *   非選択状態の場合は、ブラウザ表示の紙芝居：無効<br>
      */
/*
    private void ctlPresent() {
        if (mPresent.isSelected()) {
            mRadioPresent.setEnabled(true);
            mRadioPresent.setSelected(true);
        } else {
            mRadioPresent.setEnabled(false);
        }
        //ブラウザ表示の制御
        ctlBrowser();       
    }
*/
	
    /**
      * サイトマップのチェックボックス制御<br>
      *   選択状態の場合は、　ブラウザ表示のサイトマップ：有効<br>
      *   非選択状態の場合は、ブラウザ表示のサイトマップ：無効<br>
      */
/*
    private void ctlSitemap() {
        if (mSitemap.isSelected()) {
            mRadioSitemap.setEnabled(true);
            mRadioSitemap.setSelected(true);
        } else {
            mRadioSitemap.setEnabled(false);
        }
        //ブラウザ表示の制御
        ctlBrowser();       
    }
*/
    /**
      * ブラウザのチェックボックス／リストの制御<br>
      *   製作指示書／紙芝居／サイトマップの何れかが選択の場合、　　ブラウザのチェックボックス／リスト：有効<br>
      *   製作指示書／紙芝居／サイトマップの何れかが非選択の場合、　ブラウザのチェックボックス／リスト：無効<br>
      */
    private void ctlBrowser() {
//        if (mProduct.isSelected() || mPresent.isSelected() || mSitemap.isSelected()) {
        if (mSitemap.isSelected()) {
            mBrowser.setEnabled(true);
            //mBrowser.setSelected(true);
            mBrowserLst.setEnabled(true);
        } else {
            mBrowser.setEnabled(false);   
            mBrowser.setSelected(false);
            mBrowserLst.setEnabled(false);
        }
    }
}
