/* -*- 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.
 */


/*
 * This file is included by client.h
 *
 * It can be included by hand after mcom.h
 *
 * All intermodule data structures (i.e. MWContext, etc) should be included
 *  in this file
 */
#ifndef _STRUCTS_H_
#define _STRUCTS_H_

#include "ntypes.h"
#include "xp_mcom.h"

#include "il_types.h"
#include "lo_ele.h"
#include "shistele.h"
#include "edttypes.h"

#ifdef JAVA
#include "prlong.h"
#include "prclist.h"
#endif /* JAVA */

/* ------------------------------------------------------------------------ */
/* ============= Typedefs for the global context structure ================ */

/* will come out of the ctxtfunc.h file eventually
 */
typedef struct _ContextFuncs ContextFuncs;
/*
 *   This stuff is front end specific.  Add whatever you need.
 */
#if defined(OSF1) && defined(__cplusplus)
    struct fe_ContextData;
#endif

#if defined(XP_MAC) && defined(__cplusplus)
class NetscapeContext;
class CHyperView;

class CNSContext;
class CHTMLView;
#endif

#if ( defined(XP_WIN) || defined(XP_OS2) ) && defined(__cplusplus)
class CAbstractCX;
class CEditView;
class CSaveProgress;
#endif

typedef struct FEstruct_ {
#ifndef MOZILLA_CLIENT
	void * generic_data;
#elif defined(XP_WIN) || defined(XP_OS2)
#ifdef __cplusplus
    	CAbstractCX *cx;
#else
	void *cx;
#endif
#elif defined(XP_TEXT)
	int doc_cols;
	int doc_lines;
	int cur_top_line;
	int num_anchors;
	int cur_anchor;

#elif defined(XP_UNIX)
    struct fe_ContextData *data;
#elif defined(XP_MAC)
#ifdef __cplusplus
    class NetscapeContext*		realContext;
    class CHyperView*		view;
    
    class CNSContext*		newContext;
    class CHTMLView*		newView;
#else
	void*					realContext;
	void*					view;

	void*					newContext;
	void*					newView;	
#endif

/*
** These members are only used by the EDITOR... However, if they
** are removed for non-editor builds the MWContext structure
** becomes skewed for java (and the rest of DIST)...
*/
#ifdef __cplusplus
    class CEditView*		editview;
    class CSaveProgress*	savedialog;
#else
	void*					editview;
	void*					savedialog;
#endif

#endif
} FEstruct;

#define FEUNITS_X(x,context)   ((int32) ((MWContext *)context)->convertPixX * (x))
#define FEUNITS_Y(y,context)   ((int32) ((MWContext *)context)->convertPixY * (y))

struct MessageCopyInfo;

/*
    This is a generic context structure.  There should be one context
    per document window.  The context will allow assorted modules to
    pull out things like the URL of the current document as well as
    giving them a place to hand their window specific stuff.

*/

#if defined (OSF1)
/* Forward declaration to make compiler happy on OSF1 */
struct MSG_SearchFrame;
#ifdef XP_CPLUSPLUS
class MSG_IMAPFolderInfoMail;
class MSG_Master;
class MSG_Pane;
class TImapServerState; 
#endif
#endif

struct MWContext_ {
    MWContextType type;

    char       *url;   /* URL of current document */
    char       * name;	/* name of this context */
    History      hist;  /* Info needed for the window history module */
    FEstruct     fe;    /* Front end specific stuff */
    PRPackedBool          fancyFTP;  /* use fancy ftp ? */
    PRPackedBool          fancyNews; /* use fancy news ? */
    PRPackedBool          intrupt;   /* the user just interrupted things */
    PRPackedBool          graphProgress; /* should the user get visual feedback */
    PRPackedBool          waitingMode;  /* Has a transfer been initiated?  Once a */
                 /* transfer is started, the user cannot select another */
                 /* anchor until either the transfer is aborted, has */
                 /* started to layout, or has been recognized as a */
                 /* separate document handled through an external stream/viewer */
    PRPackedBool          reSize;   /* the user wants to resize the window once the */
                 /* current transfer is over */
    int          fileSort;  /* file sorting method */
    char       * save_as_name;	/* name to save current file as */
    char       * title;		/* title (if supplied) of current document */
    Bool       is_grid_cell;	/* Is this a grid cell */
    struct MWContext_ *grid_parent;	/* pointer to parent of grid cell */
    XP_List *	 grid_children;	/* grid children of this context */
    int      convertPixX;	/* convert from pixels to fe-specific coords */
    int      convertPixY;	/* convert from pixels to fe-specific coords */
    ContextFuncs * funcs;       /* function table of display routines */
    PrintSetup	*prSetup;	/* Info about print job */
    PrintInfo	*prInfo;	/* State information for printing process */

