////////////////////////////////////////////////////////////////////////////////
//
// TestVCTree.cpp -   Visual C++
//
////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <afxdllx.h>
#include "TestVCTree.h"
#include "PropManager\CPropMen.h"
#include "aPropUserEvent.h"

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


//-------------------------------------------------------------------------------
//       DLL
// ---
static AFX_EXTENSION_MODULE TestVCTreeDLL = { NULL, NULL };
HINSTANCE g_hInstance = NULL;
IApplicationPtr newKompasAPI( NULL );               

void OnProcessDetach();                            //  



//-------------------------------------------------------------------------------
//   
//    DLL
// ---
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
  g_hInstance = hInstance;

	if (dwReason == DLL_PROCESS_ATTACH)
	{
		TRACE0("TestVCTree.AWX Initializing!\n");

		AfxInitExtensionModule(TestVCTreeDLL, hInstance);

		new CDynLinkLibrary(TestVCTreeDLL);
	}
	else if (dwReason == DLL_PROCESS_DETACH)
	{
		TRACE0("TestVCTree.AWX Terminating!\n");
    OnProcessDetach();
		AfxTermExtensionModule(TestVCTreeDLL);
	}
	return 1;   // ok
}


//-------------------------------------------------------------------------------
//     API
// ---
void GetNewKompasAPI() 
{
  if ( !( IApplication * )newKompasAPI ) 
  {
    CString filename;
    
    if( ::GetModuleFileName(NULL, filename.GetBuffer(255), 255) ) 
    {
      filename.ReleaseBuffer( 255 );
      CString libname;
      
      libname = LoadStr( IDR_API7 );    // kAPI7.dll
      filename.Replace( filename.Right(filename.GetLength() - (filename.ReverseFind('\\') + 1)), 
        libname );
      
      HINSTANCE hAppAuto = LoadLibrary( filename ); //  kAPI7.dll
      
      if(  hAppAuto ) 
      {
        //      KompasApplication  
        typedef LPDISPATCH ( WINAPI * FCreateKompasApplication )(); 
        
        FCreateKompasApplication pCreateKompasApplication = 
          (FCreateKompasApplication)GetProcAddress( hAppAuto, "CreateKompasApplication" );	
        
        if ( pCreateKompasApplication )
          newKompasAPI = IDispatchPtr ( pCreateKompasApplication(), false /*AddRef*/); //   Application
        FreeLibrary( hAppAuto );  
      }
    }
  }
}



//-------------------------------------------------------------------------------
//   
// ---
unsigned int WINAPI LIBRARYID()
{
  return IDR_LIBID;
}


////////////////////////////////////////////////////////////////////////////////
//
// 
//
////////////////////////////////////////////////////////////////////////////////
class MLibObj : public UserControlEventCallback
{
protected:
  _variant_t                  NOPARAM;            //  
  IImageListPtr               m_treeImageList;    //    
  IImageListPtr               m_toolBarImageList; //    
  ITreeViewPtr                m_TreeVeiw;         // 
  IToolbarPtr                 m_ToolBar;          //  
  IPropertyManagerPtr         m_propMng;          //   

  ATreeCtrlEvent *            m_treeEvent;        //     
  AToolBarCtrlEvent *         m_toolBarEvent;     //     toolbar
  AContextMenuEvent *         m_contextMenuEvent; //     
  APropertyUserControlEvent * m_UserControlEvent; //    

public:
  MLibObj();
  ~MLibObj();
  
public:
  // UserControlEventCallback
  virtual bool CallbackCreateOCX ( LPDISPATCH iOcx, long controlID );
  virtual bool CallbackDestroyOCX(                  long controlID );
  
protected:
  
  //     toolBar'a
  void InitToolBarImageList( _DVCTreePtr & ctrl );
  //     
  void InitTreeImageList( _DVCTreePtr & ctrl );
  //  
  void InitTree( _DVCTreePtr & ctrl );
  //  toolbar
  void InitToolBar( _DVCTreePtr & ctrl );

public:
  void CreateUserPanel();
  void CreateUserTree();

};


PArray<MLibObj> m_libObjects;  

