// <summary>ソースコード：観測水位入力モデル用プロパティクラス</summary>
// <author>CommonMP</author>

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;


using CommonMP.HYSSOP.Interface.HSData;
using CommonMP.HYSSOP.Interface.HSController;
using CommonMP.HYSSOP.Interface.HSViewer;
using CommonMP.HYSSOP.CoreImpl.HSData;
using CommonMP.HYSSOP.CoreImpl.HSController;
using CommonMP.HYSSOP.CoreImpl.HSTools;

using CommonMP.HYMCO.Interface;
using CommonMP.HYMCO.Interface.Viewer;
using CommonMP.HYMCO.Interface.Data;
using CommonMP.HYMCO.CoreImpl.Controller;
using CommonMP.HYMCO.CoreImpl.Data;
using CommonMP.HYMCO.CoreOptions.McViewer.DotNetViewer;


namespace CommonMP.HYMCO.OptionImpl.McWaterLevelGaugingForDevelop
{
    /// <summary><para>class outline:</para>
    /// <para>観測水位入力モデル用プロパティ画面用 .net のフォーム</para>
    /// </summary>
    /// <remarks><para>history:</para>
    /// <para>[CommonMP][ver 1.0.0][2010/01/12][新規作成]</para>
    /// <para>remarks:</para>
    /// <para>必ず　McDotNetModelCellPropertyDetailBaseForm, McModelCellPropertyDetailFormIFから派生の事</para>
    /// </remarks>
    public partial class McWaterLevelGaugingForm :McDotNetModelCellPropertyDetailBaseForm, McModelCellPropertyDetailFormIF
    {

        /// <summary> 読み込むファイルのパス </summary>
        private string m_sFileNamePath = "";

        /// <summary> 観測所時点数 </summary>
        private long m_lSeriesNum = 1;

        /// <summary> ファイル形式 </summary>
        private string m_sFileType = "";

        /// <summary> 出力地点 </summary>
        private long m_lOutPoint = 0;

        /// <summary>
        /// <para>method outline:</para>
        /// <para>デフォルトコンストラクタ</para>
        /// </summary>
        /// <example>
        /// <para>usage:</para>
        /// <para>McWaterLevelGaugingForm csPropertyDetailForm = new McWaterLevelGaugingForm();</para>
        /// </example>
        /// <param name="">無し</param>
        /// <returns>無し</returns>
        /// <exception cref="">無し</exception>
        /// <remarks>
        /// <para>remarks:</para>
        /// <para>無し</para>
        /// </remarks>
        public McWaterLevelGaugingForm()
        {
            InitializeComponent();

            //フォームの外見を設定
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
            this.MaximizeBox = false;
            this.MinimizeBox = false;
        }

        /// <summary>
        /// <para>method outline:</para>
        /// <para>プロパティ表示編集</para>
        /// </summary>
        /// <example>
        /// <para>usage:</para>
        /// <para>EditParameter( );</para>
        /// </example>
        /// <param name="">無し</param>
        /// <returns>無し</returns>
        /// <exception cref="">無し</exception>
        /// <remarks>
        /// <para>remarks:</para>
        /// <para>無し</para>
        /// </remarks>
        public void EditParameter()
        {

            // 画面表示情報編集
            McModelPropertyInfo csModelPropertyInfo = m_csPropertyInfo as McModelPropertyInfo;
            if (csModelPropertyInfo != null)
            {
                // ToDo 
                // 画面に表示する初期情報等を　モデルのプロパティ情報から取得して
                // 画面上の部品に設定してください
                csModelPropertyInfo.GetInfo("m_csInFileNameWithPath", ref m_sFileNamePath);
                csModelPropertyInfo.GetInfo("m_csFileType", ref m_sFileType);
                csModelPropertyInfo.GetInfo("m_csSerialNum", ref m_lSeriesNum);
                csModelPropertyInfo.GetInfo("m_lOutPoint", ref m_lOutPoint);


                FileName.Text = m_sFileNamePath;

                
                //ファイル形式を設定
                if (m_sFileType == McWaterLevelGaugingDefine.INPUTFILE_TYPE_CSV)
                {
                    radioButtonCSVFile.Checked = true;
                }
                else if (m_sFileType == McWaterLevelGaugingDefine.INPUTFILE_TYPE_WSF)
                {
                    radioButtonWisefFile.Checked = true;
                }

                textBox_seriserNum.Text = m_lSeriesNum.ToString();

                //出力地点指定
                if (m_lOutPoint == 0)
                {
                    radioButton_OutAll.Checked = true;
                    textBox_OutPoint.Text = "";
                }
                else
                {
                    radioButton_OutPoint.Checked = true;
                    textBox_OutPoint.Text = m_lOutPoint.ToString();
                }
                textBox_OutPoint.Enabled = radioButton_OutPoint.Checked;

            }
        }