    /* XXXM12N Stuff for the new, modular Image Library. *********************/
    IL_GroupContext *img_cx;    /* Created by Front Ends.  Passed into Image
                                   Library function calls.  */
    IL_ColorSpace *color_space;  /* Colorspace information for images.  This
                                    should become a part of the FE's display
                                    context when MWContext goes away. */
    IL_IRGB *transparent_pixel; /* Background color to be passed into
                                   IL_GetImage.  Set by Front Ends (?) */
    /*************************************************************************/

	int32		images;			/* # of distinct images on this page */

	/* ! do not use these !  */
	/* ! these are going away soon ! */
	/* instead see intl_csi.h for the i18n accessor functions */
	int16		do_not_use_win_csid;	/* code set ID of current window	*/
	int16		do_not_use_doc_csid;	/* code set ID of current document	*/
	int16		do_not_use_relayout;	/* tell conversion to treat relayout case */
	char		*do_not_use_mime_charset;	/* MIME charset from URL			*/

    struct MSG_CompositionFrame *msg_cframe; /* ditto. */
	struct MSG_SearchFrame *msg_searchFrame; /*state for search, for search contexts*/
	struct MSG_BiffFrame *biff_frame; /* Biff info for this context, if any. */
    struct BM_Frame *bmframe; /* Bookmarks info for this context, if any. */
    
    /* for now, add IMAP mail stuff here */
#ifdef XP_CPLUSPLUS
	class MSG_IMAPFolderInfoMail  *currentIMAPfolder;
	class MSG_Pane				  *imapURLPane;		/* used when updated folders */
    class MSG_Master              *mailMaster;
    class TNavigatorImapConnection   *imapConnection; 
#else
	struct MSG_IMAPFolderInfoMail *currentIMAPfolder;
	struct MSG_Pane				  *imapURLPane;		/* used when updated folders */
    struct MSG_Master	 		  *mailMaster;
    struct TNavigatorImapConnection *imapConnection; 
#endif    

	/* for now, add message copy info stuff here */
	struct MessageCopyInfo		  *msgCopyInfo;

	NPEmbeddedApp *pluginList;	/* plugins on this page */
	void *pluginReconnect; /* yet another full screen hack */

    struct MimeDisplayData *mime_data;	/* opaque data used by MIME message
										   parser (not Mail/News specific,
										   since MIME objects can show up
										   in Browser windows too.) */
										/* Also overloaded by progress module to hold private crap! */

#ifdef MOCHA
    struct JSContext *mocha_context;	/* opaque handle to Mocha state */
    uint32  event_bit;			/* sum of all event capturing objects */
    XP_Bool js_drag_enabled;		/* indicates JS drag enabled */
    int8 js_dragging;			/* indicates which button has JS drag in process */
    XP_List * js_dependent_list;	/* lifetime-linked children of this context */
    MWContext *js_parent;
    int32 js_timeouts_pending;          /* Number of pending JavaScript timeouts */

#endif
    XP_Bool restricted_target;			/* TRUE if window is off-limits for opening links into 
						from mail or other window-grabbing functions.*/

	NPEmbeddedApp *pEmbeddedApp; /* yet another full screen hack */
	char * defaultStatus;		/* What string to show in the status area
								   whenever there's nothing better to show.
								   FE's should implement FE_Progress so that
								   if it is passed NULL or "" it will instead
								   display this string.  libmsg changes this
								   string all the time for mail and news
								   contexts. */
#ifdef LAYERS
	CL_Compositor *compositor;  /* The compositor associated with this context */
	XP_Bool blink_hidden;       /* State of blink layers */
	void *blink_timeout;        /* Timeout used for blink hiding/unhiding */
#endif /* LAYERS */

