/***********************************************************************************************************
*
*   名称    HAISENHYO.CPP       配線表 編集／印刷
*
***********************************************************************************************************/

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

HAISENHEDR      HaisenHedr;                                                         // 配線表 （ヘッダー部）
HAISENDATA*     HaisenData = NULL;                                                  // 配線表 （データ部）
int*            HaisenIndx = NULL;                                                  // 配線表 （インデックス）


void  CHaisenhyo :: PtrnInitFunc ()                                                 // ウィンドウの初期化
{
    SortCulm = -1;
    DispDataSet(0);
}


void  CHaisenhyo :: PtrnMesgFunc (int code)                                         // マウス操作による通知
{
    if      (code == V_SCROLL) DispDataSet  (   Get_iData(V_SCROLL)   );            // スクロールバー（縦）
    else if (code == H_SCROLL) PtrnSetOffset(0, Get_iData(H_SCROLL), 0);            // スクロールバー（横）

    else if (code == T_KOYUSENBAN ) SortDispData( 0);                               // ソート
    else if (code == T_SENKEI     ) SortDispData( 1);
    else if (code == T_SENSYU     ) SortDispData( 2);
    else if (code == T_KYOKUSEI   ) SortDispData( 3);
    else if (code == T_KAIROKUBUN ) SortDispData( 4);
    else if (code == T_HAISEN     ) SortDispData( 5);
    else if (code == T_ZAHYO1     ) SortDispData( 6);
    else if (code == T_TANSHI1    ) SortDispData( 7);
    else if (code == T_SIZE1      ) SortDispData( 8);
    else if (code == T_SYORI1     ) SortDispData( 9);
    else if (code == T_ZAHYO2     ) SortDispData(10);
    else if (code == T_TANSHI2    ) SortDispData(11);
    else if (code == T_SIZE2      ) SortDispData(12);
    else if (code == T_SYORI2     ) SortDispData(13);
    else if (code == T_SENCYO     ) SortDispData(14);
    else if (code == T_SHEETNO    ) SortDispData(15);
}


BOOL CHaisenhyo :: PtrnKeyStart (PTRNDATA* Ptrn)                                    // キー入力開始処理
{
    PTRNDATA  ptrn;
    PtrnReadData(Ptrn->DataNo, PTRN_GBOX, &ptrn);

    RECT   rect  = PtrnGetWindow();
    POINT  point = PtrnGetOffset();

    if (point.x > ptrn.Rect.left) {
        Set_iData(H_SCROLL, ptrn.Rect.left);
        PtrnSetOffset(0, ptrn.Rect.left, 0);
    }

    if ((point.x + rect.width) < ptrn.Rect.right) {
        Set_iData(H_SCROLL, ptrn.Rect.right - rect.width);
        PtrnSetOffset(0, ptrn.Rect.right - rect.width, 0);
    }
    return TRUE;
}


void  CHaisenhyo :: PtrnKeyFunc (int Key, int Shift, PTRNDATA* Ptrn)				// キー入力終了処理
{
    if (Key != VK_ESCAPE) {
        DispDataGet();                                                              // 表示中データの取得

        int  lineno = (Ptrn->DataNo - HYO_DATA) % 20;
        int  culmno = (Ptrn->DataNo - HYO_DATA) / 20;
        int  dispno = DispDtno;

        if (Key == VK_RETURN) {                                                     // 次の入力位置判定
            if (++culmno == 16) {
                culmno = 0;
                if      (lineno < 14) ++lineno;
                else if (dispno < (HaisenHedr.datacount-15)) ++dispno;
                else culmno = 15;
            }
        }

        if (Key == VK_TAB) {
            if (Shift == 0) {
                if (++culmno == 16) {
                    culmno = 0;
                    if      (lineno < 14) ++lineno;
                    else if (dispno < (HaisenHedr.datacount-15)) ++dispno;
                    else culmno = 15;
                }
            }
            else {
                if (--culmno < 0) {
                    culmno = 15;
                    if      (lineno > 0) --lineno;
                    else if (dispno > 0) --dispno;
                    else culmno = 0;
                }
            }
        }

        else if (Key == VK_LEFT) {
            if (culmno != 0) --culmno;
        }

        else if (Key == VK_RIGHT) {
            if (culmno !=15) ++culmno;
        }

        else if (Key == VK_UP) {
            if      (lineno > 0) --lineno;
            else if (dispno > 0) --dispno;
        }

        else if (Key == VK_DOWN) {
            if      (lineno < 14) ++lineno;
            else if (dispno < (HaisenHedr.datacount-15)) ++dispno;
        }

        if (dispno != DispDtno) {
            DispDataSet(dispno);                                                    // 再表示データの設定
            Set_iData(V_SCROLL, dispno);                                            // スクロールバー設定
        }

        int  datano = HYO_DATA + 20*culmno + lineno;                                // 入力再開
        KeyInputStart(datano);
    }
}


