////////////////////////////////////////////////////////////////////////////////
//
// shdialog.cpp -  
//
////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "resource.h"



#ifndef  __SHDIAL_H
#include "ShDialog.h"
#endif  

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define MAX_LENGTH 1000        //   
#define MIN_LENGTH 0           //   


//-------------------------------------------------------------------------------
//     - <studs3d.cpp>
// ---
LPTSTR LoadStr( int id );

extern bool openBase;


//-------------------------------------------------------------------------------
//   
// ---
int	Shpeel::MacroElementParam() 
{
	int res = 0;
	Shpeel* bufS = Dublicate();
	if ( bufS && bufS->OpenBase() ) 
  {
		ShpeelDlg* dlg = new ShpeelDlg( *bufS );
		if ( dlg ) 
    {
			EnableTaskAccess( 0 );        //    
			res = dlg->DoModal() == IDOK;	//  
			EnableTaskAccess( 1 );        //    
			delete dlg;
		}
		if ( res ) 
			Assign( *bufS );
		bufS->CloseBase();
		delete bufS;
	}
	return res;
}

//------------------------------------------------------------------------------
//  
// ---
static UINT ChoiceBMP( short gost, short f ) 
{
	UINT bmp = 0;
  if ( gost > 22041 ) 
		bmp = f & ALLST ? SH22042_3 : f & ISPOLN ? SH22042_2 : SH22042_1;
  else 
		bmp = f & ISPOLN ? SH22032_2 : SH22032_1;
	return bmp;
}

//------------------------------------------------------------------------------
//      
// ---
int GetTypeForGost( short gost ) 
{
	int n;
  switch ( gost ) 
  {
    case 22032 :
    case 22033 :  n = 0;  break; // 1d
    case 22034 :
    case 22035 :  n = 1;  break; // 1,25d
    case 22036 :
    case 22037 :  n = 2;  break; // 1,6d
    case 22038 :
    case 22039 :  n = 3;  break; // 2d
    case 22040 :
    case 22041 :  n = 4;  break; // 2,5d
    case 22042 :
    case 22043 :  n = 5;  break; // l0
  }
  return n;
}

//------------------------------------------------------------------------------
//     
// ---
int GetKlassForGost( short gost ) 
{
	int n;
  switch ( gost ) 
  {
    case 22032 :
    case 22034 :
    case 22036 :
    case 22038 :
    case 22040 :
    case 22042 : n = 1;  break; // B 
    case 22033 :
    case 22035 :
    case 22037 :
    case 22039 :
    case 22041 :
    case 22043 : n = 0;  break; // A
  }
  return n;
}

//------------------------------------------------------------------------------
//     
// ---
int GetGostForTypeAndKlass( int type, int klass ) 
{
	int n;
  switch ( type ) 
  {
    case 0 : n = klass ? 0  : 1;  break; // 22032 : 22033
    case 1 : n = klass ? 2  : 3;  break; // 22034 : 22035
    case 2 : n = klass ? 4  : 5;  break; // 22036 : 22037
    case 3 : n = klass ? 6  : 7;  break; // 22038 : 22039
    case 4 : n = klass ? 8  : 9;  break; // 22040 : 22041
    case 5 : n = klass ? 10 : 11; break; // 22042 : 22043
  }
  return n;
}

//------------------------------------------------------------------------------
//
// ---
static  int NumberStr( int gost ) 
{
	int n;
  switch ( gost ) 
  {
    case 22032 :	n = STR59;	break;
    case 22033 :  n = STR60;  break;
    case 22034 :  n = STR61;  break;
    case 22035 :  n = STR62;  break;
    case 22036 :  n = STR63;  break;
    case 22037 :  n = STR64;  break;
    case 22038 :  n = STR65;  break;
    case 22039 :  n = STR66;  break;
    case 22040 :  n = STR67;  break;
    case 22041 :  n = STR68;  break;
    case 22042 :  n = STR69;  break;
    case 22043 :  n = STR70;  break;
  }
  return n;
}

