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

  1. /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2.  
  3.    Created: 1/1/96
  4.    Copyright (c) 1987, 1996 Borland International Inc.  All Rights Reserved.
  5.    $Revision:   1.15  $
  6.  
  7. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ 
  8. #ifndef __AOEXPCH_H
  9.   #include "aoexpch.h"
  10. #endif
  11. #pragma hdrstop
  12.  
  13. #include <ideaddon\itx.h>
  14. #include <ideaddon\iproj.h>
  15. #include <ideaddon\itarg.h>
  16. #include "txowl.h"
  17. #include "tests.hrc"
  18. #include "txowl.uid"
  19.  
  20. #include <windowsx.h>
  21.  
  22. #define OWL_TARGET_PROPERTY "OwlTarget"
  23.  
  24. extern HINSTANCE ghInst;
  25.  
  26. ///////////////////////////////////////////////////////////////////////////////
  27.  
  28. #define OWL_APP_TYPE_STR "Win32 OWL Aplication [.exe]"
  29. #define OWL_PLATFORM_STR "Win32"
  30. #define OWL_IMAGE_STR   "GUI"
  31. #define OWL_NODETYPE_STR ".exe"
  32. #define CPP_NODETYPE_STR ".cpp"
  33.  
  34. ///////////////////////////////////////////////////////////////////////////////
  35. OwlTarget::~OwlTarget() {
  36.   if ( d_targetMgr ) {
  37.     d_targetMgr->Release();
  38.   }
  39.   if ( d_targetMgr ) {
  40.     d_targetMgr->Release();
  41.   }
  42.   if (d_IdeObj) {
  43.     d_IdeObj->Release();
  44.   }
  45. };
  46.  
  47. void OwlTarget::SetIDEObj(LPUNKNOWN ideObj) {
  48.  
  49.   d_IdeObj = ideObj;
  50.   //
  51.   // Get the ITargetManager interface and register our target type
  52.   //
  53.   d_IdeObj->QueryInterface(IID_Addon_ITargetManager, (LPVOID*)&d_targetMgr);
  54.   d_targetMgr->QueryInterface(  IID_Addon_ITargetManagerPropertyDialog
  55.                               , (LPVOID*)&d_targetMgrDlg);
  56.   d_hTarget = d_targetMgr->AddTargetType(this
  57.                                       , MakePolyString(OWL_APP_TYPE_STR)
  58.                                       , ghInst
  59.                                       , IDD_WIN32_OWL_TARGET);
  60. };
  61.  
  62. static OwlTargetData p_defaultTargetData = { 0, 0};
  63.  
  64.  
  65. void OwlTarget::Setup(ProjectNode node) {
  66.  
  67.   if (node) {
  68.     //
  69.     // If we are editing a node, try to get information from the node 
  70.     //    
  71.     IProjectServer* projectServer;
  72.     d_IdeObj->QueryInterface(IID_Addon_IProjectServer
  73.                             , (LPVOID*)&projectServer);
  74.  
  75.     UINT dataSize;
  76.     IPolyString* propertyName = MakePolyString(OWL_TARGET_PROPERTY);
  77.  
  78.     void* p = projectServer->NodePropertyFind(  node
  79.                                               , propertyName
  80.                                               , &dataSize );
  81.     projectServer->Release();
  82.     if (dataSize >= sizeof(d_targetData)) {
  83.       d_targetData = *(OwlTargetData*)p;
  84.     } else {
  85.       //
  86.       // Should not get here, but get the default anyway.
  87.       //
  88.       d_targetData = p_defaultTargetData;
  89.     }
  90.  
  91.   } else {
  92.     //
  93.     // try to get the default state settings
  94.     //
  95.     d_targetData = p_defaultTargetData;
  96.   }
  97. }
  98.  
  99. void OwlTarget::GetDlgItems() {
  100.   HWND hwndCtl = d_targetMgrDlg->GetControlWindow(IDC_BWCC);
  101.   d_targetData.d_fBWCC = Button_GetCheck(hwndCtl);
  102.  
  103.   hwndCtl = d_targetMgrDlg->GetControlWindow(IDC_DYNAMIC_LIB);
  104.   d_targetData.d_fDynamic = Button_GetCheck(hwndCtl);
  105. };
  106.  
  107. void OwlTarget::SetDlgItems() {
  108.  
  109.   ITargetManagerDialogControl* advanceBut 
  110.               = d_targetMgrDlg->GetAdvancedButton();
  111.   advanceBut->Enable(0);
  112.   advanceBut->Release();
  113.   //
  114.   // add platform Win32
  115.   //
  116.   ITargetManagerDialogList* pltm = d_targetMgrDlg->GetPlatformList();
  117.   pltm->Clear();
  118.   IPolyString* platFormStr = MakePolyString(OWL_PLATFORM_STR);
  119.   platFormStr->AddRef();
  120.   pltm->Add(platFormStr, d_hTarget);
  121.   pltm->Select(platFormStr);
  122.   pltm->Release();
  123.  
  124.   //
  125.   // add image GUI
  126.   //
  127.   ITargetManagerDialogList* image = d_targetMgrDlg->GetImageList();
  128.   image->Clear();
  129.   image->Add(MakePolyString(OWL_IMAGE_STR), d_hTarget);
  130.   image->Select(MakePolyString(OWL_IMAGE_STR));
  131.   image->Release();
  132.  
  133.   //
  134.   // initialize our own fields
  135.   //
  136.   HWND hwndCtl = d_targetMgrDlg->GetControlWindow(IDC_BWCC);
  137.   Button_SetCheck(hwndCtl, d_targetData.d_fBWCC);
  138.   hwndCtl = d_targetMgrDlg->GetControlWindow(IDC_DYNAMIC_LIB);
  139.   Button_SetCheck(hwndCtl, d_targetData.d_fDynamic);
  140.  
  141.   hwndCtl = d_targetMgrDlg->GetControlWindow(IDC_STATIC_LIB);
  142.   Button_SetCheck(hwndCtl, !d_targetData.d_fDynamic);
  143. };
  144.  
  145. void OwlTarget::OnCommand(UINT id) {
  146.   //
  147.   // we don't need to do anything here
  148.   //
  149.   switch (id) {
  150.     case IDC_BWCC:
  151.       {
  152.       }
  153.       break;
  154.     case IDC_DYNAMIC_LIB:
  155.       {
  156.       }
  157.       break;
  158.     case IDC_STATIC_LIB:
  159.       {
  160.       }
  161.       break;
  162.     default:
  163.       break;
  164.   };
  165. }
  166.  
  167.  
  168. void OwlTarget::AdvancedDialog(HWND /* hwndParent*/ )
  169. {
  170.   //
  171.   // do advance dialog
  172.   //
  173. }
  174.  
  175. void OwlTarget::PlatformSelectionChangeNotification(UINT /*id*/) {
  176.  
  177. }
  178.  
  179. ///////////////////////////////////////////////////////////////////////////////
  180.  
  181. BOOL OwlTarget::IsTargetable(IPolyString* fileExt) {
  182.   //
  183.   // We can target any files with extension .exe
  184.   //
  185.   BOOL targetable = (lstrcmpi(fileExt->GetCstr(), OWL_NODETYPE_STR) == 0);
  186.   fileExt->Release();
  187.   return targetable;
  188. };
  189.  
  190. HRESULT OwlTarget::GetClassID(CLSID *pClassID) {
  191.   *pClassID = IID_Win32_OWL_Target;
  192.   return S_OK;
  193. };
  194.  
  195. ProjectNode OwlTarget::
  196. ConvertNodeToTarget(ProjectNode nodeTarget, IPolyString* name) {
  197.  
  198.   IProjectServer* projectServer;
  199.   d_IdeObj->QueryInterface( IID_Addon_IProjectServer
  200.                           , (LPVOID*)&projectServer);
  201.  
  202.   ITargetServer* targetServer;
  203.   d_IdeObj->QueryInterface( IID_Addon_ITargetServer
  204.                           , (LPVOID*)&targetServer);
  205.  
  206.   char path_buffer[_MAX_PATH];
  207.   char drive[_MAX_DRIVE];
  208.   char dir[_MAX_DIR];
  209.   char fname[_MAX_FNAME];
  210.   char ext[_MAX_EXT];
  211.  
  212.  
  213.   if ( !nodeTarget ) {
  214.     //
  215.     // nodeTarget is NULL, we are asked to create a new target from the root
  216.     // node.
  217.     //
  218.  
  219.     //
  220.     // if name == foo.exe, it will become foo.exe
  221.     // if name == foo.ext, it will become foo.exe
  222.     //
  223.     // Is this right? Win95 does support multiple extensions.
  224.     //
  225.     // or maybe it should be
  226.     //
  227.     // if name == foo.exe, it will become foo.exe
  228.     // if name == foo.ext, it will become foo.ext.exe
  229.     //
  230.     _splitpath(name->GetCstr(), drive, dir, fname, ext );
  231.     name->Release();
  232.     //
  233.     // Creating a new target
  234.     //
  235.     _makepath(path_buffer, drive, dir, fname, OWL_NODETYPE_STR);
  236.  
  237.     //
  238.     // Call TargetAdd() to create an IDE stock target.
  239.     //
  240.     nodeTarget = targetServer->TargetAdd( 
  241.                           MakePolyString(path_buffer),    // node name
  242.                           0,                              // parent node
  243.                           TT_Application,                // target type
  244.                           TP_Win32,                      // target platform
  245.                           (TargetStdLibs)                // libs
  246.                              (  TL_Owl
  247.                              |  TL_Bids
  248.                              |  TL_Rtl
  249.                              |  (d_targetData.d_fBWCC ? TL_Bwcc : 0)
  250.                              |  (d_targetData.d_fDynamic ? TL_Dynamic : 0) ),
  251.                           TM_Gui);                        // target model
  252.  
  253.     //
  254.     // new target, creates skeleton node.
  255.     //
  256.     _makepath(path_buffer, drive, dir, fname, CPP_NODETYPE_STR);
  257.     projectServer->NodeAdd(nodeTarget, MakePolyString(path_buffer));
  258.   } else {
  259.     //
  260.     // A valid nodeTarget, we are asked to convert a node to a target
  261.     //
  262.     nodeTarget = targetServer->ConvertNodeToTarget( nodeTarget,
  263.                           TT_Application,                // target type
  264.                           TP_Win32,                      // target platform
  265.                           (TargetStdLibs)                // libs
  266.                              (  TL_Owl
  267.                              |  TL_Bids
  268.                              |  TL_Rtl
  269.                              |  (d_targetData.d_fBWCC ? TL_Bwcc : 0)
  270.                              |  (d_targetData.d_fDynamic ? TL_Dynamic : 0) ),
  271.                           TM_Gui);                        // target model
  272.  
  273.   }
  274.   targetServer->Release();
  275.  
  276.   IPolyString* propertyName = MakePolyString(OWL_TARGET_PROPERTY);
  277.  
  278.   projectServer->NodePropertySet( nodeTarget
  279.                                 , propertyName
  280.                                 , &d_targetData
  281.                                 , sizeof(d_targetData) );
  282.  
  283.   projectServer->Release();
  284.  
  285.   ((ITargetType*)this)->AddRef();
  286.   d_targetMgr->TreatAsTarget(this, nodeTarget);
  287.  
  288.   return nodeTarget;
  289. }
  290.  
  291. STDMETHODIMP OwlTarget::ConvertTargetToNode(ProjectNode nodeTarget) {
  292.  
  293.   IProjectServer* projectServer;
  294.   d_IdeObj->QueryInterface( IID_Addon_IProjectServer
  295.                           , (LPVOID*)&projectServer);
  296.  
  297.   //
  298.   // remove target template nodes if there are any.
  299.   // we asked ITargetServer to make the target, so we also ask ITargetServer
  300.   // to convert the target to node.
  301.   //
  302.   ITargetServer* targetServer;
  303.   d_IdeObj->QueryInterface( IID_Addon_ITargetServer
  304.                           , (LPVOID*)&targetServer);
  305.   targetServer->ConvertTargetToNode(nodeTarget);
  306.   targetServer->Release();
  307.   
  308.   //
  309.   // remove private target property
  310.   //
  311.   IPolyString* propertyName = MakePolyString(OWL_TARGET_PROPERTY);
  312.   projectServer->NodePropertyRemove(  nodeTarget
  313.                                     , propertyName );
  314.  
  315.   projectServer->Release();
  316.   return NOERROR;
  317. }
  318.  
  319. ///////////////////////////////////////////////////////////////////////////////
  320. OwlTargetImpl::OwlTargetImpl(LPUNKNOWN ideObj)
  321.               : IUnknownImp<OwlTarget>(IID_IUnknown) {
  322.  
  323.   SetIDEObj(ideObj);
  324. };
  325.  
  326. STDMETHODIMP
  327. OwlTargetImpl::QueryInterface(REFIID riid, LPVOID FAR* ppobj) {
  328.   if (riid == IID_IUnknown) {
  329.    *ppobj = (LPVOID)(ITargetPropertyPage *) this;
  330.   } else if ((riid == IID_Addon_ITargetType)) {
  331.     *ppobj = (LPVOID)(ITargetType*)this;
  332.   } else {
  333.     *ppobj = NULL;
  334.     return ResultFromScode(E_NOINTERFACE);
  335.   }
  336.   AddRef();
  337.   return NOERROR;
  338. }
  339.