/*
 *	rcs_id[] = "$XConsortium: xedit.h,v 1.19 89/10/07 14:59:46 kit Exp $";
 */

/*
 *			  COPYRIGHT 1987
 *		   DIGITAL EQUIPMENT CORPORATION
 *		       MAYNARD, MASSACHUSETTS
 *			ALL RIGHTS RESERVED.
 *
 * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND
 * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
 * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE FOR
 * ANY PURPOSE.  IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
 *
 * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT RIGHTS,
 * APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN ADDITION TO THAT
 * SET FORTH ABOVE.
 *
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation for any purpose and without fee is hereby granted, provided
 * that the above copyright notice appear in all copies and that both that
 * copyright notice and this permission notice appear in supporting
 * documentation, and that the name of Digital Equipment Corporation not be
 * used in advertising or publicity pertaining to distribution of the software
 * without specific, written prior permission.
 */
/* $XFree86: xc/programs/xedit/xedit.h,v 1.17 2002/10/06 17:11:39 paulo Exp $ */

#include <stdio.h>
#include <time.h>
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/cursorfont.h>
#include <X11/Xatom.h>

#include <X11/Xaw/Box.h>
#include <X11/Xaw/Command.h>
#include <X11/Xaw/Label.h>
#include <X11/Xaw/List.h>
#include <X11/Xaw/AsciiText.h>
#include <X11/Xaw/Paned.h>
#include <X11/Xaw/Viewport.h>
#include <X11/Xaw/Cardinals.h>
#include <X11/Xaw/SimpleMenu.h>

#include <X11/IntrinsicP.h>
#include <X11/Xaw/TextSinkP.h>		/* for the property list definition */

#include <X11/Xmu/SysUtil.h>

#define LSCAN(from, count, include)	\
	XawTextSourceScan(source, from, XawstEOL, XawsdLeft, count, include)
#define RSCAN(from, count, include)	\
	XawTextSourceScan(source, from, XawstEOL, XawsdRight, count, include)

typedef struct _xedit_hints {
    char *resource;
    unsigned long interval;
    XtIntervalId timer;
    char **hints;
    unsigned num_hints;
    unsigned cur_hint;
} xedit_hints;

typedef enum {NO_READ, READ_OK, WRITE_OK} FileAccess;

typedef struct _XeditLispData XeditLispData;
typedef struct _XeditTagsInfo XeditTagsInfo;

#define CHANGED_BIT	0x01
#define EXISTS_BIT	0x02
#define WRAP_BIT	0x10
typedef struct _xedit_flist_item {
    Widget source, sme;
    String name;
    String filename;
    int flags;
    FileAccess file_access;
    XawTextPosition display_position, insert_position;
    int mode;
    time_t mtime;
    XawTextPropertyList *properties;
    XawTextWrapMode wrap;
    XeditLispData *xldata;
    XeditTagsInfo *tags;
} xedit_flist_item;

extern struct _xedit_flist {
    Widget popup;
    Pixmap pixmap;
    xedit_flist_item **itens;
    xedit_flist_item *current, *other;
    Cardinal num_itens;
} flist;

extern Widget options_popup;

extern struct _app_resources {
    Boolean enableBackups;
    char *backupNamePrefix;
    char *backupNameSuffix;
    xedit_hints hints;
    char *changed_pixmap_name;
    char *position_format;
    char *auto_replace;
    char *tagsName;
    Boolean loadTags;
} app_resources;

extern Widget topwindow, textwindow, labelwindow, filenamewindow, messwidget;
extern Widget dirlabel, dirwindow;
extern Boolean international;
extern Boolean line_edit;

/*	externals in xedit.c 	*/
void Feep(void);

/*	externals in util.c 	*/
void XeditPrintf(const char *format, ...);
Widget MakeCommandButton(Widget, char*, XtCallbackProc);
Widget MakeStringBox(Widget, String, String);
String GetString(Widget);
FileAccess MaybeCreateFile(const char*), CheckFilePermissions(const char*, Boolean*);
xedit_flist_item *AddTextSource(Widget, const char *, const char *, int, FileAccess);
xedit_flist_item *FindTextSource(Widget, const char*);
Bool KillTextSource(xedit_flist_item*);
char *ResolveName(char*);
void DeleteWindow(Widget, XEvent*, String*, Cardinal*);
void SplitWindow(Widget, XEvent*, String*, Cardinal*);
void SwitchTextSource(xedit_flist_item*);
void PopupMenu(Widget, XEvent*, String*, Cardinal*);
void OtherWindow(Widget, XEvent*, String*, Cardinal*);
void SwitchSource(Widget, XEvent*, String*, Cardinal*);
void XeditFocus(Widget, XEvent*, String*, Cardinal*);
void SwitchDirWindow(Bool);
void DirWindow(Widget, XEvent*, String*, Cardinal*);

/*	externs in commands.c 	*/
void DoQuit(Widget, XtPointer, XtPointer);
void QuitAction(Widget, XEvent*, String*, Cardinal*);
void DoSave(Widget, XtPointer, XtPointer);
void SaveFile(Widget, XEvent*, String*, Cardinal*);
void DoLoad(Widget, XtPointer, XtPointer);
void CancelFindFile(Widget, XEvent*, String*, Cardinal*);
void FindFile(Widget, XEvent*, String*, Cardinal*);
void LoadFile(Widget, XEvent*, String*, Cardinal*);
Bool LoadFileInTextwindow(char *name, char *resolved_name);
void FileCompletion(Widget, XEvent*, String*, Cardinal*);
void KillFile(Widget, XEvent*, String*, Cardinal*);
void DirWindowCB(Widget, XtPointer, XtPointer);
void SourceChanged(Widget, XtPointer, XtPointer);

/*	externs in ispell.c	*/
void IspellAction(Widget, XEvent*, String*, Cardinal*);
void IspellCallback(Widget, XtPointer, XtPointer);

/*	externs in options.c	*/
void CreateEditPopup(void);
void SetEditMenu(void);
void UpdateTextProperties(int);

/*	externs in hook.c	*/
Bool StartHooks(XtAppContext);
void LineEditAction(Widget, XEvent*, String*, Cardinal*);
void LineEdit(Widget);

/*	externs in lisp.c	*/
void XeditLispInitialize(void);
void XeditLispEval(Widget, XEvent*, String*, Cardinal*);
void XeditPrintLispEval(Widget, XEvent*, String*, Cardinal*);
void XeditKeyboardReset(Widget, XEvent*, String*, Cardinal*);
void XeditLispCleanUp(void);
void SetTextProperties(xedit_flist_item*);
void UnsetTextProperties(xedit_flist_item*);
void CreateEditModePopup(Widget);
void SetEditModeMenu(void);

/* tags.c */
void TagsAction(Widget, XEvent*, String*, Cardinal*);
void SearchTagsFile(xedit_flist_item *item);

/*	externs for system replacement functions */
#if defined(_MSC_VER)
#define strcasecmp _stricmp
#endif
#ifdef NEED_REALPATH
#include <sys/param.h>
char *realpath(const char *pathname, char resolvedname[MAXPATHLEN]);
#endif