	int32      doc_id;			/* unique identifier for generated documents */
	int32      context_id;			/* unique identifier for context */

  	void       *pHelpInfo;		/* pointer to additional help information;
  								   see ns/lib/libnet/mkhelp.c [EA] */
	
#ifdef JAVA
	/* See ns/sun-java/netscape/net/netStubs.c for the next 2 items: */

	/*
    ** This mysterious list is used in two ways: (1) If you're a real
    ** window context, it's a list of all dummy java contexts that were
    ** created for java's network connections. (2) If you're a dummy java
    ** context, it's where you're linked into the list of connections for
    ** the real context:
    */
	PRCList		javaContexts;

	/*
    ** Second, if you're a dummy java context, you'll need a pointer to
    ** the stream data so that you can shut down the netlib connection:
    */
	struct nsn_JavaStreamData*	javaContextStreamData;

	/*
    ** Stuff for GraphProgress. See lj_embed.c
    */
	Bool		displayingMeteors;
	int64		timeOfFirstMeteorShower;
	int16		numberOfSimultaneousShowers;

#endif /* JAVA */

	/*
    ** Put the editor stuff at the end so that people can still use the
    ** the Java DLL from the 2.0 dist build with Navigator Gold.
    */
    PRPackedBool is_editor;       /* differentiates between Editor and Browser modes */
    PRPackedBool is_new_document; /* quick access to new doc state (unsaved-no file yet)*/
    PRPackedBool display_paragraph_marks; /* True if we should display paragraph and hard-return symbols. */
    PRPackedBool display_table_borders; /* True if we should display dotted lines around tables with invisible borders. */
    PRPackedBool edit_view_source_hack;
    PRPackedBool edit_loading_url;  /* Hack to let us run the net while in a modal dialog */
    PRPackedBool edit_saving_url;   /*  " */
	PRPackedBool edit_has_backup;   /* Editor has made a session backup */
	PRPackedBool bIsComposeWindow;  /* Editor is a compose window */

	/*
	 * Webfonts that were loaded by this context
	 */
	void *webfontsList;

	/* web font stuff */
	/* On Windows,  they are initialized to 0 in cxdc.cpp	*/
	int16		WebFontDownLoadCount;	/* # of download for this doc( one download can have multiple fonts) */
	int16		MissedFontFace;			/* have we missed any font? */

	/*  number of pixels per point-size */
	double      XpixelsPerPoint;
	double		YpixelsPerPoint;
    
    Bool bJavaScriptCalling;
	/* Allow JavaScript in certain internally generated contexts even
	 * when the "enable javascript" pref is turned off.
	 * This flag will also be inherited by child grid cells.
	 */
	PRPackedBool forceJSEnabled;

	/* For increase and decrease font */
	double		fontScalingPercentage;

    int INTL_tag;     /* used to tell that we have a valid INTL_CSIInfo */
    INTL_CharSetInfo INTL_CSIInfo; /* new home of private i18n data */

    /* the current tab focused data */
    LO_TabFocusData *tab_focus_data;

    void *ncast_channel_context;
};


/* This tells libmime.a whether it has the mime_data slot in MWContext
   (which should always be true eventually, but having this #define here
   makes life easier for me today.)  -- jwz */
#define HAVE_MIME_DATA_SLOT


/* this is avialible even in non GOLD builds. */
#define EDT_IS_EDITOR(context)       (context != NULL && context->is_editor)
#define EDT_DISPLAY_PARAGRAPH_MARKS(context) (context && context->is_editor && context->display_paragraph_marks)
#define EDT_DISPLAY_TABLE_BORDERS(context) (context && context->is_editor && context->display_table_borders)
#define EDT_RELAYOUT_FLAG (0x2)
#define EDT_IN_RELAYOUT(context)       (context != NULL && ((context->is_editor & EDT_RELAYOUT_FLAG) != 0))

#ifdef JAVA