//-----------------------------------------------------------------------------
//
// ---
MLibObj::MLibObj()
 : m_treeEvent        ( NULL )
 , m_toolBarEvent     ( NULL )
 , m_contextMenuEvent ( NULL )
 , m_UserControlEvent ( NULL )
{
  //   -  
  NOPARAM.vt    = VT_ERROR;
  NOPARAM.scode = DISP_E_PARAMNOTFOUND;
}

//-----------------------------------------------------------------------------
//
// ---
MLibObj::~MLibObj()
{
  CallbackDestroyOCX( 1000 );
}


//-----------------------------------------------------------------------------
//
// ---
void MLibObj::CreateUserPanel()
{
  CRect g_Rect( 20, 20, 270, 320 );
  m_propMng = newKompasAPI->CreatePropertyManager( TRUE/*FALSE*/ );
  if ( m_propMng )
  {
    m_propMng->Layout = pmAlignRight;
    m_propMng->Caption = _T("  ");
    m_propMng->SetGabaritRect( g_Rect.left, g_Rect.top, g_Rect.right, g_Rect.bottom );
    m_propMng->SpecToolbar = pnEnterEscCreateSaveSearchHelp;
    //      new PropertyManagerEvent( propMng );                 //     
    IPropertyTabPtr tab( m_propMng->PropertyTabs->Add(_T("  ")) );
  
    //   
    IPropertyControlsPtr collection = tab->PropertyControls;
  
    IPropertyUserControlPtr userCtrl = collection->Add( ksControlUser );
    if ( userCtrl ) {
      userCtrl->NameVisibility = ksNameHorizontalVisible;
      userCtrl->SetOCXControl(_bstr_t ( "VCTree.VCTreeCtrl.1") );
      //userCtrl->SetOCXControl(_bstr_t ( "VCTree.VCTreeCtrl.1") );
      userCtrl->Name   = ""; 
      userCtrl->Height = 100;
      userCtrl->Width  = 100; 
      userCtrl->Id     = 1000;
      m_UserControlEvent = new APropertyUserControlEvent( userCtrl, userCtrl->Id );
      m_UserControlEvent->SetNotifyObj( this );
    }
    m_propMng->Caption = _T("  1");
    m_propMng->ShowTabs();
  }
}


//-----------------------------------------------------------------------------
//
// ---
void MLibObj::CreateUserTree()
{
  IKompasDocument3DPtr doc( newKompasAPI->ActiveDocument );
  if ( doc )
  {
    IDocumentFramesPtr frames(  doc->DocumentFrames );
    if ( frames )
    {
      IDocumentFramePtr frame(frames->Item[0l] );
      IFrameTreesManagerPtr mng( frame );
      if ( mng )
      {
        IDispatchPtr tree( mng->AddTab( _bstr_t(_T("  ")),_bstr_t ( _T("VCTree.VCTreeCtrl.1")) ));
        CallbackCreateOCX( tree, 1000 );
        mng->ActiveTab = tree;
      }  
    }
  }
}

//-----------------------------------------------------------------------------
// puCreateOCX -     
// ---
bool MLibObj::CallbackCreateOCX( LPDISPATCH iOcx, long controlID )
{
  if ( controlID == 1000 )
  {
    _DVCTreePtr tree( iOcx );
  
    if( tree ) 
    {
      InitToolBarImageList( tree ); //     toolbar'a
      InitTreeImageList( tree );    //     
      InitTree( tree );             //  
      InitToolBar( tree );          //  toolbar

      if ( m_TreeVeiw )
        m_treeEvent = new ATreeCtrlEvent( m_TreeVeiw );

      if ( m_ToolBar )
        m_toolBarEvent = new AToolBarCtrlEvent( m_ToolBar );
    
      m_contextMenuEvent = new AContextMenuEvent( tree );
      tree->Invalidate();

    }
  }
  return true;
}


//-----------------------------------------------------------------------------
// puDestroyOCX - " OCX ."
// ---
bool MLibObj::CallbackDestroyOCX( long controlID )
{
  if ( controlID == 1000 )
  {
    if ( m_treeEvent ) {
      m_treeEvent->Disconnect();
      m_treeEvent = NULL;
    }
  
    if ( m_toolBarEvent ) {
      m_toolBarEvent->Disconnect();
      m_toolBarEvent = NULL;
    }

    if ( m_contextMenuEvent ) {
      m_contextMenuEvent->Disconnect();
      m_contextMenuEvent = NULL;
    }

    if ( m_UserControlEvent )
    {
      m_UserControlEvent->SetNotifyObj( NULL );
      m_UserControlEvent->Disconnect();
      m_UserControlEvent = NULL; 
    }

    m_treeImageList    = NULL;
    m_toolBarImageList = NULL;
    m_TreeVeiw         = NULL;
    m_ToolBar          = NULL;
  }
  return true;
}


