/*
 * @(#)EnvDocmentList.java
 *
 * Copyright 2001 Nomura Research Institute, LTD. All rights reserved.
 *
 * RID-X : 製作指示書のサンプルドキュメント
 *
 * @author  Intelligent Technology Inc.
 * @version 1.00 2002/05/07
 */
package jp.co.nri.rid.environment;

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.*;

import jp.co.nri.rid.error.*;


import javax.swing.JComponent;
import javax.swing.JColorChooser;
import jp.co.iti.fagot.util.ZGraphicUtil;

import jp.co.iti.fagot.ZApp;
import jp.co.iti.fagot.util.ZResource;

/**
  *製作指示書のサンプルドキュメント
  **/
public class EnvDocumentList extends JPanel {

    /** パネル **/
    protected JPanel              mPanel    = null;
    /** リストパネル **/
    protected JScrollPane         mSPanel   = null;
    /** ボタンパネル **/
    protected JPanel              mBPanel   = null;
    /** リスト **/
    protected JList               mList     = null;
    /** 新規ボタン **/
    protected JButton             mJBNew    = null;
    /** 編集ボタン **/
    protected JButton             mJBEdit   = null;
    /** 削除ボタン **/
    protected JButton             mJBDel    = null;
    /** ドキュメント配列 **/
    protected Vector              mDtLst    = null;
    /** モード **/
    protected DefaultListModel    mModel    = null;
    /** 変更前の件数 **/
    protected int                 mListCnt  = 0;

/**
  *  ドキュメントリストの生成
  */
    public EnvDocumentList() throws Exception {

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

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

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

        //Document List
        crtDocList();
        gbc.anchor  = GridBagConstraints.NORTHWEST;
        gbc.fill    = GridBagConstraints.BOTH;
        gbc.gridx   = 0;
        gbc.gridy   = 0;
        gbc.weightx = 1.0;
        mLayout.setConstraints(mSPanel, gbc);
        mPanel.add(mSPanel);

        //ボタンパネル
        crtButtonPanel(mLayout, gbc);
        gbc.gridx   = 1;
        gbc.gridy   = 0;
        mLayout.setConstraints(mBPanel, gbc);
        mPanel.add(mBPanel);

    }


/**
  * LISTの生成
  *
  */
    public void crtDocList() throws Exception {

        // リストの生成
        mModel = new DefaultListModel();
        mList = new JList(mModel);
        mList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);  //常に一つの行しか選択できない

        // ドキュメントをリストに反映
        mDtLst = getDocList();
        mListCnt = mDtLst.size();

        for (int n = 0; n < mDtLst.size(); n++) {
            // ドキュメント情報の取得
            DocumentType dt = (DocumentType)mDtLst.elementAt(n);
            mModel.addElement(dt.app);
        }

        //スクロールパネル
        mSPanel = new JScrollPane();
        mSPanel.getViewport().setView(mList);
        mSPanel.setPreferredSize(new Dimension(200, 30));
    }


/**
  * ボタンパネルの生成
  *
  * @param  GridBagLayout         Layout(GridBagLayout)
  * @param  GridBagConstraints    Layout制約の作成
  * @return void
  */

    public void crtButtonPanel(GridBagLayout layout, GridBagConstraints gbc) throws Exception {

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

        // Layoutを「GridBagLayout」にする
        mBPanel.setLayout(layout);

        // New Button
        mJBNew = new JButton("New");
        mJBNew.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) { NewDocument(); }
            }
        );
        gbc.anchor  = GridBagConstraints.NORTHWEST;
        gbc.fill    = GridBagConstraints.BOTH;
        gbc.gridx   = 0;
        gbc.gridy   = 0;
        gbc.weightx = 0.0;
        layout.setConstraints(mJBNew, gbc);
        mBPanel.add(mJBNew);

        // Edit Button
        mJBEdit = new JButton("Edit");
        mJBEdit.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) { EditDocument(); }
            }
        );
        gbc.fill    = GridBagConstraints.BOTH;
        gbc.weightx = 0.0;
        gbc.gridx   = 0;
        gbc.gridy   = 1;
        layout.setConstraints(mJBEdit, gbc);
        mBPanel.add(mJBEdit);

        // Delete Button
        mJBDel = new JButton("Delete");
        mJBDel.addActionListener(
            new ActionListener() {
                public void actionPerformed(ActionEvent e) { DelDocument(); }
            }
        );
        gbc.fill    = GridBagConstraints.BOTH;
        gbc.weightx = 0.0;
        gbc.gridx   = 0;
        gbc.gridy   = 2;
        layout.setConstraints(mJBDel, gbc);
        mBPanel.add(mJBDel);

    }


