//----------------------------------------------------------------------------
// ObjectComponents
// Copyright (c) 1994, 1996 by Borland International, All Rights Reserved
/// \file
/// Definition of TOcApp application connection class
//----------------------------------------------------------------------------
#if !defined(OCF_OCAPP_H)
#define OCF_OCAPP_H
#include <owl/private/defs.h>
#if defined(BI_HAS_PRAGMA_ONCE)
# pragma once
#endif
#include <ocf/ocbocole.h>
#include <ocf/ocobject.h>
#include <ocf/ocreg.h>
#include <ocf/autodefs.h>
#include <ocf/ocdata.h>
#include <ocf/ocapp.rh>
#include <owl/dispatch.h>
#include <owl/contain.h>
namespace owl {class _OWLCLASS TRegLink;};
namespace owl {class _OWLCLASS TRegList;};
namespace ocf {
// Generic definitions/compiler options (eg. alignment) preceeding the
// definition of classes
#include <owl/preclass.h>
class _ICLASS TOcPart;
class _ICLASS TOcClassMgr;
class _ICLASS TOcApp;
//
// OCF Mixin classes for users derived application class
//
#if !defined(_OCMCLASS)
# define _OCMCLASS
#endif
class _OCMCLASS TOcAppHost;
class _OCMCLASS TOcAppFrameHost;
//
/// \class TOcFormatName
// ~~~~~ ~~~~~~~~~~~~~
/// Clipboard format name
//
class _OCFCLASS TOcFormatName {
public:
TOcFormatName();
TOcFormatName(LPCTSTR fmtName, LPCTSTR fmtResultName, LPCTSTR id = 0);
bool operator ==(const TOcFormatName& other) const {return owl::ToBool(&other == this);}
LPCTSTR GetId() const {return Id.c_str();}
LPCTSTR GetName() const {return Name.c_str();}
LPCTSTR GetResultName() const {return ResultName.c_str();}
private:
owl::tstring Id; // internal clipboard format name
owl::tstring Name; // external name of clipboard format (used in list box)
owl::tstring ResultName; // string to be used in the dialog help text
};
//
/// \class TOcNameList
// ~~~~~ ~~~~~~~~~~~
/// Clipboard format names
//
class _OCFCLASS TOcNameList : protected owl::TIPtrArray<TOcFormatName*>
{
public:
TOcNameList();
~TOcNameList();
TOcFormatName*& operator [](unsigned index) { return Base::operator[](index);}
TOcFormatName* operator [](LPTSTR);
void Clear(int del = 1) { Base::Flush(del==1);}
int Add(TOcFormatName* name) { return Base::Add(name);}
bool IsEmpty() const { return Base::Empty();}
bool Find(const TOcFormatName* name) { return Base::Find((TOcFormatName*)name); }
owl::uint Count() const { return Base::Size();}
bool Detach(TOcFormatName* item, bool del = false)
{
return del ? Base::DestroyItem(item) : Base::DetachItem(item);
}
private:
typedef owl::TIPtrArray<TOcFormatName*> Base;
};
#if defined(_OCFDLL) || defined(BI_APP_DLL)
//
// Export template of owl::TIPtrArray<TOcFormatName*> when building ObjectWindows
// DLL and provide import declaration of DLL instance for users of the class.
//
template class owl::TIPtrArray<TOcFormatName*>;
#endif
//
/// \class TOcRegistrar
// ~~~~~ ~~~~~~~~~~~~
/// Linking & embeding version of the Registrar
//
class _OCFCLASS TOcRegistrar : public TRegistrar {
public:
TOcRegistrar(owl::TRegList& regInfo, TComponentFactory callback,
owl::uint32 preselectedOptions, owl::tstring& cmdLine,
owl::TRegLink* linkHead = 0,
owl::TModule* module = & owl::GetGlobalModule());
~TOcRegistrar();
void CreateOcApp(owl::uint32 options, TOcAppHost* host,
TOcAppFrameHost* frameHost);
void CreateOcApp(owl::uint32 options, TOcApp*& ret);
IBClassMgr* CreateBOleClassMgr();
void SetApp(TOcApp* app);
protected:
void * GetFactory(const GUID& clsid, const GUID & iid);
bool CanUnload();
void LoadBOle();
private:
HINSTANCE BOleInstance;// BOle DLL instance
IBClassMgr* BCmI; //
TOcClassMgr* OcClassMgr; // our IBClassMgr implementation
int AppCount; // TOcApp instance count
friend class _ICLASS TOcApp;
};
//
/// \class TOcApp
// ~~~~~ ~~~~~~
/// OCF Application class.
//
class _ICLASS TOcApp : public TUnknown,
private IBApplication,
private IBClassMgr {
public:
// Constructor for OcApp & 2nd part of initialization
// host & frameHost are interfaces that OcApp talks back to.
//
TOcApp(TOcRegistrar& registrar, owl::uint32 options, TOcAppHost* host,
TOcAppFrameHost* frameHost);
void SetupWindow(TOcAppFrameHost* frameHost);
// !CQ compatibility only
// Constructor for OcApp & 2nd part of initialization
// retOcApp is location holding unrefcounted pointer to this OcApp
//
TOcApp(TOcRegistrar& registrar, owl::uint32 options, TOcApp*& retOcApp);
void SetupWindow(HWND frameWnd);
// Public accessors
//
TOcRegistrar& GetRegistrar() {return Registrar;}
owl::tstring GetName() const {return (LPCTSTR)Name;}
bool IsOptionSet(owl::uint32 option) const;
void SetOption(owl::uint32 bit, bool state);
// Object reference & lifetime managment
//
virtual void ReleaseObject();
// Runtime class factory [un]registration
//
void RegisterClasses();
void UnregisterClasses();
// Clipboard
//
void AddUserFormatName(LPCTSTR name, LPCTSTR resultName,
LPCTSTR id = 0);
TOcNameList& GetNameList() {return NameList;}
// App side exposure of selected IBService functions
//
bool UnregisterClass(const owl::tstring& progid);
void EvResize();
void EvActivate(bool);
bool EvSetFocus(bool set) {return HRSucceeded(BServiceI->OnSetFocus(set));}
bool RegisterClass(const owl::tstring& progid, BCID classId, bool multiUse);
bool TranslateAccel(MSG * msg)
{return HRSucceeded(BServiceI->TranslateAccel(msg));}
bool ModalDialog(bool enable)
{return HRSucceeded(BServiceI->OnModalDialog(enable));}
TOcHelp AppHelpMode(TOcHelp newMode)
{return BServiceI->HelpMode(newMode);}
bool CanClose();
bool Browse(TOcInitInfo& initInfo);
bool BrowseControls(TOcInitInfo& initInfo);
bool BrowseClipboard(TOcInitInfo& initInfo);
bool Paste(TOcInitInfo& initInfo);
bool Copy(TOcPart* ocPart);
bool Copy(TOcDataProvider* ocData);
bool Drag(TOcDataProvider* ocData, TOcDropAction inAction, TOcDropAction& outAction);
bool Drag(TOcPart* ocData, TOcDropAction inAction, TOcDropAction& outAction);
bool Convert(TOcPart* ocPart, bool b);
owl::uint EnableEditMenu(TOcMenuEnable enable, IBDataConsumer * ocview);
// Exposure of BOle's componentCreate for internal OCF support
//
HRESULT BOleComponentCreate(IUnknown * * retIface,
IUnknown * outer, owl::uint32 idClass);
// Internal reference management
//
owl::ulong _IFUNC AddRef() {return GetOuter()->AddRef();}
owl::ulong _IFUNC Release() {return GetOuter()->Release();}
HRESULT _IFUNC QueryInterface(const GUID & iid, void ** iface)
{return GetOuter()->QueryInterface(iid, iface);}
protected:
~TOcApp();
owl::uint32 Options;
bool Registered;
TOcAppHost* Host;
TOcAppFrameHost* FrameHost;
// !CQ Ripping out the next guys
TOcApp** OcAppPtr; // Pointer to this instance, must zero on destruction
// !CQ owl::TResult ForwardEvent(int eventId, const void* param);
// !CQ owl::TResult ForwardEvent(int eventId, owl::TParam2 param = 0);
// TUnknown virtual overrides
//
HRESULT QueryObject(const IID & iid, void * * iface);
private:
// IBWindow implementation
//
HWND _IFUNC GetWindow();
HRESULT _IFUNC GetWindowRect(owl::TRect * r);
LPCOLESTR _IFUNC GetWindowTitle();
void _IFUNC AppendWindowTitle(LPCOLESTR title);
HRESULT _IFUNC SetStatusText(LPCOLESTR text);
HRESULT _IFUNC RequestBorderSpace(const owl::TRect *);
HRESULT _IFUNC SetBorderSpace(const owl::TRect *);
HRESULT _IFUNC InsertContainerMenus(HMENU hMenu, TOcMenuWidths * omw);
HRESULT _IFUNC SetFrameMenu(HMENU hMenu);
void _IFUNC RestoreUI();
HRESULT _IFUNC Accelerator(MSG * msg);
HRESULT _IFUNC GetAccelerators(HACCEL *, int *);
// IBApplication implementation
//
LPCOLESTR _IFUNC GetAppName();
TOcHelp _IFUNC HelpMode(TOcHelp newMode);
HRESULT _IFUNC CanLink();
HRESULT _IFUNC CanEmbed();
HRESULT _IFUNC IsMDI();
HRESULT _IFUNC OnModalDialog(BOOL svrModal);
void _IFUNC DialogHelpNotify(TOcDialogHelp);
void _IFUNC ShutdownMaybe();
// IBClassMgr implementation
//
HRESULT _IFUNC ComponentCreate(IUnknown * * ret,
IUnknown * outer, owl::uint32 classId);
HRESULT _IFUNC ComponentInfoGet(IUnknown * * info,
IUnknown * outer, owl::uint32 classId);
void Init();
TOcRegistrar& Registrar; // Overall application description object
// BOle side support
//
IBClassMgr* BCmI; // Our private class maneger
IUnknown* BService; // BOle service object & interface
IBService2* BServiceI; //
owl::TString Name;
TOcNameList NameList;
bool DisableDlgs; // Server went modal--disable our dialogs
friend class _ICLASS TOcDocument;
friend class _ICLASS TOcPart;
friend class _ICLASS TOcRemView;
friend class _ICLASS TOcView;
friend class _ICLASS TOcClassMgr;
};
//
//inline void TOcApp::SetupWindow(TOcAppFrameSocket* frameSocket)
//{
// FrameSocket = frameSocket;
//}
//
inline bool TOcApp::IsOptionSet(owl::uint32 option) const
{
return owl::ToBool(Options & option);
}
//
inline void TOcApp::SetOption(owl::uint32 bit, bool state)
{
if (state)
Options |= bit;
else
Options &= ~bit;
}
//
inline void TOcRegistrar::CreateOcApp(owl::uint32 options, TOcAppHost* host,
TOcAppFrameHost* frameHost)
{
new TOcApp(*this, options, host, frameHost);
}
//
// Compatibility version of TOcApp creator
//
inline void TOcRegistrar::CreateOcApp(owl::uint32 options, TOcApp*& retOcApp)
{
new TOcApp(*this, options, retOcApp);
}
//----------------------------------------------------------------------------
//
// ObjectComponents message and subdispatch IDs
//
#define WM_BCXNAME (0x7FFF-8) // (WM_VBXNAME) BCX event fire by name
#define WM_OCEVENT (WM_BCXNAME-1) // OC -> app messages
//
// Subdispatch IDs for TOcApp clients
//
#define OC_APPINSMENUS 0x0100 // Main window insert menus
#define OC_APPMENUS 0x0101 // Main window set menu
#define OC_APPPROCESSMSG 0x0102 // Process msg for accel, etc
#define OC_APPFRAMERECT 0x0103 // Get inner rect of main window
#define OC_APPBORDERSPACEREQ 0x0104 // Request/set app frame border space
#define OC_APPBORDERSPACESET 0x0105 // Request/set app frame border space
#define OC_APPSTATUSTEXT 0x0106 // Set the status text
#define OC_APPRESTOREUI 0x0107 // Have the app frame restore its UI
#define OC_APPDIALOGHELP 0x0108 // Ole dialog help button pressed
#define OC_APPSHUTDOWN 0x0109 // Shutdown app frame window
#define OC_APPGETACCEL 0x010A // Get accelerators for menu merge
//
// struct TOcGetAccel
// ~~~~~~ ~~~~~~~~~~~
struct TOcGetAccel {
HACCEL Accel;
int Count;
};
//
/// \class TOcAppHost
// ~~~~~ ~~~~~~~~~~
/// OCF Application host class. Owner of & host for a TOcApp object
//
class _OCMCLASS TOcAppHost {
public:
TOcAppHost() : OcApp(0) {} // Must call OcInit after construction
~TOcAppHost();
void OcInit(TOcRegistrar& registrar, owl::uint32 options);
TRegistrar& GetRegistrar() {return OcApp->GetRegistrar();}
bool IsOptionSet(owl::uint32 option) const;
virtual void AttachHost(TOcApp* ocApp) {OcApp = ocApp;}
virtual void ReleaseOcObject() {OcApp = 0;}
// protected:
TOleAllocator OleMalloc; // default to task allocator
TOcApp* OcApp;
private:
owl::uint32 InitOptions;
};
// Old name don't use it;
// typedef not work with dynamic_cast of VC ++
//typedef TOcAppHost TOcModule;
class TOcModule: public TOcAppHost {
public:
TOcModule():TOcAppHost(){}
~TOcModule(){}
};
//
/// \class TOcAppFrameHost
// ~~~~~ ~~~~~~~~~~~~~~~
/// OCF Application frame window host class. Receives window events from OcApp
//
class _OCMCLASS TOcAppFrameHost {
public:
TOcAppFrameHost(TOcApp* ocApp=0) : OcApp(ocApp) {}
virtual void ReleaseOcObject() {OcApp = 0;}
virtual bool EvOcAppInsMenus(TOcMenuDescr & sharedMenu) = 0;
virtual bool EvOcAppMenus(TOcMenuDescr & md) = 0;
virtual bool EvOcAppProcessMsg(MSG * msg) = 0;
virtual bool EvOcAppFrameRect(owl::TRect * rect) = 0;
virtual bool EvOcAppBorderSpaceReq(owl::TRect * rect) = 0;
virtual bool EvOcAppBorderSpaceSet(owl::TRect * rect) = 0;
virtual void EvOcAppStatusText(const char * rect) = 0;
virtual void EvOcAppRestoreUI() = 0;
virtual void EvOcAppDialogHelp(TOcDialogHelp & dh) = 0;
virtual bool EvOcAppShutdown() = 0;
virtual bool EvOcAppGetAccel(TOcGetAccel * acc) = 0;
virtual HWND EvOcGetWindow() const = 0;
// For compatibility
virtual void SetWindow(HWND) {}
protected:
TOcApp* OcApp; // !CQ really want this?
};
//
/// \class TOcAppFrameHostMsg
// ~~~~~ ~~~~~~~~~~~~~~~~~~
/// Default implementation of frame window host that uses messages
//
class _OCMCLASS TOcAppFrameHostMsg : public TOcAppFrameHost {
public:
TOcAppFrameHostMsg(TOcApp* ocApp) : Wnd(0), TOcAppFrameHost(ocApp) {}
void ReleaseOcObject() {delete this;} // We are no longer needed by Oc
bool EvOcAppInsMenus(TOcMenuDescr & sharedMenu);
bool EvOcAppMenus(TOcMenuDescr & md);
bool EvOcAppProcessMsg(MSG * msg);
bool EvOcAppFrameRect(owl::TRect * rect);
bool EvOcAppBorderSpaceReq(owl::TRect * rect);
bool EvOcAppBorderSpaceSet(owl::TRect * rect);
void EvOcAppStatusText(const char * rect);
void EvOcAppRestoreUI();
void EvOcAppDialogHelp(TOcDialogHelp & dh);
bool EvOcAppShutdown();
bool EvOcAppGetAccel(TOcGetAccel * acc);
HWND EvOcGetWindow() const {return Wnd;}
void SetWindow(HWND hWnd) {Wnd = hWnd;}
protected:
owl::TResult ForwardEvent(int eventId, const void* param);
owl::TResult ForwardEvent(int eventId, owl::TParam2 param = 0);
private:
HWND Wnd;
};
//
inline TOcAppHost::~TOcAppHost()
{
if (OcApp)
OcApp->ReleaseObject(); // don't delete, just release OC object
}
inline bool TOcAppHost::IsOptionSet(owl::uint32 option) const
{
return OcApp ? OcApp->IsOptionSet(option) : (InitOptions & option) != 0;
}
inline void TOcAppHost::OcInit(TOcRegistrar& registrar, owl::uint32 options)
{
InitOptions = options;
registrar.CreateOcApp(options, OcApp);
}
// Generic definitions/compiler options (eg. alignment) following the
// definition of classes
#include <owl/posclass.h>
} // OCF namespace
#endif // OCF_OCAPP_H
↑ V302 Member operator[] of 'TOcNameList' class has a 32-bit type argument. Use memsize-type here.
↑ V730 Not all members of a class are initialized inside the constructor. Consider inspecting: InitOptions.
↑ V832 It's better to use '= default;' syntax instead of empty destructor body.