//-----------------------------------------------------------------------------
///     toolBar'a
// ---
void MLibObj::InitToolBarImageList( _DVCTreePtr & ctrl )
{
  m_toolBarImageList  = ctrl ? ctrl->CreateImageList() : NULL; // 

  if ( m_toolBarImageList )
  {
    //   5 
    CPictureHolder pict[5];
    pict[0].CreateFromBitmap(IDB_TOOLBAR1);
    pict[1].CreateFromBitmap(IDB_TOOLBAR2);
    pict[2].CreateFromBitmap(IDB_TOOLBAR5);
    pict[3].CreateFromBitmap(IDB_TOOLBAR3);
    pict[4].CreateFromBitmap(IDB_TOOLBAR4);

    //   m_toolBarImageList
    IImagesPtr images = m_toolBarImageList->ListImages;
    images->GetCount();
    images->Add(&NOPARAM, &_variant_t("First"),   &_variant_t(pict[0].GetPictureDispatch())); 
    images->Add(&NOPARAM, &_variant_t("Second"),  &_variant_t(pict[1].GetPictureDispatch())); 
    images->Add(&NOPARAM, &_variant_t("Third"),   &_variant_t(pict[2].GetPictureDispatch())); 
    images->Add(&NOPARAM, &_variant_t("Fourth"),  &_variant_t(pict[3].GetPictureDispatch())); 
    images->Add(&NOPARAM, &_variant_t("Fifth"),   &_variant_t(pict[4].GetPictureDispatch())); 
  }
}
  

//-----------------------------------------------------------------------------
///     
// ---
void MLibObj::InitTreeImageList( _DVCTreePtr & ctrl )
{
  m_treeImageList  = ctrl ? ctrl->CreateImageList() : NULL; // 

  if ( m_treeImageList )
  {
    //   10 
    CPictureHolder pict[10];
    pict[0].CreateFromBitmap( IDB_TREE1       );
    pict[1].CreateFromBitmap( IDB_TREESELECT1 );
    pict[2].CreateFromBitmap( IDB_TREE2       );
    pict[3].CreateFromBitmap( IDB_TREESELECT2 );
    pict[4].CreateFromBitmap( IDB_TREE3       );
    pict[5].CreateFromBitmap( IDB_TREESELECT3 );
    pict[6].CreateFromBitmap( IDB_TREE4       );
    pict[7].CreateFromBitmap( IDB_TREESELECT4 );
    pict[8].CreateFromBitmap( IDB_TREE5       );
    pict[9].CreateFromBitmap( IDB_TREESELECT5 );
    
    //   m_treeImageList
    IImagesPtr images = m_treeImageList->ListImages;
    images->Add(&NOPARAM, &_variant_t("First"),         &_variant_t(pict[0].GetPictureDispatch())); 
    images->Add(&NOPARAM, &_variant_t("First Select"),  &_variant_t(pict[1].GetPictureDispatch())); 
    images->Add(&NOPARAM, &_variant_t("Second"),        &_variant_t(pict[2].GetPictureDispatch())); 
    images->Add(&NOPARAM, &_variant_t("Second Select"), &_variant_t(pict[3].GetPictureDispatch())); 
    images->Add(&NOPARAM, &_variant_t("Third"),         &_variant_t(pict[4].GetPictureDispatch())); 
    images->Add(&NOPARAM, &_variant_t("Third Select"),  &_variant_t(pict[5].GetPictureDispatch())); 
    images->Add(&NOPARAM, &_variant_t("Fourth"),        &_variant_t(pict[6].GetPictureDispatch())); 
    images->Add(&NOPARAM, &_variant_t("Fourth Select"), &_variant_t(pict[7].GetPictureDispatch())); 
    images->Add(&NOPARAM, &_variant_t("Fifth"),         &_variant_t(pict[8].GetPictureDispatch())); 
    images->Add(&NOPARAM, &_variant_t("Fifth Select"),  &_variant_t(pict[9].GetPictureDispatch())); 
  }
}

  
//-----------------------------------------------------------------------------
///  
// ---
void MLibObj::InitTree( _DVCTreePtr & ctrl )
{
  m_TreeVeiw = ctrl ? ctrl->GetTree() : NULL;

  if ( m_TreeVeiw )
  {
    m_TreeVeiw->LineStyle = tvwRootLines;
    m_TreeVeiw->Style = tvwTreelinesPlusMinusPictureText;
    m_TreeVeiw->Indentation = 0;
    //m_TreeVeiw->HotTracking = TRUE;

    ASSERT((bool)m_treeImageList); //  !!!
    // Set imageList to tree
    m_TreeVeiw->ImageList = m_treeImageList;


    INodesPtr nodes = m_TreeVeiw->GetNodes();
    // Add Nodes
    INodePtr node = nodes->Add( &NOPARAM,                    // VARIANT* Relative
                                &NOPARAM,                    // VARIANT* Relationship
                                &_variant_t("R"),            // VARIANT* Key
                                &_variant_t("First"),        // VARIANT* Text
                                &_variant_t("First"),        // VARIANT* Image
                                &_variant_t("First Select"));// VARIANT* SelectedImage

             node = nodes->Add( &_variant_t("R"),             // VARIANT* Relative
                                &_variant_t( (long)tvwChild ),// VARIANT* Relationship
                                &_variant_t("C1"),            // VARIANT* Key
                                &_variant_t("Child 1"),       // VARIANT* Text
                                &_variant_t("Second"),        // VARIANT* Image
                                &_variant_t("Second Select"));// VARIANT* SelectedImage
  
             node = nodes->Add( &_variant_t((LPDISPATCH)node), // VARIANT* Relative
                                &_variant_t( (long)tvwChild ), // VARIANT* Relationship
                                &_variant_t("SC1"),            // VARIANT* Key
                                &_variant_t("SubChild 2"),     // VARIANT* Text
                                &_variant_t("Third"),          // VARIANT* Image
                                &_variant_t("Third Select"));  // VARIANT* SelectedImage

             node = nodes->Add( &_variant_t("R"),              // VARIANT* Relative
                                &_variant_t( (long)tvwChild ), // VARIANT* Relationship
                                &_variant_t("C2"),             // VARIANT* Key
                                &_variant_t("Child 2"),        // VARIANT* Text
                                &_variant_t("Fourth"),         // VARIANT* Image
                                &_variant_t("Fourth Select")); // VARIANT* SelectedImage

             node = nodes->Add( &NOPARAM,                      // VARIANT* Relative
                                &NOPARAM,                      // VARIANT* Relationship
                                &_variant_t("S"),              // VARIANT* Key
                                &_variant_t("Second"),         // VARIANT* Text
                                &_variant_t("Fifth"),          // VARIANT* Image
                                &_variant_t("Fifth Select"));  // VARIANT* SelectedImage
  }
}



