home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 3
/
AACD03.BIN
/
AACD
/
Programming
/
Triton
/
Source
/
src
/
dragndrop_prim.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-05-23
|
12KB
|
387 lines
#ifdef oiehroishreoifh
/*
* OpenTriton -- A free release of the triton.library source code
* Copyright (C) 1993-1998 Stefan Zeiger
*
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* dragndrop_prim.c - Drag & Drop primitives
*
*/
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////// Include our stuff //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define INTUI_V36_NAMES_ONLY
#define TR_NOSUPPORT
#define TR_THIS_IS_TRITON
#include <exec/types.h>
#include <exec/lists.h>
#include <exec/ports.h>
#include <exec/libraries.h>
#include <exec/memory.h>
#include <exec/execbase.h>
#include <graphics/gfx.h>
#include <graphics/gels.h>
#include <graphics/clip.h>
#include <graphics/rastport.h>
#include <graphics/view.h>
#include <graphics/gfxbase.h>
#include <graphics/text.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/alib_protos.h>
#include <pragmas/exec_pragmas.h>
#include <pragmas/dos_pragmas.h>
#include "include/libraries/triton.h"
#include "include/clib/triton_protos.h"
#include "dragndrop.h"
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////// Extended bob object //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
typedef struct TR_Bob
{
struct TR_Project * project; // Triton Project
struct GelsInfo gelinfo; // GelInfo for entire structure
WORD nextline [8]; // Nextline data
WORD * lastcolor [8]; // Last colour data
struct RastPort * mainrast; // Rastport bob is displayed in
struct collTable colltable; // Collision table
struct VSprite vshead; // Head sprite anchor
struct VSprite vstail; // Tail sprite anchor
struct VSprite bobvsprite; // Vsprite used for bob
struct Bob bob; // Data for a single bob
struct RastPort rastport; // Rastport for our BOB
struct BitMap bitmap; // Bitmap for our BOB
ULONG planesize; // Size of one plane in bob
UBYTE * planedata; // Pointer to first plane
UBYTE * chipdata; // Pointer to all CHIP RAM data
ULONG chipsize; // Total size of allocated CHIP
} TR_Bob;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////// Private functions //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
TR_Bob * TR_CreateBob(struct TR_Project *project, int width, int height, int transp);
void TR_FreeBob(TR_Bob *aBob);
void TR_UpdateBob(TR_Bob *aBob, ULONG x, ULONG y);
int TR_PickUpBob(TR_Bob *aBob, ULONG hit, ULONG x, ULONG y);
void TR_DropBob(TR_Bob *aBob);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////// Drag & drop primitives //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
* TR_CreateBob(project, width, height, transp)
*
* This function does all the initialisation necessary to allow us
* to use a single BOB in the given rastport. A new bitmap is allocated
* of dimensions width x height into which data can be rendered.
*
* If successful, this function returns a pointer to a TR_Bob structure
* which contains, among other things, the rastport and bob structure
* you will use when calling system routines to manipulate the bob.
*
* Note that the bob must be removed from the Gel list before rendering
* into it.
*
* If transp is true, then the BOB will be transparent on colour zero.
* In this case, you must call InitMasks(aBob->vsprite) whenever
* you make a change to the image, to recalculate the mask.
*/
TR_Bob *TR_CreateBob(struct TR_Project *project, int width, int height, int transp)
{
struct GelsInfo * gInfo;
struct Bob * bob;
struct VSprite * vsprite;
struct RastPort * rport=project->trp_Window->RPort;
TR_Bob * aBob;
UBYTE * chipdata;
ULONG linesize, planesize, imagesize, chipsize, wordwidth, depth, i;
wordwidth = (width + 15) >> 4;
depth = rport->BitMap->Depth;
if(!( aBob = (TR_Bob *)AllocMem(sizeof(TR_Bob), MEMF_CLEAR) )) return NULL;
aBob->mainrast = rport;
aBob->project = project;
gInfo = &aBob->gelinfo;
gInfo->nextLine = aBob->nextline;
gInfo->lastColor = aBob->lastcolor;
gInfo->collHandler = &aBob->colltable;
gInfo->sprRsrvd = 0x03;
/*
* Set left-most and top-most to 1 to better keep items
* inside the display boundaries.
*/
gInfo->leftmost = 1;
gInfo->topmost = 1;
gInfo->rightmost = (rport->BitMap->BytesPerRow << 3) - 1;
gInfo->bottommost = rport->BitMap->Rows - 1;
rport->GelsInfo = gInfo;
InitGels(&aBob->vshead, &aBob->vstail, gInfo);
/*
* Now allocate a new BOB to be linked into this structure.
* We also allocate a bitmap associated with the bob, and
* give it its own RastPort so that we can render into it.
*/
linesize = sizeof(WORD) * wordwidth;
planesize = linesize * height;
imagesize = planesize * depth;
chipsize = imagesize*2 + linesize + planesize;
bob = &aBob->bob;
vsprite = &aBob->bobvsprite;
if (!(chipdata = AllocMem(chipsize, MEMF_CHIP | MEMF_CLEAR))) {
rport->GelsInfo = NULL;
FreeMem(aBob, sizeof(TR_Bob));
return (NULL);
}
aBob->chipdata = (void *)(chipdata);
aBob->chipsize = chipsize;
aBob->planedata = (void *)(chipdata);
bob->SaveBuffer = (void *)(chipdata + imagesize);
vsprite->BorderLine = (void *)(chipdata + imagesize*2);
vsprite->CollMask = (void *)(chipdata + imagesize*2 + linesize);
vsprite->Y = -9999;
vsprite->X = -9999;
vsprite->Flags = SAVEBACK | (transp ? OVERLAY : 0);
vsprite->Width = wordwidth;
vsprite->Depth = depth;
vsprite->Height = height;
vsprite->MeMask = 0;
vsprite->HitMask = 0;
vsprite->ImageData = (void *)aBob->planedata;
vsprite->SprColors = NULL;
vsprite->PlanePick = -1;
vsprite->PlaneOnOff = 0x00;
InitMasks(vsprite);
vsprite->VSBob = bob;
bob->BobVSprite = vsprite;
bob->ImageShadow = vsprite->CollMask;
bob->Flags = 0;
bob->Before = NULL;
bob->After = NULL;
bob->BobComp = NULL;
bob->DBuffer = NULL;
/*
* Now setup the Rastport and Bitmap so we can render into the BOB
*/
InitRastPort(&aBob->rastport);
InitBitMap(&aBob->bitmap, depth, width, height);
aBob->rastport.BitMap = &aBob->bitmap;
for (i = 0; i < depth; i++)
aBob->bitmap.Planes[i] = aBob->planedata + i * planesize;
return (aBob);
}
/*
* TR_FreeBob(aBob)
*
* Frees the bob allocated earlier, along with all other associated info
* Also removes all GELs from the system rastport.
*/
void TR_FreeBob(TR_Bob *aBob)
{
aBob->mainrast->GelsInfo = NULL;
FreeMem(aBob->chipdata, aBob->chipsize);
FreeMem(aBob, sizeof(TR_Bob));
}
/*
* TR_PickUpBob(aBob, hit, x, y)
*
* Picks up the line and copies it into our bob's bitmap, then adds
* the bob to the screen at the current mouse location so the
* user can drag it around.
*
* If the hit is correct, we can ignore Y since the field being
* dragged is in the right box and we already know which line.
* Otherwise, Y is a pixel co-ordinate that we use to calculate
* the line of the box that's being chosen.
*
* If hit is FBOX_SELECTLEFT, then we need to calculate which line
* we are dealing with.
*
* We also record the start line we use.
*
* Returns true for success, false if we didn't have a hit after all.
*/
int TR_PickUpBob(TR_Bob *aBob, ULONG hit, ULONG x, ULONG y)
{
struct RastPort *rport = aBob->project->trp_Window->RPort;
struct RastPort *bobrport = &aBob->rastport;
char viewbuf[50];
int line;
int box;
int xpos;
int ypos;
int len;
// if (hit == FBOX_NOSELECT) {
// return (FALSE);
// } else if (hit == FBOX_SELECTLEFT) {
// box = FORMAT_LEFTBOX;
// line = (y - FBoxA_Top - 2);
// if (line < FBoxSpacing)
// line = 0;
// else
// line /= FBoxSpacing;
// if (line >= FBoxA_CurLines)
// return (FALSE);
// } else {
// /* Right box */
// box = FORMAT_RIGHTBOX;
// line = hit;
// if (line >= FBoxB_CurLines)
// return (FALSE);
}
/*
* Okay, got a definite hit so go ahead and start the drag
*/
FormatDragBox = box;
FormatDragLine = line;
SetRast(bobrport, 0); /* Erase rast bitmap */
SetAPen(bobrport, 2); /* White foreground */
SetBPen(bobrport, 1); /* Black background */
SetDrMd(bobrport, JAM2); /* Solid text */
SetFont(bobrport, FormBufFont);
if (box == FORMAT_LEFTBOX) {
FieldInit *fi = &FieldTypes[AvailableFields[line].type];
mysprintf(viewbuf, FBoxA_FormString, MSG(fi->titlemsgid), fi->idchar);
len = FBoxA_NumChars;
xpos = FBoxA_Left + 2;
ypos = FBoxA_Top + 2 + line * FBoxSpacing;
} else {
FieldInit *fi = &FieldTypes[CurrentFields[line].type];
mysprintf(viewbuf, FBoxB_FormString, MSG(fi->titlemsgid),
CurrentFields[line].width, fi->idchar);
len = FBoxB_NumChars;
xpos = FBoxB_Left + 2;
ypos = FBoxB_Top + 2 + line * FBoxSpacing;
}
ABob->bob.BobVSprite->X = xpos;
ABob->bob.BobVSprite->Y = ypos;
FBoxDeltaX = xpos - x;
FBoxDeltaY = ypos - y;
Move(bobrport, 0, FormBufFont->tf_Baseline+1);
Text(bobrport, viewbuf, len);
/*
* Now draw highlight above and below the text
*/
SetAPen(bobrport, 1);
Move(bobrport, 0, 0);
Draw(bobrport, len * FormBufFont->tf_XSize - 1, 0);
Move(bobrport, 0, FormBufFont->tf_YSize + 1);
Draw(bobrport, len * FormBufFont->tf_XSize - 1, FormBufFont->tf_YSize + 1);
InitMasks(ABob->bob.BobVSprite);
SortGList(rport);
DrawGList(rport, ViewPortAddress(aBob->project->trp_Window));
return (1);
}
/****i* triton.library/TR_DropBob ******
*
* NAME
* TR_DropBob -- Drop a Triton bob
*
* SYNOPSIS
* TR_DropBob(aBob)
*
* void TR_DropBob(TR_Bob *);
*
* FUNCTION
* Drops the specified bob, triggering any necessary action.
*
* SEE ALSO
* TR_CreateBob(), TR_FreeBob(), TR_PickUpBob(), TR_UpdateBob()
*
******/
void TR_DropBob(TR_Bob *aBob)
{
TR_UpdateBob(aBob, 0, -9999); // Kill any highlighted region
}
/****i* triton.library/TR_UpdateBob ******
*
* NAME
* TR_UpdateBob -- Updates the position of a Triton bob
*
* SYNOPSIS
* TR_UpdateBob(aBob, x, y)
*
* void TR_UpdateBob(TR_Bob *, ULONG, ULONG);
*
* FUNCTION
* Moves a currently displayed Triton bob to a new position and
* draws any highlights etc. that are deemed necessary.
*
* SEE ALSO
* TR_CreateBob(), TR_FreeBob(), TR_PickUpBob(), TR_DropBob()
*
******/
void TR_UpdateBob(TR_Bob *aBob, ULONG x, ULONG y)
{
// Move bob off-screen
//ABob->bob.BobVSprite->X = 0;
//ABob->bob.BobVSprite->Y = -9999;
// Do some rendering in the window
// Move bob back on screen
ABob->bob.BobVSprite->X = x;
ABob->bob.BobVSprite->Y = y;
}
#endif