/***********************************************************************************************************
*
*   名称    TESTDISP.CPP    テスト画面
*
***********************************************************************************************************/

#include	"TEST.h"
#include	<string.h>
#include	<stdlib.h>


/*****  テスト画面１ （図形） *****/

void  CPtrnTest1 :: PtrnInitFunc ()                                                 // ウィンドウの初期化
{
    for (int i=0; i<14; ++i)                                                        // 点滅表示初期化
        Set_Flikr(MARK+i, FALSE);
    memset(Timr_Mark, 0, sizeof(Timr_Mark));                                        // 点滅表示時間初期化
}


void  CPtrnTest1 :: PtrnMesgFunc (int code)                                         // マウス操作による通知
{
    if ((code >= MARK) && (code < MARK+14)) {
        EOR_wData(code, 0x0001);
        Set_Flikr(code, TRUE);
        Timr_Mark[code-MARK] = 50;
    }
}


void  CPtrnTest1 :: PtrnTimrFunc ()                                                 // １００ｍｓｅｃタイマー
{
    for (int i=0; i<14; ++i)                                                        // マーク点滅停止
        if ((  Timr_Mark[i] != 0)
         && (--Timr_Mark[i] == 0)) Set_Flikr(MARK+i, FALSE);
}





/*****  テスト画面２ （文字列・ボタン） *****/

void  CPtrnTest2 :: PtrnInitFunc ()                                                 // ウィンドウの初期化
{
    Set_iData(CHECKBOX,    1);                                                      // チェックボックス ON
    Set_iData(CHECKBOX+1,  1);
    Set_iData(CHECKBOX+2,  1);
    Set_iData(RADIOBUTTON, 0);                                                      // ラジオボタン 0:ON

    Set_Color(BUTTON,   0);                                                         // ボタン操作可
    Set_Color(BUTTON+1, 0);
    Set_Color(BUTTON+2, 0);
}


void  CPtrnTest2 :: PtrnMesgFunc (int code)                                         // マウス操作による通知
{
    PtrnCloseWnd(1);                                                                // 子ウィンドウを閉じる

    if ((code >= CHECKBOX) && (code <= CHECKBOX+2)) {                               // チェックボックス操作
        Set_Color(BUTTON,   (Get_iData(CHECKBOX  ) == 0) ? 1 : 0);                  // ボタン操作の可否設定
        Set_Color(BUTTON+1, (Get_iData(CHECKBOX+1) == 0) ? 1 : 0);
        Set_Color(BUTTON+2, (Get_iData(CHECKBOX+2) == 0) ? 1 : 0);
    }

    else if (code == BUTTON+3) {                                                    // ポップアップメニュー
        PTRNDATA  Ptrn;
        PtrnReadData(BUTTON+3, PTRN_BUTN, &Ptrn);
        PtrnDispPopup(1, "ポップアップメニュー", Ptrn.Rect, S_FILE, S_LINE);
    }

    else if (code == MOUSE_SELECT  ) PtrnDispChild(1, "子ウィンドウ (1)");       	// ポップアップメニューからの通知
    else if (code == MOUSE_SELECT+1) PtrnDispChild(1, "子ウィンドウ (2)");
    else if (code == MOUSE_SELECT+2) PtrnDispChild(1, "子ウィンドウ (3)");

    else if (code == HANTEN    ) Set_Color(KOTEIMOJI, (Get_iData(HANTEN    ) == 0) ? 0 : 1); 	// 反転
    else if (code == HANTEN  +1) Set_Color(KAHENMOJI, (Get_iData(HANTEN  +1) == 0) ? 0 : 1);
    else if (code == HANTEN  +2) Set_Color(SUUCHI,    (Get_iData(HANTEN  +2) == 0) ? 0 : 1);

    else if (code == TENMETSU  ) Set_Flikr(KOTEIMOJI, (Get_iData(TENMETSU  ) == 0) ? FALSE : TRUE);	// 点滅
    else if (code == TENMETSU+1) Set_Flikr(KAHENMOJI, (Get_iData(TENMETSU+1) == 0) ? FALSE : TRUE);
    else if (code == TENMETSU+2) Set_Flikr(SUUCHI,    (Get_iData(TENMETSU+2) == 0) ? FALSE : TRUE);
}





/*****  テスト画面３ （表） *****/

void  CPtrnTest3 :: PtrnInitFunc ()                                                 // ウィンドウの初期化
{
    InitHaisenhyo();
}


void  CPtrnTest3 :: PtrnExitFunc ()                                                 // ウィンドウの終了処理
{
    if (HaisenData != NULL) delete [] HaisenData;                                   // 作業領域破棄
    if (HaisenIndx != NULL) delete [] HaisenIndx;
	HaisenData = NULL;
	HaisenIndx = NULL;
}


void  CPtrnTest3 :: PtrnMesgFunc (int code)                                         // マウス操作による通知
{
    if (code == TOUROKU) {                                                          // 登録 ボタン
        CFileWrite  HaisenHyo(ProjPath, "Haisenhyo");                               // 配線表ファイル書込み
        HaisenHyo.WriteBlock(&HaisenHedr, sizeof(HAISENHEDR));
        for (int i=0; i<HaisenHedr.datacount; ++i)
            HaisenHyo.WriteBlock(&HaisenData[i], sizeof(HAISENDATA));
    }

    else if (code == INSATSU) {                                                     // 印刷 ボタン
        PtrnSetCursor(2);                                                           // カーソル：砂時計
        PrintHaisenhyo();
        PtrnSetCursor(0);                                                           // カーソル：矢印
    }
}


void  CPtrnTest3 :: PtrnKeyFunc (int Key, int Shift, PTRNDATA* Ptrn)				// キー入力終了通知
{
    if (Key != VK_ESCAPE) {
        strcpy(HaisenHedr.systemno, Get_sData(SYSTEMNO  ));              			// 入力結果の取得
        strcpy(HaisenHedr.nousaki,  Get_sData(NOUNYUSAKI));
        strcpy(HaisenHedr.sakuban,  Get_sData(SAKUBAN   ));
        strcpy(HaisenHedr.banno,    Get_sData(BANNO     ));
        strcpy(HaisenHedr.comment,  Get_sData(COMENT    ));

        int  code = -1;
        int  dtno = Ptrn->DataNo;
        if (Key == VK_RETURN) {
            if      (dtno == SYSTEMNO  ) code = NOUNYUSAKI;
            else if (dtno == NOUNYUSAKI) code = SAKUBAN;
            else if (dtno == SAKUBAN   ) code = BANNO;
            else if (dtno == BANNO     ) code = COMENT;
            else if (dtno == COMENT    ) code = SYSTEMNO;
        }

        else if (Key == VK_TAB) {
            if (Shift == 0) {
                if      (dtno == SYSTEMNO  ) code = NOUNYUSAKI;
                else if (dtno == NOUNYUSAKI) code = SAKUBAN;
                else if (dtno == SAKUBAN   ) code = BANNO;
                else if (dtno == BANNO     ) code = COMENT;
                else if (dtno == COMENT    ) code = SYSTEMNO;
            }
            else {
                if      (dtno == SYSTEMNO  ) code = COMENT;
                else if (dtno == NOUNYUSAKI) code = SYSTEMNO;
                else if (dtno == SAKUBAN   ) code = NOUNYUSAKI;
                else if (dtno == BANNO     ) code = SAKUBAN;
                else if (dtno == COMENT    ) code = BANNO;
            }
        }

        else if (Key == VK_UP) {
            if      (dtno == SAKUBAN   ) code = SYSTEMNO;
            else if (dtno == BANNO     ) code = NOUNYUSAKI;
            else if (dtno == COMENT    ) code = SAKUBAN;
        }

        else if (Key == VK_DOWN) {
            if      (dtno == SYSTEMNO  ) code = SAKUBAN;
            else if (dtno == NOUNYUSAKI) code = BANNO;
            else if (dtno == SAKUBAN   ) code = COMENT;
            else if (dtno == BANNO     ) code = COMENT;
        }

        else if (Key == VK_LEFT) {
            if      (dtno == NOUNYUSAKI) code = SYSTEMNO;
            else if (dtno == BANNO     ) code = SAKUBAN;
        }

        else if (Key == VK_RIGHT) {
            if      (dtno == SYSTEMNO   ) code = NOUNYUSAKI;
            else if (dtno == SAKUBAN    ) code = BANNO;
        }

        if (code != -1) KeyInputStart(code);
    }
}