//-------------------------------------------------------------------------------
//  
// ---
ShpeelDlg::ShpeelDlg( Shpeel& _shpeel, CWnd* pParent )
	: CDialog(ShpeelDlg::IDD, pParent),
	shpeel   (_shpeel)
{
	//{{AFX_DATA_INIT(ShpeelDlg)
	m_perfGroup = -1;
	//}}AFX_DATA_INIT
	bitMapId = 0;

  m_listParam.AddParItem( &shpeel.GetShpeelParam().b,  pmFloat, STR247 ); // l0  
  m_listParam.AddParItem( &shpeel.GetShpeelParam().b1, pmFloat, STR248 ); // l1  
  m_listParam.AddParItem( &p,													 pmFloat, STR231 ); //  
  m_listParam.AddParItem( &shpeel.GetShpeelParam().c,  pmFloat, STR236 ); // 
  m_listParam.AddParItem( &massa,											 pmFloat, STR237 ); //  1000 
}


void ShpeelDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(ShpeelDlg)
	DDX_Control(pDX, IDC_MAT_COMBO, m_tMatt);
	DDX_Control(pDX, IDC_ATTR_CHECK, m_cAttr);
	DDX_Control(pDX, IDC_LISTVIEWPARAM, m_listParam);
	DDX_Control(pDX, IDC_STUD_KLASS_COMBO, m_klass);
	DDX_Control(pDX, IDC_STUD_TYPE_COMBO, m_type);
	DDX_Control(pDX, IDC_GOST_COMBO, m_gost);
	DDX_Control(pDX, IDD_PITCH, m_pitch);
	DDX_Control(pDX, IDC_SHOW_ST, m_showStatic);
	DDX_Control(pDX, IDD_LEN, m_len);
	DDX_Control(pDX, IDD_DIAM, m_diam);
	DDX_Radio(pDX, IDC_PERFORMANCE1, m_perfGroup);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(ShpeelDlg, CDialog)
	//{{AFX_MSG_MAP(ShpeelDlg)
	ON_WM_PAINT()
	ON_CBN_SELCHANGE(IDC_GOST_COMBO, OnSelchangeGostCombo)
	ON_CBN_SELCHANGE(IDC_STUD_KLASS_COMBO, OnSelchangeStudKlassCombo)
	ON_BN_CLICKED(IDC_STUD_SIMPL_CHECK, OnStudSimplCheck)
	ON_CBN_SELCHANGE(IDC_STUD_TYPE_COMBO, OnSelchangeStudTypeCombo)
	ON_CBN_SELCHANGE(IDD_DIAM, OnSelchangeDiam)
	ON_CBN_SELCHANGE(IDD_LEN, OnSelchangeLen)
	ON_BN_CLICKED(IDD_PITCH, OnPitch)
	ON_BN_CLICKED(IDC_PERFORMANCE1, OnPerformance1)
	ON_BN_CLICKED(IDC_PERFORMANCE2, OnPerformance2)
	ON_BN_CLICKED(IDC_HELP_BUT, OnHelpBut)
	ON_CBN_SELCHANGE(IDC_MAT_COMBO, OnSelchangeMatCombo)
	ON_BN_CLICKED(IDC_ATTR_CHECK, OnAttrCheck)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


//-------------------------------------------------------------------------------
//  
// ---
BOOL ShpeelDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();

	CString buf;
  //   
  static int idGOST[] = { STR59, STR60, STR61, STR62, STR63, STR64, STR65, STR66, STR67,
  												STR68, STR69, STR70 };
  for ( UINT i = 0; i < 12; i++ ) 
  {
		buf = LoadStr( idGOST[i] );
    m_gost.AddString( buf );
  }
	buf = LoadStr( ::NumberStr(shpeel.GetShpeelParam().gost) );
	m_gost.SelectString( -1, buf );	//    

  //   "   l1 ="
  for ( i = 0; i < 6; i++ ) 
  {
    buf = LoadStr( IDS_STUD_1D + i );
    m_type.AddString( buf );
  }
  m_type.SetCurSel( ::GetTypeForGost(shpeel.GetShpeelParam().gost) ); //     l1

  static int idMat[] = { STR238, STR239, STR240, STR246 };
  for ( i = 0; i < 4; i++ ) 
  {
    buf = LoadStr( idMat[i] );
    m_tMatt.AddString( buf );
  }
  m_tMatt.SetCurSel( shpeel.GetShpeelParam().indexMassa );

  //   " "
  buf = LoadStr( IDS_STUD_A ); // "A"
  m_klass.AddString( buf );
  buf = LoadStr( IDS_STUD_B ); // "B"
  m_klass.AddString( buf );
  m_klass.SetCurSel( ::GetKlassForGost(shpeel.GetShpeelParam().gost) ); //   

  //   checkbox' ""
  CheckDlgButton( IDC_STUD_SIMPL_CHECK, shpeel.GetShpeelParam().f & SIMPLE );

  InitControls();
  m_cAttr.SetCheck( shpeel.GetFlagAttr() ? 1 : 0 );

  m_listParam.SetupView();
	
	return TRUE;
}


