/*
 * @(#)EnvironmentDialog.java
 *
 * Copyright 2001 Nomura Research Institute, LTD. All rights reserved.
 *
 * RID-X : 環境設定ダイアログ
 *
 * @author  Intelligent Technology Inc.
 * @version 1.01 2002/05/15
 */
package jp.co.nri.rid.environment;

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 java.lang.Integer;
import java.lang.Character;

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.RUpdateManager;

/**
 * Rid 環境設定ダイアログ
 */

public class EnvironmentDialog {
    /** パネル**/
    protected JPanel        mPanel = null;
    /** レイアウト  **/
    protected GridBagLayout mLayout = null;
    /** Ridual ディレクトリ   **/
    EnvTextField    mRidualDir;
    /** グリッド              **/
    EnvCheckBoxText mGrid;
    /** SVG 出力線幅          **/
    EnvTextField    mSvg;
    /** Look & Feel           **/
    EnvRadioButton  mLookFeel;
    /** ブラウザ              **/
    EnvRadioText    mBrowser;
    /** ＨＴＭＬエディタ      **/
    EnvRadioText    mHtmlEdit;
    /** テキストエディタ      **/
    EnvTextField    mTextEdit;
    /** 表示色（Zone）        **/
    EnvColorEditor  mColorZone;
    /** 表示色（Page）        **/
    EnvColorEditor  mColorPage;
    /** 表示色（Link:Virtual）**/
    EnvColorEditor  mColorLink;
    /** 表示色（Link:Real）   **/
    EnvColorEditor  mColorReal;
    /** 表示色（Url）         **/
    EnvColorEditor  mColorUrl;
    /** 表示色（MapHier）     **/
    EnvColorEditor  mColorMapHier;
    /** 表示色（MapSite）     **/
    EnvColorEditor  mColorMapSite;
    /** 表示色（MapCircle）   **/
    EnvColorEditor  mColorMapCircle;
    /** 表示色（NotExist）    **/
    EnvColorEditor  mColorNotExist;
    /** 表示色（ScenarioItem）**/
    EnvColorEditor  mColorScenarioItem;
    /** 表示オプション ZonePanel（Zone）
    EnvRadioButton  mDispZone;
    **/
    /** 表示オプション          （Page）
    EnvRadioButton  mDispPage;
    **/
    /** 表示オプション          （Url） 
    EnvRadioButton  mDispUrl;
    **/
    /** 立ち上げオプション       (HTML-Editor)  **/
    EnvRadioButton  mStartHtml;
    /** EnvDocumentList **/
    EnvDocumentList mDocList;

    /** 環境設定の起動状況  **/
    boolean         mEnvFirst;

