#include <exec/memory.h>
#include <intuition/intuition.h>
#include <graphics/scale.h>
#include <libraries/asl.h>
#include <libraries/gadtools.h>
#include <proto/asl.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/gadtools.h>
#include <proto/graphics.h>
#include <proto/intuition.h>
#include <string.h>
#define WIDTH     120
#define HEIGHT    20
#define OFFSET    5

/* Menų progetto */
#define PROGETTO_NUOVO     FULLMENUNUM(0,0,NOSUB)
#define PROGETTO_CARICA    FULLMENUNUM(0,1,NOSUB)
/* La barlabel */
#define PROGETTO_SALVA     FULLMENUNUM(0,3,NOSUB)
#define PROGETTO_SALVACOME FULLMENUNUM(0,4,NOSUB)
/* La barlabel */
#define PROGETTO_INFO      FULLMENUNUM(0,6,NOSUB)
#define PROGETTO_FINE      FULLMENUNUM(0,7,NOSUB)

/* Menų editor */
#define EDITOR_TAGLIA      FULLMENUNUM(1,0,NOSUB)
#define EDITOR_COPIA       FULLMENUNUM(1,1,NOSUB)
#define EDITOR_INCOLLA     FULLMENUNUM(1,2,NOSUB)
#define EDITOR_CANCELLA    FULLMENUNUM(1,3,NOSUB)
/* La barlabel */
#define EDITOR_IFF         FULLMENUNUM(1,5,NOSUB)
#define EDITOR_TESTO       FULLMENUNUM(1,6,NOSUB)
#define EDITOR_8SVX        FULLMENUNUM(1,7,NOSUB)

/* Menų preferenze */
#define PREFERENZE_CARICA  FULLMENUNUM(2,0,NOSUB)
#define PREFERENZE_SALVA   FULLMENUNUM(2,1,NOSUB)
#define PREFERENZE_IMPOSTA FULLMENUNUM(2,2,NOSUB)

struct NewGadget ngad = {OFFSET,OFFSET,WIDTH,HEIGHT,"Premi quė",NULL,1,
	PLACETEXT_IN,NULL,NULL};
struct Gadget *gad = NULL;
struct FileRequester *req = NULL;

/* Definizione dei menu del programma */
struct NewMenu nmenu[] =
{
	{NM_TITLE,"Progetto",0,0,0,NULL,},
	{NM_ITEM,"Nuovo","N",0,0,NULL},
	{NM_ITEM,"Carica...","O",0,0,NULL,},
	{NM_ITEM,NM_BARLABEL,0,0,0,NULL,},
	{NM_ITEM,"Salva","S",0,0,NULL,},
	{NM_ITEM,"Salva come...",0,0,0,NULL,},
	{NM_ITEM,NM_BARLABEL,0,0,0,NULL,},
	{NM_ITEM,"Informazioni...","?",0,0,NULL,},
	{NM_ITEM,"Fine","F",0,0,NULL,},

	{NM_TITLE,"Editor",0,0,0,NULL,},
	{NM_ITEM,"Taglia","X",0,0,NULL,},
	{NM_ITEM,"Copia","C",0,0,NULL,},
	{NM_ITEM,"Incolla","V",0,0,NULL,},
	{NM_ITEM,"Cancella","E",0,0,NULL,},
	{NM_ITEM,NM_BARLABEL,0,0,0,NULL,},
	{NM_ITEM,"IFF",0,MENUTOGGLE | CHECKIT,~(1<<5),NULL,},
	{NM_ITEM,"Testo",0,MENUTOGGLE | CHECKIT,~(1<<6),NULL,},
	{NM_ITEM,"8SVX",0,MENUTOGGLE | CHECKIT|CHECKED,~(1<<7),NULL,},

	{NM_TITLE,"Preferenze",0,0,0,NULL,},
	{NM_ITEM,"Carica...",0,0,0,NULL,},
	{NM_ITEM,"Salva",0,0,0,NULL,},
	{NM_ITEM,"Imposta",0,0,0,NULL,},
	{NM_END,0,0,0,0,0},
};

UBYTE *FileRoutine(BOOL savemode)
{
	UBYTE *nomefile = NULL;

	if(AslRequestTags(req,ASLFR_DoSaveMode,savemode,TAG_DONE))
	{
		UBYTE len = strlen(req -> fr_File) + strlen(req -> fr_Drawer) + 1;

		if((nomefile = AllocVec(len,MEMF_CLEAR)))
		{
			strcpy(nomefile,req -> fr_Drawer);
			AddPart(nomefile,req -> fr_File,len + 1);
		}
	}
	return(nomefile);
}