//-------------------------------------------------------------------------------
//  
// ---
void ShpeelDlg::OnPaint() 
{
	CPaintDC dc(this);	
  DrawSlide( m_showStatic.m_hWnd, bitMapId );
}


//------------------------------------------------------------------------------
//    ,  
// ---
void ShpeelDlg::ErrorDialog( int id ) 
{
  ErrorT( LoadStr( id ) ); //   
  OnCancel();             //  
}



//------------------------------------------------------------------------------
//   
// ---
void ShpeelDlg::FillDiametr() 
{
  struct {
    short t;
    char s[128];
  } tmpL;
  ::memset( &tmpL, 0, sizeof(tmpL) ); 

  m_diam.Clear(); //  

  float lMin         = MAX_LENGTH; //    
  float lMax         = MIN_LENGTH; //    
  bool  enterInRange = false;      //        
  bool  failDB       = true;       //  

  if ( !::Condition(shpeel.GetShpeelBase().bg, shpeel.GetShpeelBase().rg1, "t = 1") ) 
  {
    ErrorDialog( STR144 ); 
    return; 
  }

  int i = 1;
  while( i ) //     
  {                                 
    i = ::ReadRecord( shpeel.GetShpeelBase().bg, shpeel.GetShpeelBase().rg1, &tmpL ); //  
    if ( i ) //   
    {                                     
      m_diam.AddString( _bstr_t(tmpL.s) ); //    

      char *c;
      float ln = (float)::strtod( tmpL.s, &c ); //    
      if ( shpeel.GetShpeelParam().d == ln )
        enterInRange = true;                    //       
      if ( ln < lMin )
        lMin = ln;                              //   
      if ( ln > lMax )                          
        lMax = ln;                              //   
                                                
      failDB = false;                           //  
    }
  }
  if ( !enterInRange ) //          
    shpeel.GetShpeelParam().d = lMin;     //    
  if ( shpeel.GetShpeelParam().d < lMin ) //        
    shpeel.GetShpeelParam().d = lMin;     //    
  if ( shpeel.GetShpeelParam().d > lMax ) //        
    shpeel.GetShpeelParam().d = lMax;     //    

  ::sprintf( tmpL.s, "%g", shpeel.GetShpeelParam().d ); //      
  m_diam.SelectString( -1, _bstr_t(tmpL.s) ); //    

  if ( failDB ) //       
    ErrorDialog( DIAM_ERROR ); //   
}


