gecko-dev/cmd/winfe/cxabstra.h

371 lines
10 KiB
C++
Executable File

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#ifndef __CX_ABSTRACT_H
// Avoid include redundancy
//
#define __CX_ABSTRACT_H
#ifndef _APICX_H
#include "apicx.h"
#endif
#include "ni_pixmp.h"
// Purpose: Provide the abstract context implementation.
// Comments: Pure virtual; must be derived from.
// Through wrapping functions, the C XP libs will call into the context, and
// virtual resolution will resolve the correct context.
// Revision History:
// 04-26-95 created GAB
//
// Required Includes
//
// Constants
//
// Structures
//
// Mechanism for run time information.
// Must be updated with the addition of every new context type.
// For optimizations for specific output devices in common code.
// All classes meant to be abstract will have values of 0x0.
// This allows us to ASSERT if the context is of a valid type.
typedef enum ContextType {
Abstract = 0x0000,
DeviceContext = 0x0000,
Stubs = 0x0000,
Network,
Save,
Print,
Pane,
Window,
Bookmarks,
MetaFile,
MailCX,
NewsCX,
MailThreadCX,
NewsThreadCX,
SearchCX,
AddressCX,
HtmlHelp,
HistoryCX,
IconCX,
RDFSlave,
MaxContextTypes // Leave as last entry please
} ContextType;
#ifdef MOZ_NGLAYOUT
class nsIWebWidget;
#endif
// The abstract windows context
class CAbstractCX: public IMWContext {
private:
// The actual XP context.
MWContext *m_pXPCX;
protected:
// Set this in the constructor of each derived class for run time type information.
ContextType m_cxType;
IL_GroupContext* m_pImageGroupContext;
public:
CAbstractCX();
virtual ~CAbstractCX();
// Function to load a URL with this context, with the custom exit routing handler.
// Use this to NET_GetURL instead or XL_TranslateText instead.
virtual int GetUrl(URL_Struct *pUrl, FO_Present_Types iFormatOut, BOOL bReallyLoad = TRUE, BOOL bForceNew = FALSE);
#ifndef MOZ_NGLAYOUT
virtual XL_TextTranslation TranslateText(URL_Struct *pUrl, const char *pFileName, const char *pPrefix = NULL, int iWidth = 75);
#endif /* MOZ_NGLAYOUT */
virtual void UpdateStopState(MWContext *pContext) = 0;
// Generic brain dead interface to load a URL.
// This used to be known as OnNormalLoad.
int NormalGetUrl(const char *pUrl, const char *pReferrer = NULL, const char *pTarget = NULL, BOOL bForceNew = FALSE);
// Atomic load operations regarding history.
virtual void Reload(NET_ReloadMethod iReloadType = NET_NORMAL_RELOAD);
virtual void NiceReload(int usePassInType = 0, NET_ReloadMethod iReloadType = NET_NORMAL_RELOAD);
virtual void Back();
virtual void Forward();
virtual void ImageComplete(NI_Pixmap* image) {;}
virtual void SetInternetKeyword(const char *keyword) {}
virtual BITMAPINFO* NewPixmap(NI_Pixmap* pImage, BOOL mask = FALSE) { return NULL;}
// Function for easy creation of a URL from the current history entry.
virtual URL_Struct *CreateUrlFromHist(BOOL bClearStateData = FALSE, SHIST_SavedData *pSavedData = NULL, BOOL bWysiwyg = FALSE);
virtual BOOL CanCreateUrlFromHist();
// Construction/destruction (creates/destroys XP context)
virtual void DestroyContext();
void NiceDestroyContext();
private:
BOOL m_bDestroyed;
public:
char * m_pLastStatus;
BOOL IsDestroyed() const {
// This function is very important.
// It allows you to write code which can detect when a context
// is actually in the process of being destroyed.
// In many cases, you will receive callbacks from the XP libraries
// while the context is being destroyed. If you GPF, then use
// this function to better detect your course of action.
return(m_bDestroyed);
}
public:
// Access to type information, for optimizations in common code.
ContextType GetContextType() const {
ASSERT(m_cxType);
return(m_cxType);
}
int16 GetWinCsid();
BOOL IsDCContext() const {
ASSERT(m_cxType);
switch(m_cxType) {
case Print:
case Window:
case MetaFile:
case Pane:
return(TRUE);
default:
return(FALSE);
}
}
BOOL IsPureDCContext() const {
// Return TRUE if all we depend upon is
// a DC for display (non windowed).
return(!IsWindowContext() && IsDCContext() == TRUE);
}
BOOL IsPrintContext() const {
ASSERT(m_cxType);
switch(m_cxType) {
case Print:
return(TRUE);
default:
return(FALSE);
}
}
BOOL IsWindowContext() const {
ASSERT(m_cxType);
switch(m_cxType) {
case Window:
case Pane:
return(TRUE);
default:
return(FALSE);
}
}
BOOL IsFrameContext() const {
ASSERT(m_cxType);
switch (m_cxType) {
case Window:
return TRUE;
default:
return FALSE;
}
}
public:
// Owner of any dialogs that we'll bring up.
virtual CWnd *GetDialogOwner() const;
public:
// For the foolhardy, who desire access to the XP context in our hour of need.
MWContext *GetContext() const {
return(m_pXPCX);
}
MWContext *GetParentContext() const {
// Only valid if IsGridCell is true.
return(m_pXPCX->grid_parent);
}
// Override to allow XP Context->Frame matching
virtual CFrameGlue *GetFrame() const { return NULL; }
#ifdef MOZ_NGLAYOUT
// Convenience to get/set WebWidget from MWContext.
nsIWebWidget *GetWebWidget() const {
return((nsIWebWidget*)m_pXPCX->fe.webWidget);
}
void SetWebWidget(nsIWebWidget *pWW) {
m_pXPCX->fe.webWidget = pWW;
}
#endif
// Named contexts and grid stuff.
void SetContextName(const char *pName);
void SetParentContext(MWContext *pParentContext);
BOOL IsGridCell() const;
BOOL IsGridParent() const;
// layout modularization effort.
public:
MWContext *GetDocumentContext() const {
return(m_pXPCX);
}
public:
// A function to interrupt any loads in this context.
// This happens immediatly or idly.
// Also, if the call is not nested, it may destroy this object
// if DestroyContext has been called previously.
virtual void Interrupt();
public:
BOOL m_bIdleInterrupt;
BOOL m_bIdleDestroy;
private:
int m_iInterruptNest;
private:
BOOL m_bImagesLoading; // True if any images in this context are loading.
BOOL m_bImagesLooping; // True if any images in this context are looping.
BOOL m_bImagesDelayed; // True if any images in this context are delayed.
BOOL m_bMochaImagesLoading;
BOOL m_bMochaImagesLooping;
BOOL m_bMochaImagesDelayed;
BOOL IsContextStoppableRecurse();
public:
BOOL m_bNetHelpWnd;
BOOL IsNetHelpWnd() { return m_bNetHelpWnd; }
public:
// A wrapper around XP_IsContextStoppable. This is necessary
// because a context is stoppable if its image context is
// stoppable, and the image context is owned by the Front End.
BOOL IsContextStoppable();
// Returns TRUE if this context or its children have any looping images.
BOOL IsContextLooping();
void SetImagesLoading(BOOL val) {m_bImagesLoading = val;}
void SetImagesLooping(BOOL val) {m_bImagesLooping = val;}
void SetImagesDelayed(BOOL val) {m_bImagesDelayed = val;}
void SetMochaImagesLoading(BOOL val) {m_bMochaImagesLoading = val;}
void SetMochaImagesLooping(BOOL val) {m_bMochaImagesLooping = val;}
void SetMochaImagesDelayed(BOOL val) {m_bMochaImagesDelayed = val;}
// Client pull timer information.
public:
void *m_pClientPullData;
void *m_pClientPullTimeout;
private:
// Information to time a load.
time_t m_ttStopwatch;
time_t m_ttOldwatch;
public:
BOOL ProgressReady(time_t ttCurTime) {
BOOL bRetval = ttCurTime != m_ttOldwatch;
m_ttOldwatch = ttCurTime;
return(bRetval);
}
time_t GetElapsedSeconds(time_t ttCurTime) {
return(ttCurTime - m_ttStopwatch);
}
//moved to .cpp due to dependency problems
void ResetStopwatch();
public:
// Context Identification.
DWORD GetContextID() {
return((DWORD)(m_pXPCX->context_id));
}
static CAbstractCX *FindContextByID(DWORD dwID);
public:
// NCAPI context pointer.
CNcapiUrlData *m_pNcapiUrlData;
// Progress Helpers
virtual int32 QueryProgressPercent() { return 0; }
virtual void StartAnimation() {}
virtual void StopAnimation() {}
// MFC Helpers; abstraction away
public:
virtual void MailDocument();
virtual BOOL CanMailDocument();
virtual void NewWindow();
virtual BOOL CanNewWindow();
virtual void OpenUrl();
virtual BOOL CanOpenUrl();
virtual void AllBack();
virtual BOOL CanAllBack();
virtual void AllForward();
virtual BOOL CanAllForward();
virtual void AllInterrupt();
virtual BOOL CanAllInterrupt();
virtual void AllReload(NET_ReloadMethod iReloadType = NET_NORMAL_RELOAD);
virtual BOOL CanAllReload();
virtual void CopySelection();
virtual BOOL CanCopySelection();
virtual void AddToBookmarks();
virtual BOOL CanAddToBookmarks();
#ifdef LAYERS
virtual BOOL HandleLayerEvent(CL_Layer * pLayer, CL_Event * pEvent)
{ return FALSE; }
virtual BOOL HandleEmbedEvent(LO_EmbedStruct *embed, CL_Event * pEvent)
{ return FALSE; }
#endif
virtual void GoHome(){}
virtual void AllFind(MWContext *pSearchContext = NULL){}
virtual BOOL DoFind(CWnd * pWnd, const char * pFindString,
BOOL bMatchCase, BOOL bSearchDown, BOOL bAlertOnNotFound)
{ return FALSE; }
virtual void PrintContext(){}
virtual void GetWindowOffset(int32 *x, int32 *y){}
void MochaDestructionComplete();
};
// Global variables
//
// Macros
//
// Function declarations
//
// The common front end, called in every context, that in turn uses a virtual call into
// the correct context, except in specific optimized situations.
#define MAKE_FE_FUNCS_PREFIX(funkage) CFE_##funkage
#define MAKE_FE_FUNCS_EXTERN
#include "mk_cx_fn.h"
// The exit routines.
void CFE_GetUrlExitRoutine(URL_Struct *pUrl, int iStatus, MWContext *pContext);
void CFE_SimpleGetUrlExitRoutine(URL_Struct *pUrl, int iStatus, MWContext *pContext);
void CFE_TextTranslationExitRoutine(PrintSetup *pTextFE);
#endif // __CX_ABSTRACT_H