⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wdefbase.c

📁 开放源码的编译器open watcom 1.6.0版的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
}

BOOL WdeBaseGetFirstChild ( WdeBaseObject *obj, OBJPTR *first, void *p2 )
{
    /* touch unused vars to get rid of warning */
    _wde_touch(p2);

    if ( ( obj->num_children == 0 ) || ( obj->children == NULL ) ) {
        *first = NULL;
    } else {
        *first = ListElement ( obj->children );
    }

    return ( TRUE );
}

BOOL WdeBaseDraw( WdeBaseObject *obj, RECT *area, HDC *dc )
{
    POINT   origin;
    RECT    client_rect;
    RECT    intersect;
    LIST   *olist;
    OBJPTR  child;
    OBJPTR  tops;
    RECT    child_rect;
    Bool    show_child;

    /* touch unused vars to get rid of warning */
    _wde_touch(dc);

    GetOffset( &origin );

    GetClientRect( obj->res_info->edit_win, &client_rect );

    OffsetRect( &client_rect, origin.x, origin.y );

    child = NULL;

    /* we must process the children in reverse order */
    if( obj->children ) {
        WdeListLastElt( obj->children, &olist );
    } else {
        olist = NULL;
    }

    tops = NULL;
    for( olist = obj->children; olist; olist = ListNext( olist ) ) {
        child = ListElement( olist );
        Location( child, &child_rect );
        show_child = IntersectRect( &intersect, &child_rect, &client_rect );
        Forward( child, SHOW_WIN, &show_child, NULL );
        if( !show_child ) {
            child = NULL;
        } else {
            if( !Forward( child, DRAW, area, NULL ) ) {
                WdeWriteTrail("WdeBaseDraw: child draw failed!");
            }
            if( !tops ) {
                tops = child;
            }
        }
    }

    if( IntersectRect( &intersect, area, &client_rect ) ) {
        OffsetRect( &intersect, -origin.x, -origin.y );
        RedrawWindow( obj->res_info->edit_win, &intersect, (HRGN) NULL,
                      RDW_INTERNALPAINT | RDW_INVALIDATE | RDW_NOERASE | RDW_UPDATENOW );
        if( child && !Forward ( tops, ON_TOP, NULL, NULL) ) {
            WdeWriteTrail("WdeBaseDraw: child ON_TOP failed!");
            return( FALSE );
        }
    }

    return( TRUE );
}

BOOL WdeBaseGetResizeInfo ( WdeBaseObject *obj, RESIZE_ID *info, void *p2 )
{
    /* touch unused vars to get rid of warning */
    _wde_touch(obj);
    _wde_touch(p2);

    *info = R_NONE;

    return ( TRUE );
}

BOOL WdeBaseIdentify ( WdeBaseObject *obj, OBJ_ID *id, void *p2 )
{
    /* touch unused vars to get rid of warning */
    _wde_touch(p2);

    *id = obj->object_id;

    return ( TRUE );
}

BOOL WdeBaseValidateAction ( WdeBaseObject *obj, ACTION *act, void *p2 )
{
    int     i;

    /* touch unused vars to get rid of warning */
    _wde_touch(p2);

    if ( *act == MOVE ) {
        return ( FALSE );
    }

    for ( i = 0; i < MAX_ACTIONS; i++ ) {
        if( WdeBaseActions[i].id == *act ) {
            return ( TRUE );
        }
    }

    return ( ValidateAction( (OBJPTR) obj->o_item, *act, p2 ) );
}

BOOL WdeBaseGetWindowHandle ( WdeBaseObject *obj, HWND *hwin, void *p2 )
{
    /* touch unused vars to get rid of warning */
    _wde_touch(p2);

    *hwin = obj->res_info->edit_win;

    return ( TRUE );
}

BOOL WdeBaseAddSubObject ( WdeBaseObject *base_obj, OBJPTR obj, void *p2 )
{
    /* touch unused vars to get rid of warning */
    _wde_touch(p2);

    /* make sure objects are inserted at the end of list */
    WdeInsertObject ( &(base_obj->children), obj );
    WdeAddOrderedEntry ( &(base_obj->ochildren), obj );
    base_obj->num_children++;
    Notify ( obj, NEW_PARENT , base_obj->object_handle );
    WdeCheckBaseScrollbars( FALSE );

    return ( TRUE );
}