//------------------------------------------------------------------------------
//   
// ---
void ShpeelDlg::FillLenght() 
{
  struct {
    short t;
    char s[128];
    float dr;
  } tmpL;
  ::memset( &tmpL, 0, sizeof(tmpL) ); 
  
  m_len.Clear(); //   

  float lMin         = MAX_LENGTH; //    
  float lMax         = MIN_LENGTH; //    
  bool  enterInRange = false;      //        
  bool  failDB       = true;       //  

  ::sprintf( tmpL.s, "t = 1 && d=%.1f", shpeel.GetShpeelParam().d ); 
  if ( !::Condition(shpeel.GetShpeelBase().bs, shpeel.GetShpeelBase().rs1, tmpL.s) ) 
  {
    ErrorDialog( STR144 ); 
    return; 
  }

  int i = 1;
  while( i ) //     
  {    
    i = ::ReadRecord( shpeel.GetShpeelBase().bs, shpeel.GetShpeelBase().rs1, &tmpL );//  
    if ( i ) //   
    {                                     
      m_len.AddString( _bstr_t(tmpL.s) );                //    

      char *c;
      float ln = (float)::strtod( tmpL.s, &c ); //    
      if ( shpeel.GetShpeelParam().l == ln )
        enterInRange = true;                    //       
      if ( ln < lMin )
        lMin = ln;                              //   
      if ( ln > lMax )
        lMax = ln;                              //   

      failDB = false;                           //  
    }
  }
  if ( !enterInRange ) //          
    shpeel.GetShpeelParam().l = lMin;     //    
  if ( shpeel.GetShpeelParam().l < lMin ) //        
    shpeel.GetShpeelParam().l = lMin;     //    
  if ( shpeel.GetShpeelParam().l > lMax ) //        
    shpeel.GetShpeelParam().l = lMax;     //    

  ::sprintf( tmpL.s, "%g", shpeel.GetShpeelParam().l ); //      
  m_len.SelectString( -1, _bstr_t(tmpL.s) ); //    

  if ( failDB )               //       
    ErrorDialog( LEN_ERROR ); //   
}


//------------------------------------------------------------------------------
//  
// ---
void ShpeelDlg::InitControls() 
{
  if ( shpeel.GetShpeelParam().gost > 22041 ) 
  {
    if ( ::fabs(shpeel.GetShpeelParam().b) > 0.001 )
      shpeel.GetShpeelParam().f &=~ ALLST;
    else
      shpeel.GetShpeelParam().f |= ALLST;
  }
  else
    shpeel.GetShpeelParam().f &=~ ALLST;

	m_pitch.SetCheck( shpeel.GetShpeelParam().f & PITCH ? 1 : 0 );
	m_perfGroup = shpeel.GetShpeelParam().f & ISPOLN ? 1 : 0;

  FillDiametr(); //   
  FillLenght();  //   

  ::EnableWindow( GetDlgItem(IDC_PERFORMANCE2)->m_hWnd, 
									shpeel.GetShpeelParam().f & ALLST ? false : true );
  if ( shpeel.GetShpeelParam().f & ALLST ) 
		m_perfGroup = 0;

  CalcMassa();
  ChoicePitch();
  bitMapId = ChoiceBMP( shpeel.GetShpeelParam().gost, shpeel.GetShpeelParam().f );
	m_showStatic.Invalidate();
	UpdateData( FALSE );
}


//------------------------------------------------------------------------------
//  
// ---
int ReadShpeelBase( float d, ShpeelBase &base, SHPEEL *  shpeel  ) 
{
  char buf[256];
  ShpeelTmp shpeelTmp; 
  ::memset( &shpeelTmp, 0, sizeof(shpeelTmp) );

  ::sprintf( buf, "t = 1 && d=%g", d );
  if ( !::Condition(base.bg,  base.rg2, buf) ) 
  { 
    return 0;
  }
  int res = ::ReadRecord( base.bg, base.rg2, &shpeelTmp );
  if( res ) 
  {
    
    shpeel->d  = shpeelTmp.d;  //  
    shpeel->p1 = shpeelTmp.p1; //   
    shpeel->p2 = shpeelTmp.p2; //   
    shpeel->b1 = shpeelTmp.b1; //  
    shpeel->c  = shpeelTmp.c;  //   
  }
  return  res;
}


//------------------------------------------------------------------------------
//   
//  1 -  0 -    -1 -    
// ---
int ReadShpeelStBase( ShpeelBase &base, SHPEEL * shpeel  )
{
  char buf[256];
  ShpeelSTmp shpeelSTmp;
  ::memset( &shpeelSTmp, 0, sizeof(shpeelSTmp) );

  ::sprintf( buf, "t = 1 && L=%g && d=%g", shpeel->l, shpeel->d );
  if ( !::Condition(base.bs,  base.rs2, buf) ) 
  { 
    return -1;
  }
  
  int i = ::ReadRecord(  base.bs, base.rs2, &shpeelSTmp );
  if ( !i )  
  {
    ::sprintf( buf, "t = 1 && d=%.1f", shpeel->d);

    if ( !::Condition(base.bs,  base.rs2, buf) ) 
    { 
      return -1;
    }
    ::ReadRecord( base.bs, base.rs2, &shpeelSTmp );
  }

  shpeel->l  = shpeelSTmp.l;
  shpeel->b  = shpeelSTmp.b;
  shpeel->m1 = shpeelSTmp.m1;
  shpeel->m2 = shpeelSTmp.m2;
  
  if ( shpeel->gost > 22041 ) 
  {
    if ( fabs(shpeel->b) > 0.001 ) 
    {
      shpeel->f &=~ ALLST;
    }
    else 
    {
      shpeel->f |= ALLST;
    }
  }
  return 1;
}


