/* -*- 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.
 */
/* 
 *
 *  xeditor.h --- Editor-specific headers for the front end.
 *  Should only be include by files that work with the editor.
 *  Created: David Williams <djw@netscape.com>, Mar-12-1996
 *
 *  RCSID: "$Id: xeditor.h,v 3.2 1998-09-28 19:09:17 akkana%netscape.com Exp $"
 */


#ifndef _XEDITOR_H_
#define _XEDITOR_H_

#ifdef	__cplusplus
extern "C" {
#endif

#include <edttypes.h>       /* collect EDT_<editor> types. */
#include <pa_tags.h>        /* for P_UNUM_LIST, P_NUM_LIST, etc */
#include "xfe.h"

/* These URLs shouldn't say gold, should say communicator */

#define XFE_EDITOR_DEFAULT_DOCUMENT_TEMPLATE_URL     \
"http://home.netscape.com/home/gold4.0_templates.html" 
#define XFE_WIZARD_TEMPLATE_URL \
"http://home.netscape.com/home/gold4.0_wizard.html"
#define XFE_EDITOR_NEW_DOC_NAME "file: Untitled"

typedef struct XFE_Frame XFE_Frame;

/*
 *    A useful type.
 */
typedef struct fe_NameValueItem
{
    char* name;
    char* value;
} fe_NameValueItem;

/*
 *    Put this edttype.h after 3.x merge.
 */
typedef enum {
	ED_FONTSIZE_DEFAULT    = 0, /* == ED_FONTSIZE_ZERO */
	ED_FONTSIZE_MINUS_TWO  = 1,
	ED_FONTSIZE_MINUS_ONE  = 2,
	ED_FONTSIZE_ZERO       = 3,
	ED_FONTSIZE_PLUS_ONE   = 4,
	ED_FONTSIZE_PLUS_TWO   = 5,
	ED_FONTSIZE_PLUS_THREE = 6,
	ED_FONTSIZE_PLUS_FOUR  = 7
} ED_FontSize;

#define EDT_FONTSIZE_MAX ED_FONTSIZE_PLUS_FOUR
#define EDT_FONTSIZE_MIN ED_FONTSIZE_MINUS_TWO

#define TF_ALL_MASK \
(TF_BOLD|TF_ITALIC|TF_FIXED|TF_SUPER|TF_SUB|TF_STRIKEOUT|TF_BLINK|TF_UNDERLINE)

Boolean       fe_EditorCanUndo(MWContext*, XmString* label_return);
Boolean       fe_EditorCanRedo(MWContext*, XmString* label_return);
void          fe_EditorUndo(MWContext*);
void          fe_EditorRedo(MWContext*);
Boolean       fe_EditorLineBreakCanInsert(MWContext*);
void          fe_EditorLineBreak(MWContext*, ED_BreakType type);
void          fe_EditorNonBreakingSpace(MWContext*);
void          fe_EditorParagraphMarksSetState(MWContext*, Boolean display);
Boolean       fe_EditorParagraphMarksGetState(MWContext*);
void          fe_EditorFontSizeSet(MWContext*, ED_FontSize size);
ED_FontSize   fe_EditorFontSizeGet(MWContext*);
void          fe_EditorCharacterPropertiesSet(MWContext*, ED_TextFormat);
ED_TextFormat fe_EditorCharacterPropertiesGet(MWContext*);
void          fe_EditorDoPoof(MWContext* context);
void          fe_EditorParagraphPropertiesSet(MWContext*, int8);
int8       fe_EditorParagraphPropertiesGet(MWContext*);
Boolean       fe_EditorParagraphPropertiesGetAll(MWContext*,
												 int8*,
												 EDT_ListData*,
												 ED_Alignment*);
void          fe_EditorParagraphPropertiesSetAll(MWContext*,
												 int8,
												 EDT_ListData*,
												 ED_Alignment);
void          fe_EditorIndent(MWContext* context, Boolean is_outdent);
void          fe_EditorInitActions(void);
void          fe_EditorStaticInit(void);
void          fe_EditorUpdateToolbar(MWContext*, ED_TextFormat);
void          fe_EditorInsertHorizontalRule(MWContext* context);
void          fe_EditorHorizontalRulePropertiesSet(MWContext*, EDT_HorizRuleData*);
void          fe_EditorHorizontalRulePropertiesGet(MWContext*, EDT_HorizRuleData*);
ED_Alignment  fe_EditorAlignGet(MWContext*);
void          fe_EditorAlignSet(MWContext*, ED_Alignment);

void          fe_EditorHrefInsert(MWContext* context,
								  char* p_text, char* p_url);
Boolean       fe_EditorHrefGet(MWContext* context, char** text, char** url);
void          fe_EditorHrefSetUrl(MWContext* context, char* url);
void          fe_EditorHrefClearUrl(MWContext* context);

void          fe_EditorToggleList(MWContext* context, intn tag_type);
Boolean       fe_EditorListDataGet(MWContext* context, EDT_ListData* l_data);
void          fe_EditorListDataSet(MWContext* context, EDT_ListData* l_data);
void          fe_EditorColorSet(MWContext* context, LO_Color* color);
Boolean       fe_EditorColorGet(MWContext* context, LO_Color* color);

Boolean       fe_EditorCanCut(MWContext* context);
Boolean       fe_EditorCanCopy(MWContext* context);
Boolean       fe_EditorCanPaste(MWContext* context);
Boolean       fe_EditorCanPastePrimarySel(MWContext* context);
Boolean       fe_EditorCut(MWContext* context, Time);
Boolean       fe_EditorCopy(MWContext* context, Time);
void          fe_EditorCopyToClipboard(MWContext*, char*, Time);
Boolean       fe_EditorPaste(MWContext* context, Time);
Boolean       fe_EditorPastePrimarySel(MWContext* context, Time);
Boolean       fe_EditorSelectionContainsPoint(MWContext*, int32 x, int32 y);
void          fe_EditorSelectAll(MWContext* context);
void          fe_EditorDeleteItem(MWContext* context, Boolean previous);
void          fe_EditorRemoveLinks(MWContext* context);
Boolean       fe_EditorCanRemoveLinks(MWContext* context);
void          fe_EditorInsertLinkDialogDo(MWContext* context);
void          fe_EditorFind(MWContext* context);
void          fe_EditorFindAgain(MWContext* context);
Boolean       fe_EditorCanFindAgain(MWContext* context);

/* always makes a new window */
MWContext*    fe_EditorNew(MWContext*, XFE_Frame*, Chrome*, char*);
/* tries to re-use existing windows */
MWContext*    fe_EditorEdit(MWContext*, XFE_Frame*, Chrome*, char*);
/* open any editor, or make new */
MWContext*    fe_EditorOpen(MWContext*, XFE_Frame*, Chrome*);
MWContext*    fe_showEditor(Widget top, XFE_Frame*, Chrome*, URL_Struct*);
void          fe_EditorDelete(MWContext* context);
void          fe_EditorKill(MWContext* context);
void          fe_EditorCleanup(MWContext* context);
Boolean       fe_EditorSave(MWContext*);
Boolean       fe_EditorSaveAs(MWContext*);
void          fe_EditorPublish(MWContext*);
void          fe_EditorReload(MWContext*, Boolean super_reload);

void          fe_EditorKeyInsert(MWContext*, Widget, XEvent*);
void          fe_EditorTab(MWContext* context, Boolean forward, Boolean force);

void          fe_EditorGrabFocus(MWContext* context, XEvent *event);
void          fe_EditorSelectionBegin(MWContext* context, XEvent *event);
void          fe_EditorSelectionExtend(MWContext* context, XEvent *event);
void          fe_EditorSelectionEnd(MWContext* context, XEvent *event);

/* Check whether an event is a shifted key or mouse button event */
void xfe_GetShiftAndCtrl(XEvent* event, Boolean* shiftP, Boolean* ctrlP);

/*
 *    Dialog interface.
 */
typedef enum fe_EditorPropertiesDialogType {
	XFE_EDITOR_PROPERTIES_OOPS = 0,
	XFE_EDITOR_PROPERTIES_LINK,
	XFE_EDITOR_PROPERTIES_CHARACTER,
	XFE_EDITOR_PROPERTIES_PARAGRAPH,
	XFE_EDITOR_PROPERTIES_IMAGE,
	XFE_EDITOR_PROPERTIES_HRULE,
	XFE_EDITOR_PROPERTIES_HTML_TAG,
	XFE_EDITOR_PROPERTIES_DOCUMENT,
	XFE_EDITOR_PROPERTIES_IMAGE_INSERT,
	XFE_EDITOR_PROPERTIES_LINK_INSERT,
	XFE_EDITOR_PROPERTIES_TABLE,
	XFE_EDITOR_PROPERTIES_TABLE_ROW,
	XFE_EDITOR_PROPERTIES_TABLE_CELL,
	XFE_EDITOR_PROPERTIES_TARGET
} fe_EditorPropertiesDialogType;

Boolean       fe_EditorPropertiesDialogCanDo(MWContext*,
											  fe_EditorPropertiesDialogType);
void          fe_EditorPropertiesDialogDo(MWContext*,
											  fe_EditorPropertiesDialogType);
void          fe_EditorObjectPropertiesDialogDo(MWContext* context);

typedef enum fe_EditorDocumentPropertiesDialogType
{
 	XFE_EDITOR_DOCUMENT_PROPERTIES_OOPS = 0,
 	XFE_EDITOR_DOCUMENT_PROPERTIES_APPEARANCE,
 	XFE_EDITOR_DOCUMENT_PROPERTIES_GENERAL,
 	XFE_EDITOR_DOCUMENT_PROPERTIES_ADVANCED
} fe_EditorDocumentPropertiesDialogType;

void          fe_EditorDocumentPropertiesDialogDo(MWContext* context, 
							  fe_EditorDocumentPropertiesDialogType tab_type);

Boolean       fe_EditorHorizontalRulePropertiesCanDo(MWContext* context);
void          fe_EditorHorizontalRulePropertiesDialogDo(MWContext* context);
void          fe_EditorSetColorsDialogDo(MWContext* context);

void          fe_EditorDefaultGetColors( LO_Color*  bg_color,
										 LO_Color*  normal_color,
										 LO_Color*  link_color,
										 LO_Color*  active_color,
										 LO_Color*  followed_color);
char*         fe_EditorDefaultGetTemplate(void);
Boolean       fe_EditorDefaultGetLastPublishLocation(MWContext* context,
									   char** location,
									   char** username,
									   char** password);
void          fe_EditorDefaultSetLastPublishLocation(MWContext* context,
									   char* location,
									   char* username,
									   char* password);



/*
 *    Document Properties API.
 */

#define DOCUMENT_NORMAL_TEXT_COLOR   (0)
#define DOCUMENT_LINK_TEXT_COLOR     (1)
#define DOCUMENT_ACTIVE_TEXT_COLOR   (2)
#define DOCUMENT_FOLLOWED_TEXT_COLOR (3)
#define DOCUMENT_BACKGROUND_COLOR    (4)

#define DOCUMENT_NORMAL_TEXT_COLOR_MASK   (0x1<<(DOCUMENT_NORMAL_TEXT_COLOR))
#define DOCUMENT_LINK_TEXT_COLOR_MASK     (0x1<<(DOCUMENT_LINK_TEXT_COLOR))
#define DOCUMENT_ACTIVE_TEXT_COLOR_MASK   (0x1<<(DOCUMENT_ACTIVE_TEXT_COLOR))
#define DOCUMENT_FOLLOWED_TEXT_COLOR_MASK (0x1<<(DOCUMENT_FOLLOWED_TEXT_COLOR))
#define DOCUMENT_BACKGROUND_COLOR_MASK    (0x1<<(DOCUMENT_BACKGROUND_COLOR))
#define DOCUMENT_BACKGROUND_IMAGE_MASK    (0x1<<5)

#define DOCUMENT_USE_CUSTOM_MASK          (0x1<<6)
#define DOCUMENT_USE_IMAGE_MASK           (0x1<<7)

#define DOCUMENT_ALL_APPEARANCE                           \
(DOCUMENT_BACKGROUND_COLOR_MASK|DOCUMENT_LINK_TEXT_COLOR_MASK|      \
 DOCUMENT_NORMAL_TEXT_COLOR_MASK|DOCUMENT_FOLLOWED_TEXT_COLOR_MASK| \
 DOCUMENT_ACTIVE_TEXT_COLOR_MASK|DOCUMENT_BACKGROUND_IMAGE_MASK|    \
 DOCUMENT_USE_CUSTOM_MASK|DOCUMENT_USE_IMAGE_MASK)

typedef struct fe_EditorDocumentAppearancePropertiesStruct
{
    fe_DependentList* dependents;
    MWContext* context;

    EDT_PageData page_data;
    LO_Color colors[5];         /* customized by user */
    LO_Color default_colors[5]; /* cache of defaults */
    Boolean  use_custom;
    Boolean  use_image;
    Boolean  leave_image;
    char*    image_path;
    Widget   image_text;
	unsigned changed;
    Boolean  is_editor_preferences;

} fe_EditorDocumentAppearancePropertiesStruct;

Boolean       fe_EditorDocumentGetColors(MWContext*,
										 char*      background_image,
										 Boolean*   leave_image,
										 LO_Color*  bg_color,
										 LO_Color*  normal_color,
										 LO_Color*  link_color,
										 LO_Color*  active_color,
										 LO_Color*  followed_color);
void          fe_EditorDocumentSetColors(MWContext* context,
										 char*      background_image,
										 Boolean    leave_image,
										 LO_Color*  bg_color,
										 LO_Color*  normal_color,
										 LO_Color*  link_color,
										 LO_Color*  active_color,
										 LO_Color*  followed_color);
char*         fe_EditorDocumentGetTitle(MWContext* context);
void          fe_EditorDocumentSetTitle(MWContext* context, char* name);
void          fe_EditorDocumentSetMetaData(MWContext*, char* name, char* val);
char*         fe_EditorDocumentGetMetaData(MWContext*, char* name);

void          fe_EditorDocumentSetAdvancedMetaDataList(MWContext*,
													   fe_NameValueItem*);
fe_NameValueItem* fe_EditorDocumentGetAdvancedMetaDataList(MWContext*);
void          fe_EditorDocumentSetHttpEquivMetaDataList(MWContext* context,
														fe_NameValueItem*);
fe_NameValueItem* fe_EditorDocumentGetHttpEquivMetaDataList(MWContext*);
Boolean       fe_EditorPublishDialogDo(MWContext* context);
void          fe_EditorDocumentSetImagesWithDocument(MWContext*, Boolean keep);
Boolean       fe_EditorDocumentGetImagesWithDocument(MWContext*);

/*
 *    Editor preferences API.
 */
void          fe_EditorPreferencesGetLinksAndImages(MWContext* context,
													Boolean*   links, 
													Boolean*   images);
void          fe_EditorPreferencesSetLinksAndImages(MWContext* context,
													Boolean   links, 
													Boolean   images);
char*         fe_EditorPreferencesGetAuthor(MWContext* context);
void          fe_EditorPreferencesSetAuthor(MWContext* context, char*);
Boolean       fe_EditorPreferencesGetColors(MWContext*,
										 char*      background_image,
										 LO_Color*  bg_color,
										 LO_Color*  normal_color,
										 LO_Color*  link_color,
										 LO_Color*  active_color,
										 LO_Color*  followed_color);
void          fe_EditorPreferencesSetColors(MWContext* context,
										 char*      background_image,
										 LO_Color*  bg_color,
										 LO_Color*  normal_color,
										 LO_Color*  link_color,
										 LO_Color*  active_color,
										 LO_Color*  followed_color);
void          fe_EditorPreferencesSetEditors(MWContext*, char*, char*);
void          fe_EditorPreferencesGetEditors(MWContext*, char**, char**);
void          fe_EditorEditImage(MWContext* context, char* file);
void          fe_EditorEditSource(MWContext* context);
char*         fe_EditorPreferencesGetTemplate(MWContext* context);
void          fe_EditorPreferencesSetTemplate(MWContext* context, char*);
void          fe_EditorPreferencesDialogDo(MWContext*, unsigned tab_type);
int           fe_EditorGetPublishingHistory(unsigned, char**, char**, char**);
Boolean       fe_EditorPreferencesGetPublishLocation(MWContext* context,
													 char** location,
													 char** username,
													 char** password);
void          fe_EditorPreferencesSetPublishLocation(MWContext* context,
													 char* location,
													 char* username,
													 char* password);
char*         fe_EditorPreferencesGetBrowseLocation(MWContext* context);
void          fe_EditorPreferencesSetBrowseLocation(MWContext*,	char*);
void          fe_EditorPreferencesGetAutoSave(MWContext* context,
											  Boolean*   enable,
											  unsigned*  time);
void          fe_EditorPreferencesSetAutoSave(MWContext* context,
											  Boolean    enable,
											  unsigned   time);
/* C adaptor to call C++ fe_showEditorPreferences(XFE_Component*,MWContext*)*/
void          fe_EditorShowNewPreferences(MWContext*);

void          fe_EditorTargetPropertiesDialogDo(MWContext*);
void          fe_EditorHtmlPropertiesDialogDo(MWContext*);
char*         fe_EditorGetTemplateURL(MWContext* context);
char*         fe_EditorGetWizardURL(MWContext* context);

typedef struct EDT_AllTableData
{
    EDT_TableData        td;
    EDT_TableCaptionData cd;
    Boolean              has_caption;
} EDT_AllTableData;

void          fe_EditorTableDelete(MWContext*);
Boolean       fe_EditorTableCanInsert(MWContext*);
void          fe_EditorTableInsert(MWContext*, EDT_AllTableData* data);
Boolean       fe_EditorTableCanDelete(MWContext*);
Boolean       fe_EditorTableRowCanInsert(MWContext*);
void          fe_EditorTableRowInsert(MWContext* context, EDT_TableRowData*);
Boolean       fe_EditorTableRowCanDelete(MWContext*);
void          fe_EditorTableRowDelete(MWContext* context);
Boolean       fe_EditorTableColumnCanInsert(MWContext*);
void          fe_EditorTableColumnInsert(MWContext*, EDT_TableCellData*);
void          fe_EditorTableColumnDelete(MWContext* context);
Boolean       fe_EditorTableColumnCanDelete(MWContext* context);
Boolean       fe_EditorTableCellCanInsert(MWContext*);
void          fe_EditorTableCellInsert(MWContext* context, EDT_TableCellData*);
Boolean       fe_EditorTableCellCanDelete(MWContext*);
void          fe_EditorTableCellDelete(MWContext* context);
Boolean       fe_EditorTableGetData(MWContext*, EDT_AllTableData*);
void          fe_EditorTableSetData(MWContext*, EDT_AllTableData*);
Boolean       fe_EditorTableRowGetData(MWContext*, EDT_TableRowData*);
void          fe_EditorTableRowSetData(MWContext*, EDT_TableRowData*);
Boolean       fe_EditorTableCellGetData(MWContext*, EDT_TableCellData*);
void          fe_EditorTableCellSetData(MWContext*, EDT_TableCellData*);
void          fe_EditorDisplayTablesSet(MWContext* context, Boolean display);
Boolean       fe_EditorDisplayTablesGet(MWContext* context);

void fe_EditorTablePropertiesDialogDo(MWContext*, fe_EditorPropertiesDialogType);
void fe_EditorTableCreateDialogDo(MWContext*);

Boolean       fe_EditorCheckUnsaved(MWContext* context);
void          fe_EditorDisplaySource(MWContext* context);
char*         fe_EditorMakeName(MWContext*, char* buf, unsigned maxsize);
void          fe_EditorRefresh(MWContext*);
MWContext*    fe_EditorGetURL(MWContext* context, char* address);
void          fe_EditorNotifyBackgroundChanged(MWContext*);
void          fe_EditorRefreshArea(MWContext*, int, int, unsigned, unsigned);
void          fe_EditorGetUrlExitRoutine(MWContext*, URL_Struct*, int status);

/*
 *    Misc stuff that should be elsewhere
 */
enum {
	XFE_DIALOG_YES_BUTTON = (XmDIALOG_DIR_LIST_LABEL+1),
	XFE_DAILOG_YESTOALL_BUTTON,
	XFE_DIALOG_NO_BUTTON,
	XFE_DIALOG_NOTOALL_BUTTON,
	XFE_DIALOG_CANCEL_BUTTON,
	XFE_DIALOG_DESTROY_BUTTON
};

XtPointer     fe_GetUserData(Widget);
Widget        fe_OptionMenuSetHistory(Widget, unsigned);
char*         FE_CondenseURL(char* target, char* source, unsigned target_len);
Boolean		  fe_EditorDocumentIsSaved(MWContext* context);
int           fe_YesNoCancelDialog(MWContext*, char* name, char* message);
MWContext*    fe_GetURLInBrowser(MWContext* context, URL_Struct *url);
Boolean       fe_HintDialog(MWContext* context, char* message);
void          fe_editor_scroll(MWContext *context);
void 		  fe_editor_delete_response(Widget, XtPointer, XtPointer);

#ifdef	__cplusplus
}
#endif

#endif  /* _XEDITOR_H_ */
