/*ProfiPacket - packet radio terminal program
  Copyright (C) 1999  Alexander Feigl

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

  Author:

  Alexander Feigl
  Burachstraße 51

  D-88250 Weingarten

  Mail : Alexander.Feigl@gmx.de
*/

#include <graphics/rastport.h>

struct ANSIJob {
 struct ANSIJob   *next;
 unsigned long    inserttype;
 unsigned long    page;
 unsigned long    charsize;
 unsigned long    stylesize;
 unsigned char    *charptr;
 struct StyleInfo *styles;
 unsigned long    streamcr;

  };

struct EditorBuffer {
        
        unsigned long BufferSize;
        unsigned long BufferFilled;
        unsigned long BufferLineCache;
          signed long HeadLine;
          signed long HeadColumn;
          signed long CursorLine;
          signed long CursorColumn;
          signed long InputLine;
          signed long InputColumn;
          signed long MarkStartLine;
          signed long MarkStartColumn;
          signed long MarkStopLine;
          signed long MarkStopColumn;
        unsigned char *EditorMem;       
        unsigned long ImportMode;
        struct ANSIStream ANSIInput;
 };

struct LineCache {
        unsigned short LineLength;
        unsigned short StyleInfos;
        unsigned char  *LineMemory;
 };


struct LineInfo {
        struct StyleInfo *Styles;
        unsigned char    *Chars;
        unsigned long    StyleLen;
        unsigned long    CharLen;
          signed long    line;
          signed long    edi;
 };

struct Class_Data { 
                        struct Object *RootObject;
                        struct MUI_RenderInfo *mri;
                        struct ANSIJob *JobStack;

                        unsigned long   BufferSize;
                        unsigned short  Pages;
                        unsigned short  Type;
                        unsigned short  Markable;
                        unsigned short  DisplayPage;

                        unsigned short  NumLockStatus;
                        unsigned short  NumLock;
                        unsigned short  AltAscii;
                          signed short  AltAsciiStatus;
                        unsigned short  InsertMode;
                        unsigned short  FreeMoving;
                        unsigned short  LineWrap;
                        unsigned short  WordWrap;
                        unsigned short  GarbageEditor;
                        unsigned short  Interactive;
                        unsigned short  AskInputStream;
                        unsigned short  AskInputANSI;
                        unsigned short  PCFontKey;
                        unsigned short  NotifyPrPa;
                        unsigned short  DisableRedraw;
                        unsigned short  SolidBackgroundForce;

                        unsigned long   MaxLines;
                        unsigned long   Unprintable;
                        unsigned long   InputMask;

                          signed long   GarbagedLines;
                          signed long   CachedLine;
                        unsigned short  CachedTextLen;
                        unsigned short  CachedStyleInfo;
                        unsigned char   CachedChar[4096];
                        struct StyleInfo CachedStyle[128];
                   

                        struct EditorBuffer *Buffers[512];

                        unsigned short  Refresh;                        
                          signed short  RefreshLine[128];
                          signed short  ScrollLines;

                        unsigned short CursorWantDisplay;
                        unsigned short CursorIsDisplay;
                        unsigned short CursorIsReal;
                        unsigned short CursorIsX;
                        unsigned short CursorIsY;
                        unsigned short CursorFollow;
                        unsigned short CursorRefresh;

                          signed long  MarkStartX;
                          signed long  MarkStartY;
                        unsigned short MarkTicks; 
                        unsigned short ValidDisplay;
                        struct RastPort *GfxRPort;
                        struct Window   *GfxWindow;
                        struct TextFont *GfxFont;
                        unsigned long  GfxLeft;
                        unsigned long  GfxTop;
                        unsigned long  GfxRight;
                        unsigned long  GfxBottom;
                        unsigned long  GfxWidth;
                        unsigned long  GfxHeight;
                        unsigned long  GfxLines;
                        unsigned long  GfxPOffsetX;
                        unsigned long  GfxPOffsetY;

                        struct RastPort CloneRastport;
                        struct MUI_PenSpec ANSISpecs[8];
                        struct MUI_PenSpec CursorSpec;
                        unsigned long  ANSIPens[8];
                        unsigned long  CursorPen;
                        unsigned long  BlinkCursor;
                        unsigned long  CursorInsert;
                        unsigned long  CursorOverwr;
                        unsigned long  BlinkFrequency;
                        unsigned long  SolidBackground;