//-------------------------------------------------------------------------------
//    
// ---
void ShpeelDlg::OnSelchangeGostCombo() 
{
	CString str;
  m_gost.GetLBText( m_gost.GetCurSel(), str.GetBuffer(20) ); //  
  str.ReleaseBuffer();
	int index = str.Find( _T("-"), 0 );
	if ( index > 0 )                   //    
		str = str.Left( index );      
	short gost = (short)::atoi( _bstr_t(str) ); //   
	if ( gost != shpeel.GetShpeelParam().gost ) 
  {
		shpeel.GetShpeelParam().gost = gost;

		m_type.SetCurSel( ::GetTypeForGost(shpeel.GetShpeelParam().gost) );   //     l1
	  m_klass.SetCurSel( ::GetKlassForGost(shpeel.GetShpeelParam().gost) ); //   

    if ( openBase )       //   
      shpeel.CloseBase(); //   

    //       
    if ( !shpeel.OpenBase() )                                  
      { OnCancel(); return; }
    if ( !::ReadShpeelBase(shpeel.GetShpeelParam().d, shpeel.GetShpeelBase(), &shpeel.GetShpeelParam() ) )
      { OnCancel(); return; }
    if ( -1 == ::ReadShpeelStBase( shpeel.GetShpeelBase(), &shpeel.GetShpeelParam() ) )                     
      { OnCancel(); return; }

    InitControls();     //  
    m_listParam.Show(); //   
  }
}


//-------------------------------------------------------------------------------
//    " "
// ---
void ShpeelDlg::OnSelchangeStudKlassCombo() 
{
  int k = m_klass.GetCurSel();
  int k1 = m_type.GetCurSel();
  if ( (k > -1) && (k1 > -1) ) 
  {
    m_gost.SetCurSel( ::GetGostForTypeAndKlass(k1, k) );
    OnSelchangeGostCombo();
  }
}


//-------------------------------------------------------------------------------
//   ""
// ---
void ShpeelDlg::OnStudSimplCheck() 
{
  if ( IsDlgButtonChecked(IDC_STUD_SIMPL_CHECK) )
    shpeel.GetShpeelParam().f |= SIMPLE;
  else
    shpeel.GetShpeelParam().f &= ~SIMPLE;
}


//-------------------------------------------------------------------------------
//    "  "
// ---
void ShpeelDlg::OnSelchangeStudTypeCombo() 
{
  int k = m_type.GetCurSel();
  int k1 = m_klass.GetCurSel();
  if ( (k > -1) && (k1 > -1) ) 
  {
    m_gost.SetCurSel( ::GetGostForTypeAndKlass(k, k1) );
    OnSelchangeGostCombo();
  }
}


//------------------------------------------------------------------------------
//  
// ---
void ShpeelDlg::ViewParamShow() 
{
  CalcMassa();
  ChoicePitch();
  m_listParam.Show();
}