//-----------------------------------------------------------------------------
///  
// ---
void MLibObj::InitToolBar( _DVCTreePtr & ctrl )
{
  m_ToolBar = ctrl ? ctrl->GetToolBar() : NULL;

  if ( m_ToolBar )
  {
    ASSERT((bool)m_toolBarImageList); //     
    m_ToolBar->ImageList = m_toolBarImageList;

//   m_ToolBar->Appearance = ccFlat; 
//   m_ToolBar->Style = tbrFlat;
////   m_ToolBar->BorderStyle = ccFixedSingle;
//   m_ToolBar->Wrappable = FALSE;

    //  
    IButtonsPtr buttons = m_ToolBar->GetButtons();

    buttons->Add ( &NOPARAM,                          // VARIANT* Index
                   &_variant_t("TB1"),                // VARIANT* Key
                   &NOPARAM,                          // VARIANT* Caption
                   &_variant_t((long)tbrDefault),     // VARIANT* Style /*ButtonStyleConstants*/
                   &_variant_t("First"));             // VARIANT* Image
    
    buttons->Add ( &NOPARAM,                          // VARIANT* Index
                   &NOPARAM,                          // VARIANT* Key
                   &NOPARAM,                          // VARIANT* Caption
                   &_variant_t((long)tbrSeparator),   // VARIANT* Style /*ButtonStyleConstants*/
                   &NOPARAM);                         // VARIANT* Image
    
    buttons->Add ( &NOPARAM,                          // VARIANT* Index
                   &_variant_t("TB2"),                // VARIANT* Key
                   &NOPARAM,                          // VARIANT* Caption
                   &_variant_t((long)tbrCheck),       // VARIANT* Style /*ButtonStyleConstants*/
                   &_variant_t("Second"));            // VARIANT* Image
    
    buttons->Add ( &NOPARAM,                          // VARIANT* Index
                   &NOPARAM,                          // VARIANT* Key
                   &NOPARAM,                          // VARIANT* Caption
                   &_variant_t((long)tbrSeparator),   // VARIANT* Style /*ButtonStyleConstants*/
                   &NOPARAM);                         // VARIANT* Image
    
    IButtonPtr butt = buttons->Add ( &NOPARAM,        // VARIANT* Index
                   &_variant_t("TB3"),                // VARIANT* Key
                   &NOPARAM,                          // VARIANT* Caption
                   &_variant_t((long)tbrDropdown),    // VARIANT* Style /*ButtonStyleConstants*/
                   &_variant_t("Third"));             // VARIANT* Image

    IButtonMenusPtr menu = butt->GetButtonMenus();
    menu->Add(     &NOPARAM,                          // VARIANT* Index
                   &NOPARAM,                          // VARIANT* Key
                   &_variant_t("Test1"));             // VARIANT* Text

    menu->Add(     &NOPARAM,                          // VARIANT* Index
                   &NOPARAM,                          // VARIANT* Key
                   &_variant_t("Test2"));             // VARIANT* Text


    buttons->Add ( &NOPARAM,                          // VARIANT* Index
                   &NOPARAM,                          // VARIANT* Key
                   &NOPARAM,                          // VARIANT* Caption
                   &_variant_t((long)tbrSeparator),   // VARIANT* Style /*ButtonStyleConstants*/
                   &NOPARAM);                         // VARIANT* Image

    buttons->Add ( &NOPARAM,                          // VARIANT* Index
                   &_variant_t("TB4"),                // VARIANT* Key
                   &NOPARAM,                          // VARIANT* Caption
                   &_variant_t((long)tbrButtonGroup), // VARIANT* Style /*ButtonStyleConstants*/
                   &_variant_t("Fourth"));            // VARIANT* Image
    
    buttons->Add ( &NOPARAM,                          // VARIANT* Index
                   &_variant_t("TB5"),                // VARIANT* Key
                   &NOPARAM,                          // VARIANT* Caption
                   &_variant_t((long)tbrButtonGroup), // VARIANT* Style /*ButtonStyleConstants*/
                   &_variant_t("Fifth"));             // VARIANT* Image

    buttons->Add ( &NOPARAM,                          // VARIANT* Index
                   &_variant_t("TB6"),                // VARIANT* Key
                   &NOPARAM,                          // VARIANT* Caption
                   &_variant_t((long)tbrCheck),       // VARIANT* Style /*ButtonStyleConstants*/
                   &_variant_t("Second"));            // VARIANT* Image
  }
}


//-------------------------------------------------------------------------------
//   
// ---
void WINAPI LIBRARYENTRY( unsigned int comm )
{
  GetNewKompasAPI();   
  if ( newKompasAPI )
  {
    switch ( comm )
    {
      case 1: 
      {
        MLibObj * obj = new MLibObj();
        m_libObjects.Add( obj );
        obj->CreateUserPanel();
      }
      break;
      case 2:
      {  
        MLibObj * obj = new MLibObj();
        m_libObjects.Add( obj );
        obj->CreateUserTree();
      }
    }
  }
}


//-------------------------------------------------------------------------------
//  
// ---
void OnProcessDetach()
{
  m_libObjects.Flush();
  ABaseEvent::TerminateEvents();
  ABaseEvent::DestroyList();
  cBaseEvent::TerminateEvents();
  cBaseEvent::DestroyList();
  
  newKompasAPI = NULL;
}


//------------------------------------------------------------------------------
//    
// ---
CString LoadStr( int strID ) 
{
	TCHAR temp[_MAX_PATH];
	LoadString( TestVCTreeDLL.hModule, strID, temp, _MAX_PATH ); 
	return temp;
}