void  CPtrnTest3 :: InitHaisenhyo ()
{
    CFileRead  HaisenHyo(ProjPath, "Haisenhyo");                                    // 配線表ファイル読込み
    HaisenHyo.ReadBlock(&HaisenHedr, sizeof(HAISENHEDR));                           // ヘッダー部

    if (HaisenData != NULL) delete [] HaisenData;                                   // 作業領域破棄
    if (HaisenIndx != NULL) delete [] HaisenIndx;
    HaisenData = new HAISENDATA [HaisenHedr.datacount];                             // データ部
    HaisenIndx = new int        [HaisenHedr.datacount];                             // インデックス
    for (int i=0; i<HaisenHedr.datacount; ++i) {
        HaisenIndx[i] = i;
        HaisenHyo.ReadBlock(&HaisenData[i], sizeof(HAISENDATA));
    }

    PTRNHEDR  Hedr;                                                                 // 子ウィンドウ表示情報
    PtrnReadHedr("テスト  （表）", &Hedr);

    PtrnSetScroll(V_SCROLL, HaisenHedr.datacount, 0);                               // スクロールバー（縦）
    PtrnSetScroll(H_SCROLL, Hedr.Parm1[1],        0);                               // スクロールバー（横）

    Set_sData(SYSTEMNO,   HaisenHedr.systemno);                                    	// 初期表示
    Set_sData(NOUNYUSAKI, HaisenHedr.nousaki );
    Set_sData(SAKUBAN,    HaisenHedr.sakuban );
    Set_sData(BANNO,      HaisenHedr.banno   );
    Set_sData(COMENT,     HaisenHedr.comment );

    PTRNDATA  Ptrn;                                                                 // 矩形領域表示情報
    PtrnReadData(HYO_RECT, PTRN_RECT, &Ptrn);
    PtrnDispChild(1, "テスト  （表）", Ptrn.Rect);                                  // 子ウィンドウ表示
}





/*****  テスト画面４ （折れ線グラフ） *****/

#include    <math.h>

void  CPtrnTest4 :: PtrnInitFunc ()                                                 // ウィンドウの初期化
{
    PTRNDATA  Ptrn;                                                                 // 矩形領域表示情報
    PtrnReadData(GRAPH_RECT, PTRN_RECT, &Ptrn);
    rect = Ptrn.Rect;
    timr = cont = 0;
}


