#include "wx/menuitem.h"
#include "wx/log.h"
+#if wxUSE_CARET
+ #include "wx/caret.h"
+#endif // wxUSE_CARET
+
#define wxWINDOW_HSCROLL 5998
#define wxWINDOW_VSCROLL 5997
#define MAC_SCROLLBAR_SIZE 16
extern wxList wxPendingDelete;
wxWindow* gFocusWindow = NULL ;
-#if !USE_SHARED_LIBRARY
IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxEvtHandler)
BEGIN_EVENT_TABLE(wxWindow, wxEvtHandler)
- EVT_CHAR(wxWindow::OnChar)
EVT_ERASE_BACKGROUND(wxWindow::OnEraseBackground)
EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged)
EVT_INIT_DIALOG(wxWindow::OnInitDialog)
EVT_IDLE(wxWindow::OnIdle)
- EVT_PAINT(wxWindow::OnPaint)
+// EVT_SCROLL(wxWindow::OnScroll)
END_EVENT_TABLE()
-#endif
-// Constructor
-wxWindow::wxWindow()
+
+// ===========================================================================
+// implementation
+// ===========================================================================
+
+// ---------------------------------------------------------------------------
+// wxWindow utility functions
+// ---------------------------------------------------------------------------
+
+// Find an item given the Macintosh Window Reference
+
+wxList *wxWinMacWindowList = NULL;
+wxWindow *wxFindWinFromMacWindow(WindowRef inWindowRef)
+{
+ wxNode *node = wxWinMacWindowList->Find((long)inWindowRef);
+ if (!node)
+ return NULL;
+ return (wxWindow *)node->Data();
+}
+
+void wxAssociateWinWithMacWindow(WindowRef inWindowRef, wxWindow *win)
+{
+ // adding NULL WindowRef is (first) surely a result of an error and
+ // (secondly) breaks menu command processing
+ wxCHECK_RET( inWindowRef != (WindowRef) NULL, "attempt to add a NULL WindowRef to window list" );
+
+ if ( !wxWinMacWindowList->Find((long)inWindowRef) )
+ wxWinMacWindowList->Append((long)inWindowRef, win);
+}
+
+void wxRemoveMacWindowAssociation(wxWindow *win)
{
- Init() ;
+ wxWinMacWindowList->DeleteObject(win);
}
+// ----------------------------------------------------------------------------
+// constructors and such
+// ----------------------------------------------------------------------------
+
void wxWindow::Init()
{
+ // generic
+ InitBase();
+
+ // MSW specific
+ m_doubleClickAllowed = 0;
+ m_winCaptured = FALSE;
+
+ m_isBeingDeleted = FALSE;
+
+ m_useCtl3D = FALSE;
+ m_mouseInWindow = FALSE;
+
+ m_xThumbSize = 0;
+ m_yThumbSize = 0;
+ m_backgroundTransparent = FALSE;
+
+ // as all windows are created with WS_VISIBLE style...
+ m_isShown = TRUE;
+
m_macWindowData = NULL ;
- m_isWindow = TRUE;
+
m_x = 0;
m_y = 0 ;
m_width = 0 ;
m_height = 0 ;
- // these are the defaults for MSW
- m_macShown = true ;
- m_macEnabled = true ;
- // Generic
- m_windowId = 0;
- m_windowStyle = 0;
- m_windowParent = NULL;
- m_windowEventHandler = this;
- m_windowName = "";
- m_windowCursor = *wxSTANDARD_CURSOR;
- m_children = new wxWindowList;
- m_constraints = NULL;
- m_constraintsInvolvedIn = NULL;
- m_windowSizer = NULL;
- m_sizerParent = NULL;
- m_autoLayout = FALSE;
- m_windowValidator = NULL;
- m_defaultItem = NULL;
- m_returnCode = 0;
- m_caretWidth = 0; m_caretHeight = 0;
- m_caretEnabled = FALSE;
- m_caretShown = FALSE;
- m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE) ;
- // m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW) ; ;
- m_foregroundColour = *wxBLACK;
+
m_hScrollBar = NULL ;
m_vScrollBar = NULL ;
- m_mouseInWindow = FALSE;
#if wxUSE_DRAG_AND_DROP
m_pDropTarget = NULL;
// Destructor
wxWindow::~wxWindow()
{
+ m_isBeingDeleted = TRUE;
+
if ( s_lastMouseWindow == this )
{
s_lastMouseWindow = NULL ;
}
- // Have to delete constraints/sizer FIRST otherwise
- // sizers may try to look at deleted windows as they
- // delete themselves.
-#if wxUSE_CONSTRAINTS
- DeleteRelatedConstraints();
- if (m_constraints)
- {
- // This removes any dangling pointers to this window
- // in other windows' constraintsInvolvedIn lists.
- UnsetConstraints(m_constraints);
- delete m_constraints;
- m_constraints = NULL;
- }
- if (m_windowSizer)
+
+ if ( gFocusWindow == this )
{
- delete m_windowSizer;
- m_windowSizer = NULL;
+ gFocusWindow = NULL ;
}
- // If this is a child of a sizer, remove self from parent
- if (m_sizerParent)
- m_sizerParent->RemoveChild((wxWindow *)this);
-#endif
- if ( FindFocus() == this )
- {
- // really a bad thing - maybe an error ?
- // we cannot even send it a kill focus message at this stage
- gFocusWindow = NULL ;
- }
-
- if (m_windowParent)
- m_windowParent->RemoveChild(this);
+ if ( m_parent )
+ m_parent->RemoveChild(this);
DestroyChildren();
- if ( m_macWindowData )
- {
+ if ( m_macWindowData )
+ {
UMADisposeWindow( m_macWindowData->m_macWindow ) ;
delete m_macWindowData ;
wxRemoveMacWindowAssociation( this ) ;
}
-
- delete m_children;
- m_children = NULL;
-
- // Just in case the window has been Closed, but
- // we're then deleting immediately: don't leave
- // dangling pointers.
- wxPendingDelete.DeleteObject(this);
-
- if ( m_windowValidator )
- delete m_windowValidator;
-}
-
-// Destroy the window (delayed, if a managed window)
-bool wxWindow::Destroy()
-{
- delete this;
- return TRUE;
}
// Constructor
long style,
const wxString& name)
{
- m_isWindow = TRUE;
- // Generic
- m_windowId = 0;
- m_windowStyle = 0;
- m_windowParent = NULL;
- m_windowEventHandler = this;
- m_windowName = "";
- m_windowCursor = *wxSTANDARD_CURSOR;
- m_constraints = NULL;
- m_constraintsInvolvedIn = NULL;
- m_windowSizer = NULL;
- m_sizerParent = NULL;
- m_autoLayout = FALSE;
- m_windowValidator = NULL;
-
-#if wxUSE_DRAG_AND_DROP
- m_pDropTarget = NULL;
-#endif
+ wxCHECK_MSG( parent, FALSE, wxT("can't create wxWindow without parent") );
- m_caretWidth = 0; m_caretHeight = 0;
- m_caretEnabled = FALSE;
- m_caretShown = FALSE;
- m_minSizeX = -1;
- m_minSizeY = -1;
- m_maxSizeX = -1;
- m_maxSizeY = -1;
- m_defaultItem = NULL;
- m_windowParent = NULL;
- if (!parent)
+ if ( !CreateBase(parent, id, pos, size, style, wxDefaultValidator, name) )
return FALSE;
- if (parent) parent->AddChild(this);
-
- m_returnCode = 0;
-
- SetName(name);
-
- if ( id == -1 )
- m_windowId = (int)NewControlId();
- else
- m_windowId = id;
-
- // m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW) ; ;
- m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE) ;
- m_foregroundColour = *wxBLACK;
-
- m_windowStyle = style;
-
- if ( id == -1 )
- m_windowId = (int)NewControlId();
- else
- m_windowId = id;
+ parent->AddChild(this);
m_x = (int)pos.x;
m_y = (int)pos.y;
- AdjustForParentClientOrigin(m_x, m_y, wxSIZE_USE_EXISTING);
- m_width = size.x;
- m_height = size.y;
+ AdjustForParentClientOrigin(m_x, m_y, wxSIZE_USE_EXISTING);
+ m_width = WidthDefault( size.x );
+ m_height = HeightDefault( size.y ) ;
MacCreateScrollBars( style ) ;
{
if (gFocusWindow )
{
+ #if wxUSE_CARET
+ // Deal with caret
+ if ( gFocusWindow->m_caret )
+ {
+ gFocusWindow->m_caret->OnKillFocus();
+ }
+ #endif // wxUSE_CARET
wxControl* control = wxDynamicCast( gFocusWindow , wxControl ) ;
if ( control && control->GetMacControl() )
{
UMASetKeyboardFocus( gFocusWindow->GetMacRootWindow() , control->GetMacControl() , kControlFocusNoPart ) ;
}
- wxFocusEvent event(wxEVT_KILL_FOCUS, gFocusWindow->m_windowId);
- event.SetEventObject(gFocusWindow);
+ wxFocusEvent event(wxEVT_KILL_FOCUS, gFocusWindow->m_windowId);
+ event.SetEventObject(gFocusWindow);
gFocusWindow->GetEventHandler()->ProcessEvent(event) ;
}
gFocusWindow = this ;
{
+ #if wxUSE_CARET
+ // Deal with caret
+ if ( m_caret )
+ {
+ m_caret->OnSetFocus();
+ }
+ #endif // wxUSE_CARET
+ // panel wants to track the window which was the last to have focus in it
+ wxPanel *panel = wxDynamicCast(GetParent(), wxPanel);
+ if ( panel )
+ {
+ panel->SetLastFocus(this);
+ }
wxControl* control = wxDynamicCast( gFocusWindow , wxControl ) ;
if ( control && control->GetMacControl() )
{
UMASetKeyboardFocus( gFocusWindow->GetMacRootWindow() , control->GetMacControl() , kControlEditTextPart ) ;
}
- wxFocusEvent event(wxEVT_SET_FOCUS, m_windowId);
- event.SetEventObject(this);
+ wxFocusEvent event(wxEVT_SET_FOCUS, m_windowId);
+ event.SetEventObject(this);
GetEventHandler()->ProcessEvent(event) ;
}
}
}
-void wxWindow::Enable(bool enable)
+bool wxWindow::Enable(bool enable)
{
- if ( m_macEnabled == enable )
- return ;
-
- m_macEnabled = enable ;
-
- MacSuperEnabled( enable ) ;
- return;
+ if ( !wxWindowBase::Enable(enable) )
+ return FALSE;
+/*
+ HWND hWnd = GetHwnd();
+ if ( hWnd )
+ ::EnableWindow(hWnd, (BOOL)enable);
+*/
+
+ wxWindowList::Node *node = GetChildren().GetFirst();
+ while ( node )
+ {
+ wxWindow *child = node->GetData();
+ child->Enable(enable);
+
+ node = node->GetNext();
+ }
+
+ return TRUE;
}
void wxWindow::CaptureMouse()
wxTheApp->s_captureWindow = NULL ;
}
-// Push/pop event handler (i.e. allow a chain of event handlers
-// be searched)
-void wxWindow::PushEventHandler(wxEvtHandler *handler)
-{
- handler->SetNextHandler(GetEventHandler());
- SetEventHandler(handler);
-}
-
-wxEvtHandler *wxWindow::PopEventHandler(bool deleteHandler)
-{
- if ( GetEventHandler() )
- {
- wxEvtHandler *handlerA = GetEventHandler();
- wxEvtHandler *handlerB = handlerA->GetNextHandler();
- handlerA->SetNextHandler(NULL);
- SetEventHandler(handlerB);
- if ( deleteHandler )
- {
- delete handlerA;
- return NULL;
- }
- else
- return handlerA;
- }
- else
- return NULL;
-}
-
#if wxUSE_DRAG_AND_DROP
void wxWindow::SetDropTarget(wxDropTarget *pDropTarget)
}
// Get total size
-void wxWindow::GetSize(int *x, int *y) const
+void wxWindow::DoGetSize(int *x, int *y) const
{
*x = m_width ;
*y = m_height ;
}
-void wxWindow::GetPosition(int *x, int *y) const
+void wxWindow::DoGetPosition(int *x, int *y) const
{
*x = m_x ;
*y = m_y ;
}
}
-void wxWindow::ScreenToClient(int *x, int *y) const
+
+
+
+
+bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y)
+{
+ menu->SetInvokingWindow(this);
+ menu->UpdateUI();
+ ClientToScreen( &x , &y ) ;
+
+ ::InsertMenu( menu->GetHMenu() , -1 ) ;
+ long menuResult = ::PopUpMenuSelect(menu->GetHMenu() ,y,x, 0) ;
+ menu->MacMenuSelect( this , TickCount() , HiWord(menuResult) , LoWord(menuResult) ) ;
+ ::DeleteMenu( menu->MacGetMenuId() ) ;
+ menu->SetInvokingWindow(NULL);
+
+ return TRUE;
+}
+
+void wxWindow::DoScreenToClient(int *x, int *y) const
{
WindowRef window = GetMacRootWindow() ;
MacRootWindowToClient( x , y ) ;
}
-void wxWindow::ClientToScreen(int *x, int *y) const
+void wxWindow::DoClientToScreen(int *x, int *y) const
{
WindowRef window = GetMacRootWindow() ;
}
}
-void wxWindow::SetCursor(const wxCursor& cursor)
+bool wxWindow::SetCursor(const wxCursor& cursor)
{
- m_windowCursor = cursor;
- if (m_windowCursor.Ok())
+ if ( !wxWindowBase::SetCursor(cursor) )
+ {
+ // no change
+ return FALSE;
+ }
+
+ wxASSERT_MSG( m_cursor.Ok(),
+ wxT("cursor must be valid after call to the base version"));
+
+ Point pt ;
+ wxWindow *mouseWin ;
+ GetMouse( &pt ) ;
+
+ // Change the cursor NOW if we're within the correct window
+
+ if ( MacGetWindowFromPoint( wxPoint( pt.h , pt.v ) , &mouseWin ) )
{
- // since this only affects the window-cursor, we adopt the same
- // behaviour as windows -> it will only change on mouse moved events
- // otherwise the ::WxSetCursor routine will have to be used
+ if ( mouseWin == this && !wxIsBusy() )
+ {
+ cursor.MacInstall() ;
+ }
}
+
+ return TRUE ;
}
// Get size *available for subwindows* i.e. excluding menu bar etc.
-void wxWindow::GetClientSize(int *x, int *y) const
+void wxWindow::DoGetClientSize(int *x, int *y) const
{
*x = m_width ;
*y = m_height ;
(*y) -= MAC_SCROLLBAR_SIZE;
}
+
+// ----------------------------------------------------------------------------
+// tooltips
+// ----------------------------------------------------------------------------
+
+#if wxUSE_TOOLTIPS
+
+void wxWindow::DoSetToolTip(wxToolTip *tooltip)
+{
+ wxWindowBase::DoSetToolTip(tooltip);
+
+// if ( m_tooltip )
+// m_tooltip->SetWindow(this);
+}
+
+#endif // wxUSE_TOOLTIPS
+
+void wxWindow::DoMoveWindow(int x, int y, int width, int height)
+{
+ DoSetSize( x,y, width, height ) ;
+}
+
void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
{
int former_x = m_x ;
void wxWindow::SetTitle(const wxString& title)
{
+ m_label = title ;
+
wxString label ;
if( wxApp::s_macDefaultEncodingIsPC )
wxString wxWindow::GetTitle() const
{
- if ( m_macWindowData )
- {
- char title[256] ;
- wxString label ;
- UMAGetWTitleC( m_macWindowData->m_macWindow , title ) ;
- if( wxApp::s_macDefaultEncodingIsPC )
- label = wxMacMakePCStringFromMac( title ) ;
- else
- label = title ;
- return label;
- }
-
- return wxEmptyString ;
-}
-
-void wxWindow::Centre(int direction)
-{
- int x_offset,y_offset ;
- int display_width, display_height;
- int width, height, x, y;
- wxWindow *parent = GetParent();
- if ((direction & wxCENTER_FRAME) && parent)
- {
- parent->GetPosition(&x_offset,&y_offset) ;
- parent->GetSize(&display_width,&display_height) ;
- }
- else
- {
- wxDisplaySize(&display_width, &display_height);
- x_offset = 0 ;
- y_offset = LMGetMBarHeight() + LMGetMBarHeight() / 2 ; // approx. the window title height
- }
-
- GetSize(&width, &height);
- GetPosition(&x, &y);
-
- if (direction & wxHORIZONTAL)
- x = (int)((display_width - width)/2);
- if (direction & wxVERTICAL)
- y = (int)((display_height - height)/2);
-
- SetSize(x+x_offset, y+y_offset, width, height);
+ return m_label ;
}
-
bool wxWindow::Show(bool show)
{
- if ( m_macShown == show )
- return TRUE ;
-
- m_macShown = show ;
+ if ( !wxWindowBase::Show(show) )
+ return FALSE;
+
if ( m_macWindowData )
{
if (show)
UMAHideWindow( m_macWindowData->m_macWindow ) ;
}
}
- Refresh() ;
MacSuperShown( show ) ;
- return TRUE;
+ Refresh() ;
+
+ return TRUE;
}
-bool wxWindow::IsShown() const
+void wxWindow::MacSuperShown( bool show )
{
- return m_macShown;
+ wxNode *node = GetChildren().First();
+ while ( node )
+ {
+ wxWindow *child = (wxWindow *)node->Data();
+ if ( child->m_isShown )
+ child->MacSuperShown( show ) ;
+ node = node->Next();
+ }
}
int wxWindow::GetCharHeight() const
}
void wxWindow::GetTextExtent(const wxString& string, int *x, int *y,
- int *descent, int *externalLeading, const wxFont *theFont, bool) const
+ int *descent, int *externalLeading, const wxFont *theFont ) const
{
- wxFont *fontToUse = (wxFont *)theFont;
- if (!fontToUse)
- fontToUse = (wxFont *) & m_windowFont;
-
- // TODO
+ const wxFont *fontToUse = theFont;
+ if ( !fontToUse )
+ fontToUse = &m_font;
+
+ wxClientDC dc( this ) ;
+ long lx,ly,ld,le ;
+ dc.GetTextExtent( string , &lx , &ly , &ld, &le, fontToUse ) ;
+ *externalLeading = le ;
+ *descent = ld ;
+ *x = lx ;
+ *y = ly ;
}
void wxWindow::MacEraseBackground( Rect *rect )
EraseRect( rect ) ;
- for (wxNode *node = m_children->First(); node; node = node->Next())
+ for (wxNode *node = GetChildren().First(); node; node = node->Next())
{
wxWindow *child = (wxWindow*)node->Data();
// int width ;
SectRect( &clientrect , rect , &clientrect ) ;
OffsetRect( &clientrect , -child->m_x , -child->m_y ) ;
- if ( child->GetMacRootWindow() == window && child->IsReallyShown() )
+ if ( child->GetMacRootWindow() == window && child->IsShown() )
{
wxMacDrawingClientHelper focus( this ) ;
if ( focus.Ok() )
}
}
-// This can be called by the app (or wxWindows) to do default processing for the current
-// event. Save message/event info in wxWindow so they can be used in this function.
-long wxWindow::Default()
-{
- // TODO
- return 0;
-}
-
-void wxWindow::InitDialog()
-{
- wxInitDialogEvent event(GetId());
- event.SetEventObject( this );
- GetEventHandler()->ProcessEvent(event);
-}
-
-// Default init dialog behaviour is to transfer data to window
-void wxWindow::OnInitDialog(wxInitDialogEvent& event)
-{
- TransferDataToWindow();
-}
-
+#if wxUSE_CARET && WXWIN_COMPATIBILITY
+// ---------------------------------------------------------------------------
// Caret manipulation
+// ---------------------------------------------------------------------------
+
void wxWindow::CreateCaret(int w, int h)
{
- m_caretWidth = w;
- m_caretHeight = h;
- m_caretEnabled = TRUE;
+ SetCaret(new wxCaret(this, w, h));
}
void wxWindow::CreateCaret(const wxBitmap *WXUNUSED(bitmap))
{
- // TODO
+ wxFAIL_MSG("not implemented");
}
void wxWindow::ShowCaret(bool show)
{
- // TODO
+ wxCHECK_RET( m_caret, "no caret to show" );
+
+ m_caret->Show(show);
}
void wxWindow::DestroyCaret()
{
- // TODO
- m_caretEnabled = FALSE;
+ SetCaret(NULL);
}
void wxWindow::SetCaretPos(int x, int y)
{
- // TODO
+ wxCHECK_RET( m_caret, "no caret to move" );
+
+ m_caret->Move(x, y);
}
void wxWindow::GetCaretPos(int *x, int *y) const
{
- // TODO
+ wxCHECK_RET( m_caret, "no caret to get position of" );
+
+ m_caret->GetPosition(x, y);
}
+#endif // wxUSE_CARET
wxWindow *wxGetActiveWindow()
{
return NULL;
}
-void wxWindow::SetSizeHints(int minW, int minH, int maxW, int maxH, int WXUNUSED(incW), int WXUNUSED(incH))
-{
- m_minSizeX = minW;
- m_minSizeY = minH;
- m_maxSizeX = maxW;
- m_maxSizeY = maxH;
-}
-
-
// Coordinates relative to the window
void wxWindow::WarpPointer (int x_pos, int y_pos)
{
void wxWindow::OnEraseBackground(wxEraseEvent& event)
{
// TODO : probably we would adopt the EraseEvent structure
- Default();
}
int wxWindow::GetScrollPos(int orient) const
if ( m_hScrollBar )
m_hScrollBar->SetThumbPosition( pos ) ;
}
- else
- {
- if ( m_vScrollBar )
- m_vScrollBar->SetThumbPosition( pos ) ;
- }
-}
-
-// New function that will replace some of the above.
-void wxWindow::SetScrollbar(int orient, int pos, int thumbVisible,
- int range, bool refresh)
-{
- if ( orient == wxHORIZONTAL )
- {
- if ( m_hScrollBar )
- {
- if ( range == 0 || thumbVisible >= range )
- {
- if ( m_hScrollBar->IsShown() )
- m_hScrollBar->Show(false) ;
- }
- else
- {
- if ( !m_hScrollBar->IsShown() )
- m_hScrollBar->Show(true) ;
- m_hScrollBar->SetScrollbar( pos , thumbVisible , range , refresh ) ;
- }
- }
- }
- else
- {
- if ( m_vScrollBar )
- {
- if ( range == 0 || thumbVisible >= range )
- {
- if ( m_vScrollBar->IsShown() )
- m_vScrollBar->Show(false) ;
- }
- else
- {
- if ( !m_vScrollBar->IsShown() )
- m_vScrollBar->Show(true) ;
- m_vScrollBar->SetScrollbar( pos , thumbVisible , range , refresh ) ;
- }
- }
- }
- MacRepositionScrollBars() ;
-}
-
-// Does a physical scroll
-void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
-{
- wxMacDrawingClientHelper focus( this ) ;
- if ( focus.Ok() )
- {
- int width , height ;
- GetClientSize( &width , &height ) ;
- Rect scrollrect = { 0 , 0 , height , width } ;
-
- RgnHandle updateRgn = NewRgn() ;
- ClipRect( &scrollrect ) ;
- if ( rect )
- {
- Rect r = { rect->y , rect->x , rect->y + rect->height , rect->x + rect->width } ;
- SectRect( &scrollrect , &r , &scrollrect ) ;
- }
- ScrollRect( &scrollrect , dx , dy , updateRgn ) ;
- InvalRgn( updateRgn ) ;
- DisposeRgn( updateRgn ) ;
- }
-}
-
-void wxWindow::SetFont(const wxFont& font)
-{
- m_windowFont = font;
-
- if (!m_windowFont.Ok())
- return;
- // TODO
-}
-
-void wxWindow::OnChar(wxKeyEvent& event)
-{
- if ( event.KeyCode() == WXK_TAB ) {
- // propagate the TABs to the parent - it's up to it to decide what
- // to do with it
- if ( GetParent() ) {
- if ( GetParent()->ProcessEvent(event) )
- return;
- }
- }
-}
-
-void wxWindow::OnPaint(wxPaintEvent& event)
-{
-/*
- if ( m_macWindowData )
- {
- wxMacDrawingClientHelper helper ( this ) ;
- long x ,y ,w ,h ;
- GetUpdateRegion().GetBox( x , y , w , h ) ;
- UMASetThemeWindowBackground( m_macWindowData->m_macWindow , m_macWindowData->m_macWindowBackgroundTheme , false ) ;
- Rect r = { y , x, y+h , x+w } ;
- EraseRect( &r ) ;
- }
- else
- {
- wxMacDrawingClientHelper helper ( this ) ;
- long x ,y ,w ,h ;
- GetUpdateRegion().GetBox( x , y , w , h ) ;
- RGBBackColor( &m_backgroundColour.GetPixel() ) ;
- Rect r = { y , x, y+h , x+w } ;
- EraseRect( &r ) ;
- }
-*/
-}
-
-bool wxWindow::IsEnabled() const
-{
- return m_macEnabled ;
-}
-
-// Dialog support: override these and call
-// base class members to add functionality
-// that can't be done using validators.
-// NOTE: these functions assume that controls
-// are direct children of this window, not grandchildren
-// or other levels of descendant.
-
-// Transfer values to controls. If returns FALSE,
-// it's an application error (pops up a dialog)
-bool wxWindow::TransferDataToWindow()
-{
- wxNode *node = GetChildren().First();
- while ( node )
- {
- wxWindow *child = (wxWindow *)node->Data();
- if ( child->GetValidator() &&
- !child->GetValidator()->TransferToWindow() )
- {
- wxMessageBox("Application Error", "Could not transfer data to window", wxOK|wxICON_EXCLAMATION);
- return FALSE;
- }
-
- node = node->Next();
- }
- return TRUE;
-}
-
-// Transfer values from controls. If returns FALSE,
-// validation failed: don't quit
-bool wxWindow::TransferDataFromWindow()
-{
- wxNode *node = GetChildren().First();
- while ( node )
- {
- wxWindow *child = (wxWindow *)node->Data();
- if ( child->GetValidator() && !child->GetValidator()->TransferFromWindow() )
- {
- return FALSE;
- }
-
- node = node->Next();
- }
- return TRUE;
-}
-
-bool wxWindow::Validate()
-{
- wxNode *node = GetChildren().First();
- while ( node )
- {
- wxWindow *child = (wxWindow *)node->Data();
- if ( child->GetValidator() && /* child->GetValidator()->Ok() && */ !child->GetValidator()->Validate(this) )
- {
- return FALSE;
- }
-
- node = node->Next();
- }
- return TRUE;
-}
-
-// Get the window with the focus
-wxWindow *wxWindow::FindFocus()
-{
- return gFocusWindow ;
-}
-
-// ----------------------------------------------------------------------------
-// RTTI
-// ----------------------------------------------------------------------------
-
-bool wxWindow::IsTopLevel() const
-{
- return wxDynamicCast(this, wxFrame) || wxDynamicCast(this, wxDialog);
-}
-
-void wxWindow::AddChild(wxWindow *child)
-{
- GetChildren().Append(child);
- child->m_windowParent = this;
-}
-
-void wxWindow::RemoveChild(wxWindow *child)
-{
- GetChildren().DeleteObject(child);
- child->m_windowParent = NULL;
-}
-
-void wxWindow::DestroyChildren()
-{
- wxNode *node;
- while ((node = GetChildren().First()) != (wxNode *)NULL) {
- wxWindow *child;
- if ((child = (wxWindow *)node->Data()) != (wxWindow *)NULL) {
- delete child;
- if ( GetChildren().Find(child) )
- delete node;
- }
- } /* while */
-}
-
-void wxWindow::MakeModal(bool modal)
-{
- // Disable all other windows
- if (this->IsKindOf(CLASSINFO(wxDialog)) || this->IsKindOf(CLASSINFO(wxFrame)))
- {
- wxNode *node = wxTopLevelWindows.First();
- while (node)
- {
- wxWindow *win = (wxWindow *)node->Data();
- if (win != this)
- win->Enable(!modal);
-
- node = node->Next();
- }
- }
-}
-
-// If nothing defined for this, try the parent.
-// E.g. we may be a button loaded from a resource, with no callback function
-// defined.
-void wxWindow::OnCommand(wxWindow& win, wxCommandEvent& event)
-{
- if (GetEventHandler()->ProcessEvent(event) )
- return;
- if (m_windowParent)
- m_windowParent->GetEventHandler()->OnCommand(win, event);
-}
-
-// ----------------------------------------------------------------------------
-// constraints and sizers
-// ----------------------------------------------------------------------------
-
-#if wxUSE_CONSTRAINTS
-
-void wxWindow::SetConstraints( wxLayoutConstraints *constraints )
-{
- if ( m_constraints )
- {
- UnsetConstraints(m_constraints);
- delete m_constraints;
- }
- m_constraints = constraints;
- if ( m_constraints )
- {
- // Make sure other windows know they're part of a 'meaningful relationship'
- if ( m_constraints->left.GetOtherWindow() && (m_constraints->left.GetOtherWindow() != this) )
- m_constraints->left.GetOtherWindow()->AddConstraintReference(this);
- if ( m_constraints->top.GetOtherWindow() && (m_constraints->top.GetOtherWindow() != this) )
- m_constraints->top.GetOtherWindow()->AddConstraintReference(this);
- if ( m_constraints->right.GetOtherWindow() && (m_constraints->right.GetOtherWindow() != this) )
- m_constraints->right.GetOtherWindow()->AddConstraintReference(this);
- if ( m_constraints->bottom.GetOtherWindow() && (m_constraints->bottom.GetOtherWindow() != this) )
- m_constraints->bottom.GetOtherWindow()->AddConstraintReference(this);
- if ( m_constraints->width.GetOtherWindow() && (m_constraints->width.GetOtherWindow() != this) )
- m_constraints->width.GetOtherWindow()->AddConstraintReference(this);
- if ( m_constraints->height.GetOtherWindow() && (m_constraints->height.GetOtherWindow() != this) )
- m_constraints->height.GetOtherWindow()->AddConstraintReference(this);
- if ( m_constraints->centreX.GetOtherWindow() && (m_constraints->centreX.GetOtherWindow() != this) )
- m_constraints->centreX.GetOtherWindow()->AddConstraintReference(this);
- if ( m_constraints->centreY.GetOtherWindow() && (m_constraints->centreY.GetOtherWindow() != this) )
- m_constraints->centreY.GetOtherWindow()->AddConstraintReference(this);
- }
-}
-
-// This removes any dangling pointers to this window in other windows'
-// constraintsInvolvedIn lists.
-void wxWindow::UnsetConstraints(wxLayoutConstraints *c)
-{
- if ( c )
- {
- if ( c->left.GetOtherWindow() && (c->top.GetOtherWindow() != this) )
- c->left.GetOtherWindow()->RemoveConstraintReference(this);
- if ( c->top.GetOtherWindow() && (c->top.GetOtherWindow() != this) )
- c->top.GetOtherWindow()->RemoveConstraintReference(this);
- if ( c->right.GetOtherWindow() && (c->right.GetOtherWindow() != this) )
- c->right.GetOtherWindow()->RemoveConstraintReference(this);
- if ( c->bottom.GetOtherWindow() && (c->bottom.GetOtherWindow() != this) )
- c->bottom.GetOtherWindow()->RemoveConstraintReference(this);
- if ( c->width.GetOtherWindow() && (c->width.GetOtherWindow() != this) )
- c->width.GetOtherWindow()->RemoveConstraintReference(this);
- if ( c->height.GetOtherWindow() && (c->height.GetOtherWindow() != this) )
- c->height.GetOtherWindow()->RemoveConstraintReference(this);
- if ( c->centreX.GetOtherWindow() && (c->centreX.GetOtherWindow() != this) )
- c->centreX.GetOtherWindow()->RemoveConstraintReference(this);
- if ( c->centreY.GetOtherWindow() && (c->centreY.GetOtherWindow() != this) )
- c->centreY.GetOtherWindow()->RemoveConstraintReference(this);
- }
-}
-
-// Back-pointer to other windows we're involved with, so if we delete this
-// window, we must delete any constraints we're involved with.
-void wxWindow::AddConstraintReference(wxWindow *otherWin)
-{
- if ( !m_constraintsInvolvedIn )
- m_constraintsInvolvedIn = new wxWindowList;
- if ( !m_constraintsInvolvedIn->Find(otherWin) )
- m_constraintsInvolvedIn->Append(otherWin);
-}
-
-// REMOVE back-pointer to other windows we're involved with.
-void wxWindow::RemoveConstraintReference(wxWindow *otherWin)
-{
- if ( m_constraintsInvolvedIn )
- m_constraintsInvolvedIn->DeleteObject(otherWin);
-}
-
-// Reset any constraints that mention this window
-void wxWindow::DeleteRelatedConstraints()
-{
- if ( m_constraintsInvolvedIn )
- {
- wxWindowList::Node *node = m_constraintsInvolvedIn->GetFirst();
- while (node)
- {
- wxWindow *win = node->GetData();
- wxLayoutConstraints *constr = win->GetConstraints();
-
- // Reset any constraints involving this window
- if ( constr )
- {
- constr->left.ResetIfWin(this);
- constr->top.ResetIfWin(this);
- constr->right.ResetIfWin(this);
- constr->bottom.ResetIfWin(this);
- constr->width.ResetIfWin(this);
- constr->height.ResetIfWin(this);
- constr->centreX.ResetIfWin(this);
- constr->centreY.ResetIfWin(this);
- }
-
- wxWindowList::Node *next = node->GetNext();
- delete node;
- node = next;
- }
-
- delete m_constraintsInvolvedIn;
- m_constraintsInvolvedIn = (wxWindowList *) NULL;
- }
-}
-
-void wxWindow::SetSizer(wxSizer *sizer)
-{
- if (m_windowSizer) delete m_windowSizer;
-
- m_windowSizer = sizer;
-}
-
-bool wxWindow::Layout()
-{
- int w, h;
- GetClientSize(&w, &h);
-
- // If there is a sizer, use it instead of the constraints
- if ( GetSizer() )
- {
- GetSizer()->SetDimension( 0, 0, w, h );
- return TRUE;
- }
-
- if ( GetConstraints() )
- {
- GetConstraints()->width.SetValue(w);
- GetConstraints()->height.SetValue(h);
- }
-
- // Evaluate child constraints
- ResetConstraints(); // Mark all constraints as unevaluated
- DoPhase(1); // Just one phase need if no sizers involved
- DoPhase(2);
- SetConstraintSizes(); // Recursively set the real window sizes
-
- return TRUE;
-}
-
-
-// Do a phase of evaluating constraints: the default behaviour. wxSizers may
-// do a similar thing, but also impose their own 'constraints' and order the
-// evaluation differently.
-bool wxWindow::LayoutPhase1(int *noChanges)
-{
- wxLayoutConstraints *constr = GetConstraints();
- if ( constr )
- {
- return constr->SatisfyConstraints(this, noChanges);
- }
- else
- return TRUE;
-}
-
-bool wxWindow::LayoutPhase2(int *noChanges)
-{
- *noChanges = 0;
-
- // Layout children
- DoPhase(1);
- DoPhase(2);
- return TRUE;
-}
-
-// Do a phase of evaluating child constraints
-bool wxWindow::DoPhase(int phase)
-{
- int noIterations = 0;
- int maxIterations = 500;
- int noChanges = 1;
- int noFailures = 0;
- wxWindowList succeeded;
- while ((noChanges > 0) && (noIterations < maxIterations))
- {
- noChanges = 0;
- noFailures = 0;
- wxWindowList::Node *node = GetChildren().GetFirst();
- while (node)
- {
- wxWindow *child = node->GetData();
- if ( !child->IsTopLevel() )
- {
- wxLayoutConstraints *constr = child->GetConstraints();
- if ( constr )
- {
- if ( !succeeded.Find(child) )
- {
- int tempNoChanges = 0;
- bool success = ( (phase == 1) ? child->LayoutPhase1(&tempNoChanges) : child->LayoutPhase2(&tempNoChanges) ) ;
- noChanges += tempNoChanges;
- if ( success )
- {
- succeeded.Append(child);
- }
- }
- }
- }
- node = node->GetNext();
- }
-
- noIterations++;
- }
-
- return TRUE;
-}
-
-void wxWindow::ResetConstraints()
-{
- wxLayoutConstraints *constr = GetConstraints();
- if ( constr )
- {
- constr->left.SetDone(FALSE);
- constr->top.SetDone(FALSE);
- constr->right.SetDone(FALSE);
- constr->bottom.SetDone(FALSE);
- constr->width.SetDone(FALSE);
- constr->height.SetDone(FALSE);
- constr->centreX.SetDone(FALSE);
- constr->centreY.SetDone(FALSE);
- }
- wxWindowList::Node *node = GetChildren().GetFirst();
- while (node)
- {
- wxWindow *win = node->GetData();
- if ( !win->IsTopLevel() )
- win->ResetConstraints();
- node = node->GetNext();
- }
+ else
+ {
+ if ( m_vScrollBar )
+ m_vScrollBar->SetThumbPosition( pos ) ;
+ }
}
-// Need to distinguish between setting the 'fake' size for windows and sizers,
-// and setting the real values.
-void wxWindow::SetConstraintSizes(bool recurse)
+void wxWindow::MacPaint( wxPaintEvent &event )
{
- wxLayoutConstraints *constr = GetConstraints();
- if ( constr && constr->left.GetDone() && constr->right.GetDone( ) &&
- constr->width.GetDone() && constr->height.GetDone())
- {
- int x = constr->left.GetValue();
- int y = constr->top.GetValue();
- int w = constr->width.GetValue();
- int h = constr->height.GetValue();
+ wxPaintDC dc(this);
+ PrepareDC(dc);
- if ( (constr->width.GetRelationship() != wxAsIs ) ||
- (constr->height.GetRelationship() != wxAsIs) )
- {
- SetSize(x, y, w, h);
- }
- else
- {
- // If we don't want to resize this window, just move it...
- Move(x, y);
- }
- }
- else if ( constr )
+ if (HasFlag(wxRAISED_BORDER) || HasFlag( wxSUNKEN_BORDER) )
{
- char *windowClass = GetClassInfo()->GetClassName();
-
- wxString winName;
- if ( GetName() == _T("") )
- winName = _T("unnamed");
- else
- winName = GetName();
- wxLogDebug( _T("Constraint(s) not satisfied for window of type %s, name %s:\n"),
- (const char *)windowClass,
- (const char *)winName);
- if ( !constr->left.GetDone()) wxLogDebug( _T(" unsatisfied 'left' constraint.\n") );
- if ( !constr->right.GetDone()) wxLogDebug( _T(" unsatisfied 'right' constraint.\n") );
- if ( !constr->width.GetDone()) wxLogDebug( _T(" unsatisfied 'width' constraint.\n") );
- if ( !constr->height.GetDone()) wxLogDebug( _T(" unsatisfied 'height' constraint.\n") );
- wxLogDebug( _T("Please check constraints: try adding AsIs() constraints.\n") );
+ bool sunken = HasFlag( wxSUNKEN_BORDER ) ;
+
+ wxPen m_penButton3DShadow( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_3DSHADOW ), 1, wxSOLID ) ;
+ wxPen m_penButton3DFace( wxSystemSettings::GetSystemColour( wxSYS_COLOUR_3DFACE ), 1, wxSOLID ) ;
+
+ wxPen wxPen1 = sunken ? *wxWHITE_PEN : *wxBLACK_PEN;
+ wxPen wxPen2 = sunken ? m_penButton3DShadow : m_penButton3DShadow;
+ wxPen wxPen3 = sunken ? m_penButton3DFace : m_penButton3DShadow;
+ wxPen wxPen4 = sunken ? *wxBLACK_PEN : *wxWHITE_PEN;
+
+ dc.SetPen(wxPen1);
+ dc.DrawRectangle(0, 0, m_width, m_height); // outer - right and button
+
+ dc.SetPen(wxPen2);
+ dc.DrawRectangle(1, 1, m_width-1, m_height-1); // outer - left and top
+
+ dc.SetPen(wxPen3);
+ dc.DrawRectangle(0, 0, m_width-2, m_height-2); // inner - right and button
+
+ dc.SetPen(wxPen4);
+ dc.DrawLine(0, 0, m_width-3, 0); // inner - left and top
+ dc.DrawLine(0, 0, 0, m_height-3);
}
-
- if ( recurse )
+ else if (HasFlag(wxSIMPLE_BORDER))
{
- wxWindowList::Node *node = GetChildren().GetFirst();
- while (node)
- {
- wxWindow *win = node->GetData();
- if ( !win->IsTopLevel() )
- win->SetConstraintSizes();
- node = node->GetNext();
- }
+ dc.SetPen(*wxBLACK_PEN);
+ dc.DrawRectangle(0, 0, m_width, m_height);
}
}
-// Only set the size/position of the constraint (if any)
-void wxWindow::SetSizeConstraint(int x, int y, int w, int h)
+// New function that will replace some of the above.
+void wxWindow::SetScrollbar(int orient, int pos, int thumbVisible,
+ int range, bool refresh)
{
- wxLayoutConstraints *constr = GetConstraints();
- if ( constr )
- {
- if ( x != -1 )
- {
- constr->left.SetValue(x);
- constr->left.SetDone(TRUE);
- }
- if ( y != -1 )
- {
- constr->top.SetValue(y);
- constr->top.SetDone(TRUE);
- }
- if ( w != -1 )
- {
- constr->width.SetValue(w);
- constr->width.SetDone(TRUE);
- }
- if ( h != -1 )
- {
- constr->height.SetValue(h);
- constr->height.SetDone(TRUE);
- }
- }
+ if ( orient == wxHORIZONTAL )
+ {
+ if ( m_hScrollBar )
+ {
+ if ( range == 0 || thumbVisible >= range )
+ {
+ if ( m_hScrollBar->IsShown() )
+ m_hScrollBar->Show(false) ;
+ }
+ else
+ {
+ if ( !m_hScrollBar->IsShown() )
+ m_hScrollBar->Show(true) ;
+ m_hScrollBar->SetScrollbar( pos , thumbVisible , range , refresh ) ;
+ }
+ }
+ }
+ else
+ {
+ if ( m_vScrollBar )
+ {
+ if ( range == 0 || thumbVisible >= range )
+ {
+ if ( m_vScrollBar->IsShown() )
+ m_vScrollBar->Show(false) ;
+ }
+ else
+ {
+ if ( !m_vScrollBar->IsShown() )
+ m_vScrollBar->Show(true) ;
+ m_vScrollBar->SetScrollbar( pos , thumbVisible , range , refresh ) ;
+ }
+ }
+ }
+ MacRepositionScrollBars() ;
}
-void wxWindow::MoveConstraint(int x, int y)
+// Does a physical scroll
+void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
{
- wxLayoutConstraints *constr = GetConstraints();
- if ( constr )
+ wxMacDrawingClientHelper focus( this ) ;
+ if ( focus.Ok() )
+ {
+ int width , height ;
+ GetClientSize( &width , &height ) ;
+ Rect scrollrect = { 0 , 0 , height , width } ;
+
+ RgnHandle updateRgn = NewRgn() ;
+ ClipRect( &scrollrect ) ;
+ if ( rect )
{
- if ( x != -1 )
- {
- constr->left.SetValue(x);
- constr->left.SetDone(TRUE);
- }
- if ( y != -1 )
- {
- constr->top.SetValue(y);
- constr->top.SetDone(TRUE);
- }
+ Rect r = { rect->y , rect->x , rect->y + rect->height , rect->x + rect->width } ;
+ SectRect( &scrollrect , &r , &scrollrect ) ;
}
+ ScrollRect( &scrollrect , dx , dy , updateRgn ) ;
+ InvalRgn( updateRgn ) ;
+ DisposeRgn( updateRgn ) ;
+ }
}
-void wxWindow::GetSizeConstraint(int *w, int *h) const
+void wxWindow::MacOnScroll(wxScrollEvent &event )
{
- wxLayoutConstraints *constr = GetConstraints();
- if ( constr )
- {
- *w = constr->width.GetValue();
- *h = constr->height.GetValue();
+ if ( event.m_eventObject == m_vScrollBar || event.m_eventObject == m_hScrollBar )
+ {
+ wxScrollWinEvent wevent;
+ wevent.SetPosition(event.GetPosition());
+ wevent.SetOrientation(event.GetOrientation());
+ wevent.m_eventObject = this;
+
+ switch ( event.m_eventType )
+ {
+ case wxEVT_SCROLL_TOP:
+ wevent.m_eventType = wxEVT_SCROLLWIN_TOP;
+ break;
+
+ case wxEVT_SCROLL_BOTTOM:
+ wevent.m_eventType = wxEVT_SCROLLWIN_BOTTOM;
+ break;
+
+ case wxEVT_SCROLL_LINEUP:
+ wevent.m_eventType = wxEVT_SCROLLWIN_LINEUP;
+ break;
+
+ case wxEVT_SCROLL_LINEDOWN:
+ wevent.m_eventType = wxEVT_SCROLLWIN_LINEDOWN;
+ break;
+
+ case wxEVT_SCROLL_PAGEUP:
+ wevent.m_eventType = wxEVT_SCROLLWIN_PAGEUP;
+ break;
+
+ case wxEVT_SCROLL_PAGEDOWN:
+ wevent.m_eventType = wxEVT_SCROLLWIN_PAGEDOWN;
+ break;
+
+ case wxEVT_SCROLL_THUMBTRACK:
+ wevent.m_eventType = wxEVT_SCROLLWIN_THUMBTRACK;
+ break;
+
+ }
+
+ GetEventHandler()->ProcessEvent(wevent);
}
- else
- GetSize(w, h);
}
-void wxWindow::GetClientSizeConstraint(int *w, int *h) const
+bool wxWindow::SetFont(const wxFont& font)
{
- wxLayoutConstraints *constr = GetConstraints();
- if ( constr )
+ if ( !wxWindowBase::SetFont(font) )
{
- *w = constr->width.GetValue();
- *h = constr->height.GetValue();
+ // nothing to do
+ return FALSE;
}
- else
- GetClientSize(w, h);
-}
-void wxWindow::GetPositionConstraint(int *x, int *y) const
-{
- wxLayoutConstraints *constr = GetConstraints();
- if ( constr )
- {
- *x = constr->left.GetValue();
- *y = constr->top.GetValue();
- }
- else
- GetPosition(x, y);
+ return TRUE;
}
-#endif // wxUSE_CONSTRAINTS
-
-bool wxWindow::Close(bool force)
+// Get the window with the focus
+wxWindow *wxWindowBase::FindFocus()
{
- wxCloseEvent event(wxEVT_CLOSE_WINDOW, m_windowId);
- event.SetEventObject(this);
-#if WXWIN_COMPATIBILITY
- event.SetForce(force);
-#endif
- event.SetCanVeto(!force);
-
- return GetEventHandler()->ProcessEvent(event);
+ return gFocusWindow ;
}
-wxObject* wxWindow::GetChild(int number) const
+#if WXWIN_COMPATIBILITY
+// If nothing defined for this, try the parent.
+// E.g. we may be a button loaded from a resource, with no callback function
+// defined.
+void wxWindow::OnCommand(wxWindow& win, wxCommandEvent& event)
{
- // Return a pointer to the Nth object in the window
- wxNode *node = GetChildren().First();
- int n = number;
- while (node && n--)
- node = node->Next() ;
- if (node)
- {
- wxObject *obj = (wxObject *)node->Data();
- return(obj) ;
- }
- else
- return NULL ;
+ if ( GetEventHandler()->ProcessEvent(event) )
+ return;
+ if ( m_parent )
+ m_parent->GetEventHandler()->OnCommand(win, event);
}
+#endif // WXWIN_COMPATIBILITY_2
-void wxWindow::OnDefaultAction(wxControl *initiatingItem)
+#if WXWIN_COMPATIBILITY
+wxObject* wxWindow::GetChild(int number) const
{
- // Obsolete function
+ // Return a pointer to the Nth object in the Panel
+ wxNode *node = GetChildren().First();
+ int n = number;
+ while (node && n--)
+ node = node->Next();
+ if ( node )
+ {
+ wxObject *obj = (wxObject *)node->Data();
+ return(obj);
+ }
+ else
+ return NULL;
}
+#endif // WXWIN_COMPATIBILITY
void wxWindow::Clear()
{
}
}
-// Fits the panel around the items
-void wxWindow::Fit()
-{
- int maxX = 0;
- int maxY = 0;
- wxNode *node = GetChildren().First();
- while ( node )
- {
- wxWindow *win = (wxWindow *)node->Data();
- int wx, wy, ww, wh;
- win->GetPosition(&wx, &wy);
- win->GetSize(&ww, &wh);
- if ( wx + ww > maxX )
- maxX = wx + ww;
- if ( wy + wh > maxY )
- maxY = wy + wh;
-
- node = node->Next();
- }
- SetClientSize(maxX + 5, maxY + 5);
-}
-
-void wxWindow::SetValidator(const wxValidator& validator)
-{
- if ( m_windowValidator )
- delete m_windowValidator;
- m_windowValidator = validator.Clone();
-
- if ( m_windowValidator )
- m_windowValidator->SetWindow(this) ;
-}
-
-void wxWindow::SetAcceleratorTable(const wxAcceleratorTable& accel)
-{
- m_acceleratorTable = accel;
-}
-
-// Find a window by id or name
-wxWindow *wxWindow::FindWindow(long id)
-{
- if ( GetId() == id)
- return this;
-
- wxNode *node = GetChildren().First();
- while ( node )
- {
- wxWindow *child = (wxWindow *)node->Data();
- wxWindow *found = child->FindWindow(id);
- if ( found )
- return found;
- node = node->Next();
- }
- return NULL;
-}
-
-wxWindow *wxWindow::FindWindow(const wxString& name)
+// Setup background and foreground colours correctly
+void wxWindow::SetupColours()
{
- if ( GetName() == name)
- return this;
-
- wxNode *node = GetChildren().First();
- while ( node )
- {
- wxWindow *child = (wxWindow *)node->Data();
- wxWindow *found = child->FindWindow(name);
- if ( found )
- return found;
- node = node->Next();
- }
- return NULL;
+ if ( GetParent() )
+ SetBackgroundColour(GetParent()->GetBackgroundColour());
}
void wxWindow::OnIdle(wxIdleEvent& event)
// TODO
}
-bool wxWindow::AcceptsFocus() const
-{
- return IsShown() && IsEnabled() && MacCanFocus() ;
-}
-
-// Update region access
-wxRegion wxWindow::GetUpdateRegion() const
-{
- return m_updateRegion;
-}
-
-bool wxWindow::IsExposed(int x, int y, int w, int h) const
-{
- return (m_updateRegion.Contains(x, y, w, h) != wxOutRegion);
-}
-
-bool wxWindow::IsExposed(const wxPoint& pt) const
-{
- return (m_updateRegion.Contains(pt) != wxOutRegion);
-}
-
-bool wxWindow::IsExposed(const wxRect& rect) const
-{
- return (m_updateRegion.Contains(rect) != wxOutRegion);
-}
-
-/*
- * Allocates control IDs
- */
-
-int wxWindow::NewControlId()
-{
- static int s_controlId = 0;
- s_controlId ++;
- return s_controlId;
-}
-
void wxWindow::DoSetClientSize(int width, int height)
{
if ( width != -1 || height != -1 )
}
}
-// ------------------------
-wxList *wxWinMacWindowList = NULL;
-wxWindow *wxFindWinFromMacWindow(WindowRef inWindowRef)
-{
- wxNode *node = wxWinMacWindowList->Find((long)inWindowRef);
- if (!node)
- return NULL;
- return (wxWindow *)node->Data();
-}
-
-void wxAssociateWinWithMacWindow(WindowRef inWindowRef, wxWindow *win)
-{
- // adding NULL WindowRef is (first) surely a result of an error and
- // (secondly) breaks menu command processing
- wxCHECK_RET( inWindowRef != (WindowRef) NULL, "attempt to add a NULL WindowRef to window list" );
-
- if ( !wxWinMacWindowList->Find((long)inWindowRef) )
- wxWinMacWindowList->Append((long)inWindowRef, win);
-}
-
-void wxRemoveMacWindowAssociation(wxWindow *win)
-{
- wxWinMacWindowList->DeleteObject(win);
-}
wxWindow* wxWindow::s_lastMouseWindow = NULL ;
newPoint.x -= m_x;
newPoint.y -= m_y;
- if ( m_children )
+ for (wxNode *node = GetChildren().First(); node; node = node->Next())
{
- for (wxNode *node = m_children->First(); node; node = node->Next())
+ wxWindow *child = (wxWindow*)node->Data();
+ if ( child->GetMacRootWindow() == window )
{
- wxWindow *child = (wxWindow*)node->Data();
- if ( child->GetMacRootWindow() == window )
- {
- if (child->MacGetWindowFromPointSub(newPoint , outWin ))
- return TRUE;
- }
+ if (child->MacGetWindowFromPointSub(newPoint , outWin ))
+ return TRUE;
}
}
int x = event.m_x ;
int y = event.m_y ;
- if ( m_children )
+ for (wxNode *node = GetChildren().First(); node; node = node->Next())
{
- for (wxNode *node = m_children->First(); node; node = node->Next())
+ wxWindow *child = (wxWindow*)node->Data();
+ if ( child->GetMacRootWindow() == window && child->IsShown() && child->IsEnabled() )
{
- wxWindow *child = (wxWindow*)node->Data();
- if ( child->GetMacRootWindow() == window && child->IsReallyShown() && child->IsReallyEnabled() )
- {
- if (child->MacDispatchMouseEvent(event))
- return TRUE;
- }
+ if (child->MacDispatchMouseEvent(event))
+ return TRUE;
}
}
if ( wxBusyCursorCount == 0 )
{
- m_windowCursor.MacInstall() ;
+ m_cursor.MacInstall() ;
}
GetEventHandler()->ProcessEvent( event ) ;
return TRUE;
wxTheApp->s_captureWindow = NULL ;
if ( wxBusyCursorCount == 0 )
{
- m_windowCursor.MacInstall() ;
+ m_cursor.MacInstall() ;
}
}
}
if ( focus.Ok() )
{
WindowRef window = GetMacRootWindow() ;
+ bool eraseBackground = false ;
+ if ( m_macWindowData )
+ eraseBackground = true ;
if ( m_backgroundColour == wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE) )
{
UMASetThemeWindowBackground( window , kThemeBrushDocumentWindowBackground , false ) ;
if ( parent->m_backgroundColour != wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE ) )
{
// if we have any other colours in the hierarchy
- RGBBackColor( &parent->m_backgroundColour.GetPixel()) ;
- break ;
+ RGBBackColor( &parent->m_backgroundColour.GetPixel()) ;
+ break ;
}
// if we have the normal colours in the hierarchy but another control etc. -> use it's background
if ( parent->IsKindOf( CLASSINFO( wxNotebook ) ) || parent->IsKindOf( CLASSINFO( wxTabCtrl ) ))
{
- ApplyThemeBackground (kThemeBackgroundTabPane, &(**updatergn).rgnBBox , kThemeStateActive,8,true);
+ ApplyThemeBackground(kThemeBackgroundTabPane, &(**updatergn).rgnBBox , kThemeStateActive,8,true);
break ;
}
}
{
RGBBackColor( &m_backgroundColour.GetPixel()) ;
}
+ if ( GetParent() && m_backgroundColour != GetParent()->GetBackgroundColour() )
+ eraseBackground = true ;
SetClip( updatergn ) ;
- EraseRgn( updatergn ) ;
+ if ( eraseBackground )
+ {
+ EraseRgn( updatergn ) ;
+ }
}
}
event.m_timeStamp = time ;
event.SetEventObject(this);
+ wxPaintEvent event2( event ) ;
GetEventHandler()->ProcessEvent(event);
+ MacPaint( event2 ) ;
RgnHandle childupdate = NewRgn() ;
- for (wxNode *node = m_children->First(); node; node = node->Next())
+ for (wxNode *node = GetChildren().First(); node; node = node->Next())
{
wxWindow *child = (wxWindow*)node->Data();
int width ;
SetRectRgn( childupdate , child->m_x , child->m_y , child->m_x +width , child->m_y + height ) ;
SectRgn( childupdate , m_updateRegion.GetWXHRGN() , childupdate ) ;
OffsetRgn( childupdate , -child->m_x , -child->m_y ) ;
- if ( child->GetMacRootWindow() == window && child->IsReallyShown() )
+ if ( child->GetMacRootWindow() == window && child->IsShown() )
{
// because dialogs may also be children
child->MacRedraw( childupdate , time ) ;
{
m_vScrollBar = new wxScrollBar(this, wxWINDOW_VSCROLL, wxPoint(m_width-MAC_SCROLLBAR_SIZE, 0),
wxSize(MAC_SCROLLBAR_SIZE, m_height - adjust), wxVERTICAL);
+// m_vScrollBar->PushEventHandler( this ) ;
}
if ( style & wxHSCROLL )
{
m_hScrollBar = new wxScrollBar(this, wxWINDOW_HSCROLL, wxPoint(0 , m_height-MAC_SCROLLBAR_SIZE ),
wxSize( m_width - adjust, MAC_SCROLLBAR_SIZE), wxHORIZONTAL);
+// m_hScrollBar->PushEventHandler( this ) ;
}
+
// because the create does not take into account the client area origin
MacRepositionScrollBars() ; // we might have a real position shift
}
}
-
+bool wxWindow::AcceptsFocus() const
+{
+ return MacCanFocus() && wxWindowBase::AcceptsFocus();
+}
ControlHandle wxWindow::MacGetContainerForEmbedding()
{
node = node->Next();
}
}
-
-bool wxWindow::IsReallyShown() const
-{
- if ( m_macWindowData )
- return m_macShown ;
- else
- return m_macShown && GetParent()->IsReallyShown() ;
-}
-
-bool wxWindow::IsReallyEnabled() const
-{
- if ( m_macWindowData )
- return m_macEnabled ;
- else
- return m_macEnabled && GetParent()->IsReallyEnabled() ;
-}
-
-void wxWindow::MacSuperEnabled( bool enabled )
-{
- wxNode *node = GetChildren().First();
- while ( node )
- {
- wxWindow *child = (wxWindow *)node->Data();
- if ( child->m_macEnabled )
- child->MacSuperEnabled( enabled ) ;
- node = node->Next();
- }
-}
-void wxWindow::MacSuperShown( bool show )
-{
- wxNode *node = GetChildren().First();
- while ( node )
- {
- wxWindow *child = (wxWindow *)node->Data();
- if ( child->m_macShown )
- child->MacSuperShown( show ) ;
- node = node->Next();
- }
-}
bool wxWindow::MacSetupFocusPort( )
{
if ( m_formerPort != m_currentPort )
SetPort( m_formerPort ) ;
}
-
-// ----------------------------------------------------------------------------
-// list classes implementation
-// ----------------------------------------------------------------------------
-
-void wxWindowListNode::DeleteData()
-{
- delete (wxWindow *)GetData();
-}
-