#include <intuition/intuition.h>
#include <graphics/scale.h>
#include <libraries/gadtools.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/gadtools.h>
#include <proto/graphics.h>
#include <proto/intuition.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;

/* 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},
};


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)))
				{
					/* 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);
										Printf("Bottone premuto!\n");
										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:
													Printf("Carica progetto!\n");
												break;
												case PROGETTO_SALVA:
													Printf("Salva progetto!\n");
												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);
					CloseWindow(win);
				}
				FreeMenus(menu);
			}
			FreeGadgets(gad);
			FreeVisualInfo(vinfo);
		}
		CloseScreen(scr);
	}
}

