home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / bc45 / ocfinc.pak / OCAPP.H < prev    next >
C/C++ Source or Header  |  1997-07-23  |  11KB  |  320 lines

  1. //
  2. //----------------------------------------------------------------------------
  3. // ObjectComponents
  4. // (C) Copyright 1994 by Borland International, All Rights Reserved
  5. //
  6. //   Definition of TOcApp application connection class
  7. //----------------------------------------------------------------------------
  8. #if !defined(OCF_OCAPP_H)
  9. #define OCF_OCAPP_H
  10.  
  11. #if !defined(OCF_BOLEINTF_H)
  12. # include <ocf/boleintf.h>
  13. #endif
  14. #if !defined(OCF_OCOBJECT_H)
  15. # include <ocf/ocobject.h>
  16. #endif
  17. #if !defined(OCF_OCREG_H)
  18. # include <ocf/ocreg.h>
  19. #endif
  20. #if !defined(OCF_AUTODEFS_H)
  21. # include <ocf/autodefs.h>
  22. #endif
  23. #if !defined(CLASSLIB_VECTIMP_H)
  24. # include <classlib/vectimp.h>
  25. #endif
  26. #if !defined(OCF_OCDATA_H)
  27. # include <ocf/ocdata.h>
  28. #endif
  29. #include <ocf/ocapp.rh>
  30.  
  31. class _ICLASS    TOcPart;
  32. class _BIDSCLASS TRegLink;
  33. class            TRegList;
  34. class _ICLASS    TOcClassMgr;
  35. class _ICLASS    TOcApp;
  36.  
  37. //
  38. // Clipboard format name
  39. //
  40. class TOcFormatName {
  41.   public:
  42.     TOcFormatName();
  43.     TOcFormatName(const char far* fmtName, const char far* fmtResultName, const char far* id = 0);
  44.  
  45.     bool operator ==(const TOcFormatName& other) const {return ToBool(&other == this);}
  46.     const char far* GetId() const {return Id.c_str();}
  47.     const char far* GetName() const {return Name.c_str();}
  48.     const char far* GetResultName() const {return ResultName.c_str();}
  49.  
  50.   private:
  51.     string Id;          // internal clipboard format name
  52.     string Name;        // external name of clipboard format (used in list box)
  53.     string ResultName;  // string to be used in the dialog help text
  54. };
  55.  
  56. //
  57. // Clipboard format names
  58. //
  59. class TOcNameList : private TICVectorImp<TOcFormatName> {
  60.   public:
  61.     TOcNameList();
  62.    ~TOcNameList();
  63.     void operator delete(void* ptr) {TStandardAllocator::operator delete(ptr);}
  64.  
  65.     TOcFormatName*& operator [](unsigned index) {return Base::operator[](index);}
  66.     TOcFormatName*  operator [](char far*);
  67.     void         Clear(int del = 1) {Base::Flush(del);}
  68.     int          Add(TOcFormatName* name) {return Base::Add(name);}
  69.     int          IsEmpty() const {return Base::IsEmpty();}
  70.     unsigned     Find(const TOcFormatName* name) const {return Base::Find(name);}
  71.     virtual uint Count() const {return Base::Count();}
  72.     int          Detach(const TOcFormatName* name, int del = 0)
  73.                     {return Base::Detach(Find(name), del);}
  74.  
  75.   private:
  76.     typedef TICVectorImp<TOcFormatName> Base;
  77. };
  78.  
  79. //
  80. // Linking & embeding version of the Registrar
  81. //
  82. class TOcRegistrar : public TRegistrar {
  83.   public:
  84.     TOcRegistrar(TRegList& regInfo, TComponentFactory callback,
  85.                  string& cmdLine, TRegLink* linkHead = 0,
  86.                  HINSTANCE hInst = ::_hInstance);
  87.    ~TOcRegistrar();
  88.  
  89.     void            CreateOcApp(uint32 options, TOcApp*& ret);
  90.     IBClassMgr*     CreateBOleClassMgr();
  91.  
  92.   protected:
  93.     void far* GetFactory(const GUID& clsid, const GUID far& iid);
  94.     bool      CanUnload();
  95.     void      LoadBOle();
  96.  
  97.   private:
  98.     HINSTANCE      BOleInstance;// BOle DLL instance
  99.     IBClassMgr*    BCmI;        //
  100.     TOcClassMgr*   OcClassMgr;  // our IBClassMgr implementation
  101.     int            AppCount;    // TOcApp instance count
  102.   friend class _ICLASS TOcApp;
  103. };
  104.  
  105. //
  106. // OCF OcApplication class
  107. //
  108. class _ICLASS TOcApp : public TUnknown,
  109.                        private IBApplication,
  110.                        private IBClassMgr {
  111.   public:
  112.     // Constructor for OcApp
  113.     //   retOcApp is location holding unrefcounted pointer to this OcApp
  114.     //
  115.     TOcApp(TOcRegistrar& registrar, uint32 options, TOcApp*& retOcApp);
  116.  
  117.     // Public accessors
  118.     //
  119.     TOcRegistrar& GetRegistrar() {return Registrar;}
  120.     void    SetupWindow(HWND frameWnd) {FrameWnd = frameWnd;}
  121.     string  GetName() const {return (const char far*)Name;}
  122.     bool    IsOptionSet(uint32 option) const;
  123.     void    SetOption(uint32 bit, bool state);
  124.  
  125.     // Object reference & lifetime managment
  126.     //
  127.     virtual void   ReleaseObject();
  128.  
  129.     // Runtime class factory [un]registration
  130.     //
  131.     void RegisterClasses();
  132.     void UnregisterClasses();
  133.  
  134.     // Clipboard
  135.     //
  136.     void         AddUserFormatName(const char far* name, const char far* resultName,
  137.                                    const char far* id = 0);
  138.     TOcNameList& GetNameList() {return NameList;}
  139.  
  140.     // App side exposure of selected IBService functions
  141.     //
  142.     bool     UnregisterClass(const string& progid);
  143.     void     EvResize();
  144.     void     EvActivate(bool);
  145.     bool     EvSetFocus(bool set) {return HRSucceeded(BServiceI->OnSetFocus(set));}
  146.     bool     RegisterClass(const string& progid, BCID classId, bool multiUse);
  147. //  bool     OnModalDialog(bool enable)
  148. //               {return BServiceI->OnModalDialog(enable);}
  149.     bool     TranslateAccel(MSG far* msg)
  150.                {return HRSucceeded(BServiceI->TranslateAccel(msg));}
  151. //  TOcHelp HelpMode(TOcHelp newMode);
  152. //               {return BServiceI->HelpMode(newMode);}
  153.     bool     CanClose();
  154.  
  155.     bool     Browse(TOcInitInfo& initInfo);
  156.     bool     BrowseClipboard(TOcInitInfo& initInfo);
  157.     bool     Paste(TOcInitInfo& initInfo);
  158.     bool     Copy(TOcPart* ocPart);
  159.     bool     Copy(TOcDataProvider* ocData);
  160.     bool     Drag(TOcDataProvider* ocData, TOcDropAction inAction, TOcDropAction& outAction);
  161.     bool     Drag(TOcPart* ocData, TOcDropAction inAction, TOcDropAction& outAction);
  162.     bool     Convert(TOcPart* ocPart, bool b);
  163.     uint     EnableEditMenu(TOcMenuEnable enable, IBDataConsumer far* ocview);
  164.  
  165.     // Exposure of BOle's componentCreate for internal OCF support
  166.     //
  167.     HRESULT BOleComponentCreate(IUnknown far* far* retIface,
  168.                                 IUnknown far* outer, uint32 idClass);
  169.  
  170.     // Internal reference management
  171.     //
  172.     ulong _IFUNC   AddRef() {return GetOuter()->AddRef();}
  173.     ulong _IFUNC   Release() {return GetOuter()->Release();}
  174.     HRESULT _IFUNC QueryInterface(const GUID far& iid, void far*far* iface)
  175.                      {return GetOuter()->QueryInterface(iid, iface);}
  176.   protected:
  177.    ~TOcApp();
  178.  
  179.     uint32 Options;
  180.     bool   Registered;
  181.     TOcApp*& OcAppPtr;   // pointer to this instance, must zero on destruction
  182.  
  183.     uint32 ForwardEvent(int eventId, const void far* param);
  184.     uint32 ForwardEvent(int eventId, uint32 param = 0);
  185.  
  186.     // TUnknown virtual overrides
  187.     //
  188.     HRESULT      QueryObject(const IID far& iid, void far* far* iface);
  189.  
  190.   private:
  191.  
  192.     // IBWindow implementation
  193.     //
  194.     HWND     _IFUNC GetWindow();
  195.     HRESULT  _IFUNC GetWindowRect(TRect far* r);
  196.     LPCOLESTR _IFUNC GetWindowTitle();
  197.     void     _IFUNC AppendWindowTitle(LPCOLESTR title);
  198.     HRESULT  _IFUNC SetStatusText(LPCOLESTR text);
  199.  
  200.     HRESULT  _IFUNC RequestBorderSpace(const TRect far*);
  201.     HRESULT  _IFUNC SetBorderSpace(const TRect far*);
  202.  
  203.     HRESULT  _IFUNC InsertContainerMenus(HMENU hMenu, TOcMenuWidths far* omw);
  204.     HRESULT  _IFUNC SetFrameMenu(HMENU hMenu);
  205.     void     _IFUNC RestoreUI();
  206.     HRESULT  _IFUNC Accelerator(MSG far* msg);
  207.     HRESULT  _IFUNC GetAccelerators(HACCEL far*, int far*);
  208.  
  209.     // IBApplication implementation
  210.     //
  211.     LPCOLESTR _IFUNC GetAppName();
  212.     TOcHelp  _IFUNC HelpMode(TOcHelp newMode);
  213.     HRESULT  _IFUNC CanLink();
  214.     HRESULT  _IFUNC CanEmbed();
  215.     HRESULT  _IFUNC IsMDI();
  216.     HRESULT  _IFUNC OnModalDialog(bool svrModal);
  217.     void     _IFUNC DialogHelpNotify(TOcDialogHelp);
  218.     void     _IFUNC ShutdownMaybe();
  219.  
  220.     // IBClassMgr implementation
  221.     //
  222.     HRESULT  _IFUNC ComponentCreate(IUnknown far* far* ret,
  223.                                     IUnknown far* outer, uint32 classId);
  224.     HRESULT  _IFUNC ComponentInfoGet(IUnknown far* far* info,
  225.                                      IUnknown far* outer, uint32 classId);
  226.  
  227.     void   Init();
  228.  
  229.     TOcRegistrar&  Registrar;   // Overall application description object
  230.  
  231.     // BOle side support
  232.     //
  233.     IBClassMgr*    BCmI;        // Our private class maneger
  234.     IUnknown*      BService;    // BOle service object & interface
  235.     IBService*     BServiceI;   //
  236.     HWND           FrameWnd;    // Corresponding main window
  237.  
  238. #if defined(BI_DATA_NEAR)
  239.     TString&       Name;        // Application name from reglist
  240.     TOcNameList&   NameList;    // Clipboard format name list
  241. #else
  242.     TString        Name;
  243.     TOcNameList    NameList;
  244. #endif
  245.     bool           DisableDlgs; // Server went modal--disable our dialogs
  246.  
  247.   friend class _ICLASS TOcDocument;
  248.   friend class _ICLASS TOcPart;
  249.   friend class _ICLASS TOcRemView;
  250.   friend class _ICLASS TOcView;
  251. };
  252.  
  253. inline bool TOcApp::IsOptionSet(uint32 option) const
  254.                {return ToBool(Options & option);}
  255. inline void TOcApp::SetOption(uint32 bit, bool state)
  256.                {if (state) Options |= bit; else Options &= ~bit;}
  257.  
  258. inline void TOcRegistrar::CreateOcApp(uint32 options, TOcApp*& retOcApp) {
  259.   new TOcApp(*this, options, retOcApp);
  260. }
  261.  
  262. //
  263. // ObjectConnections message and subdispatch IDs
  264. //
  265. #define WM_BCXNAME          0x7FFF-8     // (WM_VBXNAME) BCX event fire by name
  266. #define WM_OCEVENT          WM_BCXNAME-1 // OC -> app messages
  267.  
  268. //
  269. // Subdispatch IDs for TOcApp clients
  270. //
  271. #define OC_APPINSMENUS        0x0100  // Main window insert menus
  272. #define OC_APPMENUS           0x0101  // Main window set menu
  273. #define OC_APPPROCESSMSG      0x0102  // Process msg for accel, etc
  274. #define OC_APPFRAMERECT       0x0103  // Get inner rect of main window
  275. #define OC_APPBORDERSPACEREQ  0x0104  // Request/set app frame border space
  276. #define OC_APPBORDERSPACESET  0x0105  // Request/set app frame border space
  277. #define OC_APPSTATUSTEXT      0x0106  // Set the status text
  278. #define OC_APPRESTOREUI       0x0107  // Have the app frame restore its UI
  279. #define OC_APPDIALOGHELP      0x0108  // Ole dialog help button pressed
  280. #define OC_APPSHUTDOWN        0x0109  // Shutdown app frame window
  281.  
  282. //
  283. // OCF Mixin Class for users derived application class
  284. //
  285. #if !defined(_OCMCLASS)
  286. # define _OCMCLASS
  287. #endif
  288.  
  289. class _OCMCLASS TOcModule {
  290.   public:
  291.     TOcModule() : OcApp(0) {} // must call OcInit after construction
  292.    ~TOcModule();
  293.  
  294.     void OcInit(TOcRegistrar& registrar, uint32 options);
  295.     TRegistrar& GetRegistrar() {return OcApp->GetRegistrar();}
  296.  
  297.     TOleAllocator OleMalloc;   // default to task allocator
  298.     TOcApp* OcApp;
  299.     bool IsOptionSet(uint32 option) const;
  300.   private:
  301.     uint32 InitOptions;
  302. };
  303.  
  304. inline TOcModule::~TOcModule() {
  305.   if (OcApp)
  306.     OcApp->ReleaseObject();  // don't delete, just release
  307. }
  308.  
  309. inline bool TOcModule::IsOptionSet(uint32 option) const {
  310.   return OcApp ? OcApp->IsOptionSet(option) : (InitOptions & option) != 0;
  311. }
  312.  
  313. inline void TOcModule::OcInit(TOcRegistrar& registrar, uint32 options) {
  314.   InitOptions = options;
  315.   registrar.CreateOcApp(options, OcApp);
  316. }
  317.  
  318. #endif  // OCF_OCAPP_H
  319.  
  320.