#include "wx/layout.h"
#include "wx/statusbr.h"
#include "wx/menuitem.h"
+ #include "wx/treectrl.h"
+ #include "wx/listctrl.h"
#endif
#include "wx/tooltip.h"
#include "wx/spinctrl.h"
#include "wx/geometry.h"
+#if wxUSE_LISTCTRL
+ #include "wx/listctrl.h"
+#endif
+
+#if wxUSE_TREECTRL
+ #include "wx/treectrl.h"
+#endif
+
#if wxUSE_CARET
#include "wx/caret.h"
#endif
{ kEventClassCommand, kEventProcessCommand } ,
{ kEventClassCommand, kEventCommandUpdateStatus } ,
+ { kEventClassControl , kEventControlGetClickActivation } ,
{ kEventClassControl , kEventControlHit } ,
{ kEventClassTextInput, kEventTextInputUnicodeForKeyEvent } ,
{ kEventClassControl , kEventControlVisibilityChanged } ,
{ kEventClassControl , kEventControlEnabledStateChanged } ,
{ kEventClassControl , kEventControlHiliteChanged } ,
+
+ { kEventClassControl , kEventControlActivate } ,
+ { kEventClassControl , kEventControlDeactivate } ,
#endif
{ kEventClassControl , kEventControlSetFocusPart } ,
float alpha = 1.0 ;
{
wxWindow* iter = thisWindow ;
- while ( iter )
+ while ( iter )
{
alpha *= (float) iter->GetTransparent()/255.0 ;
if ( iter->IsTopLevel() )
}
}
CGContextSetAlpha( cgContext , alpha ) ;
+
+ if ( thisWindow->GetBackgroundStyle() == wxBG_STYLE_TRANSPARENT )
+ {
+ HIRect bounds;
+ HIViewGetBounds( controlRef, &bounds );
+ CGContextClearRect( cgContext, bounds );
+ }
+
+
#endif
if ( thisWindow->MacDoRedraw( updateRgn , cEvent.GetTicks() ) )
result = noErr ;
case kEventControlHiliteChanged :
thisWindow->MacHiliteChanged() ;
break ;
+
+ case kEventControlActivate :
+ case kEventControlDeactivate :
+ // FIXME: we should have a virtual function for this!
+#if wxUSE_TREECTRL
+ if ( thisWindow->IsKindOf( CLASSINFO( wxTreeCtrl ) ) )
+ thisWindow->Refresh();
+#endif
+#if wxUSE_LISTCTRL
+ if ( thisWindow->IsKindOf( CLASSINFO( wxListCtrl ) ) )
+ thisWindow->Refresh();
#endif
+ break ;
+#endif // TARGET_API_MAC_OSX
// we emulate this event under Carbon CFM
case kEventControlSetFocusPart :
}
#endif
+ if ( thisWindow->MacIsUserPane() )
+ result = noErr ;
+
if ( controlPart == kControlFocusNoPart )
{
#if wxUSE_CARET
event.SetEventObject(thisWindow);
thisWindow->GetEventHandler()->ProcessEvent(event) ;
}
-
- if ( thisWindow->MacIsUserPane() )
- result = noErr ;
}
break ;
result = thisWindow->MacControlHit( handler , event ) ;
break ;
+ case kEventControlGetClickActivation :
+ {
+ // fix to always have a proper activation for DataBrowser controls (stay in bkgnd otherwise)
+ WindowRef owner = cEvent.GetParameter<WindowRef>(kEventParamWindowRef);
+ if ( !IsWindowActive(owner) )
+ {
+ cEvent.SetParameter(kEventParamClickActivation,(UInt32) kActivateAndIgnoreClick) ;
+ result = noErr ;
+ }
+ }
+ break ;
+
default :
break ;
}
return result ;
}
-static pascal OSStatus wxMacWindowServiceEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
+static pascal OSStatus
+wxMacWindowServiceEventHandler(EventHandlerCallRef WXUNUSED(handler),
+ EventRef event,
+ void *data)
{
OSStatus result = eventNotHandledErr ;
charBuf[ numChars - 1 ] = 0;
#if SIZEOF_WCHAR_T == 2
uniChars = (wchar_t*) charBuf ;
- memcpy( uniChars , charBuf , numChars * 2 ) ;
+/* memcpy( uniChars , charBuf , numChars * 2 ) ;*/ // is there any point in copying charBuf over itself? (in fact, memcpy isn't even guaranteed to work correctly if the source and destination ranges overlap...)
#else
// the resulting string will never have more chars than the utf16 version, so this is safe
wxMBConvUTF16 converter ;
WXEVENTHANDLERCALLREF formerHandler = wxTheApp->MacGetCurrentEventHandlerCallRef() ;
wxTheApp->MacSetCurrentEvent( event , handler ) ;
+ UInt32 message = uniChars[pos] < 128 ? (char)uniChars[pos] : '?';
+/*
+ NB: faking a charcode here is problematic. The kEventTextInputUpdateActiveInputArea event is sent
+ multiple times to update the active range during inline input, so this handler will often receive
+ uncommited text, which should usually not trigger side effects. It might be a good idea to check the
+ kEventParamTextInputSendFixLen parameter and verify if input is being confirmed (see CarbonEvents.h).
+ On the other hand, it can be useful for some applications to react to uncommitted text (for example,
+ to update a status display), as long as it does not disrupt the inline input session. Ideally, wx
+ should add new event types to support advanced text input. For now, I would keep things as they are.
+
+ However, the code that was being used caused additional problems:
UInt32 message = (0 << 8) + ((char)uniChars[pos] );
+ Since it simply truncated the unichar to the last byte, it ended up causing weird bugs with inline
+ input, such as switching to another field when one attempted to insert the character U+4E09 (the kanji
+ for "three"), because it was truncated to 09 (kTabCharCode), which was later "converted" to WXK_TAB
+ (still 09) in wxMacTranslateKey; or triggering the default button when one attempted to insert U+840D
+ (the kanji for "name"), which got truncated to 0D and interpreted as a carriage return keypress.
+ Note that even single-byte characters could have been misinterpreted, since MacRoman charcodes only
+ overlap with Unicode within the (7-bit) ASCII range.
+ But simply passing a NUL charcode would disable text updated events, because wxTextCtrl::OnChar checks
+ for codes within a specific range. Therefore I went for the solution seen above, which keeps ASCII
+ characters as they are and replaces the rest with '?', ensuring that update events are triggered.
+ It would be better to change wxTextCtrl::OnChar to look at the actual unicode character instead, but
+ I don't have time to look into that right now.
+ -- CL
+*/
if ( wxTheApp->MacSendCharEvent(
focus , message , 0 , when , 0 , 0 , uniChars[pos] ) )
{
return result ;
}
-static pascal OSStatus wxMacWindowCommandEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
+static pascal OSStatus
+wxMacWindowCommandEventHandler(EventHandlerCallRef WXUNUSED(handler),
+ EventRef event,
+ void *data)
{
OSStatus result = eventNotHandledErr ;
wxWindowMac* focus = (wxWindowMac*) data ;
m_frozenness = 0 ;
m_macAlpha = 255 ;
-#if WXWIN_COMPATIBILITY_2_4
- m_backgroundTransparent = false;
-#endif
-
#if wxMAC_USE_CORE_GRAPHICS
m_cgContextRef = NULL ;
#endif
m_hScrollBar = NULL ;
m_vScrollBar = NULL ;
+ m_hScrollBarAlwaysShown = false;
+ m_vScrollBarAlwaysShown = false;
+
m_macBackgroundBrush = wxNullBrush ;
m_macIsUserPane = true;
m_hScrollBar->Raise() ;
}
-void wxWindowMac::MacPostControlCreate(const wxPoint& pos, const wxSize& size)
+void wxWindowMac::MacPostControlCreate(const wxPoint& WXUNUSED(pos), const wxSize& size)
{
wxASSERT_MSG( m_peer != NULL && m_peer->Ok() , wxT("No valid mac control") ) ;
m_peer->SetLabel( wxStripMenuCodes(m_label, wxStrip_Mnemonics) ) ;
if (!m_macIsUserPane)
- SetInitialBestSize(size);
+ SetInitialSize(size);
SetCursor( *wxSTANDARD_CURSOR ) ;
}
#endif
// Old-style File Manager Drag & Drop
-void wxWindowMac::DragAcceptFiles(bool accept)
+void wxWindowMac::DragAcceptFiles(bool WXUNUSED(accept))
{
// TODO:
}
// Returns the size of the native control. In the case of the toplevel window
// this is the content area root control
-void wxWindowMac::MacGetPositionAndSizeFromControl(int& x, int& y,
- int& w, int& h) const
+void wxWindowMac::MacGetPositionAndSizeFromControl(int& WXUNUSED(x),
+ int& WXUNUSED(y),
+ int& WXUNUSED(w),
+ int& WXUNUSED(h)) const
{
wxFAIL_MSG( wxT("Not currently supported") ) ;
}
bool wxWindowMac::SetCursor(const wxCursor& cursor)
{
- if (m_cursor == cursor)
+ if (m_cursor.IsSameAs(cursor))
return false;
- if (wxNullCursor == cursor)
+ if (!cursor.IsOk())
{
if ( ! wxWindowBase::SetCursor( *wxSTANDARD_CURSOR ) )
return false ;
HIGetMousePosition(kHICoordSpaceWindow, window, &hiPoint);
pt.h = hiPoint.x;
pt.v = hiPoint.y;
- #else
+ #else
CGrafPtr savePort ;
Boolean swapped = QDSwapPort( GetWindowPort( window ) , &savePort ) ;
return true;
}
-bool wxWindowMac::Enable(bool enable)
+void wxWindowMac::DoEnable(bool enable)
{
- wxASSERT( m_peer->Ok() ) ;
- bool former = MacIsReallyEnabled() ;
- if ( !wxWindowBase::Enable(enable) )
- return false;
-
m_peer->Enable( enable ) ;
-
- if ( former != MacIsReallyEnabled() )
- MacPropagateEnabledStateChanged() ;
-
- return true;
}
//
#endif
}
-void wxWindowMac::MacPropagateEnabledStateChanged()
+void wxWindowMac::OnEnabled(bool WXUNUSED(enabled))
{
#if !TARGET_API_MAC_OSX
MacEnabledStateChanged() ;
-
- wxWindowMac *child;
- wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
- while ( node )
- {
- child = node->GetData();
- if ( child->IsEnabled() )
- child->MacPropagateEnabledStateChanged() ;
-
- node = node->GetNext();
- }
#endif
}
fontToUse = &m_font;
wxClientDC dc( (wxWindowMac*) this ) ;
- long lx,ly,ld,le ;
+ wxCoord lx,ly,ld,le ;
dc.GetTextExtent( string , &lx , &ly , &ld, &le, (wxFont *)fontToUse ) ;
if ( externalLeading )
*externalLeading = le ;
* we always intersect with the entire window, not only with the client area
*/
-void wxWindowMac::Refresh(bool eraseBack, const wxRect *rect)
+void wxWindowMac::Refresh(bool WXUNUSED(eraseBack), const wxRect *rect)
{
if ( m_peer == NULL )
return ;
}
// Coordinates relative to the window
-void wxWindowMac::WarpPointer(int x_pos, int y_pos)
+void wxWindowMac::WarpPointer(int WXUNUSED(x_pos), int WXUNUSED(y_pos))
{
// We really don't move the mouse programmatically under Mac.
}
return ;
#if TARGET_API_MAC_OSX
- if ( !m_macBackgroundBrush.Ok() || m_macBackgroundBrush.GetStyle() == wxTRANSPARENT )
+ if ( !m_macBackgroundBrush.Ok() || m_macBackgroundBrush.GetStyle() == wxTRANSPARENT
+ || GetBackgroundStyle() == wxBG_STYLE_TRANSPARENT )
{
event.Skip() ;
}
return 0;
}
-void wxWindowMac::SetScrollPos(int orient, int pos, bool refresh)
+void wxWindowMac::SetScrollPos(int orient, int pos, bool WXUNUSED(refresh))
{
if ( orient == wxHORIZONTAL )
{
}
}
+void
+wxWindowMac::AlwaysShowScrollbars(bool hflag, bool vflag)
+{
+ bool needVisibilityUpdate = false;
+
+ if ( m_hScrollBarAlwaysShown != hflag )
+ {
+ m_hScrollBarAlwaysShown = hflag;
+ needVisibilityUpdate = true;
+ }
+
+ if ( m_vScrollBarAlwaysShown != vflag )
+ {
+ m_vScrollBarAlwaysShown = vflag;
+ needVisibilityUpdate = true;
+ }
+
+ if ( needVisibilityUpdate )
+ DoUpdateScrollbarVisibility();
+}
//
// we draw borders and grow boxes, are already set up and clipped in the current port / cgContextRef
// our own window origin is at leftOrigin/rightOrigin
//
-void wxWindowMac::MacPaintBorders( int leftOrigin , int rightOrigin )
+void wxWindowMac::MacPaintBorders( int WXUNUSED(leftOrigin) , int WXUNUSED(rightOrigin) )
{
if ( IsTopLevel() )
return ;
m_peer->GetRect( &rect ) ;
InsetRect( &rect, -1 , -1 ) ;
-#if wxMAC_USE_CORE_GRAPHICS
+#if wxMAC_USE_CORE_GRAPHICS
{
CGRect cgrect = CGRectMake( rect.left , rect.top , rect.right - rect.left ,
rect.bottom - rect.top ) ;
wxWindowBase::RemoveChild( child ) ;
}
-// New function that will replace some of the above.
-void wxWindowMac::SetScrollbar(int orient, int pos, int thumbVisible,
- int range, bool refresh)
+void wxWindowMac::DoUpdateScrollbarVisibility()
{
- bool showScroller;
bool triggerSizeEvent = false;
- if ( orient == wxHORIZONTAL )
+ if ( m_hScrollBar )
{
- if ( m_hScrollBar )
- {
- showScroller = ((range != 0) && (range > thumbVisible));
- if ( m_hScrollBar->IsShown() != showScroller )
- {
- m_hScrollBar->Show( showScroller );
- triggerSizeEvent = true;
- }
+ bool showHScrollBar = m_hScrollBarAlwaysShown || m_hScrollBar->IsNeeded();
- m_hScrollBar->SetScrollbar( pos , thumbVisible , range , thumbVisible , refresh ) ;
+ if ( m_hScrollBar->IsShown() != showHScrollBar )
+ {
+ m_hScrollBar->Show( showHScrollBar );
+ triggerSizeEvent = true;
}
}
- else
+
+ if ( m_vScrollBar)
{
- if ( m_vScrollBar )
- {
- showScroller = ((range != 0) && (range > thumbVisible));
- if ( m_vScrollBar->IsShown() != showScroller )
- {
- m_vScrollBar->Show( showScroller ) ;
- triggerSizeEvent = true;
- }
+ bool showVScrollBar = m_vScrollBarAlwaysShown || m_vScrollBar->IsNeeded();
- m_vScrollBar->SetScrollbar( pos , thumbVisible , range , thumbVisible , refresh ) ;
+ if ( m_vScrollBar->IsShown() != showVScrollBar )
+ {
+ m_vScrollBar->Show( showVScrollBar ) ;
+ triggerSizeEvent = true;
}
}
}
}
+// New function that will replace some of the above.
+void wxWindowMac::SetScrollbar(int orient, int pos, int thumb,
+ int range, bool refresh)
+{
+ if ( orient == wxHORIZONTAL && m_hScrollBar )
+ m_hScrollBar->SetScrollbar(pos, thumb, range, thumb, refresh);
+ else if ( orient == wxVERTICAL && m_vScrollBar )
+ m_vScrollBar->SetScrollbar(pos, thumb, range, thumb, refresh);
+
+ DoUpdateScrollbarVisibility();
+}
+
// Does a physical scroll
void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
{
if ( m_peer->GetNeedsDisplay() )
{
// because HIViewScrollRect does not scroll the already invalidated area we have two options:
+ // in case there is already a pending redraw on that area
// either immediate redraw or full invalidate
#if 1
// is the better overall solution, as it does not slow down scrolling
scrollrect.Offset( -MacGetLeftBorderSize() , -MacGetTopBorderSize() ) ;
m_peer->ScrollRect( &scrollrect , dx , dy ) ;
- // becuase HIViewScrollRect does not scroll the already invalidated area we have two options
- // either immediate redraw or full invalidate
#if 0
- // is the better overall solution, as it does not slow down scrolling
- m_peer->SetNeedsDisplay() ;
-#else
// this would be the preferred version for fast drawing controls
-
HIViewRender(m_peer->GetControlRef()) ;
#endif
}
{
wxRect rc( x, y, w, h );
if (rect->Intersects( rc ))
- child->SetSize( x + dx, y + dy, w, h );
+ child->SetSize( x + dx, y + dy, w, h, wxSIZE_AUTO|wxSIZE_ALLOW_MINUS_ONE );
}
else
{
- child->SetSize( x + dx, y + dy, w, h );
+ child->SetSize( x + dx, y + dy, w, h, wxSIZE_AUTO|wxSIZE_ALLOW_MINUS_ONE );
}
}
}
Rect rect ;
m_peer->GetRect( &rect ) ;
- // auf den umgebenden Rahmen zur\9fck
+ // auf den umgebenden Rahmen zur\81Â\9fck
InsetRect( &rect, -1 , -1 ) ;
wxTopLevelWindowMac* top = MacGetTopLevelWindow();
return cursor.Ok() ;
}
-wxString wxWindowMac::MacGetToolTipString( wxPoint &pt )
+wxString wxWindowMac::MacGetToolTipString( wxPoint &WXUNUSED(pt) )
{
#if wxUSE_TOOLTIPS
if ( m_tooltip )
void wxWindowMac::Update()
{
#if TARGET_API_MAC_OSX
- MacGetTopLevelWindow()->MacPerformUpdates() ;
+ wxTopLevelWindowMac* top = MacGetTopLevelWindow();
+ if (top)
+ top->MacPerformUpdates() ;
#else
::Draw1Control( m_peer->GetControlRef() ) ;
#endif
eventNc.SetEventObject( child );
if ( !child->GetEventHandler()->ProcessEvent( eventNc ) )
{
-#if wxMAC_USE_CORE_GRAPHICS
+#if wxMAC_USE_CORE_GRAPHICS
child->MacPaintBorders(0, 0) ;
#else
{
}
}
-void wxWindowMac::OnPaint( wxPaintEvent & event )
+void wxWindowMac::OnPaint( wxPaintEvent & WXUNUSED(event) )
{
- if ( wxTheApp->MacGetCurrentEvent() != NULL && wxTheApp->MacGetCurrentEventHandlerCallRef() != NULL )
+ if ( wxTheApp->MacGetCurrentEvent() != NULL && wxTheApp->MacGetCurrentEventHandlerCallRef() != NULL
+ && GetBackgroundStyle() != wxBG_STYLE_TRANSPARENT )
CallNextEventHandler(
(EventHandlerCallRef)wxTheApp->MacGetCurrentEventHandlerCallRef() ,
(EventRef) wxTheApp->MacGetCurrentEvent() ) ;
}
-void wxWindowMac::MacHandleControlClick( WXWidget control , wxInt16 controlpart , bool WXUNUSED( mouseStillDown ) )
+void wxWindowMac::MacHandleControlClick(WXWidget WXUNUSED(control),
+ wxInt16 WXUNUSED(controlpart),
+ bool WXUNUSED(mouseStillDown))
{
}
bool wxWindowMac::SetTransparent(wxByte alpha)
{
#if wxMAC_USE_CORE_GRAPHICS
+ SetBackgroundStyle(wxBG_STYLE_TRANSPARENT);
+
if ( alpha != m_macAlpha )
{
m_macAlpha = alpha ;
#endif
}
-wxByte wxWindowMac::GetTransparent() const
+wxByte wxWindowMac::GetTransparent() const
{
return m_macAlpha ;
}