#include "alg.h"
#include "mylib.h"
#include "alg_cfg.h"
#include "demohelp.h"
#include "view.h"

db_str_rec kadr_view[] =
 {
  {"SHIFR",'C',0,9,0},{"N_ROW",'N',0,1,0},{"N_CLN",'N',0,1,0},
  {"SH_1",'C',0,9,0}, {"NC_1",'N',0,1,0}, {"T_1",'N',0,1,0}, {"NZ_1",'C',0,4,0},
  {"SH_2",'C',0,9,0}, {"NC_2",'N',0,1,0}, {"T_2",'N',0,1,0}, {"NZ_2",'C',0,4,0},
  {"SH_3",'C',0,9,0}, {"NC_3",'N',0,1,0}, {"T_3",'N',0,1,0}, {"NZ_3",'C',0,4,0},
  {"SH_4",'C',0,9,0}, {"NC_4",'N',0,1,0}, {"T_4",'N',0,1,0}, {"NZ_4",'C',0,4,0},
  {"SH_5",'C',0,9,0}, {"NC_5",'N',0,1,0}, {"T_5",'N',0,1,0}, {"NZ_5",'C',0,4,0},
  {"SH_6",'C',0,9,0}, {"NC_6",'N',0,1,0}, {"T_6",'N',0,1,0}, {"NZ_6",'C',0,4,0},
  {"SH_7",'C',0,9,0}, {"NC_7",'N',0,1,0}, {"T_7",'N',0,1,0}, {"NZ_7",'C',0,4,0},
  {"SH_8",'C',0,9,0}, {"NC_8",'N',0,1,0}, {"T_8",'N',0,1,0}, {"NZ_8",'C',0,4,0},
  {"SH_9",'C',0,9,0}, {"NC_9",'N',0,1,0}, {"T_9",'N',0,1,0}, {"NZ_9",'C',0,4,0},
  {"SH_10",'C',0,9,0},{"NC_10",'N',0,1,0},{"T_10",'N',0,1,0},{"NZ_10",'C',0,4,0},
  {"SH_11",'C',0,9,0},{"NC_11",'N',0,1,0},{"T_11",'N',0,1,0},{"NZ_11",'C',0,4,0},
  {"SH_12",'C',0,9,0},{"NC_12",'N',0,1,0},{"T_12",'N',0,1,0},{"NZ_12",'C',0,4,0},
  {"SH_13",'C',0,9,0},{"NC_13",'N',0,1,0},{"T_13",'N',0,1,0},{"NZ_13",'C',0,4,0},
  {"SH_14",'C',0,9,0},{"NC_14",'N',0,1,0},{"T_14",'N',0,1,0},{"NZ_14",'C',0,4,0},
  {"SH_15",'C',0,9,0},{"NC_15",'N',0,1,0},{"T_15",'N',0,1,0},{"NZ_15",'C',0,4,0},
  {"SH_16",'C',0,9,0},{"NC_16",'N',0,1,0},{"T_16",'N',0,1,0},{"NZ_16",'C',0,4,0},
  {"SH_17",'C',0,9,0},{"NC_17",'N',0,1,0},{"T_17",'N',0,1,0},{"NZ_17",'C',0,4,0},
  {"SH_18",'C',0,9,0},{"NC_18",'N',0,1,0},{"T_18",'N',0,1,0},{"NZ_18",'C',0,4,0},
  {"SH_19",'C',0,9,0},{"NC_19",'N',0,1,0},{"T_19",'N',0,1,0},{"NZ_19",'C',0,4,0},
  {"SH_20",'C',0,9,0},{"NC_20",'N',0,1,0},{"T_20",'N',0,1,0},{"NZ_20",'C',0,4,0},
  {"SH_21",'C',0,9,0},{"NC_21",'N',0,1,0},{"T_21",'N',0,1,0},{"NZ_21",'C',0,4,0},
  {"SH_22",'C',0,9,0},{"NC_22",'N',0,1,0},{"T_22",'N',0,1,0},{"NZ_22",'C',0,4,0},
  {"SH_23",'C',0,9,0},{"NC_23",'N',0,1,0},{"T_23",'N',0,1,0},{"NZ_23",'C',0,4,0},
  {"SH_24",'C',0,9,0},{"NC_24",'N',0,1,0},{"T_24",'N',0,1,0},{"NZ_24",'C',0,4,0},
 };

