ClassAct/Demo/ClassActDemo.c

1448 lines
41 KiB
C

/**
** ClassAct Demonstration.
**
** Copyright © 1995-1997 by Timothy Aston and Christopher Aldi
** All rights reserved.
**
** This is a fairly comprehensive demo intended to show-off ClassAct's
** capability, and also demonstrate to you, the programmer, how to use
** ClassAct.
**
** The demo takes place completely in a single window, made up of several
** pages. The entire GUI layout is done completely in a single Layout
** class gadget, that is made up of layout groups containing images and
** gadgets and other layout groups. We create this layout first, then we
** create a window object and attach the layout to that.
**
** A good idea would be to go through each of the gadgets created in this
** programme, load up its autodoc, and see how we've used the various
** features here in this demo. Then feel free to change some things
** around and see what else you can do with ClassAct, because this demo by
** no means shows off all that ClassAct can do.
**
**/
#include <exec/types.h>
#include <exec/memory.h>
#include <dos/dos.h>
#include <graphics/gfxbase.h>
#include <intuition/intuition.h>
#include <intuition/gadgetclass.h>
#include <intuition/imageclass.h>
#include <intuition/icclass.h>
#include <gadgets/listbrowser.h>
#include <images/label.h>
#include <libraries/asl.h>
#include <libraries/gadtools.h>
#include <utility/tagitem.h>
#include <proto/asl.h>
#include <proto/dos.h>
#include <proto/diskfont.h>
#include <proto/exec.h>
#include <proto/gadtools.h>
#include <proto/graphics.h>
#include <proto/icon.h>
#include <proto/intuition.h>
#include <proto/utility.h>
#include <classact.h>
#include <gadgets/getfile.h>
#include <gadgets/getfont.h>
#include <gadgets/getscreenmode.h>
#include <proto/getfile.h>
#include <proto/getfont.h>
#include <proto/getscreenmode.h>
#include "stdio.h"
#include "strings.h"
/* Some useful #defines.
*/
#define D(x)
#define MAX(a, b) ((a > b) ? a : b)
#define MIN(a, b) ((a > b) ? b : a)
#define RED(x) ((x >> 8) & 0xf)
#define BLUE(x) ((x >> 4) & 0xf)
#define GREEN(x) (x & 0xf)
/* Gadget IDs
*/
#define GAD_BACK 1
#define GAD_FORWARD 2
#define GAD_QUIT 3
#define GAD_GETFILE 4
#define GAD_GETFONT 5
#define GAD_GETSCREEN 6
#define NUM_PAGES 7
extern struct GfxBase *GfxBase;
/* External variables, from Images.c
*/
extern struct Image picture_image, classact_image;
extern struct Image sb_images[];
extern struct Image hide_image, show_image, leaf_image;
/* Global variables.
*/
struct Screen *screen = NULL;
struct Gadget *layout, *layout1, *page, *layout2;
struct Gadget *fuelgauge_gad, *scroller_gad, *palette_gad, *lb_gad;
struct Gadget *getfile_gad, *getfont_gad, *getscreen_gad, *fontpreview_gad;
struct Gadget *back_gad, *forward_gad;
struct Image *limage;
struct List *radio_list, *chooser_list1, *chooser_list2, *chooser_list3, *tab_list;
struct List speedbar_list, lb_list1, lb_list2;
/* Some static string data used to initialize some gadgets.
*/
/* Integer to FuelGauge mapping.
*/
struct TagItem integer_map[] =
{
{ INTEGER_Number, FUELGAUGE_Level },
{ TAG_END, NULL }
};
/* GetFont to Button mapping.
*/
struct TagItem getfont_map[] =
{
{ GETFONT_TextAttr, GA_TextAttr },
{ GETFONT_FrontPen, BUTTON_TextPen },
{ GETFONT_BackPen, BUTTON_BackgroundPen },
{ GETFONT_SoftStyle, BUTTON_SoftStyle },
{ TAG_DONE, TAG_DONE }
};
/* SpeedBar help strings. Also used in a ListBrowser.
*/
UBYTE *sbhelp_strs[] =
{
"Erase block and copy it to the clipboard",
"Copy block to the clipboard",
"Paste from clipboard to your project",
"Erase block",
"Mail someone",
"Insert current time",
"Insert current date",
"Disk",
"Spray Paint",
"Print project",
NULL
};
/* ListBrowser column info.
*/
struct ColumnInfo ci1[] =
{
{ 20, NULL, 0 },
{ 80, NULL, 0 },
{ -1, (STRPTR)~0, -1 }
};
struct ColumnInfo ci2[] =
{
{ 100, "Column Header", 0 },
{ -1, (STRPTR)~0, -1 }
};
/* Some fonts that we'll be using.
*/
struct TextAttr helvetica15bu = { (STRPTR)"helvetica.font", 15, FSF_UNDERLINED | FSF_BOLD, FPF_DISKFONT };
struct TextAttr garnet16 = { (STRPTR)"garnet.font", 16, 0, FPF_DISKFONT };
/* Function prototypes.
*/
VOID set_mapping(struct Screen *, struct DrawInfo *, UWORD []);
LONG easy_req(struct Window *, char *, char *, char *, ...);
BOOL make_lb_list(struct List *, struct Image *, UBYTE **);
VOID make_fancy_list(struct Gadget *);
ULONG __asm __saveds lb_hook(register __a0 struct Hook *hook, register __a2 struct Node *node,
register __a1 struct LBDrawMsg *msg);
BOOL make_speedbar_list(struct List *, struct Image *, UBYTE **);
VOID free_speedbar_list(struct List *);
/* This is the start of our program.
*/
main()
{
if (!ButtonBase) return(20);
/* We'll just open up on the default public screen, so we need to get
* a lock on it.
*/
if (screen = LockPubScreen(NULL))
{
struct DrawInfo *drinfo = GetScreenDrawInfo(screen);
struct Image *l;
UWORD mapping[8];
/* Setup the pen mappings to use for our images.
*/
set_mapping(screen, drinfo, mapping);
/* Create a bunch of label lists that our various gadgets will
* use.
*/
make_speedbar_list(&speedbar_list, sb_images, sbhelp_strs);
make_lb_list(&lb_list1, sb_images, sbhelp_strs);
NewList(&lb_list2);
if (layout = LayoutObject,
GA_DrawInfo, drinfo,
LAYOUT_DeferLayout, TRUE, /* Layout refreshes done on
* task's context (by the
* window class) */
LAYOUT_SpaceOuter, TRUE,
LAYOUT_BottomSpacing, 4,
LAYOUT_HorizAlignment, LALIGN_RIGHT,
LAYOUT_Orientation, LAYOUT_ORIENT_VERT,
LAYOUT_AddChild, LayoutObject,
LAYOUT_Orientation, LAYOUT_ORIENT_HORIZ,
LAYOUT_AddChild, LayoutObject,
LAYOUT_BevelStyle, BVS_BUTTON,
LAYOUT_BevelState, IDS_SELECTED,
LAYOUT_VertAlignment, LALIGN_CENTRE,
LAYOUT_HorizAlignment, LALIGN_CENTRE,
LAYOUT_SpaceOuter, TRUE,
CLASSACT_BackFill, LAYERS_BACKFILL,
/* "ClassAct Man", always visible. This is a
* simple Label class image with a mapping.
*/
LAYOUT_AddImage, l = LabelObject,
LABEL_Justification, LABEL_CENTRE,
LABEL_Mapping, mapping,
LABEL_Image, &picture_image,
LabelEnd,
CHILD_WeightedWidth, 0,
CHILD_WeightedHeight, 0,
LayoutEnd,
CHILD_WeightedWidth, 0,
LAYOUT_AddChild, layout1 = LayoutObject,
LAYOUT_LeftSpacing, 4,
LAYOUT_RightSpacing, 4,
LAYOUT_TopSpacing, 2,
LAYOUT_BottomSpacing, 2,
LAYOUT_BevelStyle, BVS_GROUP,
/* All the cool stuff in this demo appears
* on different pages that we can flip
* through via some buttons at the bottom
* of the window.
*/
LAYOUT_AddChild, page = PageObject,
/* The first page, showing our nifty
* logo. This is a single label image,
* notice how you can seemlessly mix
* text and images, and also do pen
* re-mapping.
*/
PAGE_Add, LayoutObject,
LAYOUT_HorizAlignment, LALIGN_CENTRE,
LAYOUT_VertAlignment, LALIGN_CENTRE,
LAYOUT_AddImage, l = LabelObject,
LABEL_DrawInfo, drinfo,
IA_Font, &helvetica15bu,
LABEL_Justification, LABEL_CENTRE,
LABEL_Text, "Welcome to the ClassAct Demo\n",
LABEL_Mapping, mapping,
LABEL_Image, &classact_image,
LabelEnd,
CHILD_WeightedWidth, 0,
CHILD_WeightedHeight, 0,
LayoutEnd,
/* A credits page, made up of a single
* label image.
*/
PAGE_Add, LayoutObject,
LAYOUT_VertAlignment, LALIGN_CENTRE,
LAYOUT_HorizAlignment, LALIGN_CENTRE,
LAYOUT_AddImage, l = LabelObject,
LABEL_DrawInfo, drinfo,
IA_Font, &helvetica15bu,
LABEL_Justification, LABEL_CENTRE,
LABEL_Text, "Welcome to the ClassAct Demo\n",
IA_Font, screen->Font,
LABEL_Text, "\nPeople responsible for ClassAct:\n",
LABEL_Text, "Christopher Aldi\n",
LABEL_Text, "Timothy Aston\n",
LABEL_Text, "Osma Ahvenlampi\n\n",
LABEL_Text, "This demo written by Timothy Aston",
LabelEnd,
CHILD_WeightedWidth, 0,
CHILD_WeightedHeight, 0,
LayoutEnd,
/* The Button gadget class is so
* versatile, might as well dedicate
* an entire page to it.
*/
PAGE_Add, LayoutObject,
LAYOUT_Orientation, LAYOUT_ORIENT_VERT,
LAYOUT_VertAlignment, LALIGN_CENTRE,
LAYOUT_HorizAlignment, LALIGN_CENTRE,
LAYOUT_AddImage, l = LabelObject,
LABEL_DrawInfo, drinfo,
IA_Font, &helvetica15bu,
LABEL_Justification, LABEL_CENTRE,
LABEL_Text, "ClassAct has buttons!",
LabelEnd,
CHILD_WeightedWidth, 0,
CHILD_WeightedHeight, 0,
LAYOUT_AddChild, LayoutObject,
LAYOUT_AddChild, ButtonObject,
GA_Text, "_Simple",
GA_RelVerify, TRUE,
ButtonEnd,
LAYOUT_AddChild, ButtonObject,
GA_Text, "Push Button",
GA_RelVerify, TRUE,
BUTTON_PushButton, TRUE,
ButtonEnd,
LAYOUT_AddChild, ButtonObject,
GA_Text, "Colour",
GA_RelVerify, TRUE,
BUTTON_BackgroundPen, 7,
BUTTON_TextPen, 2,
ButtonEnd,
LayoutEnd,
LAYOUT_AddChild, LayoutObject,
LAYOUT_AddChild, ButtonObject,
GA_Text, "B_old",
GA_RelVerify, TRUE,
BUTTON_SoftStyle, FSF_BOLD,
ButtonEnd,
LAYOUT_AddChild, ButtonObject,
GA_Text, "Read-Only",
GA_RelVerify, TRUE,
GA_ReadOnly, TRUE,
ButtonEnd,
LAYOUT_AddChild, ButtonObject,
GA_Text, "_Right aligned",
GA_RelVerify, TRUE,
BUTTON_Justification, BCJ_RIGHT,
ButtonEnd,
LayoutEnd,
LAYOUT_AddChild, LayoutObject,
LAYOUT_AddChild, ButtonObject,
GA_TextAttr, &garnet16,
GA_Text, "B_ig Button, different font",
GA_RelVerify, TRUE,
ButtonEnd,
LayoutEnd,
LAYOUT_AddChild, LayoutObject,
LAYOUT_VertAlignment, LALIGN_CENTRE,
LAYOUT_AddChild, ButtonObject,
BUTTON_AutoButton, BAG_POPFILE,
GA_RelVerify, TRUE,
ButtonEnd,
CHILD_WeightedWidth, 0,
CHILD_WeightedHeight, 0,
CHILD_Label, LabelObject,
LABEL_Text, "Get Fi_le",
LabelEnd,
LAYOUT_AddChild, ButtonObject,
BUTTON_AutoButton, BAG_POPDRAWER,
GA_RelVerify, TRUE,
ButtonEnd,
CHILD_WeightedWidth, 0,
CHILD_WeightedHeight, 0,
CHILD_Label, LabelObject,
LABEL_Text, "Get _Drawer",
LabelEnd,
LAYOUT_AddChild, ButtonObject,
BUTTON_AutoButton, BAG_POPFONT,
GA_RelVerify, TRUE,
ButtonEnd,
CHILD_WeightedWidth, 0,
CHILD_WeightedHeight, 0,
CHILD_Label, LabelObject,
LABEL_Text, "Fo_nt",
LabelEnd,
LAYOUT_AddChild, ButtonObject,
BUTTON_AutoButton, BAG_POPTIME,
GA_RelVerify, TRUE,
ButtonEnd,
CHILD_WeightedWidth, 0,
CHILD_WeightedHeight, 0,
CHILD_Label, LabelObject,
LABEL_Text, "_Time",
LabelEnd,
LayoutEnd,
LayoutEnd,
/* Our next page shows some gadgets
* that are basically just direct
* replacements for GadTools gadget
* kinds. Don't be fooled though, even
* though they may look similar, we've
* made several useful enhancements.
*/
PAGE_Add, LayoutObject,
LAYOUT_Orientation, LAYOUT_ORIENT_VERT,
LAYOUT_HorizAlignment, LALIGN_CENTRE,
LAYOUT_AddImage, l = LabelObject,
LABEL_DrawInfo, drinfo,
IA_Font, &helvetica15bu,
LABEL_Justification, LABEL_CENTRE,
LABEL_Text, "GadTools Replacements",
LabelEnd,
CHILD_WeightedWidth, 0,
CHILD_WeightedHeight, 0,
LAYOUT_AddChild, PaletteObject,
GA_RelVerify, TRUE,
PALETTE_NumColours, 1 << screen->RastPort.BitMap->Depth,
PaletteEnd,
CHILD_MinWidth, 40,
CHILD_MinHeight, 20,
CHILD_Label, LabelObject,
LABEL_Text, "_Palette",
LabelEnd,
LAYOUT_AddChild, scroller_gad = ScrollerObject,
GA_RelVerify, TRUE,
SCROLLER_Top, 0,
SCROLLER_Total, 90,
SCROLLER_Visible, 10,
SCROLLER_Orientation, FREEHORIZ,
ScrollerEnd,
CHILD_MinHeight, 14,
CHILD_WeightedHeight, 0,
CHILD_Label, LabelObject,
LABEL_Text, "_Scroller",
LabelEnd,
LAYOUT_AddChild, StringObject,
GA_RelVerify, TRUE,
STRINGA_MaxChars, 40,
STRINGA_TextVal, "ClassAct is just soooooo cool",
StringEnd,
CHILD_Label, LabelObject,
LABEL_Text, "S_tring",
LabelEnd,
LAYOUT_AddChild, LayoutObject,
LAYOUT_AddChild, RadioButtonObject,
GA_RelVerify, TRUE,
GA_DrawInfo, drinfo,
RADIOBUTTON_Labels, radio_list = RadioButtons("ClassAct radio buttons",
"support strumming.",
"Click & Drag over buttons!",
NULL),
RADIOBUTTON_Spacing, 2,
RadioButtonEnd,
LAYOUT_AddChild, CheckBoxObject,
GA_RelVerify, TRUE,
GA_Text, "_Click the label",
CHECKBOX_TextPlace, PLACETEXT_RIGHT,
CheckBoxEnd,
LayoutEnd,
CHILD_WeightedHeight, 0,
LayoutEnd,
/* This page is a little more
* interesting, it contains some of the
* cooler classes like the fuelgauge,
* chooser and speedbar. We also have
* an Integer class gadget, showing off
* our innovative arrow buttons. This
* gadget is connected to the fuelgauge
* via a simple mapping.
*/
PAGE_Add, LayoutObject,
LAYOUT_Orientation, LAYOUT_ORIENT_VERT,
LAYOUT_VertAlignment, LALIGN_CENTRE,
LAYOUT_HorizAlignment, LALIGN_CENTRE,
LAYOUT_AddImage, l = LabelObject,
LABEL_DrawInfo, drinfo,
IA_Font, &helvetica15bu,
LABEL_Justification, LABEL_CENTRE,
LABEL_Text, "New and Improved!\n",
LabelEnd,
CHILD_WeightedWidth, 0,
CHILD_WeightedHeight, 0,
LAYOUT_AddChild, LayoutObject,
LAYOUT_SpaceOuter, FALSE,
LAYOUT_AddChild, fuelgauge_gad = FuelGaugeObject,
FUELGAUGE_Orientation, FGORIENT_HORIZ,
FUELGAUGE_Percent, TRUE,
FUELGAUGE_Min, 0,
FUELGAUGE_Max, 100,
FUELGAUGE_Level, 20,
FUELGAUGE_Ticks, 10,
FUELGAUGE_TickSize, 4,
FUELGAUGE_ShortTicks, TRUE,
FuelGaugeEnd,
CHILD_WeightedHeight, 0,
CHILD_Label, LabelObject,
LABEL_DrawInfo, drinfo,
LABEL_Text, "Interconnected:",
LabelEnd,
LayoutEnd,
LAYOUT_AddChild, LayoutObject,
LAYOUT_SpaceOuter, FALSE,
LAYOUT_AddChild, IntegerObject,
GA_RelVerify, TRUE,
INTEGER_MaxChars, 3,
INTEGER_Minimum, 0,
INTEGER_Maximum, 100,
INTEGER_Number, 20,
INTEGER_MinVisible, 5,
ICA_TARGET, fuelgauge_gad,
ICA_MAP, integer_map,
IntegerEnd,
CHILD_WeightedHeight, 0,
CHILD_WeightedWidth, 0,
CHILD_Label, LabelObject,
LABEL_DrawInfo, drinfo,
LABEL_Text, "_Look, arrows! (Range: 0...100):",
LabelEnd,
LayoutEnd,
LAYOUT_AddChild, LayoutObject,
LAYOUT_AddChild, ChooserObject,
GA_RelVerify, TRUE,
CHOOSER_Labels, chooser_list1 = ChooserLabels( "A PopUp gadget",
"from the Chooser",
"gadget class.",
"Good for allowing",
"the user to",
"select a state",
"or mode.",
NULL),
CHOOSER_PopUp, TRUE,
CHOOSER_AutoFit, TRUE,
ChooserEnd,
LAYOUT_AddChild, ChooserObject,
GA_RelVerify, TRUE,
CHOOSER_Labels, chooser_list2 = ChooserLabels("A DropDown",
"gadget from",
"the Chooser",
"gadget class.",
"Good for",
"allowing the",
"user to",
"select actions",
NULL),
CHOOSER_DropDown, TRUE,
CHOOSER_Title, "Drop-Down",
CHOOSER_AutoFit, FALSE,
ChooserEnd,
LAYOUT_AddChild, ChooserObject,
GA_RelVerify, TRUE,
CHOOSER_Labels, chooser_list3 = ChooserLabels("A thin Chooser.",
"Use this in",
"conjunction with",
"a string gadget.",
NULL),
CHOOSER_DropDown, TRUE,
CHOOSER_AutoFit, TRUE,
ChooserEnd,
CHILD_MinWidth, 20,
CHILD_WeightedWidth, 0,
LayoutEnd,
CHILD_WeightedWidth, 0,
LAYOUT_AddChild, SpeedBarObject,
GA_RelVerify, TRUE,
SPEEDBAR_Orientation, SBORIENT_HORIZ,
SPEEDBAR_Buttons, &speedbar_list,
SPEEDBAR_Background, mapping[4],
SPEEDBAR_StrumBar, FALSE,
SpeedBarEnd,
CHILD_WeightedHeight, 0,
LAYOUT_AddChild, ClickTabObject,
GA_RelVerify, TRUE,
CLICKTAB_Labels, tab_list = ClickTabs("Tabs", "For",
"Pages", "Etc.", NULL),
CLICKTAB_Current, 0L,
ClickTabEnd,
CHILD_WeightedHeight, 0,
LayoutEnd,
CHILD_WeightedWidth, 0,
/* One of the most powerful classes
* we've done is the ListBrowser. The
* first object is a simple multi-
* column list showing images and text,
* as well as editable nodes. The 2nd
* object is intended to demonstrate
* some of the numerous node attributes.
*/
PAGE_Add, LayoutObject,
LAYOUT_Orientation, LAYOUT_ORIENT_VERT,
LAYOUT_VertAlignment, LALIGN_CENTRE,
LAYOUT_HorizAlignment, LALIGN_CENTRE,
LAYOUT_AddImage, l = LabelObject,
LABEL_DrawInfo, drinfo,
IA_Font, &helvetica15bu,
LABEL_Justification, LABEL_CENTRE,
LABEL_Text, "Look what ListBrowser can do!\n",
LabelEnd,
CHILD_WeightedWidth, 0,
CHILD_WeightedHeight, 0,
LAYOUT_AddChild, LayoutObject,
LAYOUT_AddChild, ListBrowserObject,
GA_RelVerify, TRUE,
LISTBROWSER_Labels, (ULONG)&lb_list1,
LISTBROWSER_ColumnInfo, &ci1,
LISTBROWSER_AutoFit, TRUE,
LISTBROWSER_MultiSelect, TRUE,
LISTBROWSER_ShowSelected, TRUE,
LISTBROWSER_Separators, TRUE,
LISTBROWSER_Editable, TRUE,
LISTBROWSER_Spacing, 1,
ListBrowserEnd,
LAYOUT_AddChild, lb_gad = ListBrowserObject,
GA_RelVerify, TRUE,
LISTBROWSER_Labels, &lb_list2,
LISTBROWSER_ColumnInfo, &ci2,
LISTBROWSER_ColumnTitles, TRUE,
LISTBROWSER_Separators, TRUE,
LISTBROWSER_Hierarchical, TRUE,
LISTBROWSER_Editable, TRUE,
LISTBROWSER_MultiSelect, TRUE,
LISTBROWSER_ShowSelected, TRUE,
ListBrowserEnd,
LayoutEnd,
LayoutEnd,
/* Our second ListBrowser page shows
* the powerful hierarchical mode of
* ListBrowser. The two gadgets
* contain identical lists, but the
* left-hand gadget shows the default
* hide/show images while the right-
* hand ones shows some custom images.
*/
PAGE_Add, LayoutObject,
LAYOUT_Orientation, LAYOUT_ORIENT_VERT,
LAYOUT_VertAlignment, LALIGN_CENTRE,
LAYOUT_HorizAlignment, LALIGN_CENTRE,
LAYOUT_AddImage, l = LabelObject,
LABEL_DrawInfo, drinfo,
IA_Font, &helvetica15bu,
LABEL_Justification, LABEL_CENTRE,
LABEL_Text, "Get File/Font/Screen Mode\n",
IA_Font, screen->Font,
LABEL_Text, "ASL has never been this easy",
LabelEnd,
CHILD_WeightedWidth, 0,
CHILD_WeightedHeight, 0,
LAYOUT_AddChild, getfile_gad = GetFileObject,
GA_ID, GAD_GETFILE,
GA_RelVerify, TRUE,
GETFILE_TitleText, "Select a File",
GETFILE_ReadOnly, FALSE,
End,
CHILD_WeightedHeight, 0,
CHILD_Label, LabelObject,
LABEL_Text, "File:",
LabelEnd,
LAYOUT_AddChild, getfont_gad = GetFontObject,
GA_ID, GAD_GETFONT,
GA_RelVerify, TRUE,
GETFONT_TitleText, "Select a Font",
GETFONT_DoStyle, TRUE,
GETFONT_DoFrontPen, TRUE,
GETFONT_DoBackPen, TRUE,
ICA_MAP, getfont_map,
End,
CHILD_WeightedHeight, 0,
CHILD_Label, LabelObject,
LABEL_Text, "Font:",
LabelEnd,
LAYOUT_AddChild, fontpreview_gad = ButtonObject,
GA_ReadOnly, TRUE,
GA_Text, "123 AcBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz!@#$%^&*()",
BUTTON_DomainString, "Text",
ButtonEnd,
CHILD_Label, LabelObject,
LABEL_Text, "Preview:",
LabelEnd,
LAYOUT_AddChild, getscreen_gad = GetScreenModeObject,
GA_ID, GAD_GETSCREEN,
GA_RelVerify, TRUE,
GETSCREENMODE_TitleText, "Select a Screen Mode",
GETSCREENMODE_DoWidth, TRUE,
GETSCREENMODE_DoHeight, TRUE,
GETSCREENMODE_DoDepth, TRUE,
GETSCREENMODE_MinWidth, 500,
GETSCREENMODE_MinHeight, 180,
End,
CHILD_WeightedHeight, 0,
CHILD_Label, LabelObject,
LABEL_Text, "Screen Mode:",
LabelEnd,
LayoutEnd,
/* This is the last page, just the
* credits, again as a single label
* gadget.
*/
PAGE_Add, LayoutObject,
LAYOUT_Orientation, LAYOUT_ORIENT_VERT,
LAYOUT_VertAlignment, LALIGN_CENTRE,
LAYOUT_HorizAlignment, LALIGN_CENTRE,
LAYOUT_AddImage, l = LabelObject,
LABEL_DrawInfo, drinfo,
IA_Font, &helvetica15bu,
LABEL_Justification, LABEL_CENTRE,
LABEL_Text, "Order ClassAct Now!\n",
IA_Font, screen->Font,
LABEL_Text, "\nFinale Development, Inc.\n",
LABEL_Text, "P.O. Box 6905, ",
LABEL_Text, "West Palm Beach, FL 33405",
LABEL_Text, "U.S.A.\n",
LABEL_Text, "Tel: 1 (203) 235-7518\n",
LABEL_Text, "Fax: 1 (203) 237-8459\n",
LABEL_Text, "E-Mail: ClassAct@finale-dev.com\n",
LABEL_Text, "WWW: http://www.warped.com/~timmer/classact/\n",
LABEL_Text, "FTP: ftp.warped.com /pub/amiga/classact/\n",
LabelEnd,
CHILD_WeightedWidth, 0,
CHILD_WeightedHeight, 0,
LayoutEnd,
LayoutEnd,
PageEnd,
LayoutEnd,
/* These are the gadgets that appear at the
* bottom of the window for changing pages.
*/
LAYOUT_AddChild, layout2 = LayoutObject,
LAYOUT_Orientation, LAYOUT_ORIENT_HORIZ,
LAYOUT_EvenSize, TRUE,
LAYOUT_HorizAlignment, LALIGN_RIGHT,
LAYOUT_SpaceInner, FALSE,
LAYOUT_AddChild, SpaceObject,
SpaceEnd,
CHILD_WeightedWidth, 0,
CHILD_WeightedHeight, 0,
LAYOUT_AddChild, SpaceObject,
SpaceEnd,
CHILD_WeightedWidth, 0,
CHILD_WeightedHeight, 0,
LAYOUT_AddChild, back_gad = ButtonObject,
GA_ID, GAD_BACK,
GA_Text, "< _Back",
GA_RelVerify, TRUE,
GA_Disabled, TRUE,
ButtonEnd,
CHILD_WeightedWidth, 0,
CHILD_WeightedHeight, 0,
LAYOUT_AddChild, forward_gad = ButtonObject,
GA_ID, GAD_FORWARD,
GA_Text, "_Forward >",
GA_RelVerify, TRUE,
ButtonEnd,
CHILD_WeightedWidth, 0,
CHILD_WeightedHeight, 0,
LAYOUT_AddChild, SpaceObject,
SpaceEnd,
CHILD_WeightedWidth, 0,
CHILD_WeightedHeight, 0,
LAYOUT_AddChild, ButtonObject,
GA_ID, GAD_QUIT,
GA_Text, "Quit",
GA_RelVerify, TRUE,
ButtonEnd,
CHILD_WeightedWidth, 0,
CHILD_WeightedHeight, 0,
LayoutEnd,
CHILD_WeightedWidth, 0,
CHILD_WeightedHeight, 0,
LayoutEnd)
{
struct MsgPort *app_port;
Object *window_obj;
/* Connect the GetFont gadget to the font preview button.
*/
SetAttrs(getfont_gad,
ICA_TARGET, fontpreview_gad,
TAG_DONE);
/* Make the fancy ListBrowserList.
*/
make_fancy_list(lb_gad);
/* Create a message port for App* messages. This is needed for
* iconification. We're being a touch naughty by not checking
* the return code, but that just means that iconification won't
* work, nothing really bad will happen.
*/
app_port = CreateMsgPort();
/* Create the window object.
*/
if (window_obj = WindowObject,
WA_Left, 0,
WA_Top, screen->Font->ta_YSize + 3,
WA_CustomScreen, screen,
WA_IDCMP, IDCMP_CLOSEWINDOW,
WA_Flags, WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_CLOSEGADGET |
WFLG_SIZEGADGET | WFLG_ACTIVATE | WFLG_SMART_REFRESH,
WA_Title, "ClassAct Demonstration",
WINDOW_ParentGroup, layout,
WINDOW_IconifyGadget, TRUE,
WINDOW_Icon, GetDiskObject("PROGDIR:ClassActDemo"),
WINDOW_IconTitle, "ClassAct Demo",
WINDOW_AppPort, app_port,
EndWindow)
{
struct Window *win;
/* Open the window.
*/
if (win = (struct Window *)CA_OpenWindow(window_obj))
{
ULONG signal;
BOOL ok = TRUE;
/* Obtain the window wait signal mask.
*/
GetAttr(WINDOW_SigMask, window_obj, &signal);
/* Input Event Loop
*/
while (ok)
{
ULONG result;
Wait(signal | (1L << app_port->mp_SigBit));
/* CA_HandleInput() returns the gadget ID of a clicked
* gadget, or one of several pre-defined values. For
* this demo, we're only actually interested in a
* close window and a couple of gadget clicks.
*/
while ((result = CA_HandleInput(window_obj, NULL)) != WMHI_LASTMSG)
{
ULONG current_page;
switch(result & WMHI_CLASSMASK)
{
case WMHI_CLOSEWINDOW:
ok = FALSE;
break;
case WMHI_GADGETUP:
switch (result & WMHI_GADGETMASK)
{
case GAD_FORWARD:
GetAttr(PAGE_Current, page, &current_page);
if (current_page < NUM_PAGES)
{
if (current_page == 0)
if (SetGadgetAttrs(back_gad, win, NULL,
GA_Disabled, FALSE,
TAG_DONE))
RefreshGList(layout2, win, NULL, 1);
current_page++;
if (current_page == NUM_PAGES)
if (SetGadgetAttrs(forward_gad, win, NULL,
GA_Disabled, TRUE,
TAG_DONE))
RefreshGList(layout2, win, NULL, 1);
SetGadgetAttrs(page, win, NULL,
PAGE_Current, current_page,
TAG_DONE);
RethinkLayout(layout1, win, NULL, TRUE);
}
break;
case GAD_GETFILE:
RequestFile((Object *)getfile_gad, win);
break;
case GAD_GETFONT:
RequestFont((Object *)getfont_gad, win);
break;
case GAD_GETSCREEN:
RequestScreenMode((Object *)getscreen_gad, win);
break;
case GAD_BACK:
GetAttr(PAGE_Current, page, &current_page);
if (current_page > 0)
{
if (current_page == NUM_PAGES)
if (SetGadgetAttrs(forward_gad, win, NULL,
GA_Disabled, FALSE,
TAG_DONE))
RefreshGList(layout2, win, NULL, 1);
current_page--;
if (current_page == 0)
if (SetGadgetAttrs(back_gad, win, NULL,
GA_Disabled, TRUE,
TAG_DONE))
RefreshGList(layout2, win, NULL, 1);
SetGadgetAttrs(page, win, NULL,
PAGE_Current, current_page,
TAG_DONE);
RethinkLayout(layout1, win, NULL, TRUE);
}
break;
case GAD_QUIT:
ok = FALSE;
break;
default:
break;
}
break;
case WMHI_ICONIFY:
if (CA_Iconify(window_obj))
win = NULL;
break;
case WMHI_UNICONIFY:
win = CA_OpenWindow(window_obj);
break;
default:
break;
}
}
}
/* Disposing of the window object will also close the
* window if it is already opened and it will dispose of
* all objects attached to it.
*/
DisposeObject(window_obj);
}
else
easy_req(NULL, "Demo failed to start\nCouldn't open window", "Quit", "");
/* Lose the App* message port.
*/
if (app_port)
DeleteMsgPort(app_port);
}
else
{
easy_req(NULL, "Demo failed to start\nCouldn't create window object", "Quit", "");
DisposeObject(layout);
}
}
else
easy_req(NULL, "Demo failed to start\nCouldn't create layout", "Quit", "");
/* Free the lists.
*/
if (radio_list)
FreeRadioButtons(radio_list);
if (chooser_list1)
FreeChooserLabels(chooser_list1);
if (chooser_list2)
FreeChooserLabels(chooser_list2);
if (chooser_list3)
FreeChooserLabels(chooser_list3);
if (tab_list)
FreeClickTabs(tab_list);
free_speedbar_list(&speedbar_list);
FreeListBrowserList(&lb_list1);
FreeListBrowserList(&lb_list2);
DisposeObject(limage);
if (screen->RastPort.BitMap->Depth > 2 && GfxBase->LibNode.lib_Version >= 39)
{
ReleasePen(screen->ViewPort.ColorMap, mapping[4]);
ReleasePen(screen->ViewPort.ColorMap, mapping[5]);
ReleasePen(screen->ViewPort.ColorMap, mapping[7]);
}
UnlockPubScreen(0, screen);
}
else
easy_req(NULL, "Demo failed to start\nCouldn't lock destination screen", "Quit", "");
}
/* Set the mapping array for a screen. This creates an 8 colour mapping
* that should closely match the style of 8-colour palette that has become
* more or less conventional:
* pen 0 - medium grayish tone
* pen 1 - black
* pen 2 - white
* pen 3 - an arbitrary colour
* pen 4 - darker tone of pen 0
* pen 5 - lighter tone of pen 0
* pen 6,7 - some nice colours.
* You can be reasonably sure that this routine will setup a mapping that
* will make images designed for this style of palette look OK.
*
* This should probably lock the pen it eventually chooses, and maybe try to
* allocate a pen if it can't find anything close enough.
*/
VOID set_mapping(struct Screen *screen, struct DrawInfo *drinfo, UWORD image_mapping[])
{
/* Setup the image remapping.
*/
image_mapping[0] = drinfo->dri_Pens[BACKGROUNDPEN];
image_mapping[1] = drinfo->dri_Pens[SHADOWPEN];
image_mapping[2] = drinfo->dri_Pens[SHINEPEN];
image_mapping[3] = drinfo->dri_Pens[FILLPEN];
if (screen->RastPort.BitMap->Depth > 2)
{
if (GfxBase->LibNode.lib_Version >= 39)
{
struct ColorMap *colourmap = screen->ViewPort.ColorMap;
ULONG bg[3];
GetRGB32(colourmap, drinfo->dri_Pens[BACKGROUNDPEN], 1, bg);
image_mapping[4] = ObtainBestPen(colourmap, bg[0] - 0x22222222, bg[1] - 0x22222222, bg[2] - 0x22222222,
OBP_Precision, PRECISION_GUI);
image_mapping[5] = ObtainBestPen(colourmap, bg[0] + 0x22222222, bg[1] + 0x22222222, bg[2] + 0x22222222,
OBP_Precision, PRECISION_GUI);
image_mapping[7] = ObtainBestPen(colourmap, 0xeeeeeeee, 0x22222222, 0x22222222,
OBP_Precision, PRECISION_GUI);
}
else
{
UWORD bg;
WORD lightgray, darkgray;
WORD rdiff1 = 3, gdiff1 = 3, bdiff1 = 3;
WORD rdiff2 = 3, gdiff2 = 3, bdiff2 = 3;
WORD i;
/* Set the defaults.
*/
lightgray = darkgray = drinfo->dri_Pens[BACKGROUNDPEN];
/* Find out what the background colour is.
*/
bg = GetRGB4(screen->ViewPort.ColorMap, 0);
/* Search for the light and dark grays.
*/
for (i = 1; i < 1 << screen->RastPort.BitMap->Depth; i++)
{
UWORD colour;
/* Get the colour.
*/
colour = GetRGB4(screen->ViewPort.ColorMap, i);
/* Compare it to the background colour, see if its darker and
* close enough to that colour.
*/
if ((RED(bg) >= RED(colour) && RED(bg) - RED(colour) <= rdiff1) &&
(GREEN(bg) >= GREEN(colour) && GREEN(bg) - GREEN(colour) <= gdiff1) &&
(BLUE(bg) >= BLUE(colour) && BLUE(bg) - BLUE(colour) <= bdiff1))
{
darkgray = i;
rdiff1 = RED(bg) - RED(colour);
gdiff1 = GREEN(bg) - GREEN(colour);
bdiff1 = BLUE(bg) - BLUE(colour);
}
/* Compare it to the background colour, see if its lighter and
* close enough to that colour.
*/
if ((RED(colour) >= RED(bg) && RED(colour) - RED(bg) <= rdiff2) &&
(GREEN(colour) >= GREEN(bg) && GREEN(colour) - GREEN(bg) <= gdiff2) &&
(BLUE(colour) >= BLUE(bg) && BLUE(colour) - BLUE(bg) <= bdiff2))
{
lightgray = i;
rdiff2 = RED(colour) - RED(bg);
gdiff2 = GREEN(colour) - GREEN(bg);
bdiff2 = BLUE(colour) - BLUE(bg);
}
}
image_mapping[4] = darkgray;
image_mapping[5] = lightgray;
image_mapping[6] = (1 << screen->RastPort.BitMap->Depth) - 2;
image_mapping[7] = (1 << screen->RastPort.BitMap->Depth) - 1;
}
}
else
{
image_mapping[4] = image_mapping[5] = drinfo->dri_Pens[BACKGROUNDPEN];
image_mapping[6] = image_mapping[7] = drinfo->dri_Pens[FILLPEN];
}
}
/* Do an easy requester.
*/
LONG easy_req(struct Window *win, char *reqtext, char *reqgads, char *reqargs, ...)
{
struct EasyStruct general_es =
{
sizeof(struct EasyStruct),
0,
"Demo",
NULL,
NULL
};
general_es.es_TextFormat = reqtext;
general_es.es_GadgetFormat = reqgads;
return(EasyRequestArgs(win, &general_es, NULL, &reqargs));
}
/* Function to make an Exec List of ListBrowserNodes from an array of images
* and an array of strings.
*/
BOOL make_lb_list(struct List *list, struct Image *images, UBYTE **strs)
{
struct Node *node;
WORD i = 0;
NewList(list);
while (i < 10)
{
if (node = AllocListBrowserNode(2,
LBNA_Column, 0,
LBNCA_Image, images,
LBNCA_Justification, LCJ_CENTRE,
LBNA_Column, 1,
LBNCA_CopyText, TRUE,
LBNCA_Text, *strs,
LBNCA_Editable, TRUE,
LBNCA_MaxChars, 60,
TAG_DONE))
{
AddTail(list, node);
}
else
break;
images++;
strs++;
i++;
}
return(TRUE);
}
/* Make a fairly fancy list. We've taken a different approach here, this
* time using ListBrowser methods to create the list items AFTER the object
* has been created.
*/
VOID make_fancy_list(struct Gadget *lb_gad)
{
struct Image *gimage;
static struct Hook lbhook;
LBAddNode(lb_gad, NULL, NULL, (struct Node *)~0,
LBNA_Generation, 1,
LBNA_Column, 0,
LBNCA_CopyText, TRUE,
LBNCA_Text, "Demo of ListBrowserNode features",
TAG_DONE);
LBAddNode(lb_gad, NULL, NULL, (struct Node *)~0,
LBNA_Generation, 1,
LBNA_Flags, LBFLG_HASCHILDREN | LBFLG_SHOWCHILDREN,
LBNA_Column, 0,
LBNCA_CopyText, TRUE,
LBNCA_Text, "Editable node",
TAG_DONE);
LBAddNode(lb_gad, NULL, NULL, (struct Node *)~0,
LBNA_Generation, 2,
LBNA_Column, 0,
LBNCA_CopyText, TRUE,
LBNCA_Text, "Click twice to edit",
LBNCA_Editable, TRUE,
LBNCA_MaxChars, 60,
TAG_DONE);
LBAddNode(lb_gad, NULL, NULL, (struct Node *)~0,
LBNA_Generation, 1,
LBNA_Flags, LBFLG_HASCHILDREN | LBFLG_SHOWCHILDREN,
LBNA_Column, 0,
LBNCA_CopyText, TRUE,
LBNCA_Text, "Change colours",
TAG_DONE);
LBAddNode(lb_gad, NULL, NULL, (struct Node *)~0,
LBNA_Generation, 2,
LBNA_Flags, LBFLG_CUSTOMPENS,
LBNA_Column, 0,
LBNCA_CopyText, TRUE,
LBNCA_Text, "Colourful!",
LBNCA_FGPen, 19,
LBNCA_BGPen, 18,
TAG_DONE);
LBAddNode(lb_gad, NULL, NULL, (struct Node *)~0,
LBNA_Generation, 1,
LBNA_Flags, LBFLG_HASCHILDREN | LBFLG_SHOWCHILDREN,
LBNA_Column, 0,
LBNCA_CopyText, TRUE,
LBNCA_Text, "Checkbox item",
TAG_DONE);
LBAddNode(lb_gad, NULL, NULL, (struct Node *)~0,
LBNA_Generation, 2,
LBNA_CheckBox, TRUE,
LBNA_Checked, TRUE,
LBNA_Column, 0,
LBNCA_CopyText, TRUE,
LBNCA_Text, "Checked by default",
TAG_DONE);
LBAddNode(lb_gad, NULL, NULL, (struct Node *)~0,
LBNA_Generation, 2,
LBNA_CheckBox, TRUE,
LBNA_Checked, FALSE,
LBNA_Column, 0,
LBNCA_CopyText, TRUE,
LBNCA_Text, "Unchecked by default",
TAG_DONE);
LBAddNode(lb_gad, NULL, NULL, (struct Node *)~0,
LBNA_Generation, 1,
LBNA_Flags, LBFLG_HASCHILDREN | LBFLG_SHOWCHILDREN,
LBNA_Column, 0,
LBNCA_CopyText, TRUE,
LBNCA_Text, "Justifications",
TAG_DONE);
LBAddNode(lb_gad, NULL, NULL, (struct Node *)~0,
LBNA_Generation, 2,
LBNA_Column, 0,
LBNCA_CopyText, TRUE,
LBNCA_Text, "Left",
LBNCA_Justification, LCJ_LEFT,
TAG_DONE);
LBAddNode(lb_gad, NULL, NULL, (struct Node *)~0,
LBNA_Generation, 2,
LBNA_Column, 0,
LBNCA_CopyText, TRUE,
LBNCA_Text, "Centre",
LBNCA_Justification, LCJ_CENTRE,
TAG_DONE);
LBAddNode(lb_gad, NULL, NULL, (struct Node *)~0,
LBNA_Generation, 2,
LBNA_Column, 0,
LBNCA_CopyText, TRUE,
LBNCA_Text, "Right",
LBNCA_Justification, LCJ_RIGHT,
TAG_DONE);
LBAddNode(lb_gad, NULL, NULL, (struct Node *)~0,
LBNA_Generation, 1,
LBNA_Flags, LBFLG_HASCHILDREN | LBFLG_SHOWCHILDREN,
LBNA_Column, 0,
LBNCA_CopyText, TRUE,
LBNCA_Text, "Read-Only node",
TAG_DONE);
LBAddNode(lb_gad, NULL, NULL, (struct Node *)~0,
LBNA_Generation, 2,
LBNA_Flags, LBFLG_READONLY,
LBNA_Column, 0,
LBNCA_CopyText, TRUE,
LBNCA_Text, "Can't select me!",
TAG_DONE);
gimage = GlyphObject,
IA_Width, 20,
IA_Height, 20,
GLYPH_Glyph, GLYPH_POPTIME,
GlyphEnd;
limage = LabelObject,
IA_Font, &garnet16,
LABEL_Text, "Created using\n_label.image\n",
IA_Font, screen->Font,
LABEL_SoftStyle, FSF_BOLD | FSF_ITALIC,
LABEL_DisposeImage, TRUE,
LABEL_Image, gimage,
IA_FGPen, 35,
LABEL_Text, " Cool eh?",
LabelEnd;
LBAddNode(lb_gad, NULL, NULL, (struct Node *)~0,
LBNA_Generation, 1,
LBNA_Flags, LBFLG_HASCHILDREN | LBFLG_SHOWCHILDREN,
LBNA_Column, 0,
LBNCA_CopyText, TRUE,
LBNCA_Text, "Some images",
TAG_DONE);
LBAddNode(lb_gad, NULL, NULL, (struct Node *)~0,
LBNA_Generation, 2,
LBNA_Column, 0,
LBNCA_Image, limage,
TAG_DONE);
lbhook.h_Entry = (ULONG (*)())lb_hook;
lbhook.h_SubEntry = NULL;
lbhook.h_Data = NULL;
LBAddNode(lb_gad, NULL, NULL, (struct Node *)~0,
LBNA_Generation, 1,
LBNA_Flags, LBFLG_HASCHILDREN | LBFLG_SHOWCHILDREN,
LBNA_Column, 0,
LBNCA_CopyText, TRUE,
LBNCA_Text, "Rendering hook",
TAG_DONE);
LBAddNode(lb_gad, NULL, NULL, (struct Node *)~0,
LBNA_Generation, 2,
LBNA_Column, 0,
LBNCA_RenderHook, &lbhook,
LBNCA_HookHeight, 20,
TAG_DONE);
}
/* Hook for our fancy list. This just renders an ellipse.
*/
ULONG __asm __saveds lb_hook(register __a0 struct Hook *hook, register __a2 struct Node *node,
register __a1 struct LBDrawMsg *msg)
{
WORD width = msg->lbdm_Bounds.MaxX - msg->lbdm_Bounds.MinX;
WORD height = msg->lbdm_Bounds.MaxY - msg->lbdm_Bounds.MinY;
if(msg->lbdm_MethodID != LV_DRAW)
return(LBCB_UNKNOWN);
SetAPen(msg->lbdm_RastPort, 69);
DrawEllipse(msg->lbdm_RastPort,
msg->lbdm_Bounds.MinX + (width / 2), msg->lbdm_Bounds.MinY + (height / 2),
width / 2, height / 2);
return(LVCB_OK);
}
/* Create the SpeedBar list from an array of images, creating help texts
* for each button from a string array.
*/
BOOL make_speedbar_list(struct List *list, struct Image *images, UBYTE **help)
{
struct Node *node;
WORD i = 0;
NewList(list);
while (i < 10)
{
if (node = AllocSpeedButtonNode(i,
SBNA_Image, images,
SBNA_Top, 2,
SBNA_Left, 0,
SBNA_Help, *help,
SBNA_Enabled, TRUE,
SBNA_Spacing, 2,
SBNA_Highlight, SBH_RECESS,
TAG_DONE))
{
AddTail(list, node);
}
else
PutStr("Allocation failed\n");
images++;
help++;
i++;
}
return(TRUE);
}
/* Function to free a SpeedBar Exec List.
*/
VOID free_speedbar_list(struct List *list)
{
struct Node *node, *nextnode;
node = list->lh_Head;
while (nextnode = node->ln_Succ)
{
FreeSpeedButtonNode(node);
node = nextnode;
}
NewList(list);
}