📄 wdefdiag.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 <win1632.h>
#include "wdeglbl.h"
#include "wdemem.h"
#include "wderes.h"
#include "wdeopts.h"
#include "wdeactn.h"
#include "wde_wres.h"
#include "wdemain.h"
#include "wdemsgbx.h"
#include "wdemsgs.gh"
#include "wdesdlg.h"
#include "wdefdlg.h"
#include "wdetest.h"
#include "wdeobjid.h"
#include "wdeinfo.h"
#include "wdefont.h"
#include "wdestyle.h"
#include "wderesiz.h"
#include "wdefmenu.h"
#include "wdegeted.h"
#include "wdefutil.h"
#include "wdectool.h"
#include "wdesdup.h"
#include "wdelist.h"
#include "wdeoinfo.h"
#include "wdefordr.h"
#include "wdesym.h"
#include "wdestat.h"
#include "wdedebug.h"
#include "wdedefin.h"
#include "wresall.h"
#include "wde_rc.h"
#include "wderesin.h"
#include "wdesvobj.h"
#include "wdectl3d.h"
#include "wdecctl.h"
#include "wdefbase.h"
#include "wdefsbar.h"
#include "wdefdiag.h"
#include "windlg.h"
#include "windlg32.h"
#include "jdlg.h"
/****************************************************************************/
/* macro definitions */
/****************************************************************************/
#ifdef __NT__
#define WDEDLGTEMPLATE (LPCDLGTEMPLATE)
#else
#define WDEDLGTEMPLATE
#endif
#define WDE_NEW_DIALOG_X 20
#define WDE_NEW_DIALOG_Y WDE_NEW_DIALOG_X + 20
#define WDE_NEW_DIALOG_HEIGHT 125
#define WDE_NEW_DIALOG_WIDTH WDE_NEW_DIALOG_HEIGHT + 20
#define WDE_TT_FONT_MIN 8
#define WDE_TT_FONT_MAX 36
#define DIALOG_MIN_SIZE_BORDER WDE_BORDER_SIZE
#define DIALOG_MIN_WIDTH 75
#define DIALOG_MIN_HEIGHT DIALOG_MIN_WIDTH
#define DEFAULT_FONT "Helv"
#define DEFAULT_POINT_SIZE 8
#define DEFAULT_JFONT "俵俽 柧挬"
#define DEFAULT_JPOINT_SIZE 10
#define DEFAULT_MEMFLAGS ( MEMFLAG_DISCARDABLE | MEMFLAG_PURE | MEMFLAG_MOVEABLE )
/****************************************************************************/
/* type definitions */
/****************************************************************************/
typedef struct {
FARPROC dispatcher;
HWND window_handle;
HWND parent_handle;
OBJ_ID object_id;
OBJPTR object_handle;
OBJPTR parent;
OBJPTR o_item;
uint_16 num_children; // was uint_8 ==> not big enough for NT
LIST *children;
LIST *ochildren;
HFONT font;
RECT nc_size;
uint_16 mem_flags;
WdeDialogBoxHeader *dialog_info;
WdeResInfo *res_info;
WdeResDlgItem *dlg_item;
WdeResizeRatio resizer;
WResID *name;
// WResHelpID *helpname;
char *file_name;
char *symbol;
char *helpsymbol;
WdeOrderMode mode;
} WdeDialogObject;
typedef struct {
uint_32 style;
uint_8 items;
uint_16 x;
uint_16 y;
uint_16 cx;
uint_16 cy;
/* char dtMenuName[]; Variable-length string */
/* char dtClassName[]; Variable-length string */
/* char dtCaptionText[]; Variable-length string */
} DialogTemplateFixed;
/****************************************************************************/
/* external function prototypes */
/****************************************************************************/
extern Bool WINEXPORT WdeDialogDispatcher ( ACTION, WdeDialogObject *,
void *, void *);
extern LRESULT WINEXPORT WdeDialogProc ( HWND, UINT, WPARAM, LPARAM );
extern Bool WINEXPORT WdeDialogDefineProc ( HWND, WORD, WPARAM, LPARAM );
/****************************************************************************/
/* static function prototypes */
/****************************************************************************/
static Bool WdeRemoveObject ( WdeResInfo *, OBJPTR );
static Bool WdeCalcDialogNCSize ( WdeDialogObject *, RECT * );
static Bool WdeKludgeDialogSize ( WdeDialogObject *, Bool, Bool );
static OBJPTR WdeDialogCreater ( OBJPTR, RECT *, OBJPTR );
static WResID *WdeCreateDialogTitle ( void );
static Bool WdeDialogTest ( WdeDialogObject *, void *, void *);
static Bool WdeDialogSaveObject ( WdeDialogObject *, WORD *, void *);
static Bool WdeDialogMove ( WdeDialogObject *, POINT *, Bool *);
static Bool WdeOffsetDialogUnits( WdeDialogObject *, RECT *, RECT *);
static Bool WdeUpdateDialogUnits( WdeDialogObject *, RECT *, RECT *);
static Bool WdeDialogGetFont ( WdeDialogObject *, HFONT *, void *);
static BOOL WdeDialogResolveSymbol ( WdeDialogObject *, Bool *, Bool * );
static BOOL WdeDialogResolveHelpSymbol ( WdeDialogObject *, Bool *, Bool * );
static Bool WdeDialogGetResizer ( WdeDialogObject *, WdeResizeRatio *,
OBJPTR * );
static Bool WdeDialogGetNCSize ( WdeDialogObject *, RECT *, void *);
static Bool WdeDialogIdentify ( WdeDialogObject *, OBJ_ID *, void *);
static Bool WdeDialogDefine ( WdeDialogObject *, POINT *, void *);
static Bool WdeDialogResize ( WdeDialogObject *, RECT *, Bool *);
static Bool WdeDialogIsMarkValid ( WdeDialogObject *, BOOL *, void *);
static Bool WdeDialogDestroy ( WdeDialogObject *, Bool *, Bool *);
static Bool WdeDialogRestore ( WdeDialogObject *, void *, void *);
static Bool WdeDialogCreateWindow ( WdeDialogObject *, Bool *, void *);
static Bool WdeDialogDestroyWindow ( WdeDialogObject *, Bool *, Bool *);
static Bool WdeDialogShowWindow ( WdeDialogObject *, Bool *, void *);
static Bool WdeDialogGetResizeInfo ( WdeDialogObject *, RESIZE_ID *, void *);
static Bool WdeDialogValidateAction( WdeDialogObject *, ACTION *, void *);
static Bool WdeDialogSetFont ( WdeDialogObject *, HFONT *, WdeResizeRatio *);
static Bool WdeDialogDraw ( WdeDialogObject *, RECT *, HDC *);
static Bool WdeDialogAddSubObject ( WdeDialogObject *, OBJPTR, void *);
static Bool WdeDialogGetSubObjectList( WdeDialogObject *, LIST **, void *);
static Bool WdeDialogFindSubObjects ( WdeDialogObject *, SUBOBJ_REQUEST *,
LIST **);
static Bool WdeDialogFindObjectsPt ( WdeDialogObject *, POINT *, LIST ** );
static Bool WdeDialogGetNextChild ( WdeDialogObject *, OBJPTR *, Bool * );
static Bool WdeDialogRemoveSubObject ( WdeDialogObject *, OBJPTR, void *);
static Bool WdeDialogGetWindowHandle ( WdeDialogObject *, HWND *, void *);
static Bool WdeDialogNotify ( WdeDialogObject *, NOTE_ID *, void *);
static Bool WdeDialogFirstChild ( WdeDialogObject *, void *, void *);
static Bool WdeDialogPutChildFirst ( WdeDialogObject *, OBJPTR, void *);
static Bool WdeDialogOnTop ( WdeDialogObject *, void *, void *);
static Bool WdeDialogPasteObject ( WdeDialogObject *, OBJPTR, POINT *);
static Bool WdeDialogCutObject ( WdeDialogObject *, WdeDialogObject **,
void *);
static Bool WdeDialogCopyObject ( WdeDialogObject *, WdeDialogObject **,
WdeDialogObject *);
static Bool WdeDialogSetOrderMode ( WdeDialogObject *, WdeOrderMode *,
void * );
static Bool WdeDialogGetOrderMode ( WdeDialogObject *, WdeOrderMode *,
void * );
static Bool WdeDialogSetObjectInfo ( WdeDialogObject *, WdeDialogBoxHeader *,
void *);
static Bool WdeDialogGetObjectInfo ( WdeDialogObject *obj,
WdeDialogBoxHeader **, WResID ** );
static Bool WdeDialogGetObjectHelpInfo( WdeDialogObject *obj,
WdeDialogBoxHeader **, char ** );
static Bool WdeDialogGetScrollRect ( WdeDialogObject *, RECT *, void *);
static Bool WdeDialogGetResizeInc ( WdeDialogObject *, POINT *, void *);
static Bool WdeBuildDialogTemplate ( WdeDialogBoxHeader *, HGLOBAL *);
static void WdeDialogSetDefineDialogInfo ( WdeDefineObjectInfo *, HWND );
static void WdeDialogGetDefineDialogInfo ( WdeDefineObjectInfo *, HWND );
static void WdeDialogSetDialogStyles ( HWND, DialogStyle );
static void WdeDialogGetDialogStyles ( HWND, DialogStyle *);
static void WdeDialogSetDialogEXStyles ( HWND, uint_32 );
static void WdeDialogGetDialogEXStyles ( HWND, uint_32 *);
static void WdeDialogSetDialogMemFlags ( HWND, uint_16 );
static void WdeDialogGetDialogMemFlags ( HWND, uint_16 *);
static void WdeDialogSetDialogFontInfo ( HWND, WdeDialogObject *);
static void WdeDialogSetDialogPntInfo ( HWND, int );
static void WdeFreeDialogObject ( WdeDialogObject * );
static void WdeWriteDialogToInfo ( WdeDialogObject * );
static BOOL WdeDialogModifyInfo ( WdeDialogObject *, WdeInfoStruct *,
void * );
/****************************************************************************/
/* static variables */
/****************************************************************************/
static FARPROC WdeDialogDispatch;
static FARPROC WdeDialogDefineProcInst;
static DLGPROC WdeDialogProcInst;
static DLGPROC WdeTestProcInst;
static HINSTANCE WdeAppInst;
static WdeDialogBoxHeader *WdeDefaultDialog;
static HFONT WdeLastFont;
static DISPATCH_ITEM WdeDialogActions[] = {
{ MOVE , (BOOL (*)(OBJPTR, void *, void *))WdeDialogMove }
, { DESTROY , (BOOL (*)(OBJPTR, void *, void *))WdeDialogDestroy }
, { RESIZE , (BOOL (*)(OBJPTR, void *, void *))WdeDialogResize }
, { DRAW , (BOOL (*)(OBJPTR, void *, void *))WdeDialogDraw }
, { VALIDATE_ACTION , (BOOL (*)(OBJPTR, void *, void *))WdeDialogValidateAction }
, { GET_WINDOW_HANDLE , (BOOL (*)(OBJPTR, void *, void *))WdeDialogGetWindowHandle }
, { CREATE_WINDOW , (BOOL (*)(OBJPTR, void *, void *))WdeDialogCreateWindow }
, { DESTROY_WINDOW , (BOOL (*)(OBJPTR, void *, void *))WdeDialogDestroyWindow }
, { SHOW_WIN , (BOOL (*)(OBJPTR, void *, void *))WdeDialogShowWindow }
, { RESIZE_INFO , (BOOL (*)(OBJPTR, void *, void *))WdeDialogGetResizeInfo }
, { NOTIFY , (BOOL (*)(OBJPTR, void *, void *))WdeDialogNotify }
, { PASTE , (BOOL (*)(OBJPTR, void *, void *))WdeDialogPasteObject }
, { COPY , (BOOL (*)(OBJPTR, void *, void *))WdeDialogCopyObject }
, { CUT , (BOOL (*)(OBJPTR, void *, void *))WdeDialogCutObject }
, { GET_OBJECT_INFO , (BOOL (*)(OBJPTR, void *, void *))WdeDialogGetObjectInfo }
, { SET_OBJECT_INFO , (BOOL (*)(OBJPTR, void *, void *))WdeDialogSetObjectInfo }
, { GET_OBJECT_HELPINFO, (BOOL (*)(OBJPTR, void *, void *))WdeDialogGetObjectHelpInfo}
, { ADD_SUBOBJECT , (BOOL (*)(OBJPTR, void *, void *))WdeDialogAddSubObject }
, { FIND_SUBOBJECTS , (BOOL (*)(OBJPTR, void *, void *))WdeDialogFindSubObjects }
, { FIND_OBJECTS_PT , (BOOL (*)(OBJPTR, void *, void *))WdeDialogFindObjectsPt }
, { REMOVE_SUBOBJECT , (BOOL (*)(OBJPTR, void *, void *))WdeDialogRemoveSubObject }
, { GET_SUBOBJ_LIST , (BOOL (*)(OBJPTR, void *, void *))WdeDialogGetSubObjectList }
, { IDENTIFY , (BOOL (*)(OBJPTR, void *, void *))WdeDialogIdentify }
, { DEFINE , (BOOL (*)(OBJPTR, void *, void *))WdeDialogDefine }
, { SET_FONT , (BOOL (*)(OBJPTR, void *, void *))WdeDialogSetFont }
, { GET_FONT , (BOOL (*)(OBJPTR, void *, void *))WdeDialogGetFont }
, { GET_RESIZER , (BOOL (*)(OBJPTR, void *, void *))WdeDialogGetResizer }
, { GET_NC_SIZE , (BOOL (*)(OBJPTR, void *, void *))WdeDialogGetNCSize }
, { SAVE_OBJECT , (BOOL (*)(OBJPTR, void *, void *))WdeDialogSaveObject }
, { ON_TOP , (BOOL (*)(OBJPTR, void *, void *))WdeDialogOnTop }
, { TEST , (BOOL (*)(OBJPTR, void *, void *))WdeDialogTest }
, { BECOME_FIRST_CHILD , (BOOL (*)(OBJPTR, void *, void *))WdeDialogFirstChild }
, { PUT_ME_FIRST , (BOOL (*)(OBJPTR, void *, void *))WdeDialogPutChildFirst }
, { GET_RESIZE_INC , (BOOL (*)(OBJPTR, void *, void *))WdeDialogGetResizeInc }
, { GET_SCROLL_RECT , (BOOL (*)(OBJPTR, void *, void *))WdeDialogGetScrollRect }
, { IS_MARK_VALID , (BOOL (*)(OBJPTR, void *, void *))WdeDialogIsMarkValid }
, { RESTORE_OBJECT , (BOOL (*)(OBJPTR, void *, void *))WdeDialogRestore }
, { RESOLVE_SYMBOL , (BOOL (*)(OBJPTR, void *, void *))WdeDialogResolveSymbol }
, { RESOLVE_HELPSYMBOL , (BOOL (*)(OBJPTR, void *, void *))WdeDialogResolveHelpSymbol}
, { MODIFY_INFO , (BOOL (*)(OBJPTR, void *, void *))WdeDialogModifyInfo }
, { GET_NEXT_CHILD , (BOOL (*)(OBJPTR, void *, void *))WdeDialogGetNextChild }
, { SET_ORDER_MODE , (BOOL (*)(OBJPTR, void *, void *))WdeDialogSetOrderMode }
, { GET_ORDER_MODE , (BOOL (*)(OBJPTR, void *, void *))WdeDialogGetOrderMode }
};
#define MAX_ACTIONS (sizeof(WdeDialogActions)/sizeof (DISPATCH_ITEM))
Bool WdeRemoveObject ( WdeResInfo *res_info, OBJPTR object )
{
WdeResDlgItem *ditem;
signed int pos;
if ( !res_info ) {
return ( FALSE );
}
pos = WdeFindObjectPosInDialogList ( res_info, object );
if ( pos == -1 ) {
return ( FALSE );
}
ditem = WdeFindDialogInResInfo ( res_info, pos );
if ( !ditem ) {
WdeWriteTrail("WdeRemoveObject: item not found!");
return ( FALSE );
}
if ( !WdeRemoveDialogFromResInfo ( res_info, ditem, FALSE ) ) {
WdeWriteTrail("WdeRemoveObject: remove failed!");
return ( FALSE );
}
return ( TRUE );
}
void WdeDialogModified ( void *_obj )
{
WdeDialogObject *obj = _obj;
if ( obj && obj->dlg_item ) {
obj->dlg_item->modified = TRUE;
}
}
Bool WdePreserveDialogWithDBI ( void *_obj )
{
WdeDialogObject *obj = _obj;
void *vp;
vp = WdeDBIFromObject( obj );
if( !vp ) {
return( FALSE );
}
if( obj->dlg_item->dialog_info ) {
WdeFreeDialogBoxInfo( obj->dlg_item->dialog_info );
}
obj->dlg_item->dialog_info = vp;
obj->dlg_item->object = NULL;
return ( TRUE );
}
WdeDialogBoxInfo *WdeDBIFromObject ( void *_obj )
{
WdeDialogObject *obj = _obj;
WdeDialogBoxInfo *info;
LIST *clist;
LIST *end;
WdeDialogBoxControl *control;
WdeOrderedEntry *oentry;
char *symbol;
char *helpsymbol;
Bool is32bitEx;
WdeDialogBoxHeader *dh;
info = (WdeDialogBoxInfo *) WdeMemAlloc ( sizeof(WdeDialogBoxInfo) );
if ( !info ) {
WdeWriteTrail("WdeDBIFromObject: WdeResInfo alloc failed!");
return ( NULL );
}
SETHDR_NUMITEMS(obj->dialog_info, obj->num_children );
info->dialog_header = WdeCopyDialogBoxHeader ( obj->dialog_info );
if( !info->dialog_header ) {
WdeWriteTrail("WdeDBIFromObject: CopyDBH failed!");
WdeMemFree( info );
return( NULL );
}
is32bitEx = FALSE;
info->MemoryFlags = obj->mem_flags;
info->dialog_header->symbol = WdeStrDup( obj->symbol );
info->dialog_header->helpsymbol = WdeStrDup( obj->helpsymbol );
info->control_list = NULL;
end = NULL;
WdeCleanOrderedList( &obj->ochildren );
for( clist = obj->ochildren; clist; clist = ListNext(clist) ) {
oentry = (WdeOrderedEntry *) ListElement( clist );
if ( !Forward ( oentry->obj, GET_OBJECT_INFO, &control, &symbol ) ) {
WdeWriteTrail("WdeDBIFromObject: GET_OBJECT_INFO failed!");
WdeFreeDialogBoxInfo ( info );
return ( NULL );
}
/* JPK - do it again for the help symbol */
if ( !Forward ( oentry->obj, GET_OBJECT_HELPINFO, &control, &helpsymbol ) ) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -