home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 1998 May
/
Pcwk5b98.iso
/
Borland
/
Cplus45
/
BC45
/
OWLINC.PAK
/
APPLICAT.H
< prev
next >
Wrap
C/C++ Source or Header
|
1995-08-29
|
10KB
|
320 lines
//----------------------------------------------------------------------------
// ObjectWindows
// (C) Copyright 1991, 1994 by Borland International, All Rights Reserved
//
// Defines class TApplication. This defines the basic behavior
// for OWL applications.
//----------------------------------------------------------------------------
#if !defined(OWL_APPLICAT_H)
#define OWL_APPLICAT_H
#if !defined(OWL_MODULE_H)
# include <owl/module.h>
#endif
#if defined(BI_MULTI_THREAD) && !defined(CLASSLIB_THREAD_H)
# include <classlib/thread.h>
#endif
class _OWLCLASS TWindow;
class _OWLCLASS TFrameWindow;
class _OWLCLASS TDocManager;
class _OWLCLASS TAppDictionary;
//
// Internal current event structure for windows events
//
struct TCurrentEvent {
TWindow* Win;
uint Message;
WPARAM WParam;
LPARAM LParam;
};
//
// class TApplication
// ----- ------------
//
class _OWLCLASS TApplication : public TModule {
public:
class _OWLCLASS_RTL TXInvalidMainWindow : public TXOwl {
public:
TXInvalidMainWindow();
~TXInvalidMainWindow();
TXInvalidMainWindow* Clone();
void Throw();
};
HINSTANCE hPrevInstance;
int nCmdShow;
TDocManager* DocManager; // will become private, use Get/SetDocManager()
TFrameWindow* MainWindow; // will become private, use Get/SetMainWindow()
HACCEL HAccTable;
// Constructors for TApplication. Default args for the ctor allow
// TApplication to access global pointers in the user exe/dll.
// Default OwlAppDictionary can be overridden by passing non-0 appDict arg
//
TApplication(const char far* name = 0, TModule*& gModule = ::Module,
TAppDictionary* appDict = 0);
TApplication(const char far* name,
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
const char far* cmdLine,
int cmdShow,
TModule*& gModule = ::Module,
TAppDictionary* appDict = 0);
~TApplication();
TFrameWindow* GetMainWindow() {return MainWindow;}
TDocManager* GetDocManager() {return DocManager;}
static void SetWinMainParams(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
const char far* cmdLine,
int cmdShow);
void GetWinMainParams();
virtual bool CanClose();
virtual int Run();
virtual int Start();
#if defined(BI_MULTI_THREAD)
TMutex* GetMutex();
class _OWLCLASS TAppMutex {
public:
TAppMutex();
~TAppMutex();
TMutex* GetMutex();
static int HasMutex();
private:
char Mutex[sizeof(TMutex)];
static int NotWIN32s;
};
class _OWLCLASS TAppLock {
public:
TAppLock(TApplication &app);
~TAppLock();
void Release();
private:
char AppLock[sizeof(TMutex::Lock)];
};
// override TEventHandler::Dispatch() to handle multi-thread
// synchronization
//
virtual LRESULT Dispatch(TEventInfo& info, WPARAM wp, LPARAM lp = 0);
#endif
bool PumpWaitingMessages(); // pumps all waiting msgs
virtual int MessageLoop(); // Loops until break or WM_QUIT
virtual bool ProcessAppMsg(MSG& msg);
void SuspendThrow(xalloc& x); // saves xalloc exception info
void SuspendThrow(xmsg& x); // saves xmsg exception info
void SuspendThrow(TXBase& x); // saves copy of TXBase exception
void SuspendThrow(int); // set bit flag to log exception
void ResumeThrow(); // checks and rethrows suspended exceptions
int QueryThrow() {return XState;} // return suspend flags
enum {
xsUnknown = 1,
xsBadCast = 2,
xsBadTypeid = 4,
xsMsg = 8,
xsAlloc = 16,
xsBase = 32,
xsOwl = 32, // for compatibility
};
// Get the TWindow pointer belonging to this app given an hWnd
//
TWindow* GetWindowPtr(HWND hWnd) const;
// begin and end of a modal window's modal message loop
//
int BeginModal(TWindow* window, int flags=MB_APPLMODAL);
void EndModal(int result);
virtual void PreProcessMenu(HMENU); // called from MainWindow
// Is this Application object running? i.e. does it own the main msg loop
//
bool IsRunning() const {return Running;}
// Dead TWindow garbage collection
//
void Condemn(TWindow* win);
void Uncondemn(TWindow* win);
// Call this function after each msg dispatch if TApplication's message
// loop is not used.
//
void PostDispatchAction();
// TApplication has no event table itself, defers event handling to
// DocManager if it has been installed.
//
bool Find(TEventInfo&, TEqualOperator = 0);
void EnableBWCC(bool enable = true, uint language = 0);
bool BWCCEnabled() const {return BWCCOn;}
TModule* GetBWCCModule() const {return BWCCModule;}
void EnableCtl3d(bool enable = true);
void EnableCtl3dAutosubclass(bool enable);
bool Ctl3dEnabled() const {return Ctl3dOn;}
TModule* GetCtl3dModule() const {return Ctl3dModule;}
static string& GetCmdLine() {return InitCmdLine;}
TCurrentEvent& GetCurrentEvent() {return CurrentEvent;}
protected:
bool BreakMessageLoop;
int MessageLoopResult;
string CmdLine; // string object copy of cmd line
virtual void InitApplication(); // "first"-instance initialization
virtual void InitInstance(); // each-instance initialization
virtual void InitMainWindow(); // init application main window
virtual int TermInstance(int status); // each-instance termination
// (re)set a new main-window and DocManager either at construction or
// sometime later
//
TFrameWindow* SetMainWindow(TFrameWindow* window);
TDocManager* SetDocManager(TDocManager* docManager);
// Called each time there are no messages in the queue. idle count is
// incremented each time, & zeroed when messages are pumped. Return
// whether or not more processing needs to be done.
//
// Default behavior is to give the main window an opportunity to do idle
// processing by invoking its IdleAction() member function when
// "idleCount" is 0
//
virtual bool IdleAction(long idleCount);
private:
bool BWCCOn;
TModule* BWCCModule;
bool Ctl3dOn;
TModule* Ctl3dModule;
bool Running;
#if defined(BI_MULTI_THREAD)
TAppMutex Mutex;
#endif
TCurrentEvent CurrentEvent;
static HINSTANCE InitHInstance;
static HINSTANCE InitHPrevInstance;
static string InitCmdLine;
static int InitCmdShow;
// Exception handling state
//
int XState;
string XString;
size_t XSize;
TXBase* XBase;
// Condemned TWindow garbage collection
//
void DeleteCondemned();
TWindow* CondemnedWindows;
// The dictionary that this app is in
//
TAppDictionary* Dictionary;
// Hidden to prevent accidental copying or assignment
//
TApplication(const TApplication&);
TApplication& operator =(const TApplication&);
DECLARE_STREAMABLE(_OWLCLASS, TApplication, 1);
};
#if defined(BI_MULTI_THREAD)
inline TMutex *TApplication::GetMutex()
{
return Mutex.GetMutex();
}
inline TApplication::TAppMutex::TAppMutex()
{
if (HasMutex())
new(Mutex)TMutex;
}
inline TApplication::TAppMutex::~TAppMutex()
{
if (HasMutex())
REINTERPRET_CAST(TMutex *,Mutex)->TMutex::~TMutex();
}
inline TMutex *TApplication::TAppMutex::GetMutex()
{
if (!HasMutex())
return 0;
else
return REINTERPRET_CAST(TMutex *,(char*)Mutex);
}
inline int TApplication::TAppMutex::HasMutex()
{
return NotWIN32s;
}
inline TApplication::TAppLock::TAppLock(TApplication &app)
{
if (TAppMutex::HasMutex())
new(AppLock)TMutex::Lock(*app.GetMutex());
}
inline TApplication::TAppLock::~TAppLock()
{
if (TAppMutex::HasMutex())
REINTERPRET_CAST(TMutex::Lock*,AppLock)->TMutex::Lock::~Lock();
}
inline void TApplication::TAppLock::Release()
{
if (TAppMutex::HasMutex())
REINTERPRET_CAST(TMutex::Lock*,AppLock)->Release();
}
#endif
extern TWindow* GetWindowPtr(HWND, const TApplication*);
inline TWindow* TApplication::GetWindowPtr(HWND hWnd) const
{
return ::GetWindowPtr(hWnd, this);
}
inline void TApplication::SetWinMainParams(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
const char far* cmdLine,
int cmdShow)
{
InitHInstance = hInstance;
InitHPrevInstance = hPrevInstance;
InitCmdLine = cmdLine;
InitCmdShow = cmdShow;
}
inline void TApplication::GetWinMainParams()
{
InitModule(InitHInstance, InitCmdLine.c_str());
hPrevInstance = InitHPrevInstance;
nCmdShow = InitCmdShow;
}
#endif // OWL_APPLICAT_H