📄 utils.cpp
字号:
}
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 + -