    //
    /** [msg.environment.title]プロパティ  **/
    static String MSG_ENVIRONMENT_TITLE     = "msg.environment.title";
    /** [app.install.path]プロパティ  **/
    static String APP_INSTALL_PATH          = "app.install.path";
    /** [edit.grid]プロパティ  **/
    static String EDIT_GRID                 = "edit.grid";
    /** [edit.gridsize]プロパティ  **/
    static String EDIT_GRIDSIZE             = "edit.gridsize";
    /** [app.lookandfeel]プロパティ  **/
    static String APP_LOOKANDFEEL           = "app.lookandfeel";
    /** [generate.browser_command]プロパティ  **/
    static String GEN_BROWSER_CMD           = "generate.browser_command";
    /** [generate.browser_command.1]プロパティ  **/
    static String GEN_BROWSER_CMD_1         = "generate.browser_command.1";
    /** [generate.browser_command.2]プロパティ  **/
    static String GEN_BROWSER_CMD_2         = "generate.browser_command.2";
    /** [command.html.editor]プロパティ  **/
    static String CMD_HTML_EDITOR           = "command.html.editor";
    /** [command.html.editor.1]プロパティ  **/
    static String CMD_HTML_EDITOR_1         = "command.html.editor.1";
    /** [command.html.editor.2]プロパティ  **/
    static String CMD_HTML_EDITOR_2         = "command.html.editor.2";
    /** [command.text.editor]プロパティ  **/
    static String CMD_TEXT_EDITOR           = "command.text.editor";
    /** [unit.color.ZoneUnit]プロパティ  **/
    static String UNIT_CLR_ZONEUNIT         = "unit.color.ZoneUnit";
    /** [unit.color.PageUnit]プロパティ  **/
    static String UNIT_CLR_PAGEUNIT         = "unit.color.PageUnit";
    /** [unit.color.LinkUnit]プロパティ  **/
    static String UNIT_CLR_LINKUNIT         = "unit.color.LinkUnit";
    /** [unit.color.StrongLink]プロパティ  **/
    static String UNIT_CLR_STRONG           = "unit.color.StrongLink";
    /** [unit.color.UrlUnit]プロパティ  **/
    static String UNIT_CLR_URLUNIT          = "unit.color.UrlUnit";
    /** [unit.color.AccessCount]プロパティ  **/
    static String UNIT_CLR_ACCESSCOUNT      = "unit.color.AccessCount";
    /** [panel.color.page]プロパティ  **/
    static String UNIT_CLR_PANEL_PAGE       = "panel.color.page";
    /** [panel.color.Map.Hier]プロパティ  **/
    static String UNIT_CLR_MAP_HIER         = "panel.color.Map.Hier";
    /** [panel.color.Map.Site]プロパティ  **/
    static String UNIT_CLR_MAP_SITE         = "panel.color.Map.Site";
    /** [panel.color.Map.Circle]プロパティ  **/
    static String UNIT_CLR_MAP_CIRCLE       = "panel.color.Map.Circle";
    /** [unit.color.NotExist]プロパティ  **/
    static String UNIT_CLR_NOT_EXIST        = "unit.color.NotExist";
    /** [unit.color.ScenarioItem]プロパティ  **/
    static String UNIT_CLR_SCENARIO_ITEM    = "unit.color.ScenarioItem";
    /** [viewtext.Zone.ZoneUnit]プロパティ  **/
    static String VIEWTEXT_ZONE_ZONEUNIT    = "viewtext.Zone.ZoneUnit";
    /** [viewtext.Zone.PageUnit]プロパティ  **/
    static String VIEWTEXT_ZONE_PAGEUNIT    = "viewtext.Zone.PageUnit";
    /** [viewtext.Zone.UrlUnit]プロパティ  **/
    static String VIEWTEXT_ZONE_URLUNIT     = "viewtext.Zone.UrlUnit";
    /** [viewtext.Map.PageUnit]プロパティ  **/
    static String VIEWTEXT_MAP_PAGEUNIT     = "viewtext.Map.PageUnit";
    /** [newproject.edit.html]プロパティ  **/
    static String NEWPROJECT_EDIT_HTML      = "newproject.edit.html";
    /** [env.first]プロパティ  **/
    static String ENV_FIRST                 = "env.first";
    /** [svg.line.width]プロパティ  **/
    static String SVG_LINEWIDTH             = "svg.line.width";

    /** LookAndFeel名のリスト（削除） 
    private String[] mLookAndFeel           = {"javax.swing.plaf.metal.MetalLookAndFeel" ,
                                               "com.sun.java.swing.plaf.motif.MotifLookAndFeel" ,
                                               "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"};
    **/
    /** LookAndFeel表示名のリスト（削除）

    private String[] mRadioLookAndFeel      = { "Metal" ,"Motif" ,"Windows"};
    **/
    /** パネル表示　Pageの表示リスト  (削除)
    private static String[] mRadioPage      = { "Name", "Title", "Comment", "File(Path)"};
    **/
    /** パネル表示　Zoneの表示リスト  (削除)
    private static String[] mRadioZone      = { "Name", "Comment", "File(Path)"};
    **/
    /** パネル表示　Urlの表示リスト (削除)
    private static String[] mRadioUrl       = { "Name", "Comment"};
    **/
    /** Start-UP表示名のリスト  (削除)**/
    private static String[] mRadioHtml      = { "On", "Off"};