                        unsigned short FontXSize[256];
                        unsigned short FontNominalX;
                        unsigned short FontYSize;
                        unsigned short FontBaseline;

                        unsigned long  DisplayStart;   
                        unsigned long  DisplayStop;    
                        unsigned long  DisplayOffset;  
                        unsigned long  DisplayXMax;    
                        
                        unsigned long  DisplayX;
                        unsigned long  DisplayXSize;  
                        unsigned long  DisplayAPen;
                        unsigned long  DisplayBPen;
                        unsigned long  DisplayStyle;
                        unsigned long  DisplayDrMd;
                        unsigned long  DisplayLength;
                        unsigned char  DisplayCache[96];        
        
                        struct MUI_InputHandlerNode CursorTimer;
                        struct MUI_EventHandlerNode MainEventHandler;
                        struct MUI_EventHandlerNode AuxEventHandler;
                        unsigned short AuxEventActive;
                  };


void CompleteRefresh(struct Class_Data *data);

void ClearBuffer(struct EditorBuffer *edbuf);

void ScrollEditor(struct Class_Data *data,signed long lines);



/* Input */

void ClearMark(struct Class_Data *data);

void StopMark(struct Class_Data *data);

void SetMark(struct Class_Data *data,unsigned long markx,
             unsigned long marky);

void DragMark(struct Class_Data *data,unsigned long markx,
             unsigned long marky);





unsigned long GetFreeMemory (struct EditorBuffer *buffer);

unsigned int CacheClear (struct Class_Data *data);

unsigned int CacheSet (struct Class_Data *data,unsigned long line);

unsigned int GetLineInfo (struct Class_Data *data,struct LineInfo *linf,
                          unsigned long line);

unsigned int GetLineInfoPg (struct Class_Data *data,unsigned long page,
                            struct LineInfo *linf,unsigned long line);

void GarbageCollection (struct Class_Data *data,struct EditorBuffer *edbuf);

unsigned long FillDisplayCache(struct Class_Data *data,struct LineInfo *lc);

unsigned long ColumnToOffset(struct Class_Data *data,struct LineInfo *li,
                             unsigned long column);

unsigned long OffsetToColumn(struct Class_Data *data,struct LineInfo *li,
                             unsigned long offset);

unsigned long OffsetToColumnMouse(struct Class_Data *data,struct LineInfo *li,
                             unsigned long offset);

unsigned long ColumnXSize(struct Class_Data *data,struct LineInfo *li,
                         unsigned long column);

unsigned int InsertLine(struct Class_Data *data,struct EditorBuffer *edbuf,
                        unsigned long LineAfterInsert);

unsigned int DeleteLine (struct Class_Data *data,unsigned long line);


/* Methods */

ULONG _PutStorage(struct IClass *cl,Object *obj, unsigned long *msg);

ULONG _GetStorage(struct IClass *cl,Object *obj, unsigned long *msg);

ULONG _ExportPage(struct IClass *cl,Object *obj, unsigned long *msg);

ULONG _ImportPage(struct IClass *cl,Object *obj, unsigned long *msg);

ULONG _ExportStream(struct IClass *cl,Object *obj, unsigned long *msg);

ULONG _ImportStream(struct IClass *cl,Object *obj, unsigned long *msg);

ULONG _ClearPage(struct IClass *cl,Object *obj, unsigned long *msg);

ULONG _WriteANSI(struct IClass *cl,Object *obj, unsigned long *msg);

ULONG _WriteStream(struct IClass *cl,Object *obj, unsigned long *msg);

ULONG _ANSIToStream(struct IClass *cl,Object *obj, unsigned long *msg);

ULONG _StreamToANSI(struct IClass *cl,Object *obj, unsigned long *msg);

void ClipboardPaste(struct Class_Data *data);

void ClipboardCopy(struct Class_Data *data);

void Handle_Jobs(struct Class_Data *data);

void Put_InputStream(struct Class_Data *data);

void Put_InputANSI(struct Class_Data *data);



/* ANSI Parse */

unsigned long Stream_ANSIToStream(struct ANSIStream *ansi);

unsigned long Stream_StreamToANSI(struct ANSIStream *ansi);