void  CPtrnTest4 :: PtrnDispFunc (CDraw* pDraw, int mode)                           // 画面再表示
{
    if ((mode == 0) || (++timr >= 5)) {                                             // 500msec 周期
        timr = 0;
        PtrnDispData(pDraw, GRAPH_RECT, PTRN_RECT);                                 // 矩形塗り潰し

        data1[cont] = 15 + (rand() % 10);
        data2[cont] = 35 + (rand() % 10);
        data3[cont] = 55 + (rand() % 10);
        data4[cont] = 75 + (rand() % 10);

        GdkPoint  point[100];                                                         	// グラフ計算
        for (int i=0; i<4; ++i) {
            for (int j=0; j<cont; ++j) {
                int  data;
                if      (i == 0) data = data1[j];
                else if (i == 1) data = data2[j];
                else if (i == 2) data = data3[j];
                else             data = data4[j];
                point[j].x= rect.left + j    * (rect.right  - rect.left) / 100;
                point[j].y= rect.top  + data * (rect.bottom - rect.top ) / 100;
            }

		    gdk_gc_set_foreground(pDraw->gc, &DrawColr[50+i]);
		    gdk_gc_set_line_attributes(pDraw->gc, 1, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_MITER);
			gdk_draw_lines(pDraw->window, pDraw->gc, point, cont);
        }

        PtrnDispData(pDraw, GRAPH_LINE, PTRN_LINE);                                 	// 罫線再表示
        if (++cont == 100) cont = 0;
    }
}





/*****  テスト画面５ （マウス操作） *****/

void  CPtrnTest5 :: PtrnInitFunc ()                                                 // ウィンドウの初期化
{
    Clear_AllData(MOUSE_RECT1);
    Clear_AllData(MOUSE_RECT2);
}


void  CPtrnTest5 :: PtrnMesgFunc (int code)                                         // マウス操作による通知
{                                                                                   // 左ボタン
    PtrnCloseWnd(1);                                                                // 子ウィンドウを閉じる
    if ((code >= MOUSE_RECT1) && (code <= MOUSE_RECT1+4))
        EOR_wData(code, 0x0001);

    else if (code == MOUSE_SELECT  ) PtrnDispChild(1, "子ウィンドウ (1)");
    else if (code == MOUSE_SELECT+1) PtrnDispChild(1, "子ウィンドウ (2)");
    else if (code == MOUSE_SELECT+2) PtrnDispChild(1, "子ウィンドウ (3)");
}


void  CPtrnTest5 :: PtrnRbtnFunc (int code)                                         // マウス操作による通知
{                                                                                   // 右ボタン
    PtrnCloseWnd(1);
    if ((code >= MOUSE_RECT2) && (code <= MOUSE_RECT2+4))
        EOR_wData(code, 0x0001);
}


BOOL CPtrnTest5 :: PtrnMouseFunc (POINT point, int butn, int key)                  	// マウス操作横取り
{
    PTRNDATA  Ptrn;
    if (PtrnTestData(point, &Ptrn) == TRUE) PtrnSetCursor(1);
    else                                    PtrnSetCursor(0);

    if ((PtrnTestData(point, &Ptrn) == FALSE) && (butn == 2)
                                              && (key  == 0)) {
        PtrnDispPopup(1, "ポップアップメニュー", point, S_FILE, S_LINE);
        return TRUE;
    }

    if (PtrnTestData(point, MOUSE_BUTTON1, PTRN_RECT) == TRUE) {
        if ((butn == 0) && (key == 0)) Set_Color(MOUSE_BUTTON1, 1);
        return TRUE;
    }
    else Set_Color(MOUSE_BUTTON1, 0);

    if (PtrnTestData(point, MOUSE_BUTTON2, PTRN_RECT) == TRUE) {
        if ((butn == 0) && (key == 1)) Set_Color(MOUSE_BUTTON2, 1);
        return TRUE;
    }
    else Set_Color(MOUSE_BUTTON2, 0);

    if (PtrnTestData(point, MOUSE_BUTTON3, PTRN_RECT) == TRUE) {
        if ((butn == 1) && (key == 1)) Set_Color(MOUSE_BUTTON3, 1);
        return TRUE;
    }
    else Set_Color(MOUSE_BUTTON3, 0);

    if (PtrnTestData(point, MOUSE_BUTTON4, PTRN_RECT) == TRUE) {
        if ((butn == 2) && (key == 2)) Set_Color(MOUSE_BUTTON4, 1);
        return TRUE;
    }
    else Set_Color(MOUSE_BUTTON4, 0);

    return FALSE;
}
