home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / BC_502 / SRCBDTO.PAK / DATASOUR.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-06  |  8.3 KB  |  318 lines

  1. //-----------------------------------------------------------------------------
  2. // Visual Database Tools
  3. // Copyright (c) 1996 by Borland International, All Rights Reserved
  4. //
  5. // datasour.cpp
  6. // TDataSource wrapper class
  7. //-----------------------------------------------------------------------------
  8.  
  9. #include <vdbt\bdto.h>
  10.  
  11. #pragma hdrstop
  12.  
  13. #include "wrapit.h"
  14. #include "misc.h"
  15.  
  16. #include <stdarg.h>
  17. #include <stdio.h>
  18.  
  19. //-----------------------------------------------------------------------------
  20.  
  21. static void STDAPICALLTYPE _export DataSourceNotifyEventCallback( int32 data, PITDataSource datasource )
  22. {
  23.     if (data)
  24.     {
  25.         PTDataSource ezDataSource = WrapPITDataSource( datasource );
  26.  
  27.         TDataSourceNotifySource* source = (TDataSourceNotifySource*) data;
  28.         (*source)( *ezDataSource );
  29.  
  30.         if (ezDataSource)
  31.             delete ezDataSource;
  32.     }
  33. }
  34.  
  35. void TDataSource::AttachOnStateChange( const TBdtEventSourceBase&, bool attach )
  36. {
  37.     if (datasource)
  38.     {
  39.         AttachedOnStateChange = attach;
  40.         if (attach)
  41.             datasource->AttachOnStateChange( DataSourceNotifyEventCallback, (int32) &OnStateChangeSource );
  42.         else
  43.             datasource->DetachOnStateChange( DataSourceNotifyEventCallback, (int32) &OnStateChangeSource );
  44.     }
  45. }
  46.  
  47. void TDataSource::AttachOnUpdateData( const TBdtEventSourceBase&, bool attach )
  48. {
  49.     if (datasource)
  50.     {
  51.         AttachedOnUpdateData = attach;
  52.         if (attach)
  53.             datasource->AttachOnUpdateData( DataSourceNotifyEventCallback, (int32) &OnUpdateDataSource );
  54.         else
  55.             datasource->DetachOnUpdateData( DataSourceNotifyEventCallback, (int32) &OnUpdateDataSource );
  56.     }
  57. }
  58.  
  59. static void STDAPICALLTYPE _export DataChangeEventCallback( int32 data, PITDataSource datasource, PITField field )
  60. {
  61.     if (data)
  62.     {
  63.         PTDataSource ezDataSource = WrapPITDataSource( datasource );
  64.         PTField ezField = WrapPITField( field );
  65.  
  66.         TDataChangeSource* source = (TDataChangeSource*) data;
  67.         (*source)( *ezDataSource, ezField );
  68.  
  69.         if (ezField)
  70.             delete ezField;
  71.         if (ezDataSource)
  72.             delete ezDataSource;
  73.     }
  74. }
  75.  
  76. void TDataSource::AttachOnDataChange( const TBdtEventSourceBase&, bool attach )
  77. {
  78.     if (datasource)
  79.     {
  80.         AttachedOnDataChange = attach;
  81.         if (attach)
  82.             datasource->AttachOnDataChange( DataChangeEventCallback, (int32) &OnDataChangeSource );
  83.         else
  84.             datasource->DetachOnDataChange( DataChangeEventCallback, (int32) &OnDataChangeSource );
  85.     }
  86. }
  87.  
  88. void TDataSource::DetachEvents( void )
  89. {
  90.     if (datasource)
  91.     {
  92.         if (AttachedOnStateChange)
  93.             datasource->DetachOnStateChange( DataSourceNotifyEventCallback, (int32) &OnStateChangeSource );
  94.         if (AttachedOnDataChange)
  95.             datasource->DetachOnDataChange( DataChangeEventCallback, (int32) &OnDataChangeSource );
  96.         if (AttachedOnUpdateData)
  97.             datasource->DetachOnUpdateData( DataSourceNotifyEventCallback, (int32) &OnUpdateDataSource );
  98.     }
  99. }
  100.  
  101. void TDataSource::ReattachEvents( void )
  102. {
  103.     if (datasource)
  104.     {
  105.         if (AttachedOnStateChange)
  106.             datasource->AttachOnStateChange( DataSourceNotifyEventCallback, (int32) &OnStateChangeSource );
  107.         if (AttachedOnDataChange)
  108.             datasource->AttachOnDataChange( DataChangeEventCallback, (int32) &OnDataChangeSource );
  109.         if (AttachedOnUpdateData)
  110.             datasource->AttachOnUpdateData( DataSourceNotifyEventCallback, (int32) &OnUpdateDataSource );
  111.     }
  112. }
  113.  
  114. //-----------------------------------------------------------------------------
  115.  
  116. void TDataSource::SetTDataSource( PIUnknown p )
  117. {
  118.     datasource = 0;
  119.     if (p)
  120.         p->QueryInterface( IID_ITDataSource, (void**) &datasource );
  121.     ReattachEvents();
  122. }
  123.  
  124. void TDataSource::ClearTDataSource( void )
  125. {
  126.     DetachEvents();
  127.     if (datasource)
  128.     {
  129.         datasource->Release();
  130.         datasource = 0;
  131.     }
  132. }
  133.  
  134. TDataSource::TDataSource( void ) :
  135.     TBDTComponent(),
  136.     OnStateChangeSource( SrcAttach_MFUNCTOR( *this, &TDataSource::AttachOnStateChange ) ),
  137.     AttachedOnStateChange( false ),
  138.     OnDataChangeSource( SrcAttach_MFUNCTOR( *this, &TDataSource::AttachOnDataChange ) ),
  139.     AttachedOnDataChange( false ),
  140.     OnUpdateDataSource( SrcAttach_MFUNCTOR( *this, &TDataSource::AttachOnUpdateData ) ),
  141.     AttachedOnUpdateData( false )
  142. {
  143.     datasource = CreateITDataSource();
  144.     TBDTComponent::SetPIT( datasource );
  145. }
  146.  
  147. TDataSource::TDataSource( PITDataSource p ) :
  148.     TBDTComponent( p ),
  149.     OnStateChangeSource( SrcAttach_MFUNCTOR( *this, &TDataSource::AttachOnStateChange ) ),
  150.     AttachedOnStateChange( false ),
  151.     OnDataChangeSource( SrcAttach_MFUNCTOR( *this, &TDataSource::AttachOnDataChange ) ),
  152.     AttachedOnDataChange( false ),
  153.     OnUpdateDataSource( SrcAttach_MFUNCTOR( *this, &TDataSource::AttachOnUpdateData ) ),
  154.     AttachedOnUpdateData( false )
  155. {
  156.     SetTDataSource( p );
  157. }
  158.  
  159. TDataSource::TDataSource( const TDataSource& p ) :
  160.     TBDTComponent( p ),
  161.     OnStateChangeSource( SrcAttach_MFUNCTOR( *this, &TDataSource::AttachOnStateChange ) ),
  162.     AttachedOnStateChange( false ),
  163.     OnDataChangeSource( SrcAttach_MFUNCTOR( *this, &TDataSource::AttachOnDataChange ) ),
  164.     AttachedOnDataChange( false ),
  165.     OnUpdateDataSource( SrcAttach_MFUNCTOR( *this, &TDataSource::AttachOnUpdateData ) ),
  166.     AttachedOnUpdateData( false )
  167. {
  168.     SetTDataSource( p.datasource );
  169. }
  170.  
  171. TDataSource::TDataSource( PTDataSource p ) :
  172.     TBDTComponent( p ),
  173.     OnStateChangeSource( SrcAttach_MFUNCTOR( *this, &TDataSource::AttachOnStateChange ) ),
  174.     AttachedOnStateChange( false ),
  175.     OnDataChangeSource( SrcAttach_MFUNCTOR( *this, &TDataSource::AttachOnDataChange ) ),
  176.     AttachedOnDataChange( false ),
  177.     OnUpdateDataSource( SrcAttach_MFUNCTOR( *this, &TDataSource::AttachOnUpdateData ) ),
  178.     AttachedOnUpdateData( false )
  179. {
  180.     SetTDataSource( p ? p->datasource : 0 );
  181. }
  182.  
  183. TDataSource::TDataSource( HWND hdlg, int idc ) :
  184.     TBDTComponent(),
  185.     OnStateChangeSource( SrcAttach_MFUNCTOR( *this, &TDataSource::AttachOnStateChange ) ),
  186.     AttachedOnStateChange( false ),
  187.     OnDataChangeSource( SrcAttach_MFUNCTOR( *this, &TDataSource::AttachOnDataChange ) ),
  188.     AttachedOnDataChange( false ),
  189.     OnUpdateDataSource( SrcAttach_MFUNCTOR( *this, &TDataSource::AttachOnUpdateData ) ),
  190.     AttachedOnUpdateData( false )
  191. {
  192.     SetTDataSource( GetVBXPIUnknown( hdlg, idc ) );
  193.     TBDTComponent::SetPIT( datasource );
  194. }
  195.  
  196. void TDataSource::AttachToControl( HWND hdlg, int idc )
  197. {
  198.     SetPIT( GetVBXPIUnknown( hdlg, idc ) );
  199. }
  200.  
  201. void TDataSource::AttachControl( HWND hdlg, int idc )
  202. {
  203.     SetVBXPIUnknown( hdlg, idc, datasource );
  204. }
  205.  
  206. TDataSource& TDataSource::operator=( PITDataSource p )
  207. {
  208.     TBDTComponent::operator=(p);
  209.     ClearTDataSource();
  210.     SetTDataSource( p );
  211.     return *this;
  212. }
  213.  
  214. TDataSource& TDataSource::operator=( const TDataSource& p )
  215. {
  216.     if (this != &p)
  217.     {
  218.         TBDTComponent::operator=(p);
  219.         ClearTDataSource();
  220.         SetTDataSource( p.datasource );
  221.     }
  222.     return *this;
  223. }
  224.  
  225. int TDataSource::operator==( const TDataSource& p ) const
  226. {
  227.     if (this == &p)
  228.         return true;
  229.     if (datasource == p.datasource)
  230.         return true;
  231.     return false;
  232. }
  233.  
  234. int TDataSource::operator!=( const TDataSource& p ) const
  235. {
  236.     return ! operator==(p);
  237. }
  238.  
  239. TDataSource::~TDataSource()
  240. {
  241.     ClearTDataSource();
  242. }
  243.  
  244. void TDataSource::SetPIT( PIUnknown p )
  245. {
  246.     ClearTDataSource();
  247.     SetTDataSource( p );
  248.     TBDTComponent::SetPIT( p );
  249. }
  250.  
  251. void TDataSource::Edit( void )
  252. {
  253.     if (datasource)
  254.         datasource->Edit();
  255. }
  256.  
  257. bool TDataSource::IsLinkedTo( TDataSet& DataSet )
  258. {
  259.     if (datasource)
  260.         return MakeBool( datasource->IsLinkedTo( DataSet.GetPITDataSet() ) );
  261.     return false;
  262. }
  263.  
  264. DEFINE_BDTO_PROP_RO( TDataSource, TDataSetState, State );
  265.  
  266. void TDataSource::GetState( TDataSetState& s )
  267. {
  268.     if (datasource)
  269.         s = datasource->get_State();
  270. }
  271.  
  272. DEFINE_BDTO_PROP_RW( TDataSource, bool, AutoEdit );
  273. DEFINE_BDTO_OBJECTPROP_RW_FAST( TDataSource, TDataSet, PITDataSet, DataSet );
  274. DEFINE_BDTO_PROP_RW( TDataSource, bool, Enabled );
  275.  
  276. void TDataSource::GetAutoEdit( bool& a )
  277. {
  278.     if (datasource)
  279.         a = MakeBool( datasource->get_AutoEdit() );
  280. }
  281.  
  282. void TDataSource::SetAutoEdit( bool a )
  283. {
  284.     if (datasource)
  285.         datasource->put_AutoEdit( MakeVariantBool( a ) );
  286. }
  287.  
  288. void TDataSource::GetDataSet( TDataSet& d )
  289. {
  290.     if (datasource)
  291.     {
  292.         PITDataSet pit = datasource->get_DataSet();
  293.         if (pit)
  294.         {
  295.             d.SetPIT( pit );
  296.             pit->Release();
  297.         }
  298.     }
  299. }
  300.  
  301. void TDataSource::SetDataSet( const TDataSet& d )
  302. {
  303.     if (datasource)
  304.         datasource->put_DataSet( d.GetPITDataSet() );
  305. }
  306.  
  307. void TDataSource::GetEnabled( bool& e )
  308. {
  309.     if (datasource)
  310.         e = MakeBool( datasource->get_Enabled() );
  311. }
  312.  
  313. void TDataSource::SetEnabled( bool e )
  314. {
  315.     if (datasource)
  316.         datasource->put_Enabled( MakeVariantBool( e ) );
  317. }
  318.