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

📄 utils.cpp

📁 Wxpython Implemented on Windows CE, Source code
💻 CPP
📖 第 1 页 / 共 4 页
字号:
}

bool wxMacControl::IsVisible() const
{
    return IsControlVisible( m_controlRef );
}

void wxMacControl::SetVisibility( bool visible , bool redraw )
{
    SetControlVisibility( m_controlRef , visible , redraw );
}

bool wxMacControl::IsEnabled() const
{
#if TARGET_API_MAC_OSX
    return IsControlEnabled( m_controlRef );
#else
    return IsControlActive( m_controlRef );
#endif
}

bool wxMacControl::IsActive() const
{
    return IsControlActive( m_controlRef );
}

void wxMacControl::Enable( bool enable )
{
#if TARGET_API_MAC_OSX
    if ( enable )
        EnableControl( m_controlRef );
    else
        DisableControl( m_controlRef );
#else
    if ( enable )
        ActivateControl( m_controlRef );
    else
        DeactivateControl( m_controlRef );
#endif
}

void wxMacControl::SetDrawingEnabled( bool enable )
{
#if TARGET_API_MAC_OSX
    HIViewSetDrawingEnabled( m_controlRef , enable );
#endif
}

#if TARGET_API_MAC_OSX
bool wxMacControl::GetNeedsDisplay() const
{
#if TARGET_API_MAC_OSX
    if ( m_isCompositing )
    {
        return HIViewGetNeedsDisplay( m_controlRef );
    }
    else
#endif
    {
        if ( !IsVisible() )
            return false;

        Rect controlBounds;
        GetControlBounds( m_controlRef, &controlBounds );
        RgnHandle rgn = NewRgn();
        GetWindowRegion ( GetControlOwner( m_controlRef ) , kWindowUpdateRgn , rgn );
        Boolean intersect = RectInRgn ( &controlBounds , rgn );
        DisposeRgn( rgn );

        return intersect;
    }
}
#endif

void wxMacControl::SetNeedsDisplay( RgnHandle where )
{
    if ( !IsVisible() )
        return;

#if TARGET_API_MAC_OSX
    if ( m_isCompositing )
    {
        HIViewSetNeedsDisplayInRegion( m_controlRef , where , true );
    }
    else
#endif
    {
        Rect controlBounds;
        GetControlBounds( m_controlRef, &controlBounds );
        RgnHandle update = NewRgn();
        CopyRgn( where , update );
        OffsetRgn( update , controlBounds.left , controlBounds.top );
        InvalWindowRgn( GetControlOwner( m_controlRef) , update );
    }
}

void wxMacControl::SetNeedsDisplay( Rect* where )
{
    if ( !IsVisible() )
        return;

#if TARGET_API_MAC_OSX
    if ( m_isCompositing )
    {
        if ( where != NULL )
        {
            RgnHandle update = NewRgn();
            RectRgn( update , where );
            HIViewSetNeedsDisplayInRegion( m_controlRef , update , true );
            DisposeRgn( update );
        }
        else
            HIViewSetNeedsDisplay( m_controlRef , true );
    }
    else
#endif
    {
        Rect controlBounds;

        GetControlBounds( m_controlRef, &controlBounds );
        if ( where )
        {
            Rect whereLocal = *where;
            OffsetRect( &whereLocal , controlBounds.left , controlBounds.top );
            SectRect( &controlBounds , &whereLocal, &controlBounds );
        }

        InvalWindowRect( GetControlOwner( m_controlRef) , &controlBounds );
    }
}

void  wxMacControl::Convert( wxPoint *pt , wxMacControl *from , wxMacControl *to )
{
#if TARGET_API_MAC_OSX
    if ( from->m_peer->MacGetTopLevelWindow()->MacUsesCompositing() )
    {
        HIPoint hiPoint;

        hiPoint.x = pt->x;
        hiPoint.y = pt->y;
        HIViewConvertPoint( &hiPoint , from->m_controlRef , to->m_controlRef  );
        pt->x = (int)hiPoint.x;
        pt->y = (int)hiPoint.y;
    }
    else
#endif
    {
        Rect fromRect, toRect;

        GetControlBounds( from->m_controlRef , &fromRect );
        GetControlBounds( to->m_controlRef , &toRect );
        if ( from->m_isRootControl )
            fromRect.left = fromRect.top = 0;
        if ( to->m_isRootControl )
            toRect.left = toRect.top = 0;

        pt->x = pt->x + fromRect.left - toRect.left;
        pt->y = pt->y + fromRect.top - toRect.top;
    }
}