/*
** This macro is used to recover the MWContext* from the javaContexts
** list pointer:
*/
#define MWCONTEXT_PTR(context) \
    ((MWContext*) ((char*) (context) - offsetof(MWContext,javaContexts)))

#endif /* JAVA */

/* ------------------------------------------------------------------------ */
/* ====================== NASTY UGLY SHORT TERM HACKS ===================== */

#define XP_CONTEXTID(ctxt)		((ctxt)->context_id)
#define XP_DOCID(ctxt)			((ctxt)->doc_id)
#define XP_SET_DOCID(ctxt, id)	((ctxt)->doc_id = (id))

/* ------------------------------------------------------------------------ */
/* ============= Typedefs for the parser module structures ================ */

/*
 * I *think* (but am unsure) that these should be forked off into a
 *   parser specific client level include file
 *
 */

typedef int8 TagType;

struct PA_Tag_struct {
    TagType type;
    PRPackedBool is_end;
    uint16 newline_count;
#if defined(XP_WIN) || defined(XP_OS2)
    union {                 /* use an anonymous union for debugging purposes*/
    	PA_Block data;
        char* data_str;
    };
#else
    PA_Block data;
#endif
    int32 data_len;
    int32 true_len;
    void *lo_data;
    struct PA_Tag_struct *next;
    ED_Element *edit_element;
};

#define PA_HAS_PDATA( tag ) (tag->pVoid != 0 )

#ifdef XP_UNIX
typedef    char *PAAllocate (intn byte_cnt);
typedef    void  PAFree (char *ptr);
#else
typedef    void *PAAllocate (unsigned int byte_cnt);
typedef    void  PAFree (void *ptr);
#endif
typedef    intn  PA_OutputFunction (void *data_object, PA_Tag *tags, intn status);

struct _PA_Functions {
    PAAllocate  *mem_allocate;
    PAFree      *mem_free;
    PA_OutputFunction   *PA_ParsedTag;
};

typedef struct PA_InitData_struct {
    PA_OutputFunction   *output_func;
} PA_InitData;

/* Structure that defines the characteristics of a new window.
 * Each entry should be structured so that 0 should be the
 * default normal value.  Currently all 0 values
 * bring up a chromeless MWContextBrowser type window of
 * arbitrary size.
 */
struct _Chrome {
    MWContextType type;			/* Must be set to the correct type you want,
								 * if doesn't exist, define one!!!
								 */
	Bool show_button_bar;        /* TRUE to display button bar */
	Bool show_url_bar;           /* TRUE to show URL entry area */
 	Bool show_directory_buttons; /* TRUE to show directory buttons */
	Bool show_bottom_status_bar; /* TRUE to show bottom status bar */
	Bool show_menu;				 /* TRUE to show menu bar */
	Bool show_security_bar;		 /* TRUE to show security bar */
	Bool hide_title_bar;		 /* TRUE to hide title bar and window controls */
	int32 w_hint, h_hint;		 /* hints for width and height */
	int32 outw_hint, outh_hint;	 /* hints for outer window width and height */
	int32 l_hint, t_hint;		 /* hints for left and top window positioning */
	Bool topmost;				 /* TRUE for window alwaysOnTop */
	Bool bottommost;			 /* TRUE for 'desktop' window */
	Bool z_lock;				 /* TRUE for window which cannot move within z-order */
	Bool is_modal;				 /* TRUE to make window be modal */
	Bool show_scrollbar;		 /* TRUE to show scrollbars on window */
	Bool location_is_chrome;	 /* TRUE if top or left is specified */
	Bool allow_resize;			 /* TRUE to allow resize of windows */
	Bool allow_close;			 /* TRUE to allow window to be closed */
	Bool copy_history;			 /* TRUE to copy history of prototype context*/
	Bool dependent;				 /* TRUE if this window is to be closed with its parent*/
	Bool disable_commands;			/* TRUE if user has set hot-keys / menus off */
	Bool restricted_target;			/* TRUE if window is off-limits for opening links into 
						    from mail or other window-grabbing functions.*/
	void (* close_callback)(void *close_arg); /* called on window close */
	void *close_arg;			 /* passed to close_callback */
};


#endif /* _STRUCTS_H_ */