void  CHaisenhyo :: DispDataSet (int dispno)                                        // 表示データ設定
{
    DispDtno = dispno;
    for (int i=0; i<15; ++i) {
        int  j = HaisenIndx[DispDtno + i];
        Set_iData(LINENO      +i, DispDtno+i+1);
        Set_sData(HYO_DATA    +i, HaisenData[j].senban);
        Set_sData(HYO_DATA+ 20+i, HaisenData[j].senkei);
        Set_sData(HYO_DATA+ 40+i, HaisenData[j].sensyu);
        Set_sData(HYO_DATA+ 60+i, HaisenData[j].kyoku );
        Set_sData(HYO_DATA+ 80+i, HaisenData[j].kairo );
        Set_sData(HYO_DATA+100+i, HaisenData[j].haisen);
        Set_sData(HYO_DATA+120+i, HaisenData[j].zahyo1);
        Set_sData(HYO_DATA+140+i, HaisenData[j].tansi1);
        Set_sData(HYO_DATA+160+i, HaisenData[j].size1 );
        Set_sData(HYO_DATA+180+i, HaisenData[j].syori1);
        Set_sData(HYO_DATA+200+i, HaisenData[j].zahyo2);
        Set_sData(HYO_DATA+220+i, HaisenData[j].tansi2);
        Set_sData(HYO_DATA+240+i, HaisenData[j].size2 );
        Set_sData(HYO_DATA+260+i, HaisenData[j].syori2);
        Set_iData(HYO_DATA+280+i, HaisenData[j].length);
        Set_sData(HYO_DATA+300+i, HaisenData[j].sheet );
    }
}


void  CHaisenhyo :: DispDataGet ()                                                  // 表示データ取得
{
    for (int i=0; i<15; ++i) {
        int  j = HaisenIndx[DispDtno + i];
        HaisenData[j].length = Get_iData(HYO_DATA+280+i);
        strcpy(HaisenData[j].senban, Get_sData(HYO_DATA    +i));
        strcpy(HaisenData[j].senkei, Get_sData(HYO_DATA+ 20+i));
        strcpy(HaisenData[j].sensyu, Get_sData(HYO_DATA+ 40+i));
        strcpy(HaisenData[j].kyoku,  Get_sData(HYO_DATA+ 60+i));
        strcpy(HaisenData[j].kairo,  Get_sData(HYO_DATA+ 80+i));
        strcpy(HaisenData[j].haisen, Get_sData(HYO_DATA+100+i));
        strcpy(HaisenData[j].zahyo1, Get_sData(HYO_DATA+120+i));
        strcpy(HaisenData[j].tansi1, Get_sData(HYO_DATA+140+i));
        strcpy(HaisenData[j].size1,  Get_sData(HYO_DATA+160+i));
        strcpy(HaisenData[j].syori1, Get_sData(HYO_DATA+180+i));
        strcpy(HaisenData[j].zahyo2, Get_sData(HYO_DATA+200+i));
        strcpy(HaisenData[j].tansi2, Get_sData(HYO_DATA+220+i));
        strcpy(HaisenData[j].size2,  Get_sData(HYO_DATA+240+i));
        strcpy(HaisenData[j].syori2, Get_sData(HYO_DATA+260+i));
        strcpy(HaisenData[j].sheet,  Get_sData(HYO_DATA+300+i));
    }
}


