/*
     Filemaster - Multitasking directory utility.
     Copyright (C) 2000  Toni Wilen
     
     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.
*/


#include <exec/types.h>
#include <intuition/intuition.h>
#include <proto/all.h>
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
#include "fmnode.h"
#include "fmlocale.h"
#include "fmgui.h"

void copyus(UBYTE*,UBYTE*);
void outputfmmessage(struct FMList*,UBYTE*,WORD);
UBYTE *scanchar(UBYTE*,UBYTE);
void fittext(struct RastPort*,UBYTE*,WORD,WORD,WORD,WORD,WORD);

extern struct FMConfig *fmconfig;
extern struct FMMain fmmain;

WORD errorreq(WORD title,UBYTE *txt,WORD pos,WORD neg)
{
UBYTE text[100];
UBYTE *ptr1;
struct EasyStruct es;

es.es_StructSize=sizeof(struct EasyStruct);
es.es_Flags=0;
es.es_Title=getstring(title);
es.es_TextFormat=txt;
ptr1=text;
if(pos) {
	copyus(ptr1,getstring(pos));
	ptr1+=strlen(ptr1);
	*ptr1++='|';
}
copyus(ptr1,getstring(neg));
es.es_GadgetFormat=text;
return((WORD)EasyRequest(0,&es,0,0));
}

void fmmessage(struct FMList *list)
{
UBYTE msg1[256],msg2[256];

if (!(list->flags&LSOURCE)) return;
if(AttemptSemaphore(&fmmain.msgsema)) {
	strcpy(msg1,list->fmmessage1);
	strcpy(msg2,list->fmmessage2);
	ReleaseSemaphore(&fmmain.msgsema);
	outputfmmessage(list,msg1,fmmain.messageliney1);
	outputfmmessage(list,msg2,fmmain.messageliney2);
}
}

void outputfmmessage(struct FMList *list,UBYTE *ptr,WORD yy)
{
WORD width;
UBYTE *ptr1;

ptr1=scanchar(ptr,'\n');
if(ptr1) *ptr1=32;
if (fmmain.ikkuna) {
	width=fmmain.ikkuna->Width-fmmain.ikkuna->BorderLeft-fmmain.ikkuna->BorderRight-2*fmconfig->spacew;
	fittext(fmmain.rp,ptr,-1,fmconfig->spacew,yy,width,1);
}
}

WORD request2(UBYTE *title,WORD pos,WORD neg,UBYTE *reqtxt)
{
struct GUIBase *gb;
WORD ret;

gb=getguibase(title);
reqinfo(gb,reqtxt,-1,guiCENTER);
if (pos) {
	buttonbarmsg(gb,pos,1,neg,0,0);
} else {
	buttonbarmsg(gb,neg,0,0);
}
ret=quickreq(gb);
if (pos&&ret==1) return(1);
return(0);
}

WORD requestmsg(UBYTE *title,WORD pos,WORD neg,LONG msg,...)
{
UBYTE reqtxt[200];

va_list args;
va_start(args,msg);
sformatti(reqtxt,getstring(msg),args);
return(request2(title,pos,neg,reqtxt));
}

WORD request(UBYTE *title,WORD pos,WORD neg,UBYTE *txt,...)
{
UBYTE reqtxt[200];

va_list args;
va_start(args,txt);
sformatti(reqtxt,txt,args);
return(request2(title,pos,neg,reqtxt));
}

WORD dosrequesti(struct FMList *list,WORD flag,UBYTE *dostxt1)
{
struct GUIBase *gb;
ULONG ioerr;
UBYTE dostxt2[100];
WORD ret;

outputlist(list);
gb=getguibase(getstring(MSG_REQ_DOSERR));
ioerr=IoErr();
Fault(ioerr,0,dostxt2,256);
reqinfo(gb,dostxt1,-1,guiCENTER);
reqinfo(gb,dostxt2,-1,guiCENTER);
startbuttonbar(gb);
if (flag&1) reqbuttonmsg(gb,MSG_RETRY,2,guiUC);
if (flag&2) reqbuttonmsg(gb,MSG_IGNORE,3,guiUC);
if (!flag) reqbuttonmsg(gb,MSG_OK,1,guiUC); else reqbuttonmsg(gb,MSG_CANCEL,0,guiUC);
ret=quickreq(gb);
if (ret==2) return(1);
if (ret==3) return(-1);
return(0);
}

WORD dosrequestmsg(struct FMList *list,WORD flag,LONG msg,...)
{
UBYTE dostxt1[200];

va_list args;
va_start(args,msg);
sformatti(dostxt1,getstring(msg),args);
return(dosrequesti(list,flag,dostxt1));
}

WORD dosrequest(struct FMList *list,WORD flag,UBYTE *txt,...)
{
UBYTE dostxt1[200];

va_list args;
va_start(args,txt);
sformatti(dostxt1,txt,args);
return(dosrequesti(list,flag,dostxt1));
}


WORD asklong(struct Screen *scr,UBYTE *title,UBYTE *text,LONG *value,LONG min,LONG max)
{
struct GUIBase *gb;
WORD c;

gb=getguibase(title);
if(gb) gb->screen=scr;
setconnectgroup(gb,1,0,0);
reqinfo(gb,text,100,guiLEFT|guiUC);
reqinteger(gb,100,value,min,max);
buttonbarmsg(gb,MSG_OK,1,MSG_CANCEL,0,0);
c=quickreq(gb);
return(c);
}

WORD askstring(struct Screen *scr,UBYTE *title,UBYTE *text,UBYTE *string,WORD len)
{
struct GUIBase *gb;
WORD c;

gb=getguibase(title);
if(gb) gb->screen=scr;
setconnectgroup(gb,1,0,0);
reqinfo(gb,text,100,guiLEFT|guiUC);
reqstring(gb,100,string,len);
buttonbarmsg(gb,MSG_OK,1,MSG_CANCEL,0,0);
c=quickreq(gb);
if(!c) return(0);
return(1);
}
