#include "Globals.h"

#define FP 1  /*Pen for filenames in YAFR (white)*/
#define DP 3  /* "   "  dirnames   "   "  (orange)*/

extern ColorReq();

/*I think most of these are self explanatory (HandleNew() handles the New*/
/*item in the Project menu, etc.)*/
void HandleNew()
{
   if(Modified && !AreYouSure(Window))
      return;

   NewAll();
}

HandleOpen()
{
   if(GetFilename(SFileName,SDirName,SExt,FileName,24,9,
         "Enter filename for open",Screen,FP,DP,TRUE))
      {
      if(Modified)
         if(!AreYouSure(Window))
            return(FALSE);

      if(ReadItemList(FileName,FALSE))
            {
            Modified=FALSE;
            TitleErrorCancel(); /*Write current filename in title bar*/
            }                   /*if there was no error*/
      }
}

void Save(arexx)
BYTE arexx;
{
   if(FileName[0]==NULL)
      HandleSaveAs();
   else
      {
      WriteItemList(FileName,arexx);
      Modified=FALSE;
      TitleErrorCancel();
      }
}

void HandleSaveAs()
{
   if(GetFilename(SFileName,SDirName,SExt,FileName,24,9,
         "Enter filename for save",Screen,FP,DP,TRUE))
      {
      if(WriteItemList(FileName,FALSE)) /*Save As... never called from ARexx*/
         {
         Modified=FALSE;
         TitleErrorCancel();     /*Update filename in title bar*/
         }                       /*if there was no error*/
      }
}

HandlePrintDisk(arexxstat,filename)
BYTE arexxstat;   /*Called from arexx or not?*/
char *filename;   /*Filename if called from ARexx*/
{
   struct FileHandle *fp;
   char chip buffer[90];
   struct LineItem *Item;

   if(arexxstat)
      strcpy(PDName,filename);
   else
      if(!GetFilename(PFileName,PDirName,PExt,PDName,24,9,
            "Enter filename for print",Screen,FP,DP,TRUE))
         return(FALSE);

   if((fp=(struct FileHandle *)Open(PDName,MODE_NEWFILE))==NULL)
   {
      if(!arexxstat)
         TitleError("Can't open file!");
      return(FALSE);
   }

   Item=(struct LineItem *)FirstItem;
   while(Item != NULL)
      {
      MakeTextLine(buffer,Item);
      Write(fp,buffer,strlen(buffer));
      Item=(struct LineItem *)Item->NextItem;
      }
   Close(fp);
   return(TRUE);
}

HandlePrintPrinter() /*Send an outline to the printer*/
{
   struct FileHandle *fp;
   char chip RetBuf[8];
   char Printed=0;
   char chip buffer[90];
   struct LineItem *Item;
   struct Preferences preferences;
   UWORD maxlines;

   if((fp=(struct FileHandle *)Open("prt:",MODE_OLDFILE))==NULL)
      {
      TitleError("Can't open printer!");
      return(FALSE);
      }
      
   GetPrefs(&preferences,sizeof(struct Preferences));
   maxlines=preferences.PaperLength-1; /*Get maximum page size*/
   
   RetBuf[0]=0x0d;
   RetBuf[1]=0x0a;
   
   if(prefs.DS)
      {
      RetBuf[2]=0x0d;
      RetBuf[3]=0x0a;
      RetBuf[4]=0;
      }
   else
      RetBuf[2]=0;

   Item=(struct LineItem *)FirstItem;
   while(Item != NULL)
      {
      for(Printed=2;Printed < maxlines && Item != NULL;
            Printed+=(prefs.DS) ? 2 : 1)
         {
         strcpy(buffer,"");
         GetOutlineChars(Item,buffer);
         strcat(buffer,"  ");
         strcat(buffer,Item->Text);
         Write(fp,&buffer[Indent],strlen(&buffer[Indent]));
         strcpy(buffer,RetBuf);
         Write(fp,buffer,strlen(buffer));
         Item=(struct LineItem *)Item->NextItem;
         }
      buffer[0]=NEWPAGE;
      Write(fp,buffer,1);
      }
   Close(fp);
   return(TRUE);
}

void HandleQuit()
{
   if(Modified) /*Ask "Are you sure?" only if outline isn't saved*/
   {
      if(AreYouSure(Window))
          CloseStuff();
   }
   else
      CloseStuff();
}

HandleCut()
{
   if(NOINV==InvsMode)
      return(FALSE);
   if(HandleCopy())   /*Copy to buffer.  If it was successful,*/
      HandleErase();    /*erase the block copied from*/
   else
      return(FALSE);
   CheckModified();
}