        /// <summary><para>method outline:</para>
        /// <para>出力地点選択変更時処理</para>
        /// </summary>
        /// <param name="sender">Object</param>
        /// <param name="e">Event</param>
        private void radioButton_OutPoint_CheckedChanged(object sender, EventArgs e)
        {
            textBox_OutPoint.Enabled = radioButton_OutPoint.Checked;
            if (textBox_OutPoint.Enabled && textBox_OutPoint.exIsEmpty)
            {
                textBox_OutPoint.Text = "1";
            }
        }

        /// <summary><para>method outline:</para>
        /// <para>ファイル入力処理</para>
        /// </summary>
        /// <example><para>usage:</para>
        /// <para>FileOpen_Click(sender,e);</para>
        /// </example>
        /// <param name="sender">Object</param>
        /// <param name="e">Event</param>
        /// <returns>無し</returns>
        /// <exception cref="">無し</exception>
        /// <remarks>
        /// <para>remarks:</para>
        /// <para>「ファイル入力」ボタンを押下された時の処理を記述</para>
        /// </remarks>
        private void FileOpen_Click(object sender, EventArgs e)
        {
            string sPath = "";      // FileNameテキストボックスに入力されている文字列
            string sDir = "";       // ディレクトリ・パス名（ファイル名を含まない）
            string sFile = "";      // ファイル名（パス名を含まない）

            McModelPropertyInfo csModelPropertyInfo = m_csPropertyInfo as McModelPropertyInfo;
            csModelPropertyInfo.GetInfo("m_csInFileNameWithPath", ref sPath);

            //OpenFileDialogクラスのインスタンスを作成
            OpenFileDialog ofd = new OpenFileDialog();

            // はじめのファイル名を指定する場合
            McWaterLevelGaugingPropertyScreen csPrptyScreen = this.m_csScreen as McWaterLevelGaugingPropertyScreen;

            // 初めて要素モデルを配置する場合
            if (sPath == "")
            {
                sDir = csPrptyScreen.GetProjectGroupDirectory().ToString() + "\\InputData";
            }
            // フルパスで記述されている場合は、そのまま渡す。
            else if (sPath.IndexOf(":") >= 0)
            {
                sDir = System.IO.Path.GetDirectoryName(sPath);
                sFile = System.IO.Path.GetFileName(sPath);
            }
            // 相対パスで記述されている場合も、そのまま渡す（プロジェクト・ディレクトリの外に入力ファイルを置く場合）。
            else if (sPath.IndexOf("..") >= 0)
            {
                sDir = System.IO.Path.GetDirectoryName(sPath);
                sFile = System.IO.Path.GetFileName(sPath);
            }
            // プロジェクト・ディレクトリの中に置かれている場合（デフォルト）
            else
            {
                sDir = System.IO.Path.GetDirectoryName(csPrptyScreen.GetProjectGroupDirectory().ToString() + "\\" + sPath);
                sFile = System.IO.Path.GetFileName(sPath);
            }
                
            // はじめに表示されるディレクトリを指定する。
            ofd.InitialDirectory = sDir;
            ofd.FileName = sFile;

            //はじめに「ファイル名」で表示される文字列と[ファイルの種類]に表示される選択肢を指定する
            if (radioButtonCSVFile.Checked == true)
            {
                ofd.Filter = Properties.Resources.CSV_FILE_FILTER;  // "csvファイル(*.csv)|*.csv|すべてのファイル(*.*)|*.*";
                if (sPath == "")
                {
                    ofd.FileName = "FileIn.csv";
                }
            }
            else if (radioButtonWisefFile.Checked == true)
            {
                ofd.Filter = Properties.Resources.WISEF_FILE_FILTER; // "wisefファイル(*.wsf)|*.wsf|すべてのファイル(*.*)|*.*";
                if (sPath == "")
                {
                    ofd.FileName = "FileIn.wsf";
                }
            }

            //[ファイルの種類]ではじめに
            ofd.FilterIndex = 1;
            //タイトルを設定する

            ofd.Title = Properties.Resources.OFD_TITLE; // "開くファイルを選択してください";

            // ダイアログを表示する
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                // 選択したファイルの絶対パスをプロジェクト・ディレクトリ以下の相対パスに直す。
                HySString csRelativePath = new HySString("");
                HySString csAbsolutePath = new HySString(ofd.FileName);
                csPrptyScreen.GetRelativePathBasedOnProjectGroup(csAbsolutePath, ref csRelativePath);
                this.FileName.Text = csRelativePath.ToString();
            }

        }


        /// <summary><para>method outline:</para>
        /// <para>設定処理</para>
        /// </summary>
        /// <example><para>usage:</para>
        /// <para>ParaSet_Click(sender,e);</para>
        /// </example>
        /// <param name="sender">object</param>
        /// <param name="e">Event</param>
        /// <returns>無し</returns>
        /// <exception cref="">無し</exception>
        /// <remarks>
        /// <para>remarks:</para>
        /// <para>「設定」ボタンを押下された時の処理を記述</para>
        /// </remarks>
        private void ParaSet_Click(object sender, EventArgs e)
        {
            //----------------------------------------
            //①入力データの整合性チェックする。
            //----------------------------------------
            //入力ファイル
            if (FileName.exIsEmpty)
            {
                CommonControlLibrary.CommonLib.ShowInputError(Properties.Resources.FILE_EMPTY_ERROR /*"入力ファイルを指定して下さい。"*/);
                FileName.Focus();
                return;
            }
            // 絶対パスまたは相対パスで記述されている場合
            if (this.FileName.Text.IndexOf("..") >= 0 || this.FileName.Text.IndexOf(":") >= 0)
            {
                if (!FileName.exIsFileExists)
                {
                    CommonControlLibrary.CommonLib.ShowInputError("'" + FileName.Text + Properties.Resources.FILE_NOT_EXIST_ERROR /*"'は存在しません。"*/);
                    FileName.Focus();
                    return;
                }
            }
            else{
                McWaterLevelGaugingPropertyScreen csPrptyScreen = this.m_csScreen as McWaterLevelGaugingPropertyScreen;
                string sFilePath = csPrptyScreen.GetProjectGroupDirectory().ToString() + "\\" + this.FileName.Text;
                if (!System.IO.File.Exists(sFilePath))
                {
                    CommonControlLibrary.CommonLib.ShowInputError("'" + sFilePath + Properties.Resources.FILE_NOT_EXIST_ERROR /*"'は存在しません。"*/);
                    this.FileName.Focus();
                    return;
                }
            }

            //観測所地点数
            if (textBox_seriserNum.exIsEmpty)
            {
                CommonControlLibrary.CommonLib.ShowInputError(Properties.Resources.SERIES_NUM_EMPTY_ERROR /*"観測所地点数を入力して下さい。"*/);
                textBox_seriserNum.Focus();
                return;
            }
            long lSeriserNum = (long)textBox_seriserNum.exValue;

            //[ファイルの種類]に表示される選択肢を指定する
            string sType = "";
            if (System.IO.Path.GetExtension(FileName.Text) == ".csv")
            {
                if (!radioButtonCSVFile.Checked)
                {
                    CommonControlLibrary.CommonLib.ShowInputError(Properties.Resources.DIFFERENT_FILE_TYPE_ERROR /*"入力ファイルの形式が指定したファイルの形式と一致していません。"*/);
                    return;
                }
                sType = McWaterLevelGaugingDefine.INPUTFILE_TYPE_CSV;
            }
            else if (System.IO.Path.GetExtension(FileName.Text) == ".wsf")
            {
                if (!radioButtonWisefFile.Checked)
                {
                    CommonControlLibrary.CommonLib.ShowInputError(Properties.Resources.DIFFERENT_FILE_TYPE_ERROR /*"入力ファイルの形式が指定したファイルの形式と一致していません。"*/);
                    return;
                }
                sType = McWaterLevelGaugingDefine.INPUTFILE_TYPE_WSF;
            }

            //出力地点指定
            long lOutPointVal = 0;
            if (radioButton_OutPoint.Checked)
            {
                if (textBox_OutPoint.exIsEmpty)
                {
                    CommonControlLibrary.CommonLib.ShowInputError(Properties.Resources.OBSERVATORY_NUM_EMPTY_ERROR /*"地点指定を入力して下さい。"*/);
                    textBox_OutPoint.Focus();
                    return;
                }
                lOutPointVal = (long)textBox_OutPoint.exValue;
                if (lOutPointVal < 1 || lOutPointVal > lSeriserNum)
                {
                    CommonControlLibrary.CommonLib.ShowInputError(string.Format(Properties.Resources.OBSERVATORY_NUM_INADEQUATE_ERROR /*"地点指定には1～{0}（観測所地点数）までを入力して下さい。"*/, lSeriserNum));
                    textBox_OutPoint.Focus();
                    return;
                }
            }

            //----------------------------------------
            //②既存の情報と変更があるかチェックする。
            //----------------------------------------

            //----------------------------------------
            //③入力データの保存をする。
            //----------------------------------------
            McModelPropertyInfo csModelPropertyInfo = m_csPropertyInfo as McModelPropertyInfo;

            csModelPropertyInfo.SetInfo("m_csInFileNameWithPath", FileName.Text);
            csModelPropertyInfo.SetInfo("m_csSerialNum", lSeriserNum);
            csModelPropertyInfo.SetInfo("m_csFileType", sType);
            csModelPropertyInfo.SetInfo("m_lOutPoint", lOutPointVal);

            DialogResult = DialogResult.OK;     // 設定変更がある場合


            //----------------------------------------
            //④画面終了
            //----------------------------------------
            Close();

        }
        /// <summary><para>method outline:</para>
        /// <para>キャンセル処理</para>
        /// </summary>
        /// <example><para>usage:</para>
        /// <para>Cancel_Click(sender,e);</para>
        /// </example>
        /// <param name="sender">Object</param>
        /// <param name="e">Event</param>
        /// <returns>無し</returns>
        /// <exception cref="">無し</exception>
        /// <remarks>
        /// <para>remarks:</para>
        /// <para>「キャンセル」ボタンを押下された時の処理を記述</para>
        /// </remarks>
        private void Cancel_Click(object sender, EventArgs e)
        {
            DialogResult = DialogResult.Cancel;
            Close();
        }

        
    }
}