void main(void)
{
	struct Screen *scr;
	struct Window *win;
	struct Menu *menu;
	struct IntuiMessage *msg;
	struct BitScaleArgs bsa;
	BOOL finito = FALSE;
	APTR vinfo;

	if((scr = OpenScreenTags(NULL,
		SA_LikeWorkbench, TRUE,
		SA_Title,         "Schermo di prova",
		TAG_DONE)))
	{
		if((vinfo = GetVisualInfoA(scr,NULL)))
		{
			ngad.ng_VisualInfo = vinfo;

			if((menu = CreateMenusA(nmenu,NULL)))
			{
				LayoutMenus(menu,vinfo,GTMN_NewLookMenus,TRUE,TAG_DONE);

				if((win = OpenWindowTags(NULL,
					WA_Top,        scr -> BarHeight + scr -> BarVBorder,
					WA_Height,     scr -> Height - scr -> BarHeight - scr -> BarVBorder,
					WA_IDCMP,      IDCMP_CLOSEWINDOW | IDCMP_GADGETUP |
										IDCMP_REFRESHWINDOW | IDCMP_MENUPICK,
					WA_Flags,      WFLG_CLOSEGADGET | WFLG_SIZEGADGET |
										WFLG_DRAGBAR | WFLG_DEPTHGADGET |
										WFLG_NEWLOOKMENUS,
					WA_Title,      "Finestra di prova",
					WA_PubScreen,  scr,
					TAG_DONE)))
				{
					if((req = AllocAslRequestTags(ASL_FileRequest,
						ASLFR_Window,        win,
						ASLFR_SleepWindow,   TRUE,
						ASLFR_RejectIcons,   TRUE,
						TAG_DONE)))
					{
						struct TextExtent te;
						struct TextAttr ta;
						AskFont(win -> RPort,&ta);
						Printf("ta_Name %s ta_YSize %ld\n",ta.ta_Name,ta.ta_YSize);
						FontExtent(win -> RPort -> Font,&te);
						Printf("te_Width = %ld te_Height = %ld\n",te.te_Width,te.te_Height);
						Printf("te_Extent.MinX = %ld te_Extent.MinY = %ld te_Extent.MaxX = %ld te_Extent.MaxY = %ld\n",
							te.te_Extent.MinX,te.te_Extent.MinY,te.te_Extent.MaxX,te.te_Extent.MaxY);
						Move(win -> RPort,20,30);
						TextExtent(win -> RPort,"Ciao",4,&te);
						Printf("Ciao: te_Width = %ld te_Height = %ld\n",te.te_Width,te.te_Height);
						Printf("te_Extent.MinX = %ld te_Extent.MinY = %ld te_Extent.MaxX = %ld te_Extent.MaxY = %ld\n",
							te.te_Extent.MinX,te.te_Extent.MinY,te.te_Extent.MaxX,te.te_Extent.MaxY);

						/* Collego i menų */
						SetMenuStrip(win,menu);

						/* Aggiusto in base alla dimensione del font */
						ngad.ng_LeftEdge += win -> BorderLeft;
						ngad.ng_TopEdge += win -> BorderTop;

						/* Pių piccola di cosė no */
						WindowLimits(win,
							ngad.ng_LeftEdge + ngad.ng_Width + win -> BorderRight + OFFSET,
							ngad.ng_TopEdge + ngad.ng_Height + win -> BorderBottom + OFFSET,0,0);

						if((gad = CreateGadget(BUTTON_KIND,CreateContext(&gad),&ngad,TAG_DONE)))
						{
							ULONG style;
							/* Aggiungo il bottone alla finestra */
							AddGList(win,gad,0,1,NULL);

							/* Rinfresco i bottoni */
							RefreshGList(gad,win,NULL,1);

							/* Rinfresco i bottoni della finestra */
							GT_RefreshWindow(win,NULL);

							style = AskSoftStyle(win -> RPort);
							SetSoftStyle(win -> RPort,FSF_BOLD,style);

							/* Creo un immagine ingrandita del bottone */
							bsa.bsa_SrcX = bsa.bsa_DestX = win -> LeftEdge + gad -> LeftEdge;
							bsa.bsa_SrcY = win -> TopEdge + gad -> TopEdge;
							bsa.bsa_SrcWidth = gad -> Width;
							bsa.bsa_SrcHeight = gad -> Height;
							bsa.bsa_XSrcFactor = bsa.bsa_YSrcFactor = 1;
							bsa.bsa_XDestFactor = bsa.bsa_YDestFactor = 2;
							bsa.bsa_SrcBitMap = bsa.bsa_DestBitMap = win -> RPort -> BitMap;
							bsa.bsa_Flags = 0;
							bsa.bsa_DestY = bsa.bsa_SrcY + bsa.bsa_SrcHeight + win -> RPort -> Font -> tf_YSize + 5;
							BitMapScale(&bsa);
							while(!finito)
							{
								WaitPort(win -> UserPort);
								while((msg = GT_GetIMsg(win -> UserPort)))
								{
									switch(msg -> Class)
									{
										case IDCMP_CLOSEWINDOW:
											finito = TRUE;
										break;
										case IDCMP_GADGETUP:
											Move(win -> RPort,ngad.ng_LeftEdge,
												ngad.ng_TopEdge + ngad.ng_Height +
												win -> RPort -> Font -> tf_YSize);
											Text(win -> RPort,"Bottone premuto!",16);
											ScrollRaster(win -> RPort,-4,0,
												bsa.bsa_DestX,win -> TopEdge + gad -> TopEdge + gad -> Height,
												bsa.bsa_DestX + bsa.bsa_DestWidth,
												bsa.bsa_DestY + bsa.bsa_DestHeight);
										break;
										case IDCMP_MENUPICK:
										{
											UWORD code = msg -> Code;
											do
											{
												struct MenuItem *item;
												switch(code)
												{
													case PROGETTO_NUOVO:
														Printf("Nuovo progetto!\n");
													break;
													case PROGETTO_CARICA:
													{
														UBYTE *nf;
														Printf("Carica progetto!\n");
														if((nf = FileRoutine(FALSE)))
														{
															Move(win -> RPort,ngad.ng_LeftEdge,130);
															Text(win -> RPort,nf,strlen(nf));
															FreeVec(nf);
														}
													}
													break;
													case PROGETTO_SALVA:
													{
														UBYTE *nf;
														Printf("Salva progetto!\n");
														if((nf = FileRoutine(TRUE)))
														{
															Move(win -> RPort,ngad.ng_LeftEdge,130);
															Text(win -> RPort,nf,strlen(nf));
															FreeVec(nf);
														}
													}
													break;
													case PROGETTO_SALVACOME:
														Printf("Salva progetto come!\n");
													break;
													case PROGETTO_INFO:
														Printf("Informazioni progetto!\n");
													break;
													case PROGETTO_FINE:
														Printf("Fine progetto!\n");
														finito = TRUE;
													break;

													case EDITOR_TAGLIA:
														Printf("Taglia!\n");
														OffMenu(win,PROGETTO_NUOVO);
													break;
													case EDITOR_COPIA:
														Printf("Copia!\n");
														OffMenu(win,PROGETTO_SALVA);
													break;
													case EDITOR_INCOLLA:
														Printf("Incolla!\n");
														OnMenu(win,PROGETTO_NUOVO);
													break;
													case EDITOR_CANCELLA:
														Printf("Cancella!\n");
														OnMenu(win,PROGETTO_SALVA);
													break;
													case EDITOR_IFF:
														Printf("Editor IFF!\n");
													break;
													case EDITOR_TESTO:
														Printf("Editor testo!\n");
													break;
													case EDITOR_8SVX:
														Printf("Editor suoni!\n");
													break;

													case PREFERENZE_CARICA:
														Printf("Carica preferenze!\n");
													break;
													case PREFERENZE_SALVA:
														Printf("Salva preferenze!\n");
													break;
													case PREFERENZE_IMPOSTA:
														Printf("Imposta preferenze!\n");
													break;
												}
												item = ItemAddress(win -> MenuStrip,code);
												code = item -> NextSelect;
											}
											while(code != MENUNULL);
										}
										break;
										case IDCMP_REFRESHWINDOW:
											GT_BeginRefresh(win);
											GT_EndRefresh(win,TRUE);
										break;
									}
									GT_ReplyIMsg(msg);
								}
							}
						}
						ClearMenuStrip(win);
						FreeAslRequest(req);
					}
					CloseWindow(win);
				}
				FreeMenus(menu);
			}
			FreeGadgets(gad);
			FreeVisualInfo(vinfo);
		}
		CloseScreen(scr);
	}
}

