home *** CD-ROM | disk | FTP | other *** search
-
- #include <classes/Intuition/Window.h>
-
- #pragma -
- #include <pragma/intuition_lib.h>
- #include <pragma/exec_lib.h>
- #include <pragma/layers_lib.h>
- #pragma +
-
- #ifndef CPP_LIBRARIES_GADTOOLS_H
- #include <classes/libraries/gadtools.h>
- #endif
-
- #ifndef EXEC_LIBRARIES_H
- #include <exec/libraries.h>
- #endif
-
- extern struct Library *IntuitionBase;
-
- WindowSnapshotC::WindowSnapshotC()
- {
- }
-
- // *************************************************************
-
- WindowC::WindowC(IDCMPortC &p, Tag tag1Type, ...)
- : idcmport(p), inittags((struct TagItem *) &tag1Type)
- {
- window_ob = NULL;
- menuattached = FALSE;
- menu = NULL;
- idcmps = inittags.getData(WA_IDCMP, 0);
- inittags.filter(TAGFILTER_NOT,WA_IDCMP,WA_Gadgets,TAG_END);
- gadgetlistattached = FALSE;
- gadgets = NULL;
- busy = FALSE;
- busyReq = NULL;
- }
-
- WindowC::WindowC(IDCMPortC &p, struct TagItem *tags)
- : idcmport(p), inittags(tags)
- {
- window_ob = NULL;
- menuattached = FALSE;
- menu = NULL;
- idcmps = inittags.getData(WA_IDCMP, 0);
- inittags.filter(TAGFILTER_NOT,WA_IDCMP,WA_Gadgets,TAG_END);
- gadgetlistattached = FALSE;
- gadgets = NULL;
- busy = FALSE;
- busyReq = NULL;
- }
-
- WindowC::WindowC(const WindowC &s)
- : idcmport(s.idcmport), inittags(s.inittags)
- {
- window_ob = NULL;
- menuattached = s.menuattached;
- menu = s.menu;
- idcmps = s.idcmps;
- gadgetlistattached = FALSE;
- gadgets = NULL;
- busy = s.busy;
- busyReq = NULL;
- }
-
- WindowC::~WindowC()
- {
- close();
- }
-
- WindowC &WindowC::operator= (const WindowC &s)
- {
- if (this != &s)
- {
- close();
- idcmport = s.idcmport;
- inittags = s.inittags;
- window_ob = NULL;
- menuattached = s.menuattached;
- menu = s.menu;
- idcmps = s.idcmps;
- gadgetlistattached = FALSE;
- gadgets = NULL;
- busy = s.busy;
- busyReq = NULL;
- };
- return *this;
- }
-
- VOID WindowC::open(struct TagItem *tagList)
- {
- if (window_ob)
- return;
- TagItemC t = inittags;
- t.set(tagList);
- idcmps |= t.getData(WA_IDCMP, 0);
- t.filter(TAGFILTER_NOT,WA_IDCMP,TAG_END);
- if (gadgets && gadgets->gadget())
- {
- t.set(WA_Gadgets,gadgets->gadget(),TAG_END);
- gadgetlistattached = TRUE;
- }
- else {
- t.set(WA_Gadgets,NULL,TAG_END);
- gadgetlistattached = FALSE;
- };
- if ((window_ob = OpenWindowTagList(NULL,t.tags())) == NULL)
- throw WindowX();
- window_ob->UserData = (BYTE *) this;
- window_ob->UserPort = idcmport.port();
- if (idcmps != 0)
- ModifyIDCMP(window_ob,idcmps);
- if (menu)
- menuattached = SetMenuStrip(window_ob,menu->menu());
- // resetGadgetList();
- setBusy(busy);
- }
-
- VOID WindowC::close(BOOL snapshot)
- {
- if (window_ob)
- {
- if (snapshot)
- {
- inittags.set(
- WA_Left, window_ob->LeftEdge,
- WA_Top, window_ob->TopEdge,
- WA_Width, window_ob->Width,
- WA_Height, window_ob->Height,
- TAG_END);
- };
- clearBusy();
- clearMenuStrip();
- clearGadgetList(FALSE,FALSE);
- freeIDCMP();
- CloseWindow(window_ob);
- window_ob = NULL;
- }
- }
-
- // *************************************************************
-
- VOID WindowC::setIDCMP(ULONG idcmpFlags)
- {
- if (window_ob)
- {
- if (idcmpFlags)
- {
- if (!idcmps)
- window_ob->UserPort = idcmport.port();
- ModifyIDCMP(window_ob,idcmpFlags);
- }
- else
- freeIDCMP();
- };
- idcmps = idcmpFlags;
- }
-
- VOID WindowC::addIDCMP(ULONG idcmpFlags)
- {
- setIDCMP(idcmps|idcmpFlags);
- }
-
- VOID WindowC::subIDCMP(ULONG idcmpFlags)
- {
- setIDCMP(idcmps&(!idcmpFlags));
- }
-
- // *************************************************************
-
- BOOL WindowC::setMenuStrip(class MenuC &m)
- {
- clearMenuStrip();
- menu = &m;
- if (window_ob)
- {
- menuattached = SetMenuStrip(window_ob,menu->menu());
- return menuattached;
- };
- return FALSE;
- }
-
- BOOL WindowC::resetMenuStrip()
- {
- clearMenuStrip();
- if ((window_ob) && (menu))
- {
- menuattached = ResetMenuStrip(window_ob,menu->menu());
- return menuattached;
- };
- return FALSE;
- }
-
- VOID WindowC::clearMenuStrip(BOOL forget)
- {
- if (window_ob)
- {
- if (menuattached)
- {
- ClearMenuStrip(window_ob);
- menuattached = FALSE;
- };
- };
- if (forget)
- menu = NULL;
- }
-
- // *************************************************************
-
- BOOL WindowC::setGadgetList(class GadgetListC &gl)
- {
- clearGadgetList(TRUE,FALSE);
- gadgets = ≷
- if (window_ob)
- {
- if (gadgets->gadget())
- addGadgets(gadgets->gadget());
- refreshGadgets();
- gadgetlistattached = TRUE;
- };
- return TRUE;
- }
-
- VOID WindowC::resetGadgetList(BOOL refresh)
- {
- clearGadgetList(FALSE,FALSE);
- if ((window_ob) && (gadgets))
- {
- if (gadgets->gadget())
- addGadgets(gadgets->gadget());
- if (refresh)
- refreshGadgets();
- gadgetlistattached = TRUE;
- };
- }
-
- VOID WindowC::clearGadgetList(BOOL forget, BOOL refresh)
- {
- if (window_ob)
- {
- if (gadgetlistattached)
- {
- if (gadgets->gadget())
- {
- RemoveGList(window_ob,gadgets->gadget(),~0);
- // remGadgets(gadgets->gadget());
- };
- if (refresh)
- refreshGadgets();
- gadgetlistattached = FALSE;
- };
- };
- if (forget)
- gadgets = NULL;
- }
-
- VOID WindowC::refreshGadgets()
- {
- if (window_ob)
- {
- if (gadgets->gadget())
- refreshGadgets(gadgets->gadget());
- };
- }
-
- // ***************************************************************
-
- #pragma chip
- static UWORD waitPointer[] = {
- 0x0000,0x0000,
- 0x0400,0x07c0,
- 0x0000,0x07c0,
- 0x0100,0x0380,
- 0x0000,0x07e0,
- 0x07c0,0x1ff8,
- 0x1ff0,0x3fec,
- 0x3ff8,0x7fde,
- 0x3ff8,0x7fbe,
- 0x7ffc,0xff7f,
- 0x7efc,0xffff,
- 0x7ffc,0xffff,
- 0x3ff8,0x7ffe,
- 0x3ff8,0x7ffe,
- 0x1ff0,0x3ffc,
- 0x07c0,0x1ff8,
- 0x0000,0x07e0,
- 0x0000,0x0000
- };
- #pragma fast
-
- BOOL WindowC::setBusy(BOOL status)
- {
- BOOL retval = TRUE;
- if (status)
- {
- if (window_ob)
- {
- if (!busyReq)
- {
- busyReq = (struct Requester *) AllocMem(sizeof(struct Requester),0);
- if (busyReq)
- {
- InitRequester(busyReq);
- if (!Request(busyReq,window_ob))
- {
- FreeMem(busyReq,sizeof(struct Requester));
- busyReq = NULL;
- retval = FALSE;
- };
- busyPointer = window_ob->Pointer;
- busyHeight = window_ob->PtrHeight;
- busyWidth = window_ob->PtrWidth;
- busyXOffset = window_ob->XOffset;
- busyYOffset = window_ob->YOffset;
- if (IntuitionBase->lib_Version >= 39)
- {
- SetWindowPointer(window_ob,
- WA_BusyPointer,TRUE,
- TAG_END);
- }
- else {
- SetPointer(window_ob,waitPointer,16,16,-6,0);
- };
- }
- else
- retval = FALSE;
- };
- };
- busy = TRUE;
- }
- else {
- clearBusy();
- busy = FALSE;
- };
- return retval;
- }
-
- // ***************************************************************
-
- BOOL WindowC::snapshot(WindowSnapshotC &snap)
- {
- if (isOpen())
- {
- snap.setTop(window_ob->TopEdge);
- snap.setLeft(window_ob->LeftEdge);
- snap.setWidth(window_ob->Width);
- snap.setHeight(window_ob->Height);
- snap.setBusy(isBusy());
- }
- else {
- snap.setTop(inittags.getData(WA_Top,0));
- snap.setLeft(inittags.getData(WA_Left,0));
- snap.setWidth(inittags.getData(WA_Width,~0));
- snap.setHeight(inittags.getData(WA_Height,~0));
- snap.setBusy(isBusy());
- };
- return TRUE;
- }
-
- BOOL WindowC::stamp(WindowSnapshotC &snap)
- {
-
- inittags.set(
- WA_Top,snap.top(), WA_Left,snap.left(),
- WA_Width,snap.width(), WA_Height,snap.height(),
- TAG_END);
- if (isOpen())
- {
- change(snap.left(),snap.top(),snap.width(),snap.height());
- };
- setBusy(snap.busy());
- return TRUE;
- }
-
- // ***************************************************************
-
- BOOL WindowC::addGadget(struct Gadget *gadget)
- {
- if (window_ob)
- {
- AddGadget(window_ob,gadget,-1);
- return TRUE;
- };
- return FALSE;
- }
-
- BOOL WindowC::addGadgets(struct Gadget *gadgets)
- {
- if (window_ob)
- {
- AddGList(window_ob,gadgets,-1,-1,NULL);
- return TRUE;
- };
- return FALSE;
- }
-
- BOOL WindowC::remGadget(struct Gadget *gadget)
- {
- if (window_ob)
- {
- return RemoveGadget(window_ob,gadget) != -1;
- };
- return FALSE;
- }
-
- BOOL WindowC::remGadgets(struct Gadget *gadgets, WORD number)
- {
- if (window_ob)
- {
- return RemoveGList(window_ob,gadgets,number) != -1
- };
- return FALSE;
- }
-
- BOOL WindowC::refreshGadgets(struct Gadget *gadgets, WORD number)
- {
- if (window_ob)
- {
- RefreshGList(gadgets,window_ob,NULL,number);
- return TRUE;
- };
- return FALSE;
- }
-
- // *************************************************************
-
- VOID WindowC::activate()
- {
- if (window_ob)
- ActivateWindow(window_ob);
- }
-
- BOOL WindowC::changeSize(WORD Width, WORD Height)
- {
- if (window_ob)
- {
- WORD swidth = window_ob->WScreen->Width;
- WORD sheight = window_ob->WScreen->Height;
- if (Width > swidth || Height > sheight)
- return FALSE;
- WORD left = window_ob->LeftEdge;
- WORD top = window_ob->TopEdge;
- if (left + Width > swidth)
- {
- left = swidth - Width;
- };
- if (top + Height > sheight)
- {
- top = sheight - Height;
- };
- ChangeWindowBox(window_ob,left,top,Width,Height);
- }
- else {
- inittags.set(
- WA_Width, Width,
- WA_Height, Height,
- TAG_END);
- };
- return TRUE;
- }
-
- VOID WindowC::move(WORD LeftEdge, WORD TopEdge)
- {
- if (window_ob)
- {
- MoveWindow(window_ob,LeftEdge - window_ob->LeftEdge,
- TopEdge - window_ob->TopEdge);
- }
- else {
- inittags.set(
- WA_Left,LeftEdge,
- WA_Top,TopEdge,
- TAG_END);
- };
- }
-
- VOID WindowC::change(WORD LeftEdge, WORD TopEdge, WORD Width, WORD Height)
- {
- if (window_ob)
- {
- ChangeWindowBox(window_ob,LeftEdge,TopEdge,Width,Height);
- }
- else {
- inittags.set(
- WA_Left,LeftEdge,
- WA_Top,TopEdge,
- WA_Width,Width,
- WA_Height,Height,
- TAG_END);
- };
- }
-
- BOOL WindowC::limits(WORD MinWidth, WORD MinHeight, WORD MaxWidth, WORD MaxHeight)
- {
- if (window_ob)
- return WindowLimits(window_ob,MinWidth,MinHeight,MaxWidth,MaxHeight)
- else {
- inittags.set(
- WA_MinWidth,MinWidth,
- WA_MaxWidth,MaxWidth,
- WA_MinHeight,MinHeight,
- WA_MaxHeight,MaxHeight);
- };
- return TRUE;
- }
-
- BOOL WindowC::limitMin(WORD MinWidth, WORD MinHeight)
- {
- if (window_ob)
- return WindowLimits(window_ob,MinWidth,MinHeight,0,0)
- else {
- inittags.set(
- WA_MinWidth,MinWidth,
- WA_MinHeight,MinHeight,
- TAG_END);
- };
- return TRUE;
- }
-
- BOOL WindowC::limitMax(WORD MaxWidth, WORD MaxHeight)
- {
- if (window_ob)
- return WindowLimits(window_ob,0,0,MaxWidth,MaxHeight)
- else {
- inittags.set(
- WA_MaxWidth,MaxWidth,
- WA_MaxHeight,MaxHeight,
- TAG_END);
- };
- return TRUE;
- }
-
- VOID WindowC::toFront()
- {
- if (window_ob)
- WindowToFront(window_ob);
- }
-
- VOID WindowC::toBack()
- {
- if (window_ob)
- WindowToBack(window_ob);
- }
-
- VOID WindowC::moveInFrontOf(struct Window *BehindWindow)
- {
- if (window_ob)
- MoveWindowInFrontOf(window_ob,BehindWindow);
- }
-
- VOID WindowC::moveInFrontOf(const WindowC &BehindWindow)
- {
- if (window_ob)
- MoveWindowInFrontOf(window_ob,BehindWindow.window_ob);
- }
-
- VOID WindowC::zip()
- {
- if (window_ob)
- ZipWindow(window_ob)
- }
-
- VOID WindowC::setTitles(STRPTR WindowTitle, STRPTR ScreenTitle)
- {
- if (window_ob)
- SetWindowTitles(window_ob,WindowTitle,ScreenTitle);
- inittags.set(
- WA_Title, WindowTitle,
- WA_ScreenTitle, ScreenTitle,
- TAG_END);
- }
-
- VOID WindowC::setWindowTitle(STRPTR WindowTitle)
- {
- if (window_ob)
- SetWindowTitles(window_ob,WindowTitle,(STRPTR) -1);
- inittags.set(
- WA_Title, WindowTitle,
- TAG_END);
- }
-
- VOID WindowC::setScreenTitle(STRPTR ScreenTitle)
- {
- if (window_ob)
- SetWindowTitles(window_ob,(STRPTR) -1,ScreenTitle);
- inittags.set(
- WA_ScreenTitle, ScreenTitle,
- TAG_END);
- }
-
- VOID WindowC::setPointer(UWORD *Pointer,
- WORD Height, WORD Width, WORD XOffset, WORD YOffset)
- {
- if (window_ob)
- SetPointer(window_ob,Pointer,Height,Width,XOffset,YOffset);
- }
-
- VOID WindowC::clearPointer()
- {
- if (window_ob)
- ClearPointer(window_ob);
- }
-
- VOID WindowC::disableMenu(ULONG number, BOOL v)
- {
- if (window_ob)
- {
- if (v)
- OffMenu(window_ob,number)
- else
- OnMenu(window_ob,number);
- };
- }
-
- VOID WindowC::beginRefresh()
- {
- if (window_ob)
- BeginRefresh(window_ob);
- }
-
- VOID WindowC::endRefresh(BOOL Complete)
- {
- if (window_ob)
- EndRefresh(window_ob,Complete);
- }
-
- VOID WindowC::refreshFrame()
- {
- if (window_ob)
- RefreshWindowFrame(window_ob);
- }
-
- VOID WindowC::freeIDCMP()
- {
- Forbid();
- MsgPort *idcmport = window_ob->UserPort;
- struct IntuiMessage *msg;
- struct Node *succ;
- if (idcmport)
- {
- msg = (struct IntuiMessage *) idcmport->mp_MsgList.lh_Head;
- while (succ = msg->ExecMessage.mn_Node.ln_Succ)
- {
- if (msg->IDCMPWindow == window_ob)
- {
- Remove((struct Node *) msg);
- ReplyMsg((struct Message *) msg);
- }
- msg = (IntuiMessage *) succ;
- };
- };
- window_ob->UserPort = NULL;
- ModifyIDCMP(window_ob,0);
- Permit();
- }
-
- VOID WindowC::clearBusy()
- {
- if (window_ob)
- {
- if (busyReq)
- {
- if (busyPointer)
- {
- SetPointer(window_ob,busyPointer,busyHeight,busyWidth,
- busyXOffset,busyYOffset);
- }
- else {
- ClearPointer(window_ob);
- };
- EndRequest(busyReq,window_ob);
- FreeMem(busyReq,sizeof(struct Requester));
- busyReq = NULL;
- };
- };
- }
-
- // *************************************************************
-
- WindowListC::WindowListC()
- {
- }
-
- VOID WindowListC::close(BOOL snapshot)
- {
- ListCursorC lc(*this);
- while (!lc.isDone()) {
- ((WindowC *) lc.item())->close(snapshot);
- lc.next();
- };
- }
-
- BOOL WindowListC::setBusy(BOOL state, WindowC *except)
- {
- BOOL retval = TRUE;
- ListCursorC lc(*this);
- while (!lc.isDone()) {
- if ((WindowC *) lc.item() != except)
- if (!((WindowC *) lc.item())->setBusy(state))
- retval = FALSE;
- lc.next();
- };
- return retval;
- }
-
- // *************************************************************
-
- WindowEventHandlerC::WindowEventHandlerC(WindowC &w, ULONG IDCMPclass)
- : IDCMPEventHandlerC(IDCMPclass)
- {
- cWindow = &w;
- cWindow->idcmPort().add(*this);
- cWindow->addIDCMP(IDCMPclass);
- }
-
- WindowEventHandlerC::WindowEventHandlerC(WindowEventHandlerChainC &c)
- : IDCMPEventHandlerC(c.eventClass())
- {
- cWindow = c.window();
- c.add(*this);
- }
-
- BOOL WindowEventHandlerC::_forMe(IntuiMessageC &msg)
- {
- return (msg.Class == eventClass())
- && (msg.IDCMPWindow == cWindow->window());
- }
-
- // *************************************************************
-
- WindowEventHandlerChainC::WindowEventHandlerChainC(WindowC &w,
- ULONG IDCMPclass)
- : WindowEventHandlerC(w,IDCMPclass), HandlerChainC()
- {
- }
-
- // *************************************************************
-
- WindowCloseHandlerC::WindowCloseHandlerC(WindowC &w)
- : WindowEventHandlerC(w,IDCMP_CLOSEWINDOW)
- {
- _exit = FALSE;
- }
-
- BOOL WindowCloseHandlerC::_handle(IntuiMessageC &)
- {
- close();
- return TRUE;
- };
-
- // **************************************************************
-
- WindowActiveHandlerC::WindowActiveHandlerC(WindowC &w)
- : WindowEventHandlerC(w,IDCMP_ACTIVEWINDOW)
- {
- }
-
- BOOL WindowActiveHandlerC::_handle(IntuiMessageC &)
- {
- activated();
- return TRUE;
- };
-
- // **************************************************************
-
- WindowInactiveHandlerC::WindowInactiveHandlerC(WindowC &w)
- : WindowEventHandlerC(w,IDCMP_INACTIVEWINDOW)
- {
- }
-
- BOOL WindowInactiveHandlerC::_handle(IntuiMessageC &)
- {
- inactivated();
- return TRUE;
- };
-
- // **************************************************************
-
- WindowRefreshHandlerChainC::WindowRefreshHandlerChainC(WindowC &w)
- : WindowEventHandlerChainC(w,IDCMP_REFRESHWINDOW)
- {
- }
-
- BOOL WindowRefreshHandlerChainC::handle(MessageC &msg)
- {
- LockLayerInfo(&window()->window()->WScreen->LayerInfo);
- window()->beginRefresh();
- BOOL b = WindowEventHandlerChainC::handle(msg);
- window()->endRefresh();
- UnlockLayerInfo(&window()->window()->WScreen->LayerInfo);
- return b;
- }
-
- // **************************************************************
-
- WindowRefreshHandlerC::WindowRefreshHandlerC(WindowRefreshHandlerChainC &c)
- : WindowEventHandlerC((WindowEventHandlerChainC &) c)
- {
- }
-
- BOOL WindowRefreshHandlerC::_handle(IntuiMessageC &)
- {
- refresh();
- return TRUE;
- };
-
- // **************************************************************
-
- WindowNewsizeHandlerC::WindowNewsizeHandlerC(WindowC &w)
- : WindowEventHandlerC(w,IDCMP_NEWSIZE)
- {
- }
-
- BOOL WindowNewsizeHandlerC::_handle(IntuiMessageC &)
- {
- newsize();
- return TRUE;
- };
-
- // **************************************************************
-
- WindowSizeverifyHandlerC::WindowSizeverifyHandlerC(WindowC &w)
- : WindowEventHandlerC(w,IDCMP_SIZEVERIFY)
- {
- }
-
- BOOL WindowSizeverifyHandlerC::_handle(IntuiMessageC &)
- {
- verify();
- return TRUE;
- };
-
- // **************************************************************
-
- WindowChangeHandlerC::WindowChangeHandlerC(WindowC &w)
- : WindowEventHandlerC(w,IDCMP_CHANGEWINDOW)
- {
- }
-
- BOOL WindowChangeHandlerC::_handle(IntuiMessageC &)
- {
- change();
- return TRUE;
- };
-
-