Bool WdeBaseFindSubObjects ( WdeBaseObject *obj, SUBOBJ_REQUEST *req,
                             LIST **obj_list )
{
    return ( WdeFindSubObjects ( req, obj_list, obj->children ) );
}

BOOL WdeBaseFindObjectsPt ( WdeBaseObject *obj, POINT *pt, LIST **obj_list )
{
    LIST   *subobjs;
    OBJPTR  child;
    OBJ_ID  id;

    if ( WdeFindObjectsAtPt ( pt, &subobjs, obj->children ) ) {
        child = ListElement ( subobjs );
        if ( !( Forward ( child, IDENTIFY, &id, NULL ) &&
                ( id == DIALOG_OBJ ) ) ||
             !Forward ( child, FIND_OBJECTS_PT, pt, obj_list ) ) {
            ListAddElt ( obj_list, child );
        }
        ListFree ( subobjs );
    } else {
        ListAddElt ( obj_list, obj );
    }

    return ( TRUE );
}

BOOL WdeBaseRemoveSubObject ( WdeBaseObject *base_obj, OBJPTR obj, void *p2 )
{
    /* touch unused vars to get rid of warning */
    _wde_touch(p2);

    if ( base_obj->num_children && ListFindElt (base_obj->children, obj) ) {
        ListRemoveElt ( &(base_obj->children), obj);
        WdeRemoveOrderedEntry ( base_obj->ochildren, obj);
        base_obj->num_children--;
        if( !base_obj->num_children ) {
            base_obj->children = NULL;
            base_obj->res_info->next_current = NULL;
        }
    } else {
        return ( FALSE );
    }

    return ( TRUE );
}

BOOL WdeBasePutChildFirst ( WdeBaseObject *obj, OBJPTR child, void *p2 )
{
    /* touch unused vars to get rid of warning */
    _wde_touch(p2);

    if ( obj->num_children ) {
        if ( !WdePutObjFirst ( child, &(obj->children) ) ) {
            WdeWriteTrail("WdeBasePutChildFirst: WdePutObjFirst failed!");
            return ( FALSE );
        }
    } else {
        WdeWriteTrail("WdeBasePutChildFirst: No children!");
        return ( FALSE );
    }

    return ( TRUE );
}

BOOL WdeBaseNotify ( WdeBaseObject *base_obj, NOTE_ID *id, void *p2 )
{
    OBJPTR           obj;
    WdeInfoStruct    is;

    /* touch unused vars to get rid of warning */
    _wde_touch(p2);

    switch ( *id ) {
        case PRIMARY_OBJECT:
            obj = base_obj->res_info->next_current;
            if ( obj && ( obj != base_obj ) ) {
                MakeObjectCurrent( obj );
            } else if ( base_obj->num_children ) {
                obj = ListElement ( base_obj->children );
                MakeObjectCurrent( obj );
            } else {
                WdeSetBaseObject ( IDM_SELECT_MODE );
                WdeSetBaseObjectMenu(base_obj->res_info->hash_table != NULL);

                memset ( &is, 0, sizeof(WdeInfoStruct) );

                is.obj_id      = BASE_OBJ;
                is.obj         = base_obj->object_handle;
                is.res_info    = base_obj->res_info;

                WdeWriteInfo ( &is );
            }
            return ( TRUE );
    }

    return ( Notify ( (OBJPTR) base_obj->o_item, *id, p2 ) );
}

BOOL WdeBaseLocation( WdeBaseObject *base_obj, RECT *obj_rect, void *p2 )
{
    RECT onion;
    RECT rect1;
    RECT rect2;

    /* touch unused vars to get rid of warning */
    _wde_touch(base_obj);
    _wde_touch(p2);

    if( base_obj->res_info->edit_win != NULL ) {
        GetClientRect( base_obj->res_info->edit_win, &rect1 );
        if( IsRectEmpty( &rect1 ) ) {
            rect1.right++;
            rect1.bottom++;
        }
    } else {
        SetRectEmpty( &rect1 );
    }

    WdeGetBoundingRectFromList( base_obj->children, &rect2 );
    InflateRect( &rect2, WDE_WORLD_PAD, WDE_WORLD_PAD );

    UnionRect( &onion, &rect1, &rect2 );

    *obj_rect = onion;

    return( TRUE );
}