    /**
      * 環境設定のダイアログ
      *
      * @return boolean     ボタンの状態true(OK)/false(Cancel)
      */
    public boolean EnvDialog() throws Exception {

        //OS毎にLook&Feelの値を変更（デフォルトWindows）
        init();

        JFrame frame = (JFrame)ZApp.getTheApp().getFrame();
        EnvDialog gdlg = new EnvDialog(frame, getResString(MSG_ENVIRONMENT_TITLE));

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

        //パネルのレイアウトを「GridBagLayout」にする
        mLayout = new GridBagLayout();
        mPanel.setLayout(mLayout);

        setPanelControl();

        // [メインコンポーネント]と[適用][取消]
        gdlg.setControlPanel(mPanel);

        // 初期状態の時はキャンセルボタンをなし
        if (mEnvFirst){
          JButton  CancelButton = gdlg.getCancelButton();
          CancelButton.setVisible(false);
        }

        //ダイアログに適用ボタンを配置する
        JButton mApply = new JButton("Apply");
        mApply.addActionListener(
          new ActionListener() {
              public void actionPerformed(ActionEvent e) { onApply(); }
          }
        );
        gdlg.getButtonPanel().add( mApply );

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

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

    /**
      * 初期設定
      *
      * @return void
      */
    private void init() {

        /* Look&dFeel と　Displayはツールバーにあるのでコメント
        // OSアーキテクチャ
        String arch = System.getProperty("os.arch");

        //Mac OS Xの場合
        if (arch.equals("ppc")) {
            mLookAndFeel[2] = "com.apple.mrj.swing.MacLookAndFeel";
            mRadioLookAndFeel[2] = "Mac";
        }
        */

        // 環境設定画面の起動状況
        mEnvFirst = getResBoolean(ENV_FIRST);

    }


/******************************************************************************
 *　パネル配置
 ******************************************************************************/
    /**
      * パネルのコントロールを配置する
      *
      * @return void
      */
    private void setPanelControl() throws Exception  {

        //　Look&dFeel と　Displayはツールバーにあるのでコメント
        //setPanelLookAndFeel(3);   // Look & Feel
        //setPanelDisplay(15);      // Display  (+4)

        setPanelLabel(0,"　");    // DUMMY
        if (mEnvFirst){
            setPanelRidualDir(1);     // Ridual Dir
            setPanelSeparator(2);     // Separator
        }
        setPanelGrid(3);          // Grid
        setPanelSeparator(4);     // Separator
        setPanelBrowser(5);       // Browser
        setPanelSeparator(6) ;    // Separator
        setPanelHtmlEdit(7);      // Html/Text Editor
        setPanelSeparator(9);     // Separator
        setPanelTextEdit(10);     // Html/Text Editor
        setPanelDocumentList(11); // Document List
        setPanelSeparator(12);    // Separator
        setPanelDefaultColor(13); // Default Color (+2)
        setPanelSeparator(15);    // Separator
        setPanelStartUp(16);      // Start Up (+2)
        setPanelSeparator(18);    // Separator
        setPanelSVGLineWidth(19);
        //setPanelSeparator(20);    // Separator
        //setPanelLabel(23,"　");   // Dummy
    }
    /**
      * パネルに[Ridual Dir]を配置する
      *
      * @param  int                 line    行数
      * @return void
      */
    private void setPanelRidualDir(int line) throws Exception  {
        // 「app.install.path」がNullの場合はカレントディレクトリの親のパスにする
        String inst =getResString(APP_INSTALL_PATH);
        if ( isNullString(inst) ) {
            String current = getCurrentPath();
            File dir = new File(current);
            inst = dir.getParent();
        }
        mRidualDir = setPanelLabelText(line, "Ridual Dir", inst, JFileChooser.DIRECTORIES_ONLY);
    }
    /**
      * パネルに[Look & Feel]を配置する
      *
      * @param  int                 line    行数
      * @return void
      */
/*(削除)
    private void setPanelLookAndFeel(int line) throws Exception  {
        mLookFeel = setPanelRadioButton(line, "Look&Feel", mRadioLookAndFeel, getLookAndFeel());
    }
*/
    /**
      * [Look & Feel]取得する
      *
      * @param  
      * @return String Look & Feel
      */
/*(削除)
    private String getLookAndFeel() throws Exception {
        int n = 0;
        String  lookandfeel = getResString(APP_LOOKANDFEEL);
        for ( n = 0 ; n < mLookAndFeel.length; n++ ) {
            if (mLookAndFeel[n].compareTo(lookandfeel) == 0)  break;
        }
        return mRadioLookAndFeel[n];
    }
*/
    /**
      * パネルに[Grid]を配置する
      *
      * @param  int                 line    行数
      * @return void
      */
    private void setPanelGrid(int line) throws Exception  {
        mGrid = setPanelCheckBoxText(line, "Grid", getResBoolean(EDIT_GRID), getResString(EDIT_GRIDSIZE));
    }
    /**
      * パネルに[Browser]を配置する
      *
      * @param  int                 line    行数
      * @return void
      */
    private void setPanelBrowser(int line) throws Exception  {

        int sel = 0;

        // Browserを取得、Nullの場合 ""
        String browser  = getResString(GEN_BROWSER_CMD);
        String browser1 = getResString(GEN_BROWSER_CMD_1);
        String browser2 = getResString(GEN_BROWSER_CMD_2);
        // デフォルトはどちらか？
        if ( browser.equals(browser1) ) {
            sel = 0;
        } else if ( browser.equals(browser2) ) {
            sel = 1;
        }
        mBrowser = setPanelRadioText(line, 
                                    "Browser", 
                                    getResString(GEN_BROWSER_CMD_1),
                                    getResString(GEN_BROWSER_CMD_2), 
                                    sel);

    }
    /**
      * パネルに[Editor(HTML/TEXT)]を配置する
      *
      * @param  int                 line    行数
      * @return void
      */
    private void setPanelHtmlEdit(int line) throws Exception  {

        int sel = 0;
        
        // Html/Text Editor
        String  html  = getResString(CMD_HTML_EDITOR);
        String  html1 = getResString(CMD_HTML_EDITOR_1);
        String  html2 = getResString(CMD_HTML_EDITOR_2);
        // デフォルトはどちらか？
        if ( html.equals(html1) ) {
            sel = 0;
        } else if ( html.equals(html2) ) {
            sel = 1;
        }
        mHtmlEdit =  setPanelRadioText(line, 
                                      "HTML Editor", 
                                      getResString(CMD_HTML_EDITOR_1),
                                      getResString(CMD_HTML_EDITOR_2), 
                                      sel);
  }
    /**
      * パネルに[Editor(HTML/TEXT)]を配置する
      *
      * @param  int                 line    行数
      * @return void
      */
    private void setPanelTextEdit(int line) throws Exception  {
        mTextEdit =  setPanelLabelText(line,"TEXT Editor", getResString(CMD_TEXT_EDITOR), JFileChooser.FILES_AND_DIRECTORIES);
    }
    /**
      * パネルに[Document List]を配置する
      *
      * @param  int                 line    行数
      * @return void
      */
    private void setPanelDocumentList(int line) throws Exception  {
        mDocList = setPanelDocList(line, "Document List");
    }
    /**
      * パネルに[Default Color"]を配置する
      *
      * @param  int                 line    行数
      * @return void
      */
    private void setPanelDefaultColor(int line)  throws Exception {

        // ラベル行
        setPanelLabel(line,"Default Color");

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

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

        // Layout制約の作成
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.NORTHWEST;
        gbc.fill   = GridBagConstraints.BOTH;

        // Panelに配置
        mColorZone          = setColorEditor(p, l, gbc, 0, 0, " Zone",          getResString(UNIT_CLR_ZONEUNIT));
        mColorPage          = setColorEditor(p, l, gbc, 0, 1, " Page",          getResString(UNIT_CLR_PAGEUNIT));
        mColorLink          = setColorEditor(p, l, gbc, 0, 2, " Link(Virtual)", getResString(UNIT_CLR_STRONG));
        mColorReal          = setColorEditor(p, l, gbc, 0, 3, " Link(Real)",    getResString(UNIT_CLR_LINKUNIT));
        mColorUrl           = setColorEditor(p, l, gbc, 0, 4, " Url",           getResString(UNIT_CLR_URLUNIT));

        mColorNotExist      = setColorEditor(p, l, gbc, 2, 0, " NotExist",      getResString(UNIT_CLR_NOT_EXIST));
        mColorMapHier       = setColorEditor(p, l, gbc, 2, 1, " MapHier",       getResString(UNIT_CLR_MAP_HIER));
        mColorMapSite       = setColorEditor(p, l, gbc, 2, 2, " MapSite",       getResString(UNIT_CLR_MAP_SITE));
        mColorMapCircle     = setColorEditor(p, l, gbc, 2, 3, " MapCircle",     getResString(UNIT_CLR_MAP_CIRCLE));
        mColorScenarioItem  = setColorEditor(p, l, gbc, 2, 4, " ScenarioItem",  getResString(UNIT_CLR_SCENARIO_ITEM));

        //mColorAccessCount   = setColorEditor(p, l, gbc, 2, 4, " AccessCount",   getResString(UNIT_CLR_ACCESSCOUNT));
        //mColorPanelPage     = setColorEditor(p, l, gbc, 2, 0, " PanelPage",     getResString(UNIT_CLR_PANEL_PAGE));

        // コンポーネント用レイアウト制約の作成
        GridBagConstraints  cgbc= createComponentConstraints();
        cgbc.gridy = line+1;
        cgbc.gridx = 0;
        cgbc.gridwidth = 2;
        mLayout.setConstraints(p, cgbc);
        mPanel.add(p);
    }
    /**
      * テキストフィールドとカラーダイアログコントロールを配置
      * 
      * @param  JPanel              p       パネル
      * @param  GridBagLayout       l       レイアウト
      * @param  GridBagConstraints  gbc     Layout制約の作成
      * @param  int                 x       列
      * @param  int                 y       行
      * @param  String              label   ラベル
      * @param  String              color   カラーコード
      * @return EnvColorEditor
      */
    private EnvColorEditor setColorEditor(JPanel p, GridBagLayout l, GridBagConstraints gbc, int x, int y, String label, String color) {

        // ラベルを配置
        gbc.weightx  = 0.0 ;
        gbc.insets   = new Insets(0,10,0,10) ;
        JLabel lb    = new JLabel(label);
        gbc.gridx    = x;
        gbc.gridy    = y;
        l.setConstraints(lb, gbc);
        p.add(lb);

        // EnvColorEditorを配置
        EnvColorEditor env_color  = new EnvColorEditor(color);
        gbc.insets    = new Insets(0,0,0,0) ;
        gbc.weightx   = 1.0 ;
        gbc.gridx     = x+1;
        gbc.gridy     = y;
        l.setConstraints(env_color.getPanel(), gbc);
        p.add(env_color.getPanel());
        
        return env_color;
    }
    /**
      * パネルに[Display"]を配置する
      *
      * @param  int                 line    行数
      * @return void
      */
/*(削除)
    private void setPanelDisplay(int line) {
        setPanelLabel(line,"Display");
        mDispZone = setPanelRadioButton(line+1, "  Zone", mRadioZone, getDialayItem(VIEWTEXT_ZONE_ZONEUNIT));
        mDispPage = setPanelRadioButton(line+2, "  Page", mRadioPage, getDialayItem(VIEWTEXT_ZONE_PAGEUNIT));
        mDispUrl  = setPanelRadioButton(line+3, "  Url",  mRadioUrl,  getDialayItem(VIEWTEXT_ZONE_URLUNIT));
    }
*/
    /**
      * Displayを取得する
      *　Fileの場合のみ、"(Path)"を付加する
      * @param  String      resource      リソース名
      * @return string
      */
/*(削除)
    private String getDialayItem(String resource) {
          ZResource res = ZApp.getTheApp().getResource();
          String  dialay = res.getString(resource);
          if (dialay.compareTo("File") == 0) dialay = dialay + "(Path)";
          return dialay;
    }
*/
    /**
      * パネルに[StartUp]を配置する
      *
      * @param  int                 line    行数
      * @return void
      */
    private void setPanelStartUp(int line) {
        setPanelLabel(line,"Start-Up");
        mStartHtml = setPanelRadioButton(line+1, "  HTML-Editor", mRadioHtml, getStartUp(NEWPROJECT_EDIT_HTML));
    }
    /**
      * Start-Upの取得する
      *
      * @param  String      resource      リソース名
      * @return String      On/Offの文字列
      */
    private String getStartUp(String resource) {
          boolean  startup = getResBoolean(resource);
          if (startup) return "On"; else  return "Off";
    }

    /**
      * パネルに[SVG Line Width]を配置する
      *
      * @param  int                 line    行数
      * @return void
      */
    private void setPanelSVGLineWidth(int line) throws Exception  {
        mSvg = setPanelLabelTextLabel(line, "SVG Line Width ",getResString(SVG_LINEWIDTH), "　%　");
    }

    /**
      * ラベル用レイアウト制約の作成
      *
      * @return GridBagConstraints
      */
    private GridBagConstraints createLabelConstraints() {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor  = GridBagConstraints.NORTHWEST;
        gbc.weightx = 0.0 ;
        gbc.insets  = new Insets(0,10,0,10) ;
        return gbc;
    }
    /**
      * コンポーネント用レイアウト制約の作成
      *
      * @return GridBagConstraints
      */
    private GridBagConstraints createComponentConstraints() {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill    = GridBagConstraints.BOTH;
        gbc.weightx = 1.0 ;
        gbc.insets    = new Insets(0,0,0,10) ;
        return gbc;
    }
    /**
      * ラベルのコントロールを配置
      *
      * @param  int         line            行
      * @param  String      label           ラベル
      * @return void
      */
    private void  setPanelLabel(int line, String label) {
        setPanelLayoutLabel(line,label);
    }
    /**
      * テキストフィールドのコントロールを配置(JFileChooser有り)
      * 
      * @param  int         line            行
      * @param  String      label           ラベル
      * @param  String      value           テキスト
      * @param  int         mode            ファイルセレクトモード
      * @return EnvTextField
      */
    private EnvTextField setPanelLabelText(int line, String label, String value, int mode) {
        // テキストフィールド生成
        EnvTextField itf = new EnvTextField(value, mode);
        // ラベル配置
        setPanelLayoutLabel(line,label);
        // コンポーネント配置（テキストフィールド）
        setPanelLayoutComponent(line, itf.getPanel());
        return itf;
    }

    /**
      * テキストフィールドのコントロールを配置
      * 
      * @param  int         line            行
      * @param  String      label1          ラベル
      * @param  String      value           テキスト
      * @param  String      label2          ラベル
      * @return EnvTextField
      */
    private EnvTextField setPanelLabelTextLabel(int line, String label1, String value, String label2) {

        // テキストフィールド生成
        EnvTextField itf = new EnvTextField(value, label2);
        // ラベル配置
        setPanelLayoutLabel(line,label1);
        // コンポーネント配置（テキストフィールド）
        setPanelLayoutComponent(line, itf.getPanel());
        return itf;
    }
    /**
      * チェックボックス付きテキストフィールドのコントロールを配置
      * 
      * @param  int         line            行
      * @param  String      label           ラベル
      * @param  boolean     selected        チェックボックスの状態
      * @param  String      value           テキスト
      * @return EnvCheckBoxText
      */
    private EnvCheckBoxText setPanelCheckBoxText(int line, String label, boolean selected, String value) {
        // チェックボックス付きテキストフィールドの生成
        EnvCheckBoxText ice = new EnvCheckBoxText(selected, value);
        // ラベル配置
        setPanelLayoutLabel(line,label);
        // コンポーネント配置（チェックボックス付きテキストフィールド）
        setPanelLayoutComponent(line, ice.getPanel());
        return ice;
  }
    /**
      * ラジオボタンコントロールを配置
      * 
      * @param  int         line            行
      * @param  String      label           ラベル
      * @param  String[]    radioButton     ラジオボタンのラベル
      * @param  String      checked         選択
      * @return EnvRadioButton
      */
    private EnvRadioButton setPanelRadioButton(int line, String label, String[] radioButton, String checked) {
        // ラジオボタンコントロールの生成
        EnvRadioButton irb =  new EnvRadioButton();
        for ( int n=0 ; n<radioButton.length ; n++ ) {
            irb.addItem(radioButton[n]);
        }
        // 値を設定
        irb.setString(checked);
        // ラベル配置
        setPanelLayoutLabel(line,label);
        // コンポーネント配置（ラジオボタン）
        setPanelLayoutComponent(line, irb.getPanel());
        return irb;
    }
    /**
      * チェックボックス付きテキストフィールドのコントロールを配置
      * 
      * @param  int         line            行
      * @param  String      label           ラベル
      * @param  boolean     selected        チェックボックスの状態
      * @param  String      value           テキスト
      * @return EnvCheckBoxText
      */
    private EnvRadioText setPanelRadioText(int line, String label, String value1, String value2, int selected ) {
        // チェックボックス付きテキストフィールドの生成
        EnvRadioText ice = new EnvRadioText(value1, value2);
        ice.setSelected(selected);
        // ラベル配置
        setPanelLayoutLabel(line,label);
        // コンポーネント配置（チェックボックス付きテキストフィールド）
        setPanelLayoutComponent(line, ice.getPanel());
        return ice;
  }
    /**
      * セパレータの配置
      *
      * @return EnvRadioButton
      */
    private void setPanelSeparator(int line) {
        EnvSeparator ISeparator = new EnvSeparator();
        // レイアウト制約の作成
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill       = GridBagConstraints.BOTH;
        gbc.weightx    = 1.0 ;
        gbc.insets     = new Insets(0,0,0,10) ;
        gbc.gridy      = line;
        gbc.gridx      = 0;
        gbc.gridwidth  = 2;
        gbc.gridheight = 1;
        mLayout.setConstraints(ISeparator, gbc);
        mPanel.add(ISeparator);
    }
    /**
      * ドキュメントリストのコントロールを配置
      * 
      * @param  int         line            行
      * @param  String      label           ラベル
      * @return EnvDocumentList
      */
    private EnvDocumentList setPanelDocList(int line, String label) throws Exception  {
        // テキストフィールド生成
        EnvDocumentList itf = new EnvDocumentList();
        // ラベル配置
        setPanelLayoutLabel(line,label);
        // コンポーネント配置
        setPanelLayoutComponent(line, itf.getPanel());
        return itf;
    }
    /**
      * ラベルを配置
      * @param  int         line            行
      * @param  String      label           ラベル
      * @return void
      */
    private void setPanelLayoutLabel(int line, String value) {
        // ラベル用レイアウト制約の作成
        GridBagConstraints gbc = createLabelConstraints();
        JLabel label = new JLabel(value);
        gbc.gridy = line;
        gbc.gridx = 0;
        mLayout.setConstraints(label, gbc);
        mPanel.add(label);
    }
    /**
      * コンポーネントを配置
      * @param  int         line            行
      * @param  JComponent  component       コンポーネント
      */
    private void setPanelLayoutComponent(int line, JComponent component) {
        // コンポーネント用レイアウト制約の作成
        GridBagConstraints gbc = createComponentConstraints();
        gbc.gridy = line;
        gbc.gridx = 1;
        mLayout.setConstraints(component, gbc);
        mPanel.add(component);
    }


/******************************************************************************
 *　環境変数を設定
 ******************************************************************************/
    /**
      * 環境変数を設定
      * @return void
      */
    private void setEnvironment()  throws Exception {

        // 設定
        if (mEnvFirst){
            setRidualDir();         // Ridial Dir    
        }
        setGrid();                  // Grid
        setBrowser();               // Browser
        setHtmlEditor();            // Html Edit
        setTextEditor();            // Text Edit
        mDocList.setDocList();      // Documet List
        setDefaultColor();          // Default Color
        setStartUp();               // Start Up
        setSvgLineWidth();          // Svg Line Width

        //ツールバーを更新する
        ((jp.co.nri.Ridual)ZApp.getTheApp()).resetGroupToolBar();
        RUpdateManager.update(RUpdateManager.PANEL_ACTIVE);
    }

    /**
      * 「適用」ボタン
      *
      * @return void
      */
    public void onApply() {
        try {
            setEnvironment();
            //GridとSVG LineWidthは再設定
            mGrid.setString(getResString(EDIT_GRIDSIZE));
            mSvg.setString(getResString(SVG_LINEWIDTH));
        } catch ( Throwable e) {
        }
    }

    /**
      * Ridual Dirを設定
      * 　設定値がNULLの場合は、前回指定した値とする
      * 
      * @return void
      */
    private void setRidualDir() throws Exception {
        String ridual = mRidualDir.getString();
        if (isNullString(ridual)) ridual = getResString(APP_INSTALL_PATH);
        setResString(APP_INSTALL_PATH, ridual);

        //一度　Ridual Dirを入力したら入力できなくする
        setResBoolean(ENV_FIRST, false);
    }
    /**
      * Look&Feelを設定
      * @param  
      * @return void
      */
/*(削除)
    private void setLookAndFeel() throws Exception {
        int n;
        String value = mLookFeel.getString();
        for (n = 0 ; n < mRadioLookAndFeel.length; n++ ) {
            if (mRadioLookAndFeel[n].compareTo(value) == 0) break;
        }
        setResString(APP_LOOKANDFEEL, mLookAndFeel[n]);
    }
*/
    /**
      * Gridを設定
      *     1 <= グリット値 <= 100まで、それ以外はデフォルト値とする
      * 
      * @return void
      */
    private void setGrid() throws Exception {
        setResBoolean(EDIT_GRID, mGrid.getSelected());

        //文字列取得
        String str=mGrid.getString();
        if ( str != null ) {
            String gridValue = null;
            //文字列が数値（0-9)か判断
            if ( isDigitString(str) ) {
                int Suu = Integer.parseInt(str);
                if ( (1 <= Suu) && (Suu <= 100)) gridValue = str;
            }
            setResString(EDIT_GRIDSIZE, gridValue);
        } else {
            setResString(EDIT_GRIDSIZE, null);
        }
    }
    /**
      * ブラウザを設定
      * 　指定されたブラウザをデフォルトとする
      *
      * @return void
      */
    private void setBrowser() {
        String browser;
        if (mBrowser.getSelected() == 0) {
            browser = mBrowser.getString1();
        } else {
            browser = mBrowser.getString2();
        }
        setResString(GEN_BROWSER_CMD,   browser);
        setResString(GEN_BROWSER_CMD_1, mBrowser.getString1());
        setResString(GEN_BROWSER_CMD_2, mBrowser.getString2());
    }
    /**
      * HTMLエディタを設定
      * 　指定されたHTMLエディタをデフォルトとする
      * 
      * @return void
      */
    private void setHtmlEditor() {
        String htmlEdit;
        if (mHtmlEdit.getSelected() == 0) {
            htmlEdit = mHtmlEdit.getString1();
        } else {
            htmlEdit = mHtmlEdit.getString2();
        }
        setResString(CMD_HTML_EDITOR,   htmlEdit);
        setResString(CMD_HTML_EDITOR_1, mHtmlEdit.getString1());
        setResString(CMD_HTML_EDITOR_2, mHtmlEdit.getString2());
    }
    /**
      * TEXTエディタを設定
      * 
      * @return void
      */
    private void setTextEditor() {
        setResString(CMD_TEXT_EDITOR, mTextEdit.getString());
    }
    /**
      * デフォルトカラーを設定
      * 
      * @return void
      */
    private void setDefaultColor() {
        setResString(UNIT_CLR_ZONEUNIT,      mColorZone.getString());            // Zone
        setResString(UNIT_CLR_PAGEUNIT,      mColorPage.getString());            // Panel
        setResString(UNIT_CLR_STRONG,        mColorLink.getString());            // Link:Virtual
        setResString(UNIT_CLR_LINKUNIT,      mColorReal.getString());            // Link:Real
        setResString(UNIT_CLR_URLUNIT ,      mColorUrl.getString());             // Url
        setResString(UNIT_CLR_MAP_HIER,      mColorMapHier.getString());         // MapHier
        setResString(UNIT_CLR_MAP_SITE,      mColorMapSite.getString());         // MapSite
        setResString(UNIT_CLR_MAP_CIRCLE,    mColorMapCircle.getString());       // MapCircle
        setResString(UNIT_CLR_NOT_EXIST,     mColorNotExist.getString());        // NotExist
        setResString(UNIT_CLR_SCENARIO_ITEM, mColorScenarioItem.getString());    // ScenarioItem
        //setResString(UNIT_CLR_ACCESSCOUNT,   mColorAccessCount.getString());     // AccessCount
        //setResString(UNIT_CLR_PANEL_PAGE,    mColorPanelPage.getString());       // PanelPage

    }
    /**
      * Diaplayを設定
      * 
      * @return void
      */
/*(削除)
    private void setDiaplay() {
        setDialayItem(VIEWTEXT_ZONE_ZONEUNIT, mDispZone.getString());
        setDialayItem(VIEWTEXT_ZONE_PAGEUNIT, mDispPage.getString());
        setDialayItem(VIEWTEXT_ZONE_URLUNIT,  mDispUrl.getString());
    }
*/
    /**
      * Diaplayを設定する
      *　File(Path)の場合は、Fileに変更する
      * @param  String      resource      リソース名
      * @param  String      value         文字列
      * @return void
      */
    private void setDialayItem(String resource, String value) {
          // [File(Path)]の場合は、「File」にする
          if (value.indexOf("(Path)") != -1) value = "File";
          setResString(resource, value);
    }
    /**
      * Start-Upを設定
      * 
      * @return void
      */
    private void setStartUp() {
          boolean startup = false;
          String value = mStartHtml.getString();
          if (value.compareTo("On") == 0)  startup = true;
          setResBoolean(NEWPROJECT_EDIT_HTML, startup);
    }
    /**
      * Svg Line Widthを設定
      * 
      * @return void
      */
    private void setSvgLineWidth() throws Exception {
        //文字列取得
        String str=mSvg.getString();
        if ( str != null ) {
            String lineWidth = null;
            //文字列が数値（0-9)か判断
            if ( isDigitString(str) ) {
                int Suu = Integer.parseInt(str);
                if ( (1 <= Suu) && (Suu <= 100)) lineWidth = str;
            }
            setResString(SVG_LINEWIDTH, lineWidth);
        } else {
            setResString(SVG_LINEWIDTH, null);
        }
    }

/******************************************************************************
 *　
 ******************************************************************************/
    /**
      * String型がＮＵＬＬか判断する
      *
      * @param  String      str           ファイル名
      * @return boolean     true (null)/false(not null)
      */
    private boolean isNullString(String str) throws Exception {
        boolean ret;
        if ( (str == null) || (str.equals("")) ) {
            ret = true;
        } else {
            ret = false;
        } 
        return ret;
    }
    /**
      * リソースファイルへ設定(String)
      *
      * @param  String      resource      リソース名
      * @param  String      value         文字列
      * @return void
      */
    private void setResString(String resource, String value) {
        ZResource res = ZApp.getTheApp().getResource();
        res.putString(resource, value);
    }
    /**
      * リソースファイルへ設定(boolean)
      *
      * @param  String      resource      リソース名
      * @param  boolean     value         true/false
      * @return void
      */
    private void setResBoolean(String resource, boolean value) {
        ZResource res = ZApp.getTheApp().getResource();
        res.putBoolean(resource, value);
    }
    /**
      * リソースファイルの取得(String)
      *
      * @param  String      resource      リソース名
      * @return String      文字列
      */
    private String getResString(String resource) throws Exception {
        ZResource res = ZApp.getTheApp().getResource();
        String val = res.getString(resource);
        if (isNullString(val)) val = "";  
        return val;
    }
    /**
      * リソースファイルの取得(boolean)
      *
      * @param  String      resource      リソース名
      * @return boolean     true/false
      */
    private boolean getResBoolean(String resource) {
        ZResource res = ZApp.getTheApp().getResource();
        return (res.getBoolean(resource));
    }

    /**
      * カレントディレクトリの絶対パスを取得する
      *
      * @return String  カレントディレクトリのパス
    */
    private String getCurrentPath() throws Exception {
        File fileParentDir = new File(".").getAbsoluteFile().getParentFile();
        return (fileParentDir.getAbsolutePath());
    }

    /**
      * 文字列が数値（0-9)か判断
      *
      * @return boolean  true(数値)/false(数値以外)
    */
    private boolean isDigitString(String str) throws Exception {
        for (int i=0; i<str.length() ; i++ ){
            if (!Character.isDigit(str.charAt(i))) return false;
        }
        return true;
    }
}