/**
  * ドキュメントの取得
  *
  * @return Vector      ドキュメントリスト
  *
  *   command.doc.app.n   = アプリケーション名
  *   command.doc.cmd.n   = アプリケーションコマンド
  *   command.doc.ext.n   = 拡張子
  *   command.doc.view.n  = 製作指示書用拡張子(省略可)
  */
    public Vector getDocList() throws Exception {

        //Documentのリスト
        Vector  doc_lst  = new Vector();
        
        String  command;

        //リソースファイルからブラウザコマンドのリストを設定する
        ZResource res = ZApp.getTheApp().getResource();

        for ( int i = 1; ; i++ ) {

            //拡張子
            command = "command.doc.ext." + Integer.toString(i);
            String  doc_ext = res.getString(command);

            // 拡張子の指定が無い場合終了
            if ( isNullString(doc_ext) ) break;

            //アプリケーション名
            command = "command.doc.app." + Integer.toString(i);
            String  doc_app = res.getString(command);
          
            //アプリケーションコマンド
            command = "command.doc.cmd." + Integer.toString(i);
            String  doc_cmd = res.getString(command);

            //製作指示書用拡張子(省略可)
            command = "command.doc.view." + Integer.toString(i);
            String  doc_view = res.getString(command);

            DocumentType dt = new DocumentType();
            dt.app =doc_app;
            dt.cmd =doc_cmd;
            dt.ext =doc_ext;
            dt.view =doc_view;
            doc_lst.add(dt);
        }
        return doc_lst;
    }



/**
  * ドキュメントの設定
  *
  * @return void
  *
  *   command.doc.app.n   = アプリケーション名
  *   command.doc.cmd.n   = アプリケーションコマンド
  *   command.doc.ext.n   = 拡張子
  *   command.doc.view.n  = 製作指示書用拡張子(省略可)
  */
    public void setDocList() throws Exception {

        String  cmd_app, cmd_ext, cmd_cmd, cmd_view;
        int max = Math.max(mListCnt,mDtLst.size());

        //リソースファイルからブラウザコマンドのリストを設定する
        ZResource res = ZApp.getTheApp().getResource();

        for ( int i = 1; i <= max; i++ ) {
            cmd_app  = "command.doc.app."  + Integer.toString(i); //アプリケーション名
            cmd_cmd  = "command.doc.cmd."  + Integer.toString(i); //アプリケーションコマンド
            cmd_ext  = "command.doc.ext."  + Integer.toString(i); //拡張子
            cmd_view = "command.doc.view." + Integer.toString(i); //製作指示書用拡張子(省略可)

            
            if (i <= mDtLst.size() ) {
                DocumentType dt = (DocumentType)mDtLst.elementAt(i-1);
                res.putString(cmd_app, dt.app);
                res.putString(cmd_cmd, dt.cmd);
                res.putString(cmd_ext, dt.ext);
                res.putString(cmd_view,dt.view);
            } else {
                res.putString(cmd_app, null);
                res.putString(cmd_cmd, null);
                res.putString(cmd_ext, null);
                res.putString(cmd_view,null);
            }
        }
    }

/**
  * JPanelの取得
  *
  * @return JPanel
  */
    public JPanel getPanel(){
        return mPanel;
    }


/**
  *　新規ボタンが押されたときの処理
  *
  * @return void
  */
    public void NewDocument()  {

        boolean ret;
        RidMessage ridMsg = new RidMessage();

        DocumentType  dt = new DocumentType();
        DocumentTypeDialog dtdlg = new DocumentTypeDialog();
        ret = dtdlg.newDocument(dt);

        if (ret) {
            // null
            if (isNullString(dt.app) || isNullString(dt.cmd) || isNullString(dt.ext) ){
                MessageDialog.showError(ridMsg.Warning("W4008",""));
            } else {
                //追加
                if (mDtLst.indexOf(dt) == -1) {
                    mDtLst.add(dt);
                    mModel.addElement(dt.app);
                }
            }
        }
    }

/**
  *　編集ボタンが押されたときの処理
  *
  * @return void
  */
    public void EditDocument() {

        int pos;
        boolean ret;

        // 選択状態
        if ((pos = mList.getSelectedIndex()) > -1) {

            DocumentType dt = (DocumentType)mDtLst.elementAt(pos);

            DocumentTypeDialog dtdlg = new DocumentTypeDialog();
            
            ret = dtdlg.editDocument(dt);

            if (ret) {
  
                //削除・追加
                mDtLst.remove(pos);
                mModel.remove(pos);
                mDtLst.add(pos, dt);
                mModel.add(pos, dt.app);
            }

        }
    }
/**
  *　削除ボタンが押されたときの処理
  *
  * @return void
  */
    public void DelDocument() {

        int pos;

        // 選択状態
        if ((pos = mList.getSelectedIndex()) > -1) {
            //
            mDtLst.remove(pos);
            mModel.remove(pos);
        }
    }


/**
  * String型がＮＵＬＬか判断する
  *
  * @param  String      str           ファイル名
  * @return boolean     true (null)/false(not null)
  */
    public boolean isNullString(String str) {

        boolean ret;
        if ( (str == null) || (str.equals("")) ) {
            ret = true;
        } else {
            ret = false;
        } 
        return ret;
    }

}
