home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 3
/
AACD03.BIN
/
AACD
/
Programming
/
Triton
/
Source
/
classes
/
string.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-05-23
|
14KB
|
425 lines
/*
* 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.
*
*/
/****** triton.library/class_String ******
*
* NAME
* class_String -- A GadTools string gadget
*
* SUPERCLASS
* class_DisplayObject
*
* SYNOPSIS
* TROB_String
*
* ATTRIBUTES
* <Default> : STRPTR string
* [create, set, get]
* TRAT_Value : UWORD maxchars (default: 64)
* [create]
* TRST_Filter : STRPTR filter: Only characters in this string will
* be accepted if present, otherwise all characters
* are allowed.
* [create]
* TRAT_Flags : ULONG flags
* - TRST_INVISIBLE : Invisible typing
* - TRST_NORETURNBROADCAST : Don't broadcast <Return>
* key presses to the window.
* - TRST_FLOAT : Only one "." or "," symbol
* is accepted.
* [create]
*
* APPLICATION MESSAGES
* TRMS_NEWVALUE is sent when <Return> has been pressed in an activated
* string gadget. trm_Data contains a pointer to the new string and is
* only valid as long as the object exists. It is advised that you do not
* check for TRMS_NEWVALUE messages but instead read the current string
* using TR_GetAttribute() when you need it.
*
* OBJECT MESSAGES
* TROM_ACTIVATE : Activate the string gadget.
*
******/
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////// Include our stuff //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define TR_THIS_IS_TRITON
#define TR_EXTERNAL_ONLY
#include <intuition/sghooks.h>
#include <libraries/triton.h>
#include <clib/triton_protos.h>
#include "/internal.h"
#include "string.def"
#include "/prefs/Triton.h"
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////// Object data //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define OBJECT (&(object->DO.O))
#define DISPLAYOBJECT (&(object->DO))
#define STRING object
static const char *nullstr="";
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////// The edit hook //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define KEYB_SHORTCUT 1
#define KEYB_POPUP 2
#ifndef RAWKEY_UP
#define RAWKEY_UP 0x4C
#define RAWKEY_DOWN 0x4D
#endif
#define USERFLAG_UP_DOWN_ARROW 0x1
#define USERFLAG_POPUP 0x2
struct StrGadUserData { ULONG flags; };
struct CombStringInfo {
ULONG magic;
struct CombStringInfo *self;
struct StringInfo strinfo;
struct StringExtend strextend;
struct Hook edithook;
};
#define IEQUALIFIER_SHIFT (IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT)
ULONG __asm __saveds TR_StrEditHookEntry(register __a0 struct Hook *hook,
register __a2 struct SGWork *sgw,
register __a1 ULONG *msg)
{
// struct StrGadUserData *userdata;
int qual, rawcode; //, uparrow;
struct TROD_String *object;
if( msg[0] == SGH_KEY)
{
object=((struct TROD_String *)(sgw->Gadget->UserData));
rawcode = sgw->IEvent->ie_Code;
qual = sgw->IEvent->ie_Qualifier;
/* Apply filter */
if(sgw->Code!=27)
if(sgw->EditOp == EO_INSERTCHAR || sgw->EditOp == EO_REPLACECHAR)
if(STRING->Filter)
if(TR_FirstOccurance(sgw->Code,STRING->Filter)==-1)
{
sgw->Actions &= ~(SGA_USE|SGA_REUSE);
sgw->Actions |= SGA_BEEP;
sgw->Code = 0;
}
/* Float separator check */
if((sgw->Code=='.')||(sgw->Code==','))
if(sgw->EditOp == EO_INSERTCHAR || sgw->EditOp == EO_REPLACECHAR)
if(STRING->Flags&TRST_FLOAT)
if((TR_FirstOccurance(',',(((struct StringInfo *)
(((struct Gadget *)
DISPLAYOBJECT->PrivData)->SpecialInfo))->Buffer))!=-1)
|| (TR_FirstOccurance('.',(((struct StringInfo *)
(((struct Gadget *)
DISPLAYOBJECT->PrivData)->SpecialInfo))->Buffer))!=-1))
{
sgw->Actions &= ~(SGA_USE|SGA_REUSE);
sgw->Actions |= SGA_BEEP;
sgw->Code = 0;
}
if( sgw->EditOp == EO_INSERTCHAR ||
sgw->EditOp == EO_REPLACECHAR ||
sgw->EditOp == EO_BADFORMAT ||
( sgw->EditOp == EO_NOOP &&
sgw->Actions == (SGA_USE|SGA_BEEP) &&
sgw->NumChars == (sgw->StringInfo->MaxChars - 1)
)
)
{
if ((qual & IEQUALIFIER_RCOMMAND) || (sgw->Code==27))
{
sgw->Actions &= ~(SGA_USE|SGA_BEEP|SGA_REDISPLAY);
sgw->IEvent->ie_Qualifier &= ~IEQUALIFIER_RCOMMAND;
if (!(qual & IEQUALIFIER_REPEAT))
{
sgw->Actions |= SGA_REUSE|SGA_END;
sgw->Code = KEYB_SHORTCUT;
}
}
}
if( ( (rawcode==68) && (!(STRING->Flags & TRST_NORETURNBROADCAST)) )
|| (rawcode==76)
|| (rawcode==77)
|| (rawcode==95) )
{
sgw->Actions &= ~(SGA_USE|SGA_BEEP|SGA_REDISPLAY);
sgw->IEvent->ie_Qualifier &= ~IEQUALIFIER_RCOMMAND;
if (!(qual & IEQUALIFIER_REPEAT))
{
sgw->Actions |= SGA_REUSE|SGA_END;
sgw->Code = KEYB_SHORTCUT;
}
}
// if (userdata = (struct StrGadUserData *)sgw->Gadget->UserData)
// {
// if (userdata->flags & USERFLAG_POPUP)
// {
// if( (sgw->IEvent->ie_Qualifier & IEQUALIFIER_SHIFT) &&
// rawcode == RAWKEY_DOWN )
// {
// sgw->Actions &= ~(SGA_USE|SGA_BEEP|SGA_REDISPLAY);
// sgw->Actions |= SGA_END;
// sgw->Code = KEYB_POPUP;
// return (TRUE);
// }
// }
// if (userdata->flags & USERFLAG_UP_DOWN_ARROW)
// {
// uparrow = (rawcode == RAWKEY_UP);
// if (uparrow || (rawcode == RAWKEY_DOWN))
// {
// sgw->Actions &= ~(SGA_USE|SGA_BEEP|SGA_REDISPLAY);
// sgw->Actions |= SGA_REUSE|SGA_END;
// sgw->Code = KEYB_SHORTCUT;
// }
// }
// }
return (TRUE);
}
return (FALSE);
}
struct Hook TR_StrEditHook = { { NULL }, TR_StrEditHookEntry, NULL, NULL };
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////// Methods //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
TR_METHOD(String,NEW,NewData)
{
if(!TRDP_DisplayObject_NEW(object,messageid,data,metaclass->trc_SuperClass)) return NULL;
data->project->trp_IDCMPFlags|=STRINGIDCMP;
if(STRING->MaxChars==0) STRING->MaxChars=64;
if(!(STRING->WorkBuffer=
(STRPTR)TR_AllocPooled(data->project->trp_MemPool,STRING->MaxChars+2))) return NULL;
DISPLAYOBJECT->MinHeight=(data->project->trp_PropFont->tf_YSize)+6;
DISPLAYOBJECT->MinWidth=DISPLAYOBJECT->MinHeight;
DISPLAYOBJECT->XResize=TRUE;
DISPLAYOBJECT->Flags|=TROB_DISPLAYOBJECT_TABOK;
return (ULONG)object;
}
TR_METHOD(String,INSTALL,InstallData)
{
struct TR_Project *project;
TRDP_DisplayObject_INSTALL(object,messageid,data,metaclass->trc_SuperClass);
project=OBJECT->Project;
TR_InternalAreaFill(project,NULL,DISPLAYOBJECT->Left+4,DISPLAYOBJECT->Top+2,
DISPLAYOBJECT->Left+DISPLAYOBJECT->Width-5,
DISPLAYOBJECT->Top+DISPLAYOBJECT->Height-3,TRBF_NONE);
if(!((STRING->StrExt)=(struct StringExtend *)
TR_AllocPooled(project->trp_MemPool,sizeof(struct StringExtend)))) return NULL;
STRING->StrExt->Pens[1]=TR_GetPen(project,TRPT_TRITONPEN,TRTP_USSTRINGGADBACK);
STRING->StrExt->Pens[0]=TR_GetPen(project,TRPT_TRITONPEN,TRTP_USSTRINGGADFRONT);
STRING->StrExt->ActivePens[1]=TR_GetPen(project,TRPT_TRITONPEN,TRTP_SSTRINGGADBACK);
STRING->StrExt->ActivePens[0]=TR_GetPen(project,TRPT_TRITONPEN,TRTP_SSTRINGGADFRONT);
if(STRING->Flags&TRST_INVISIBLE)
{
STRING->StrExt->Pens[1]=TR_GetPen(project,TRPT_TRITONPEN,TRTP_USSTRINGGADFRONT);
STRING->StrExt->ActivePens[1]=TR_GetPen(project,TRPT_TRITONPEN,TRTP_SSTRINGGADFRONT);
}
STRING->StrExt->EditHook=&TR_StrEditHook;
STRING->StrExt->WorkBuffer=STRING->WorkBuffer;
if(DISPLAYOBJECT->PrivData=(ULONG)
TR_CreateGadgetTags(OBJECT->Project,
OBJECT,
STRING_KIND,
DISPLAYOBJECT->Left,
DISPLAYOBJECT->Top,
DISPLAYOBJECT->Width,
DISPLAYOBJECT->Height,
STRINGA_Justification, GACT_STRINGLEFT,
STRINGA_ReplaceMode, FALSE,
STRINGA_ExitHelp, FALSE,
GA_TabCycle, TRUE,
GTST_String, STRING->String,
GTST_MaxChars, STRING->MaxChars,
GA_Disabled, TR_DO_DISABLED,
TAG_END))
{
((struct StringInfo*)(((struct Gadget *)(DISPLAYOBJECT->PrivData))->SpecialInfo))->Extension=
(STRING->StrExt);
return 1L;
}
return NULL;
}
TR_SIMPLEMETHOD(String,PREGTREMOVE)
{
ULONG textlength;
FreeVec((APTR)(STRING->String));
textlength=TR_FirstOccurance(0,(STRPTR)
(((struct StringInfo *)
(((struct Gadget *)DISPLAYOBJECT->PrivData)->SpecialInfo))->Buffer))+1;
if(!(STRING->String=AllocVec(textlength, MEMF_ANY))) return NULL;
CopyMem((APTR)
(((struct StringInfo *)(((struct Gadget *)DISPLAYOBJECT->PrivData)->SpecialInfo))->Buffer),
(APTR)(STRING->String),textlength);
return 1L;
}
TR_SIMPLEMETHOD(String,REMOVE)
{
if(STRING->StrExt)
TR_FreePooled(OBJECT->Project->trp_MemPool,(APTR)(STRING->StrExt),sizeof(struct StringExtend));
return 1L;
}
TR_METHOD(String,SETATTRIBUTE,SetAttributeData)
{
ULONG textlength;
switch(data->attribute)
{
case TRAT_Value:
STRING->MaxChars=(UWORD)(data->value);
return 1;
case TRAT_Flags:
STRING->Flags=data->value;
return 1;
case TRST_Filter:
textlength=TR_FirstOccurance(0,(STRPTR)(data->value))+1;
if(!(STRING->Filter=
(STRPTR)TR_AllocPooled(OBJECT->Project->trp_MemPool,textlength)))
return 0;
CopyMem((APTR)(data->value),(APTR)(STRING->Filter),textlength);
return 1;
case 0:
if(!(data->value)) data->value=(ULONG)nullstr;
if(STRING->String) FreeVec((APTR)(STRING->String));
textlength=TR_FirstOccurance(0,(STRPTR)(data->value))+1;
if(!(STRING->String=AllocVec(textlength, MEMF_ANY))) return 0;
CopyMem((APTR)(data->value),(APTR)(STRING->String),textlength);
if(DISPLAYOBJECT->Installed)
GT_SetGadgetAttrs((struct Gadget *)DISPLAYOBJECT->PrivData,OBJECT->Project->trp_Window,NULL,
GTST_String,STRING->String,GA_Disabled,TR_DO_DISABLED,
TAG_END);
return 1;
default:
return TRDP_DisplayObject_SETATTRIBUTE(object,messageid,data,metaclass->trc_SuperClass);
}
}
TR_SIMPLEMETHOD(String,GETATTRIBUTE)
{
switch((ULONG)data)
{
case 0:
return (ULONG)
(((struct StringInfo *)(((struct Gadget *)DISPLAYOBJECT->PrivData)->SpecialInfo))->Buffer);
default:
return TRDP_DisplayObject_GETATTRIBUTE(object,messageid,data,metaclass->trc_SuperClass);
}
}
TR_SIMPLEMETHOD(String,KEYDOWN)
{
ActivateGadget((struct Gadget *)DISPLAYOBJECT->PrivData,OBJECT->Project->trp_Window,NULL);
OBJECT->Project->trp_CurrentID=0;
OBJECT->Project->trp_IsShortcutDown=FALSE;
return 1;
}
TR_SIMPLEMETHOD(String,DISABLED_ENABLED)
{
GT_SetGadgetAttrs((struct Gadget *)DISPLAYOBJECT->PrivData,OBJECT->Project->trp_Window,NULL,
GA_Disabled,TR_DO_DISABLED,TAG_END);
return 1;
}
TR_METHOD(String,EVENT,EventData)
{
struct TR_Message *m;
if((data->imsg->Class==IDCMP_GADGETUP)&&(data->imsg->IAddress==(APTR)(DISPLAYOBJECT->PrivData)))
if(m=TR_CreateMsg(Self.DO.O.Project->trp_App))
{
m->trm_ID=DISPLAYOBJECT->ID;
m->trm_Class=TRMS_NEWVALUE;
m->trm_Data=(ULONG)
(((struct StringInfo *)(((struct Gadget *)DISPLAYOBJECT->PrivData)->SpecialInfo))->Buffer);
return TROM_EVENT_SWALLOWED;
}
return TROM_EVENT_CONTINUE;
}
TR_SIMPLEMETHOD(String,DISPOSE)
{
// if(STRING->WorkBuffer) TR_FreePooled((void *)(STRING->WorkBuffer),STRING->MaxChars);
// Not needed; the entire pool gets deleted
if(STRING->String) FreeVec((APTR)(STRING->String));
return 1;
}
TR_SIMPLEMETHOD(String,ACTIVATE)
{
if((struct Gadget *)DISPLAYOBJECT->PrivData)
{
TR_DoMethodID(OBJECT->Project, OBJECT->Project->trp_CurrentID, TROM_KEYCANCELLED, NULL);
//TR_DoShortcut(OBJECT->Project, 0, TR_SHORTCUT_CANCELLED, NULL);
return ActivateGadget((struct Gadget *)DISPLAYOBJECT->PrivData,
OBJECT->Project->trp_Window,NULL);
}
return 0;
}