//-------------------------------------------------------------------------------
//     -         
// ---
void ShpeelDlg::OnSelchangeDiam() 
{
	CString str;
  m_diam.GetLBText( m_diam.GetCurSel(), str.GetBuffer(20) ); //  
  str.ReleaseBuffer();

  TCHAR *c;
  float dr = (float)::_tcstod( str, &c ); //   
  if ( ::fabs(dr - shpeel.GetShpeelParam().d) > 0.001 ) 
  {
    if ( !::ReadShpeelBase( dr, shpeel.GetShpeelBase(), &shpeel.GetShpeelParam() ) )
      { OnCancel(); return ; } //  

    FillLenght(); //   

    if ( ::ReadShpeelStBase(shpeel.GetShpeelBase(), &shpeel.GetShpeelParam()) == -1 )
      {  OnCancel(); return; } //  

		::EnableWindow( GetDlgItem(IDC_PERFORMANCE2)->m_hWnd, 
										shpeel.GetShpeelParam().f & ALLST ? false : true );
		if ( shpeel.GetShpeelParam().f & ALLST ) 
			m_perfGroup = 0;

    bitMapId = ::ChoiceBMP( shpeel.GetShpeelParam().gost, shpeel.GetShpeelParam().f ); //  
    ViewParamShow(); //   
    m_showStatic.Invalidate(); //  
  }
}

//-------------------------------------------------------------------------------
//     -     
// ---
void ShpeelDlg::OnSelchangeLen() 
{
	CString str;
  m_len.GetLBText( m_len.GetCurSel(), str.GetBuffer(20) ); //  
  str.ReleaseBuffer();
  TCHAR *c;
  float l = (float)::_tcstod( str, &c ); //   
  if ( ::fabs(l - shpeel.GetShpeelParam().l) > 0.001 ) 
  {
    shpeel.GetShpeelParam().l = l; //    k    
     if ( ::ReadShpeelStBase(shpeel.GetShpeelBase(), &shpeel.GetShpeelParam()) == -1 ) 
       { OnCancel(); return; } //  

		::EnableWindow( GetDlgItem(IDC_PERFORMANCE2)->m_hWnd, 
										shpeel.GetShpeelParam().f & ALLST ? false : true );
		if ( shpeel.GetShpeelParam().f & ALLST ) 
			m_perfGroup = 0;

    bitMapId = ::ChoiceBMP( shpeel.GetShpeelParam().gost, shpeel.GetShpeelParam().f ); //  
    ViewParamShow(); //   
    m_showStatic.Invalidate(); //  
  }
}


//-------------------------------------------------------------------------------
// 
// ---
void ShpeelDlg::OnPitch() 
{
  if ( m_pitch.GetCheck() == 1 )
    shpeel.GetShpeelParam().f |= PITCH;
  else
    shpeel.GetShpeelParam().f &= ~PITCH;
  ViewParamShow();
}


//-------------------------------------------------------------------------------
//  1
// ---
void ShpeelDlg::OnPerformance1() 
{
	if ( IsDlgButtonChecked(IDC_PERFORMANCE1) )
		shpeel.GetShpeelParam().f &=~ ISPOLN;
	else
		shpeel.GetShpeelParam().f |= ISPOLN;

  bitMapId = ::ChoiceBMP( shpeel.GetShpeelParam().gost, shpeel.GetShpeelParam().f ); //  
  ViewParamShow(); //   
  m_showStatic.Invalidate(); //  
}


//-------------------------------------------------------------------------------
//  2 
// ---
void ShpeelDlg::OnPerformance2() 
{
	if ( IsDlgButtonChecked(IDC_PERFORMANCE2) )
		shpeel.GetShpeelParam().f |= ISPOLN;
	else
		shpeel.GetShpeelParam().f &=~ ISPOLN;

  bitMapId = ::ChoiceBMP( shpeel.GetShpeelParam().gost, shpeel.GetShpeelParam().f ); //  
  ViewParamShow(); //   
  m_showStatic.Invalidate(); //  
}


//-------------------------------------------------------------------------------
//  
// ---
void ShpeelDlg::OnHelpBut() 
{
  MessageT( LoadStr( STR230 ) );
}


//-------------------------------------------------------------------------------
// 
// --- 
void ShpeelDlg::OnSelchangeMatCombo() 
{
  int k = m_tMatt.GetCurSel();
  if ( k > -1 ) 
  {
    shpeel.GetShpeelParam().indexMassa =(byte) k;
    ViewParamShow();
  }
}


//-------------------------------------------------------------------------------
//   
// ---
void ShpeelDlg::OnAttrCheck() 
{
	shpeel.GetFlagAttr() = m_cAttr.GetCheck() == 1 ? true : false;
}