HandleCopy()
{
   struct WhichOne which;
   
   if(ClipMode < NOINV)
      FreeListMem(ClipStart,ClipEnd);
   if(InvsMode > NOINV)
      if(StartChar < EndChar)
         WriteInvsTextToClip(StartChar,EndChar-StartChar+1,CurrentItem->Text);
      else
         WriteInvsTextToClip(EndChar,StartChar-EndChar+1,CurrentItem->Text);
   else
   {           /*Find the true start/end*/
      FindStartEnd(StartIItem,EndIItem,&which);
      
         /*If cutting out a bunch of continuations, get the parent and all*/
         /*the child continuations as well*/
      which.Start=(struct LineItem *)FindPrevNonCont(which.Start);
      if((which.End = (struct LineItem *)FindNextNonCont(which.End))==NULL)
         which.End=(struct LineItem *)LastItem;
         
      if(which.End->NextItem != NULL && !which.End->cont &&
            which.End->NextItem->cont)
         return(FALSE);
      if(!SnagBlock(which.Start,which.End))
         return(FALSE);
   }
   ClipMode=InvsMode;
   return(TRUE);
}

void HandlePaste()
{
   int TempX,TempY;
   char text[160];

   CancelInvs();
   CheckModified();
   if(ClipMode < NOINV)
   {
      if((!CurrentItem->NextItem->cont) || (CurrentItem->NextItem == NULL))
         AddBlock(CurrentItem);
   }
   else
   {
      strcpy(text,CurrentItem->Text);
      ReadItemString(PosInText(CurrentItem->Level),
         79-PosInText(CurrentItem->Level),text);

      TempX=CurX;
      PlotCursor(1,(TempY=CurY));
      
         /*Break line apart if paste overruns the line*/
      if(BreakLineApart(CurrentItem,CurrentItem->NextItem,
            text)==CurrentItem)
         PrintItem(CurrentItem);
      else
         PrintItemList(CurrentItem,CurY);
      PlotCursor(TempX > MaxX(CurrentItem)?MaxX(CurrentItem):TempX,TempY);
   }
}

HandleErase()
{
   BYTE status=TRUE;
   
   if(InvsMode==NOINV)
      return(FALSE);

   if(InvsMode > NOINV)
      DelTextBlock();
   else
      status=HandleDelBlock();
   if(status)
   {
      InvsMode=NOINV;
      CheckModified();
   }
}

void Refresh() /*Refresh the entire screen*/
{
   UBYTE OldX,OldY;
   OldX=CurX;
   OldY=CurY;

   PrintItemList(FirstScrnItem,1);
   if(OldX < MinX(CurrentItem))
      OldX=MinX(CurrentItem);
   else
      if(OldX > MaxX(CurrentItem))
         OldX=MaxX(CurrentItem);

   PlotCursor(OldX,OldY);
}

void CheckModified() /*Put an '*' in the title bar if it isn't there*/
{
   if(Modified==FALSE)
      {
      Modified=TRUE;
      TitleErrorCancel();
      }
}

void MakeTextLine(Buffer,Item)  /*Convert a LineItem into a text string*/
char *Buffer;
struct LineItem *Item;
{
   UBYTE buflen;
   strcpy(Buffer,"");
   GetOutlineChars(Item,Buffer); /*Get the number*/
   strcat(Buffer,"  ");
   strcat(Buffer,Item->Text); /*Append the text*/
   buflen=strlen(Buffer);
   Buffer[buflen]=0x0a;
   if(prefs.DS)
   {
      Buffer[buflen+1]=0x0a;
      Buffer[buflen+2]=NULL;
   }
   else
      Buffer[buflen+1]=NULL;
}

void HandlePalette() /*Change the color palette*/
{
   ColorReq(Screen);
   SaveColors(&(Screen->ViewPort));
}

void HandleReloadPrefs()
{
   UBYTE X,Y;
   X=CurX;
   Y=CurY;
   
   GetLinerPrefs("liner:liner.prefs");   /*Get the preferences from disk*/
   CloseGraphics();
   ClearMenus();
   InterpretPrefs();          /*Install them*/

   PrintItemList(FirstScrnItem,1); /*Restore the current outline*/
   if(Y > DispRows)  /*if the old laced Y is > the current possible rows*/
      {
      Y=DispRows;    /*Y now = the last screen item*/
      CurrentItem=(struct LineItem *)ScrnBtm;
      }
   if(X > MaxX(CurrentItem))  /*Out of bounds*/
      X=MaxX(CurrentItem);
   else if(X < MinX(CurrentItem))
      X=MinX(CurrentItem);

   PlotCursor(X,Y);     /*Restore cursor position*/
}

/*End of menu.c*/