void wxMacControl::SetRect( Rect *r )
{
#if TARGET_API_MAC_OSX
    if ( m_isCompositing )
    {
        //A HIRect is actually a CGRect on OSX - which consists of two structures -
        //CGPoint and CGSize, which have two floats each
        HIRect hir = { { r->left , r->top }, { r->right - r->left , r->bottom - r->top } };
        HIViewSetFrame ( m_controlRef , &hir );
        // eventuall we might have to do a SetVisibility( false , true );
        // before and a SetVisibility( true , true ); after
    }
    else
#endif
    {
        bool vis = IsVisible();
        if ( vis )
        {
            Rect former;
            GetControlBounds( m_controlRef , &former );
            InvalWindowRect( GetControlOwner( m_controlRef ) , &former );
        }

        Rect controlBounds = *r;

        // since the rect passed in is always (even in non-compositing) relative
        // to the (native) parent, we have to adjust to window relative here
        wxMacControl* parent = m_peer->GetParent()->GetPeer();
        if ( !parent->m_isRootControl )
        {
            Rect superRect;
            GetControlBounds( parent->m_controlRef , &superRect );
            OffsetRect( &controlBounds , superRect.left , superRect.top );
        }

        SetControlBounds( m_controlRef , &controlBounds );
        if ( vis )
            InvalWindowRect( GetControlOwner( m_controlRef ) , &controlBounds );
    }
}

void wxMacControl::GetRect( Rect *r )
{
    GetControlBounds( m_controlRef , r );
    if ( !m_isCompositing )
    {
        // correct the case of the root control
        if ( m_isRootControl )
        {
            WindowRef wr = GetControlOwner( m_controlRef );
            GetWindowBounds( wr , kWindowContentRgn , r );
            r->right -= r->left;
            r->bottom -= r->top;
            r->left = 0;
            r->top = 0;
        }
        else
        {
            wxMacControl* parent = m_peer->GetParent()->GetPeer();
            if ( !parent->m_isRootControl )
            {
                Rect superRect;
                GetControlBounds( parent->m_controlRef , &superRect );
                OffsetRect( r , -superRect.left , -superRect.top );
            }
        }
    }
}

void wxMacControl::GetRectInWindowCoords( Rect *r )
{
    UMAGetControlBoundsInWindowCoords( m_controlRef , r );
}

void wxMacControl::GetBestRect( Rect *r )
{
    short   baselineoffset;

    GetBestControlRect( m_controlRef , r , &baselineoffset );
}

void wxMacControl::SetLabel( const wxString &title )
{
    wxFontEncoding encoding;

    if ( m_font.Ok() )
        encoding = m_font.GetEncoding();
    else
        encoding = wxFont::GetDefaultEncoding();

    UMASetControlTitle( m_controlRef , title , encoding );
}

void wxMacControl::GetFeatures( UInt32 * features )
{
    GetControlFeatures( m_controlRef , features );
}

OSStatus wxMacControl::GetRegion( ControlPartCode partCode , RgnHandle region )
{
    OSStatus err = GetControlRegion( m_controlRef , partCode , region );
    if ( !m_isCompositing )
    {
        if ( !m_isRootControl )
        {
            Rect r;

            GetControlBounds(m_controlRef, &r );
            if ( !EmptyRgn( region ) )
                OffsetRgn( region , -r.left , -r.top );
        }
    }

    return err;
}

OSStatus wxMacControl::SetZOrder( bool above , wxMacControl* other )
{
#if TARGET_API_MAC_OSX
    return HIViewSetZOrder( m_controlRef,above ? kHIViewZOrderAbove : kHIViewZOrderBelow,
       (other != NULL) ? other->m_controlRef : NULL);
#else
    return 0;
#endif
}

#if TARGET_API_MAC_OSX
// SetNeedsDisplay would not invalidate the children
static void InvalidateControlAndChildren( HIViewRef control )
{
    HIViewSetNeedsDisplay( control , true );
    UInt16 childrenCount = 0;
    OSStatus err = CountSubControls( control , &childrenCount );
    if ( err == errControlIsNotEmbedder )
        return;

    wxASSERT_MSG( err == noErr , wxT("Unexpected error when accessing subcontrols") );

    for ( UInt16 i = childrenCount; i >=1; --i )
    {
        HIViewRef child;

        err = GetIndexedSubControl( control , i , & child );
        if ( err == errControlIsNotEmbedder )
            return;

        InvalidateControlAndChildren( child );
    }
}
#endif