BOOL WdeBaseGetSubObjectList ( WdeBaseObject *base_obj, LIST **l, void *p2 )
{
    /* touch unused vars to get rid of warning */
    _wde_touch(p2);

    *l = base_obj->children;

    return( TRUE );
}

static void isWorldInBaseClient( WdeBaseObject *base_obj,
                                 BOOL *x_in, BOOL *y_in )
{
    RECT        client_rect;
    RECT        bounding_rect;

    *x_in = FALSE;
    *y_in = FALSE;

    if( base_obj->res_info->edit_win == NULL ) {
        return;
    }

    if( base_obj->children == NULL ) {
        return;
    }

    GetClientRect( base_obj->res_info->forms_win, &client_rect );

    WdeGetBoundingRectFromList( base_obj->children, &bounding_rect );
    InflateRect( &bounding_rect, WDE_WORLD_PAD, WDE_WORLD_PAD );

    if( ( bounding_rect.left < client_rect.left ) ||
        ( bounding_rect.right > client_rect.right ) ) {
        *x_in = TRUE;
    }

    if( ( bounding_rect.top < client_rect.top ) ||
        ( bounding_rect.bottom > client_rect.bottom ) ) {
        *y_in = TRUE;
    }

    return;
}

static BOOL enableFormsScrollbars( WdeBaseObject *base_obj,
                                   BOOL enablex, BOOL enabley )
{
    STATE_HDL   state_handle;
    SCR_CONFIG  scroll_config;

    state_handle = GetCurrFormID();
    if( state_handle == (STATE_HDL)NULL ) {
        return( FALSE );
    }

    scroll_config = SCROLL_NONE;

    if( enablex ) {
        scroll_config |= SCROLL_HORZ;
    }

    if( enabley ) {
        scroll_config |= SCROLL_VERT;
    }

    SetFormEditWnd( state_handle, base_obj->res_info->forms_win,
                    MENU_NONE, scroll_config );

    return( TRUE );
}

BOOL WdeCheckBaseScrollbars( BOOL in_resize )
{
    WdeBaseObject       *base_obj;
    BOOL                enablex;
    BOOL                enabley;
    RECT                rect;

    if( WdeInCleanup() ) {
        return( TRUE );
    }

    base_obj = (WdeBaseObject *)GetMainObject();

    if( !base_obj || !base_obj->res_info ) {
        return( FALSE );
    }

    if( base_obj->in_destroy ) {
        return( TRUE );
    }

    enablex = FALSE;
    enabley = FALSE;

    isWorldInBaseClient( base_obj, &enablex, &enabley );

    if( ( enablex == base_obj->has_hscroll ) &&
        ( enabley == base_obj->has_vscroll ) ) {
        return( TRUE );
    }

    if( enablex != base_obj->has_hscroll ) {
        if( !enablex ) {
            SetScrollPos( base_obj->res_info->forms_win, SB_HORZ, 0, FALSE );
        }
        SetScrollRange( base_obj->res_info->forms_win, SB_HORZ, 0, (enablex) ?100 :0, FALSE );
        ShowScrollBar( base_obj->res_info->forms_win, SB_HORZ, enablex );
    }

    if( enabley != base_obj->has_vscroll ) {
        if( !enabley ) {
            SetScrollPos( base_obj->res_info->forms_win, SB_VERT, 0, FALSE );
        }
        SetScrollRange( base_obj->res_info->forms_win, SB_VERT, 0, (enabley) ?100 :0, FALSE );
        ShowScrollBar( base_obj->res_info->forms_win, SB_VERT, enabley );
    }

    enableFormsScrollbars( base_obj, enablex, enabley );

    if( !in_resize ) {
        GetClientRect( base_obj->res_info->forms_win, &rect );
        MoveWindow( base_obj->res_info->edit_win, 0, 0,
                    (rect.right  - rect.left),
                    (rect.bottom - rect.top), TRUE );
    }

    UpdateScroll();

    base_obj->has_hscroll = enablex;
    base_obj->has_vscroll = enabley;

    return( TRUE );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -