/**************************************************************************//**
    @file       main.h
    @brief      要約説明
    
        このファイルの詳細説明
    
    @author     N.Takeda
    @date       2010/11/02(火) 21:45:46
*//***************************************************************************/

#ifndef ___MAIN__H___   // 重複定義防止
#define ___MAIN__H___   // 重複定義防止マクロ


#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <string>
#include <list>

#ifdef _STOOLS_H
    #include "stools.h"
#else
    #include <tools.h>
    #include <files/xcopy.h>
    #include <system/ezParam.h>
#endif


using namespace std;


#define WINDOW_TITLE    TEXT("超代筆君 MEGA-Mix")   ///< ウィンドウタイトル
#define APP_NAME        TEXT("swriter.exe")         ///< アプリケーション名
//#define WINDOW_W      480                         ///< ウィンドウ横幅
//#define WINDOW_H      360                         ///< ウィンドウ縦幅

#define TIMER_LOOP_CONV (WM_USER + 0x00)            ///< タイマーメッセージ

#define BTN_START       100                         ///< 開始
#define BTN_REFER       101                         ///< 参照
#define BTN_FILEUP      102                         ///< リストアップ
#define BTN_FILEDOWN    103                         ///< リストダウン
#define BTN_FILEDEL     104                         ///< リスト削除
#define BTN_DECODE      105                         ///< 展開
#define BTN_PROPERTY    106                         ///< プロパティ



/// コマンド構造体.
typedef struct
{
    xstring     sCommand;                               ///< コマンド.
    xstring     sParam;                                 ///< パラメータ.
} SCRIPT_STAT;


/// オプション設定.
typedef struct
{
    Bool                m_bAuto;                        ///< 自動起動.
    Bool                m_bAtExit;                      ///< 　自動起動後自動終了.
    Bool                m_bOutInfo;                     ///< 結果をファイルに出力.
    Bool                m_bRetexec;                     ///< リターンキーで実行.
    
    Bool                m_bBackup;                      ///< バックアップをとる.
    Int32               m_iRange;                       ///< 範囲限定モード 0:なし　1:限定　2:指定のある物だけ限定.
    Bool                m_bSearchSubDir;                ///< サブディレクトリのファイルも検索するか.
    
    Bool                m_bDefaultCurrent;              ///< falseの時、swbバッチファイルのあるフォルダをカレントにする.
    
    TCHAR               m_sOutInfoName[ _MAX_PATH ];    ///< ダイアログに指定してあるメッセージ出力先.
    TCHAR               m_sBackupPath[ _MAX_PATH ];     ///< バックアップファイル出力先.
    
} OPTION_DATA;


typedef std::list< SCRIPT_STAT >    LScriptStat;


//********************************************************************************************
///     グローバル構造体
//********************************************************************************************
struct STRUCT_GLOBAL
{
    /// アプリケーション
//  HWND                hMainWnd;                   ///< メインウインドウのハンドル.
    HINSTANCE           hInst;                      ///< インスタンス.
    TCHAR               MainPath[ _MAX_PATH ];      ///< 作業ディレクトリ.
    HFONT               hFont;                      ///< アプリケーションフォント.
    
    UInt32              TimerID;                    ///< タイマーID.
    Bool                TimerFlag;                  ///< タイマーフラグ.
    Int32               err;
    Int32               old_i, iLimitCnt;
    
    /// 子ウィンドウ
    HWND                hStart;
    HWND                hScriptPath;
    HWND                hFileNum;
    HWND                hFlist;
    HWND                hEntry;
    HWND                hInfo;
    
    TCHAR               *m_memMsg;
    
    TCHAR               ScriptPath[ _MAX_PATH ];    ///< 
    TCHAR               MessagePath[ _MAX_PATH ];   ///< メッセージ出力するパス.
    
    Bool                bFlagStop;                  ///< 処理の中止フラグ.
    
    /// バッチコマンド
    LScriptStat             m_stScrStat;
    LScriptStat::iterator   m_itStat;
    /// ファイルリスト
    FILE_XCOPY              m_cXcopy;
    
    
    /// 制御系
    Int32               m_iIdx;                     ///< 実行インデックス.
    Int32               autoexec;
    Bool                bLock;                      ///< 処理実行中は1に.
    Int32               iErrors;
    
    /// 機能限定版用
    Bool                bFuntion_lock;              ///< 処理実行中は1に.
    
    /// 設定フラグ
    OPTION_DATA         m_cSysOption;               ///< システム(*.ini)の設定.
    OPTION_DATA         m_cBatOption;               ///< バッチファイルで指定された設定.
    OPTION_DATA         *m_pOption;                 ///< 設定情報のポインタ. 上記のうちいずれかを指す.
    
    STRUCT_GLOBAL()
     : m_memMsg( NULL )
     , iErrors( 0 )
     , m_pOption( &m_cSysOption )
    {
        m_cXcopy.Clear();
        m_stScrStat.clear();
    }
};//STRUCT_GLOBAL;


LPCTSTR     pickup_name( LPCTSTR pp );

void        defaultpath( LPTSTR saki, LPCTSTR moto );

Bool        file_targetwrite( LPCTSTR _pFName, char *_pPtr, Int32 _iSize );
Bool        file_textwrite( LPCTSTR _pFName, LPCTSTR _pPtr );


void    Message_error( LPCTSTR format,...);
void    Message_printf( LPCTSTR format,...);
void    Message_win( LPCTSTR str );
void    Message_clear();
void    Message_script();
void    List_clear();


//********************************************************************************************
/**
 * @class       CRANGE_CTRL
 * @brief       範囲限定制御クラス
 * @author      N.Takeda
 */
//********************************************************************************************
class CRANGE_CTRL
{
    Bool    m_bMode;            ///< FALSEで機能を使用しない
    Bool    m_bSwitch;          ///< 指定範囲内か否かのフラグ
    
public:
    void    Init( LPCTSTR _mem, Int32 _iLen );
    Bool    Is( LPCTSTR _mem, Int32 ii, Int32 _iLen );
    
    CRANGE_CTRL();
};

/// 範囲限定記号
#define RANGECHAR_TOP       '▼'
#define RANGECHAR_BOTTOM    '▲'


Bool    wchar_cmp( LPCTSTR _pPtr, WCHAR _cCh );

/// 外部モジュール実行.
BOOL    swriter_ExecModule( LPCTSTR _pCommand, LPCTSTR _sParamString );


extern  STRUCT_GLOBAL   s_stGl;

//#define USE_BOOST                   ///< ここを有効にする場合はビルド環境に boost がインストールされている必要があります。

#endif // ___MAIN__H___ 重複定義防止