void  CHaisenhyo :: SortDispData (int culm)
{
    if (SortCulm != culm) SortFlag =  0;
    else                  SortFlag ^= 1;
    SortCulm = culm;

	typedef	  struct  { char buff[12]; } SORTDATA;
	SORTDATA* SortTabl = new SORTDATA [HaisenHedr.datacount];

    for (int i=0; i<HaisenHedr.datacount; ++i) {
        int  j = HaisenIndx[i];
        if      (culm ==  0) strcpy(SortTabl[i].buff, HaisenData[j].senban);
        else if (culm ==  1) strcpy(SortTabl[i].buff, HaisenData[j].senkei);
        else if (culm ==  2) strcpy(SortTabl[i].buff, HaisenData[j].sensyu);
        else if (culm ==  3) strcpy(SortTabl[i].buff, HaisenData[j].kyoku);
        else if (culm ==  4) strcpy(SortTabl[i].buff, HaisenData[j].kairo);
        else if (culm ==  5) strcpy(SortTabl[i].buff, HaisenData[j].haisen);
        else if (culm ==  6) strcpy(SortTabl[i].buff, HaisenData[j].zahyo1);
        else if (culm ==  7) strcpy(SortTabl[i].buff, HaisenData[j].tansi1);
        else if (culm ==  8) strcpy(SortTabl[i].buff, HaisenData[j].size1);
        else if (culm ==  9) strcpy(SortTabl[i].buff, HaisenData[j].syori1);
        else if (culm == 10) strcpy(SortTabl[i].buff, HaisenData[j].zahyo2);
        else if (culm == 11) strcpy(SortTabl[i].buff, HaisenData[j].tansi2);
        else if (culm == 12) strcpy(SortTabl[i].buff, HaisenData[j].size2);
        else if (culm == 13) strcpy(SortTabl[i].buff, HaisenData[j].syori2);
        else if (culm == 14) {
            char  work[100];
            sprintf(work, "%10d", HaisenData[j].length);
			strcpy(SortTabl[i].buff, work);
        }
        else if (culm == 15) strcpy(SortTabl[i].buff, HaisenData[j].sheet);
    }

    for (int i=1; i<HaisenHedr.datacount; ++i) {
        for (int j=0; j<i; ++j) {
            if (((SortFlag == 0) && (strcmp(SortTabl[i].buff, SortTabl[j].buff) < 0))
             || ((SortFlag == 1) && (strcmp(SortTabl[i].buff, SortTabl[j].buff) > 0))) {
		        char  work[100];
                int   save = HaisenIndx[i];
				strcpy(work, SortTabl[i].buff);
                for (int k=i; k>j; --k) {
                    HaisenIndx[k] = HaisenIndx[k-1];
                    strcpy(SortTabl[k].buff, SortTabl[k-1].buff);
                }
                HaisenIndx[j] = save;
				strcpy(SortTabl[j].buff, work);
                break;
            }
        }
    }
    delete [] SortTabl;

    Set_iData(V_SCROLL, 0);                                                         // 再表示
    DispDataSet(0);
}





/***********************************************************************************************************
*
*   名称    PrintHaisenhyo          配線表 印刷
*
***********************************************************************************************************/

const   int   PRINT_LINE1 =  26;                                                    // 印字行数（横書き）
const   int   PRINT_LINE2 =  62;                                                    // 印字行数（縦書き）

void  CPtrnTest3 :: PrintHaisenhyo ()                                               // 配線表印刷
{
}