TViewDialog::TViewDialog( ) :
               TDialog( TRect( 0, 0, 74, 17 ),""),
               TWindowInit( TViewDialog::initFrame )
{
 char str[256], *str1;
 int i;

 options |= ofCentered;
 helpCtx=hcAllASave;

 getcwd(PathDir,sizeof(PathDir));

 sprintf(str,Text_msg[39],PathDir);
 title=newStr(str);


 TView *Monosel = new TView(TRect(13,2,72,12)); Monosel->options |= ofFramed; insert(Monosel);
// Monosel = new TView(TRect(13,2,72,4)); Monosel->options |= ofFramed; insert(Monosel);

 myApp->LoadView(NameView,&ViewDBF);

 ViewColect = new TCompCollect(10,10);
 ScrollBar1 = new TScrollBar( TRect( 11, 2, 12, 13) ); insert(ScrollBar1);
 MyTListBox1 = new TMyTListBox(TRect( 2, 2, 11, 13), 1, ScrollBar1,NULL); insert(MyTListBox1);
 MyTListBox1->helpCtx=hcMax;
 TMyLabel *Label = new TMyLabel(TRect(2, 1, 12, 2),"Кадры",MyTListBox1,1); insert(Label);

 EditRow = new TEdit( TRect(22, 2, 23, 3),2,EnterNumber); insert(EditRow);
 Label = new TMyLabel(TRect(13, 2, 18, 3),"Строк",EditRow,1); insert(Label);
 EditLine = new TEdit( TRect(22, 3, 23, 4),2,EnterNumber); insert(EditLine);
 Label = new TMyLabel(TRect(13, 3, 20, 4),"Колонок",EditLine,1); insert(Label);

 for(i=0;i<6;i++)
 {
  Edit1[i] = new TEdit( TRect(13+i*10, 5, 22+i*10, 6),10,SelectInput); insert(Edit1[i]);
  Edit2[i] = new TEdit( TRect(13+i*10, 7, 22+i*10, 8),10,SelectInput); insert(Edit2[i]);
  Edit3[i] = new TEdit( TRect(13+i*10, 9, 22+i*10, 10),10,SelectInput); insert(Edit3[i]);
  Edit4[i] = new TEdit( TRect(13+i*10,11, 22+i*10, 12),10,SelectInput); insert(Edit4[i]);
 }

 TButton *Button = new TButton( TRect( 28,14, 38, 16),Text_msg[115], cmOK, bfDefault ); insert(Button);
 Button = new TButton( TRect( 41,14, 51, 16),Text_msg[114], cmCancel, bfNormal ); insert(Button);

 for(i=0;i<ViewDBF->GetCountItems();i++)
 {
  str1 = new char[10];
  ViewDBF->GetFieldIt(i,"SHIFR",str1);
  ViewColect->insert(str1);
 }
 MyTListBox1->newList(ViewColect);
 ViewView(OldIndChek=0);

 MyTListBox1->select();

 Modif=False;
 Modifs=False;
}

TViewDialog::~TViewDialog()
{
 delete ViewDBF;
 myApp->FreeColect(ViewColect);
}

void TViewDialog::handleEvent ( TEvent& event )
{
 int i,iii,k1;
 char str[256],*str1,*str2;
 ushort control;

 if( event.what == evCommand && event.message.command == cmClose)
 {
  if(Modif || Modifs)
  {
   control = messageBox(Text_msg[26],mfWarning | mfOKCancel);
   if(control==cmOK)
   {
    if(Modif) SaveChengeView(MyTListBox1->focused);
    sprintf(str,Text_msg[109],PathDir,NameView);
    ViewDBF->SaveFile(str);
   }
  }
 }

 TDialog::handleEvent(event);

#ifdef __DOS32__
 if( event.what == evBroadcast && event.message.command == cmGetBuf) Modif=True;
#endif

 if( event.what == evBroadcast && event.message.command == cmScrollBarChanged) //List ListBox
 {
  if(MyTListBox1->state & sfFocused)    // ListBox1
  {
   if(Modif)
   {
    control = messageBox(mfWarning | mfOKCancel,"Группа изменена. Сохранить изменения?");
    if(control==cmOK)
    {
     SaveChengeView(OldIndChek);
     Modifs=True;
    }
    Modif=False;
   }
#ifdef __DOS32__
   if(getShiftState() & (kbLeftShift|kbRightShift))
   {
    str1=(char *)ViewDBF->getItem(OldIndChek);
    str2=(char *)ViewDBF->getItem(MyTListBox1->focused);
    ViewDBF->DeleteItems(OldIndChek,0);
    ViewDBF->AddItem(OldIndChek,str2);
    ViewDBF->DeleteItems(MyTListBox1->focused,0);
    ViewDBF->AddItem(MyTListBox1->focused,str1);

    ViewColect->freeAll();
    for(i=0;i<ViewDBF->GetCountItems();i++)
    {
     str1 = new char[10];
     ViewDBF->GetFieldIt(i,"SHIFR",str1);
     ViewColect->insert(str1);
    }
    MyTListBox1->drawView();
    Modifs=True;
   }
#endif
   ViewView(MyTListBox1->focused);
   clearEvent(event);
   OldIndChek=MyTListBox1->focused;
  }
 }

 if( event.what == evBroadcast && event.message.command == cmChange)
 {
  if(EditRow->state & sfFocused)
  {
   if(EditRow->data[0]>'4') EditRow->setData((char *)"4");
   if(EditRow->data[0]<'1') EditRow->setData((char *)"1");
  }
  if(EditLine->state & sfFocused)
  {
   if(EditLine->data[0]>'6') EditLine->setData((char *)"6");
   if(EditLine->data[0]<'1') EditLine->setData((char *)"1");
  }
  MaskEdit(atoi(EditRow->data),atoi(EditLine->data));
  Modif=True;
 }

 if( event.what == evCommand )
 {
  switch( event.message.command )
  {
   case cmOK:
        SaveChengeView(MyTListBox1->focused);
        Modifs=True; Modif=False;
        clearEvent(event);
        break;
   case cmCancel:
        ViewView(MyTListBox1->focused);
        Modif=False;
        clearEvent(event);
        break;
   case cmSave1:
        control = messageBox(mfWarning | mfOKCancel,Text_msg[37]);
        if(control!=cmOK) break;
        SaveChengeView(MyTListBox1->focused);
        sprintf(str,Text_msg[109],PathDir,NameView);
        ViewDBF->SaveFile(str);
        Modif=Modifs=False;
        break;
   case cmReLoad:
        control = messageBox(mfWarning | mfOKCancel,Text_msg[38]);
        if(control!=cmOK) break;
        sprintf(str,Text_msg[109],PathDir,NameView);
        myApp->LoadView(str,&ViewDBF); ViewColect->freeAll();
        for(i=0;i<ViewDBF->GetCountItems();i++)
        {
         str1 = new char[12];
         ViewDBF->GetFieldIt(i,"SHIFR",str1);
         ViewColect->insert(str1);
        }
        MyTListBox1->setRange( MyTListBox1->list()->getCount());
        MyTListBox1->drawView(); ViewView(OldIndChek=0);
        Modif=Modifs=False;
        break;
   case cmInsert:
   case cmAdd:
   case cmRename:
        str1 = new char[12]; str1[0]=0;
        if(event.message.command==cmRename)ViewDBF->GetFieldIt(MyTListBox1->focused,"SHIFR",str1);
        control = inputBox("Ввод имени", "Группа",str1, 8);
        if(control==cmOK)
        {
         for(i=0;i<ViewDBF->GetCountItems();i++)
         {
          ViewDBF->GetFieldIt(i,"SHIFR",str);
          for(iii=7;iii>=0;iii--)if(str[iii]==' ')str[iii]=0;else break;
          if(!strncmp(str1,str,8)){ i= -1; break;}
         }
         if(i== -1){ DispFixErr(0,Text_msg[15],str1); delete str1; break;}
         if(event.message.command==cmInsert || event.message.command==cmRename) k1 = MyTListBox1->focused;
         if(event.message.command==cmAdd)    k1 = ViewDBF->GetCountItems();
         if(event.message.command==cmRename) MyTListBox1->list()->atFree(k1);
         else
         {
          ViewDBF->CreateItems(k1);
          ViewDBF->ModifiFieldIt(k1,"SHIFR",str1);
          ViewDBF->ModifiFieldIt(k1,"N_ROW","1");
          ViewDBF->ModifiFieldIt(k1,"N_CLN","1");
         }
         MyTListBox1->list()->atInsert(k1,str1);

         MyTListBox1->setRange( MyTListBox1->list()->getCount() );
         MyTListBox1->drawView();
         ViewView(MyTListBox1->focused);
         Modifs=True;
        }
        else delete str1;
        clearEvent(event);
        break;
   case cmDelete:
        if(!MyTListBox1->list()->getCount()) break;
        ViewDBF->DeleteItems(MyTListBox1->focused,1);
        MyTListBox1->list()->atFree(MyTListBox1->focused);
        MyTListBox1->setRange( MyTListBox1->list()->getCount() );
        MyTListBox1->drawView();
        ViewView(MyTListBox1->focused);
        Modifs=True;
        clearEvent(event);
        break;
   default: ;
  }
 }
}

void TViewDialog::ViewView(int item)
{
 char str1[10];
 int i,x,y;

 if(ViewDBF->GetFieldIt(item,"N_ROW",str1)== -1)return;
 EditRow->setData(str1); x = atoi(str1);
 if(ViewDBF->GetFieldIt(item,"N_CLN",str1)== -1)return;
 EditLine->setData(str1); y = atoi(str1);

 for(i=0;i<6;i++)
 {
  sprintf(str1,"SH_%d",i+1); if(ViewDBF->GetFieldIt(item,str1,str1)== -1)return;
  Edit1[i]->setData(str1);
  sprintf(str1,"SH_%d",i+7); if(ViewDBF->GetFieldIt(item,str1,str1)== -1)return;
  Edit2[i]->setData(str1);
  sprintf(str1,"SH_%d",i+13); if(ViewDBF->GetFieldIt(item,str1,str1)== -1)return;
  Edit3[i]->setData(str1);
  sprintf(str1,"SH_%d",i+19); if(ViewDBF->GetFieldIt(item,str1,str1)== -1)return;
  Edit4[i]->setData(str1);
 }
 MaskEdit(x,y);
}

void TViewDialog::MaskEdit(int x,int y)
{
 TView *view=current;

 int i;
 for(i=0;i<6;i++)
 {
  if(y<i+1) Edit1[i]->setState(sfVisible,False); else Edit1[i]->setState(sfVisible,True);
  if(x<2 || y<i+1) Edit2[i]->setState(sfVisible,False); else Edit2[i]->setState(sfVisible,True);
  if(x<3 || y<i+1) Edit3[i]->setState(sfVisible,False); else Edit3[i]->setState(sfVisible,True);
  if(x<4 || y<i+1) Edit4[i]->setState(sfVisible,False); else Edit4[i]->setState(sfVisible,True);
 }
 view->select();
}

int TViewDialog::SelectInput(void* source,TEvent& event)
{
 TEdit *Edit = (TEdit *)source;
 TViewDialog *Dialog = (TViewDialog *)Edit->owner;

 ushort control;

 if(event.what == evKeyboard)
  switch(event.keyDown.keyCode)
  {
   case 0x3920:
     control = myApp->execView( myApp->SelDialog = new TSelDialog(Dialog->PathDir,2,((TEdit *)source)->data));
     if(control==cmOK)
     {
      ((TEdit *)source)->setData( (char *)myApp->SelDialog->Colect2->at(myApp->SelDialog->ListBox2->focused) );
      Dialog->Modif=True;
     }
     destroy(myApp->SelDialog);
     break;
   case kbDel: ((TEdit *)source)->setData(Text_msg[49]); Dialog->Modif=True; break;
   case kbUp: Dialog->selectNext(True); Edit->clearEvent(event); break;
   case kbDown: Dialog->selectNext(False); Edit->clearEvent(event); break;
  }
 return(1);
}

int TViewDialog::EnterNumber(void* source,TEvent& event)
{
 char code;
 TEdit *Edit = (TEdit *)source;
 TViewDialog *Dialog = (TViewDialog *)Edit->owner;

 if(event.what == evKeyboard)
 {
  switch(event.keyDown.keyCode)
  {
   case kbDown: Dialog->selectNext(False); Edit->clearEvent(event); break;
   case kbUp: Dialog->selectNext(True); Edit->clearEvent(event); break;
  }
  code=event.keyDown.charScan.charCode;
  if( code>='0'&&code<='9')
  {
   Edit->setData(&code);
   message(Dialog,evBroadcast,cmChange,Edit); // Clicked
   Edit->clearEvent(event);
  }
 }
 return(1);
}

void TViewDialog::SaveChengeView(int item)
{
 char str1[10];
 int i;

 ViewDBF->ModifiFieldIt(item,"N_ROW",EditRow->data);
 ViewDBF->ModifiFieldIt(item,"N_CLN",EditLine->data);

 for(i=0;i<6;i++)
 {
  sprintf(str1,"SH_%d",i+1);  ViewDBF->ModifiFieldIt(item,str1,Edit1[i]->data);
  sprintf(str1,"SH_%d",i+7);  ViewDBF->ModifiFieldIt(item,str1,Edit2[i]->data);
  sprintf(str1,"SH_%d",i+13); ViewDBF->ModifiFieldIt(item,str1,Edit3[i]->data);
  sprintf(str1,"SH_%d",i+19); ViewDBF->ModifiFieldIt(item,str1,Edit4[i]->data);
 }
}

//==================================================
void TMyApp::LoadView(char* Name, TBasaDBF **BasaDBF)
{
 *BasaDBF = new TBasaDBF();
 if((*BasaDBF)->LoadFile(Name)== -1) (*BasaDBF)->LoadFields(kadr_view,sizeof(kadr_view)/sizeof(db_str_rec));
}