void wxMacControl::InvalidateWithChildren()
{
#if TARGET_API_MAC_OSX
    InvalidateControlAndChildren( m_controlRef );
#endif
}

void wxMacControl::ScrollRect( wxRect *r , int dx , int dy )
{
    wxASSERT( r != NULL );

#if TARGET_API_MAC_OSX
    if ( m_isCompositing )
    {
        HIRect scrollarea = CGRectMake( r->x , r->y , r->width , r->height);
        HIViewScrollRect ( m_controlRef , &scrollarea , dx ,dy );
    }
    else
#endif
    {
        Rect bounds;

        GetControlBounds( m_controlRef , &bounds );
        bounds.left += r->x;
        bounds.top += r->y;
        bounds.bottom = bounds.top + r->height;
        bounds.right = bounds.left + r->width;
        wxMacWindowClipper clip( m_peer );
        RgnHandle updateRgn = NewRgn();
        ::ScrollRect( &bounds , dx , dy , updateRgn );
        InvalWindowRgn( GetControlOwner( m_controlRef ) , updateRgn );
        DisposeRgn( updateRgn );
    }
}

OSType wxMacCreator = 'WXMC';
OSType wxMacControlProperty = 'MCCT';

void wxMacControl::SetReferenceInNativeControl()
{
    void * data = this;
    verify_noerr( SetControlProperty ( m_controlRef ,
        wxMacCreator,wxMacControlProperty, sizeof(data), &data ) );
}

wxMacControl* wxMacControl::GetReferenceFromNativeControl(ControlRef control)
{
    wxMacControl* ctl = NULL;
    UInt32 actualSize;
    if ( GetControlProperty( control ,wxMacCreator,wxMacControlProperty, sizeof(ctl) ,
        &actualSize , &ctl ) == noErr )
    {
        return ctl;
    }
    return NULL;
}

// ============================================================================
// DataBrowser Wrapper
// ============================================================================
//
// basing on DataBrowserItemIDs
//

pascal void wxMacDataBrowserControl::DataBrowserItemNotificationProc(
    ControlRef browser,
    DataBrowserItemID itemID,
    DataBrowserItemNotification message,
    DataBrowserItemDataRef itemData )
{
    wxMacDataBrowserControl* ctl = dynamic_cast<wxMacDataBrowserControl*>( wxMacControl::GetReferenceFromNativeControl( browser ) );
    if ( ctl != 0 )
    {
        ctl->ItemNotification(itemID, message, itemData);
    }
}

pascal OSStatus wxMacDataBrowserControl::DataBrowserGetSetItemDataProc(
    ControlRef browser,
    DataBrowserItemID itemID,
    DataBrowserPropertyID property,
    DataBrowserItemDataRef itemData,
    Boolean changeValue )
{
    OSStatus err = errDataBrowserPropertyNotSupported;

    wxMacDataBrowserControl* ctl = dynamic_cast<wxMacDataBrowserControl*>( wxMacControl::GetReferenceFromNativeControl( browser ) );
    if ( ctl != 0 )
    {
        err = ctl->GetSetItemData(itemID, property, itemData, changeValue);
    }
    return err;
}

pascal Boolean wxMacDataBrowserControl::DataBrowserCompareProc(
    ControlRef browser,
    DataBrowserItemID itemOneID,
    DataBrowserItemID itemTwoID,
    DataBrowserPropertyID sortProperty)
{
    wxMacDataBrowserControl* ctl = dynamic_cast<wxMacDataBrowserControl*>( wxMacControl::GetReferenceFromNativeControl( browser ) );
    if ( ctl != 0 )
    {
        return ctl->CompareItems(itemOneID, itemTwoID, sortProperty);
    }
    return false;
}

DataBrowserItemDataUPP gDataBrowserItemDataUPP = NULL;
DataBrowserItemNotificationUPP gDataBrowserItemNotificationUPP = NULL;
DataBrowserItemCompareUPP gDataBrowserItemCompareUPP = NULL;

wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow* peer, const wxPoint& pos, const wxSize& size, long style) : wxMacControl( peer )
{
    Rect bounds = wxMacGetBoundsForControl( peer, pos, size );
    OSStatus err = ::CreateDataBrowserControl(
        MAC_WXHWND(peer->MacGetTopLevelWindowRef()),
        &bounds, kDataBrowserListView, &m_controlRef );
    SetReferenceInNativeControl();
    verify_noerr( err );
    if ( gDataBrowserItemCompareUPP == NULL )
        gDataBrowserItemCompareUPP = NewDataBrowserItemCompareUPP(DataBrowserCompareProc);
    if ( gDataBrowserItemDataUPP == NULL )
        gDataBrowserItemDataUPP = NewDataBrowserItemDataUPP(DataBrowserGetSetItemDataProc);
    if ( gDataBrowserItemNotificationUPP == NULL )
    {
        gDataBrowserItemNotificationUPP =
#if TARGET_API_MAC_OSX
            (DataBrowserItemNotificationUPP) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc);
#else
            NewDataBrowserItemNotificationUPP(DataBrowserItemNotificationProc);
#endif
    }

    DataBrowserCallbacks callbacks;
    InitializeDataBrowserCallbacks( &callbacks, kDataBrowserLatestCallbacks );

    callbacks.u.v1.itemDataCallback = gDataBrowserItemDataUPP;
    callbacks.u.v1.itemCompareCallback = gDataBrowserItemCompareUPP;
    callbacks.u.v1.itemNotificationCallback = gDataBrowserItemNotificationUPP;
    SetCallbacks( &callbacks );

}

OSStatus wxMacDataBrowserControl::GetItemCount( DataBrowserItemID container,
    Boolean recurse,
    DataBrowserItemState state,
    UInt32 *numItems) const
{
    return GetDataBrowserItemCount( m_controlRef, container, recurse, state, numItems );
}

OSStatus wxMacDataBrowserControl::GetItems( DataBrowserItemID container,
    Boolean recurse,
    DataBrowserItemState state,
    Handle items) const
{
    return GetDataBrowserItems( m_controlRef, container, recurse, state, items );
}

OSStatus wxMacDataBrowserControl::SetSelectionFlags( DataBrowserSelectionFlags options )
{
    return SetDataBrowserSelectionFlags( m_controlRef, options );
}

OSStatus wxMacDataBrowserControl::AddColumn( DataBrowserListViewColumnDesc *columnDesc,
        DataBrowserTableViewColumnIndex position )
{
    return AddDataBrowserListViewColumn( m_controlRef, columnDesc, position );
}

OSStatus wxMacDataBrowserControl::AutoSizeColumns()
{
    return AutoSizeDataBrowserListViewColumns(m_controlRef);
}

OSStatus wxMacDataBrowserControl::SetHasScrollBars( bool horiz, bool vert )
{
    return SetDataBrowserHasScrollBars( m_controlRef, horiz, vert );
}

OSStatus wxMacDataBrowserControl::SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle )
{
    return SetDataBrowserTableViewHiliteStyle( m_controlRef, hiliteStyle );
}

OSStatus wxMacDataBrowserControl::SetHeaderButtonHeight(UInt16 height)
{
    return SetDataBrowserListViewHeaderBtnHeight( m_controlRef, height );
}

OSStatus wxMacDataBrowserControl::GetHeaderButtonHeight(UInt16 *height)
{
    return GetDataBrowserListViewHeaderBtnHeight( m_controlRef, height );
}

OSStatus wxMacDataBrowserControl::SetCallbacks(const DataBrowserCallbacks *callbacks)
{
    return SetDataBrowserCallbacks( m_controlRef, callbacks );
}

OSStatus wxMacDataBrowserControl::UpdateItems(
    DataBrowserItemID container,
    UInt32 numItems,
    const DataBrowserItemID *items,
    DataBrowserPropertyID preSortProperty,
    DataBrowserPropertyID propertyID ) const
{
    return UpdateDataBrowserItems( m_controlRef, container, numItems, items, preSortProperty, propertyID );
}

bool wxMacDataBrowserControl::IsItemSelected( DataBrowserItemID item ) const
{
    return IsDataBrowserItemSelected( m_controlRef, item );
}

OSStatus wxMacDataBrowserControl::AddItems(
    DataBrowserItemID container,
    UInt32 numItems,
    const DataBrowserItemID *items,
    DataBrowserPropertyID preSortProperty )
{
    return AddDataBrowserItems( m_controlRef, container, numItems, items, preSortProperty );

⌨️ 快捷键说明

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