📄 wdefbase.c
字号:
/****************************************************************************
*
* Open Watcom Project
*
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
* ========================================================================
*
* This file contains Original Code and/or Modifications of Original
* Code as defined in and that are subject to the Sybase Open Watcom
* Public License version 1.0 (the 'License'). You may not use this file
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
* provided with the Original Code and Modifications, and is also
* available at www.sybase.com/developer/opensource.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
* NON-INFRINGEMENT. Please see the License for the specific language
* governing rights and limitations under the License.
*
* ========================================================================
*
* Description: WHEN YOU FIGURE OUT WHAT THIS FILE DOES, PLEASE
* DESCRIBE IT HERE!
*
****************************************************************************/
#include <windows.h>
#include <string.h>
#include <mbstring.h>
#include <stdlib.h>
#include "wdeglbl.h"
#include "wdeactn.h"
#include "wderes.h"
#include "wdefordr.h"
#include "wdefmenu.h"
#include "wdefont.h"
#include "wdemem.h"
#include "wdemsgbx.h"
#include "wdemsgs.gh"
#include "wdeedit.h"
#include "wderesiz.h"
#include "wdeinfo.h"
#include "wdemain.h"
#include "wdesym.h"
#include "wdefutil.h"
#include "wdectool.h"
#include "wdelist.h"
#include "wdealign.h"
#include "wdeopts.h"
#include "wde_rc.h"
#include "wdedebug.h"
#include "wdefbase.h"
/****************************************************************************/
/* macro definitions */
/****************************************************************************/
#define WDE_WORLD_PAD 20
#define WDE_WORLD_WIDTH 1024
#define WDE_WORLD_HEIGHT WDE_WORLD_WIDTH
/****************************************************************************/
/* type definitions */
/****************************************************************************/
typedef struct {
FARPROC dispatcher;
OBJPTR object_handle;
OBJ_ID object_id;
OBJPTR parent;
OBJPTR o_item;
HFONT font;
int num_children;
LIST *children;
LIST *ochildren;
WdeResizeRatio resizer;
WdeResInfo *res_info;
Bool has_hscroll;
Bool has_vscroll;
Bool in_destroy;
} WdeBaseObject;
/****************************************************************************/
/* external function prototypes */
/****************************************************************************/
extern BOOL WINEXPORT WdeBaseDispatcher ( ACTION, WdeBaseObject *,
void *, void *);
/****************************************************************************/
/* static function prototypes */
/****************************************************************************/
static BOOL WdeBaseDraw ( WdeBaseObject *, RECT *, HDC *);
static BOOL WdeBaseDestroy ( WdeBaseObject *, BOOL *, void *);
static BOOL WdeBaseIsMarkValid ( WdeBaseObject *, BOOL *, void *);
static BOOL WdeBaseGetResizeInfo ( WdeBaseObject *, RESIZE_ID *, void *);
static BOOL WdeBaseValidateAction ( WdeBaseObject *, ACTION *, void *);
static BOOL WdeBaseGetWindowHandle ( WdeBaseObject *, HWND *, void *);
static BOOL WdeBaseAddSubObject ( WdeBaseObject *, OBJPTR, void *);
static BOOL WdeBaseFindSubObjects ( WdeBaseObject *, SUBOBJ_REQUEST *,
LIST **objlist );
static BOOL WdeBaseFindObjectsPt ( WdeBaseObject *, POINT *, LIST ** );
static BOOL WdeBaseRemoveSubObject ( WdeBaseObject *, OBJPTR, void *);
static BOOL WdeBaseFirstChild ( WdeBaseObject *, void *, void *);
static BOOL WdeBasePutChildFirst ( WdeBaseObject *, OBJPTR, void *);
static BOOL WdeBaseGetFirstChild ( WdeBaseObject *, OBJPTR *, void *);
static BOOL WdeBaseNotify ( WdeBaseObject *, NOTE_ID *, void *);
static BOOL WdeBaseLocation ( WdeBaseObject *, RECT *, void *);
static BOOL WdeBaseIdentify ( WdeBaseObject *, OBJ_ID *, void *);
static BOOL WdeBaseGetSubObjectList( WdeBaseObject *, LIST **, void *);
static BOOL WdeBaseGetFont ( WdeBaseObject *, HFONT *, void *);
static BOOL WdeBaseGetResizer ( WdeBaseObject *, WdeResizeRatio *,
OBJPTR * );
static BOOL WdeBaseGetNCSize ( WdeBaseObject *, RECT *, void *);
static BOOL WdeBaseGetScrollRect ( WdeBaseObject *, RECT *, void *);
static Bool WdeBaseGetResizeInc ( WdeBaseObject *, POINT *, void *);
static Bool WdeBaseGetNextChild ( WdeBaseObject *, OBJPTR *, Bool * );
static BOOL WdeBaseResolveSymbol ( WdeBaseObject *, Bool *, Bool * );
static BOOL WdeBaseResolveHelpSymbol( WdeBaseObject *, Bool *, Bool * );
/****************************************************************************/
/* static variables */
/****************************************************************************/
static FARPROC WdeBaseDispatch;
static DISPATCH_ITEM WdeBaseActions[] = {
{ DRAW , (BOOL (*)(OBJPTR, void *, void *))WdeBaseDraw }
, { LOCATE , (BOOL (*)(OBJPTR, void *, void *))WdeBaseLocation }
, { DESTROY , (BOOL (*)(OBJPTR, void *, void *))WdeBaseDestroy }
, { VALIDATE_ACTION , (BOOL (*)(OBJPTR, void *, void *))WdeBaseValidateAction }
, { NOTIFY , (BOOL (*)(OBJPTR, void *, void *))WdeBaseNotify }
, { RESIZE_INFO , (BOOL (*)(OBJPTR, void *, void *))WdeBaseGetResizeInfo }
, { FIND_SUBOBJECTS , (BOOL (*)(OBJPTR, void *, void *))WdeBaseFindSubObjects }
, { FIND_OBJECTS_PT , (BOOL (*)(OBJPTR, void *, void *))WdeBaseFindObjectsPt }
, { ADD_SUBOBJECT , (BOOL (*)(OBJPTR, void *, void *))WdeBaseAddSubObject }
, { REMOVE_SUBOBJECT , (BOOL (*)(OBJPTR, void *, void *))WdeBaseRemoveSubObject }
, { GET_WINDOW_HANDLE , (BOOL (*)(OBJPTR, void *, void *))WdeBaseGetWindowHandle }
, { GET_SUBOBJ_LIST , (BOOL (*)(OBJPTR, void *, void *))WdeBaseGetSubObjectList }
, { IDENTIFY , (BOOL (*)(OBJPTR, void *, void *))WdeBaseIdentify }
, { GET_FONT , (BOOL (*)(OBJPTR, void *, void *))WdeBaseGetFont }
, { GET_RESIZER , (BOOL (*)(OBJPTR, void *, void *))WdeBaseGetResizer }
, { GET_NC_SIZE , (BOOL (*)(OBJPTR, void *, void *))WdeBaseGetNCSize }
, { BECOME_FIRST_CHILD , (BOOL (*)(OBJPTR, void *, void *))WdeBaseFirstChild }
, { GET_FIRST_CHILD , (BOOL (*)(OBJPTR, void *, void *))WdeBaseGetFirstChild }
, { PUT_ME_FIRST , (BOOL (*)(OBJPTR, void *, void *))WdeBasePutChildFirst }
, { GET_SCROLL_RECT , (BOOL (*)(OBJPTR, void *, void *))WdeBaseGetScrollRect }
, { GET_RESIZE_INC , (BOOL (*)(OBJPTR, void *, void *))WdeBaseGetResizeInc }
, { IS_MARK_VALID , (BOOL (*)(OBJPTR, void *, void *))WdeBaseIsMarkValid }
, { RESOLVE_SYMBOL , (BOOL (*)(OBJPTR, void *, void *))WdeBaseResolveSymbol }
, { RESOLVE_HELPSYMBOL , (BOOL (*)(OBJPTR, void *, void *))WdeBaseResolveHelpSymbol}
, { GET_NEXT_CHILD , (BOOL (*)(OBJPTR, void *, void *))WdeBaseGetNextChild }
};
#define MAX_ACTIONS ( sizeof( WdeBaseActions ) / sizeof ( DISPATCH_ITEM ) )
OBJPTR WINEXPORT WdeBaseCreate ( OBJPTR parent, RECT *obj_rect,
OBJPTR handle)
{
RECT rect;
WdeBaseObject *new;
char *text;
char *cp;
int point_size;
Bool use_default;
/* touch unused vars to get rid of warning */
_wde_touch(obj_rect);
WdeDebugCreate("Base", parent, obj_rect, handle);
new = (WdeBaseObject *) WdeMemAlloc ( sizeof(WdeBaseObject) );
if ( new == NULL ) {
WdeWriteTrail("WdeBaseCreate: Malloc failed");
return ( new );
}
memset ( new, 0, sizeof(WdeBaseObject) );
new->object_id = BASE_OBJ;
new->parent = parent;
new->font = WdeGetEditFont();
new->dispatcher = WdeBaseDispatch;
new->res_info = WdeGetCurrentRes();
if ( !new->font || !new->res_info ) {
WdeWriteTrail ( "WdeBaseCreate: NULL font or NULL res_info!" );
return ( NULL );
}
if( new->res_info->edit_win != NULL ) {
GetClientRect( new->res_info->edit_win, &rect );
} else {
SetRectEmpty( &rect );
}
InflateRect( &rect, WDE_WORLD_PAD, WDE_WORLD_PAD );
if ( handle == NULL ) {
new->object_handle = new;
} else {
new->object_handle = handle;
}
new->o_item = Create( OBJ_ITEM, parent, &rect, new->object_handle );
use_default = TRUE;
text = WdeAllocRCString( WDE_BASEOBJECTFONT );
if( text ) {
cp = _mbschr( text, '.' );
if( cp ) {
*cp = '\0';
cp++;
point_size = atoi( cp );
use_default = FALSE;
}
}
if( use_default ) {
WdeGetResizerFromFont( &new->resizer, "Helv", 8 );
} else {
WdeGetResizerFromFont( &new->resizer, text, point_size );
}
if( text ) {
WdeFreeRCString( text );
}
return( new );
}
BOOL WINEXPORT WdeBaseDispatcher (ACTION act, WdeBaseObject *obj,
void *p1, void *p2)
{
int i;
WdeDebugDispatch("Base", act, obj, p1, p2);
for ( i = 0; i < MAX_ACTIONS; i++ ) {
if( WdeBaseActions[i].id == act ) {
return( (WdeBaseActions[i].rtn)( obj, p1, p2 ) );
}
}
return (Forward ((OBJPTR)obj->o_item, act, p1, p2));
}
Bool WdeBaseInit ( Bool first )
{
_wde_touch(first);
WdeBaseDispatch = MakeProcInstance((FARPROC)WdeBaseDispatcher,
WdeGetAppInstance());
return( TRUE );
}
void WdeBaseFini ( void )
{
FreeProcInstance(WdeBaseDispatch);
}
BOOL WdeBaseIsMarkValid ( WdeBaseObject *obj, BOOL *flag, void *p2 )
{
/* touch unused vars to get rid of warning */
_wde_touch(p2);
_wde_touch(obj);
*flag = FALSE;
return ( TRUE );
}
Bool WdeBaseGetNextChild ( WdeBaseObject *obj, OBJPTR *o, Bool *up )
{
return ( WdeGetNextChild ( &obj->ochildren, o, *up ) );
}
BOOL WdeBaseResolveSymbol ( WdeBaseObject *obj, Bool *b, Bool *from_id )
{
LIST *olist;
OBJPTR child;
if ( obj->res_info->hash_table ) {
for ( olist = obj->children; olist; olist = ListNext ( olist ) ) {
child = ListElement ( olist );
Forward ( child, RESOLVE_SYMBOL, b, from_id );
}
}
return ( TRUE );
}
BOOL WdeBaseResolveHelpSymbol ( WdeBaseObject *obj, Bool *b, Bool *from_id )
{
LIST *olist;
OBJPTR child;
if ( obj->res_info->hash_table ) {
for ( olist = obj->children; olist; olist = ListNext ( olist ) ) {
child = ListElement ( olist );
Forward ( child, RESOLVE_HELPSYMBOL, b, from_id );
}
}
return ( TRUE );
}
BOOL WdeBaseDestroy ( WdeBaseObject *obj, BOOL *flag, void *p2 )
{
OBJPTR sub_obj;
LIST *clist;
/* touch unused vars to get rid of warning */
_wde_touch(p2);
/* if the user initiated this destroy then don't do it! */
if ( *flag ) {
return ( FALSE );
}
obj->in_destroy = TRUE;
/* destroy all children */
clist = WdeListCopy ( obj->children );
for( ; clist; clist = ListConsume(clist) ) {
sub_obj = ListElement( clist );
Destroy ( sub_obj, *flag );
}
WdeFreeOrderedList ( obj->ochildren );
Destroy ( obj->o_item, *flag );
WdeMemFree( obj );
return ( TRUE );
}
BOOL WdeBaseGetScrollRect ( WdeBaseObject *obj, RECT *r, void *p2 )
{
return ( WdeBaseLocation ( obj, r, p2 ) );
}
Bool WdeBaseGetResizeInc ( WdeBaseObject *obj, POINT *p, void *p2 )
{
DialogSizeInfo d;
RECT r;
/* touch unused vars to get rid of warning */
_wde_touch(p2);
p->x = 1;
p->y = 1;
d.x = 0;
d.y = 0;
d.width = WdeGetOption( WdeOptReqGridX );
d.height = WdeGetOption( WdeOptReqGridY );
if( WdeDialogToScreen( obj, &(obj->resizer), &d, &r ) ) {
p->x = r.right;
p->y = r.bottom;
}
return ( TRUE );
}
BOOL WdeBaseGetResizer ( WdeBaseObject *obj, WdeResizeRatio *resizer,
OBJPTR *o )
{
*resizer = obj->resizer;
if ( o ) {
*o = obj;
}
return ( TRUE );
}
BOOL WdeBaseGetFont ( WdeBaseObject *obj, HFONT *font, void *p2 )
{
/* touch unused vars to get rid of warning */
_wde_touch(obj);
_wde_touch(p2);
*font = obj->font;
return ( TRUE );
}
BOOL WdeBaseGetNCSize( WdeBaseObject *obj, RECT *size, void *p2)
{
/* touch unused vars to get rid of warning */
_wde_touch(obj);
_wde_touch(p2);
memset ( size, 0, sizeof(RECT) );
return ( TRUE );
}
BOOL WdeBaseFirstChild ( WdeBaseObject *obj, void *p1, void *p2 )
{
/* touch unused vars to get rid of warning */
_wde_touch(obj);
_wde_touch(p1);
_wde_touch(p2);
return ( TRUE );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -