From 9453cf2bd702241fabc417e9dd5cd7422bcd9966 Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Wed, 11 Jul 2001 20:33:12 +0000 Subject: [PATCH] several mac fixes (Mark Newsams patches) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10975 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/generic/spinctlg.h | 2 +- include/wx/mac/choice.h | 1 + include/wx/mac/control.h | 2 +- include/wx/mac/notebook.h | 6 +- include/wx/mac/radiobox.h | 1 + include/wx/mac/slider.h | 15 +- include/wx/mac/statbmp.h | 2 +- include/wx/mac/stattext.h | 2 +- src/generic/spinctlg.cpp | 7 +- src/mac/carbon/choice.cpp | 7 + src/mac/carbon/control.cpp | 313 +++++++++++++++--------- src/mac/carbon/frame.cpp | 8 +- src/mac/carbon/notebmac.cpp | 3 +- src/mac/carbon/radiobox.cpp | 31 ++- src/mac/carbon/slider.cpp | 442 +++++++++++++++++++++++----------- src/mac/carbon/spinctrl.cpp | 4 + src/mac/carbon/window.cpp | 83 +++---- src/mac/choice.cpp | 7 + src/mac/control.cpp | 313 +++++++++++++++--------- src/mac/frame.cpp | 8 +- src/mac/notebmac.cpp | 3 +- src/mac/radiobox.cpp | 31 ++- src/mac/slider.cpp | 442 +++++++++++++++++++++++----------- src/mac/spinctrl.cpp | 4 + src/mac/window.cpp | 83 +++---- 25 files changed, 1198 insertions(+), 622 deletions(-) diff --git a/include/wx/generic/spinctlg.h b/include/wx/generic/spinctlg.h index 3c24bf3384..29d3c0faab 100644 --- a/include/wx/generic/spinctlg.h +++ b/include/wx/generic/spinctlg.h @@ -20,7 +20,7 @@ // without tons of #ifdefs. // ---------------------------------------------------------------------------- -#if wxUSE_SPINBTN && !defined(__WXMAC__) +#if wxUSE_SPINBTN #ifdef __GNUG__ #pragma interface "spinctlg.h" diff --git a/include/wx/mac/choice.h b/include/wx/mac/choice.h index 01faf5e769..50a506940b 100644 --- a/include/wx/mac/choice.h +++ b/include/wx/mac/choice.h @@ -83,6 +83,7 @@ class WXDLLEXPORT wxChoice: public wxChoiceBase virtual inline int GetColumns() const { return 1 ; }; */ protected: + virtual wxSize DoGetBestSize() const ; virtual void DoSetItemClientData( int n, void* clientData ); virtual void* DoGetItemClientData( int n ) const; virtual void DoSetItemClientObject( int n, wxClientData* clientData ); diff --git a/include/wx/mac/control.h b/include/wx/mac/control.h index cf3288535d..35a00c5013 100644 --- a/include/wx/mac/control.h +++ b/include/wx/mac/control.h @@ -75,7 +75,7 @@ public: virtual void MacSuperShown( bool show ) ; virtual bool MacCanFocus() const ; - virtual void DoSetSize(int x, int y,int width, int height,int sizeFlags ) ; + virtual void DoSetSize(int x, int y,int width, int height,int sizeFlags = wxSIZE_AUTO ) ; virtual void OnKeyDown( wxKeyEvent &event ) ; virtual void OnMouseEvent( wxMouseEvent &event ) ; virtual void OnPaint(wxPaintEvent& event) ; diff --git a/include/wx/mac/notebook.h b/include/wx/mac/notebook.h index 283a0166b8..d71c10eebe 100644 --- a/include/wx/mac/notebook.h +++ b/include/wx/mac/notebook.h @@ -80,11 +80,11 @@ public: // control the appearance of the notebook pages // set the size (the same for all pages) - void SetPageSize(const wxSize& size); + virtual void SetPageSize(const wxSize& size); // set the padding between tabs (in pixels) - void SetPadding(const wxSize& padding); + virtual void SetPadding(const wxSize& padding); // sets the size of the tabs (assumes all tabs are the same size) - void SetTabSize(const wxSize& sz); + virtual void SetTabSize(const wxSize& sz); /* // get number of pages in the dialog diff --git a/include/wx/mac/radiobox.h b/include/wx/mac/radiobox.h index 665635334b..632495c5df 100644 --- a/include/wx/mac/radiobox.h +++ b/include/wx/mac/radiobox.h @@ -80,6 +80,7 @@ protected: int m_noRowsOrCols; // Internal functions + virtual wxSize DoGetBestSize() const ; virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO); diff --git a/include/wx/mac/slider.h b/include/wx/mac/slider.h index ff45a5790d..b5dd7e48e7 100644 --- a/include/wx/mac/slider.h +++ b/include/wx/mac/slider.h @@ -53,7 +53,6 @@ public: virtual int GetValue() const ; virtual void SetValue(int); - bool Show(bool show); void SetRange(int minValue, int maxValue); @@ -76,9 +75,20 @@ public: int GetThumbLength() const ; void SetTick(int tickPos) ; + + // set min/max size of the slider + virtual void SetSizeHints( int minW, int minH, + int maxW = -1, int maxH = -1, + int incW = -1, int incH = -1 ); + + protected: + virtual wxSize DoGetBestSize() const; + virtual void DoSetSize(int x, int y, int w, int h, int sizeFlags); + virtual void DoMoveWindow(int x, int y, int w, int h); + void Command(wxCommandEvent& event); void MacHandleControlClick( ControlHandle control , SInt16 controlpart ) ; - protected: + wxStaticText* m_macMinimumStatic ; wxStaticText* m_macMaximumStatic ; wxStaticText* m_macValueStatic ; @@ -88,6 +98,7 @@ public: int m_pageSize; int m_lineSize; int m_tickFreq; +private : DECLARE_EVENT_TABLE() }; diff --git a/include/wx/mac/statbmp.h b/include/wx/mac/statbmp.h index 3ae276eaff..18bffd3d23 100644 --- a/include/wx/mac/statbmp.h +++ b/include/wx/mac/statbmp.h @@ -58,7 +58,7 @@ class WXDLLEXPORT wxStaticBitmap: public wxStaticBitmapBase // overriden base class virtuals virtual bool AcceptsFocus() const { return FALSE; } - wxSize DoGetBestSize() const ; + virtual wxSize DoGetBestSize() const ; protected: wxBitmap m_bitmap; diff --git a/include/wx/mac/stattext.h b/include/wx/mac/stattext.h index 45d6e4e326..934d7e8118 100644 --- a/include/wx/mac/stattext.h +++ b/include/wx/mac/stattext.h @@ -48,7 +48,7 @@ class WXDLLEXPORT wxStaticText: public wxStaticTextBase void DrawParagraph(wxDC &dc, wxString paragraph); void OnPaint( wxPaintEvent &event ) ; void OnDraw( wxDC &dc ) ; - wxSize DoGetBestSize() const ; + virtual wxSize DoGetBestSize() const ; virtual bool AcceptsFocus() const { return FALSE; } private : wxString m_label ; diff --git a/src/generic/spinctlg.cpp b/src/generic/spinctlg.cpp index 44d209b5b9..5c02451b72 100644 --- a/src/generic/spinctlg.cpp +++ b/src/generic/spinctlg.cpp @@ -28,7 +28,7 @@ #pragma hdrstop #endif -#if !(defined(__WXMSW__) || defined(__WXGTK__) || defined(__WXPM__)) || \ +#if !(defined(__WXMSW__) || defined(__WXGTK__) || defined(__WXPM__)) || defined(__WXMAC__) || \ defined(__WXUNIVERSAL__) #ifndef WX_PRECOMP @@ -147,7 +147,6 @@ bool wxSpinCtrl::Create(wxWindow *parent, } SetBackgroundColour(*wxRED); - m_text = new wxSpinCtrlText(this, value); m_btn = new wxSpinCtrlButton(this, style); @@ -155,7 +154,9 @@ bool wxSpinCtrl::Create(wxWindow *parent, m_btn->SetValue(initial); DoSetSize(pos.x, pos.y, size.x, size.y); - +#ifdef __WXMAC__ + DoMoveWindow( pos.x, pos.y, size.x, size.y ) ; +#endif // have to disable this window to avoid interfering it with message // processing to the text and the button... but pretend it is enabled to // make IsEnabled() return TRUE diff --git a/src/mac/carbon/choice.cpp b/src/mac/carbon/choice.cpp index 0559853584..30a17488d2 100644 --- a/src/mac/carbon/choice.cpp +++ b/src/mac/carbon/choice.cpp @@ -216,6 +216,13 @@ void wxChoice::MacHandleControlClick( ControlHandle control , SInt16 controlpart event.SetString(GetStringSelection()); ProcessCommand(event); } + +wxSize wxChoice::DoGetBestSize() const +{ + // TODO should modify this to take into account string length ala wxGTK + return wxSize(100,20); +} + /* void wxChoice::Command(wxCommandEvent & event) { diff --git a/src/mac/carbon/control.cpp b/src/mac/carbon/control.cpp index f0714b067a..1d23a5eaae 100644 --- a/src/mac/carbon/control.cpp +++ b/src/mac/carbon/control.cpp @@ -143,7 +143,50 @@ void wxControl::SetLabel(const wxString& title) wxSize wxControl::DoGetBestSize() const { - return wxSize(20, 20); + Rect bestsize = { 0 , 0 , 0 , 0 } ; + short baselineoffset ; + int bestWidth, bestHeight ; + UMAGetBestControlRect( m_macControl , &bestsize , &baselineoffset ) ; + + if ( EmptyRect( &bestsize ) ) + { + baselineoffset = 0; + bestsize.left = bestsize.top = 0 ; + bestsize.right = 16 ; + bestsize.bottom = 16 ; + if ( IsKindOf( CLASSINFO( wxScrollBar ) ) ) + { + bestsize.bottom = 16 ; + } + else if ( IsKindOf( CLASSINFO( wxSpinButton ) ) ) + { + bestsize.bottom = 24 ; + } + } + + if ( IsKindOf( CLASSINFO( wxButton ) ) ) + { + bestWidth = m_label.Length() * 8 + 12 ; + if ( bestWidth < 70 ) + bestWidth = 70 ; + } + else if ( IsKindOf( CLASSINFO( wxStaticText ) ) ) + { + bestWidth = m_label.Length() * 8 ; + } + else + bestWidth = bestsize.right - bestsize.left ; + + bestWidth += 2 * m_macHorizontalBorder ; + + bestHeight = bestsize.bottom - bestsize.top ; + if ( bestHeight < 10 ) + bestHeight = 13 ; + + bestHeight += 2 * m_macVerticalBorder; + + + return wxSize(bestWidth, bestHeight); } bool wxControl::ProcessCommand (wxCommandEvent & event) @@ -203,7 +246,7 @@ void wxControl::MacPreControlCreate( wxWindow *parent, wxWindowID id, wxString l SetValidator(validator); m_windowStyle = style; - parent->AddChild((wxButton *)this); + parent->AddChild(this); m_backgroundColour = parent->GetBackgroundColour() ; m_foregroundColour = parent->GetForegroundColour() ; @@ -213,20 +256,17 @@ void wxControl::MacPreControlCreate( wxWindow *parent, wxWindowID id, wxString l else m_windowId = id; + // These sizes will be adjusted in MacPostControlCreate + m_width = size.x ; m_height = size.y ; - int x = pos.x ; - int y = pos.y ; - AdjustForParentClientOrigin(x, y, wxSIZE_USE_EXISTING); - m_x = x ; - m_y = y ; + m_x = pos.x ; + m_y = pos.y ; - - parent->MacClientToRootWindow( &x , &y ) ; - outBounds->top = y + m_macVerticalBorder ; - outBounds->left = x + m_macHorizontalBorder ; - outBounds->bottom = outBounds->top + m_height - 2 * m_macVerticalBorder; - outBounds->right = outBounds->left + m_width - 2 * m_macHorizontalBorder ; + outBounds->top = -10; + outBounds->left = -10; + outBounds->bottom = 0; + outBounds->right = 0; char c_text[255]; strcpy( c_text , label ) ; @@ -268,17 +308,35 @@ void wxControl::MacPostControlCreate() ::UMASetControlFontStyle( m_macControl , &controlstyle ) ; } ControlHandle container = GetParent()->MacGetContainerForEmbedding() ; - wxASSERT_MSG( container != NULL , "No valid mac container control" ) ; + wxASSERT_MSG( container != NULL , wxT("No valid mac container control") ) ; ::UMAEmbedControl( m_macControl , container ) ; m_macControlIsShown = true ; - MacAdjustControlRect() ; + wxAssociateControlWithMacControl( m_macControl , this ) ; - UMAShowControl( m_macControl ) ; + + + // Adjust the controls size and position + wxPoint pos(m_x, m_y); + wxSize best_size( DoGetBestSize() ); + wxSize new_size( m_width, m_height ); + + m_x = m_y = m_width = m_height = -1; // Forces SetSize to move/size the control + + if (new_size.x == -1) { + new_size.x = best_size.x; + } + if (new_size.y == -1) { + new_size.y = best_size.y; + } + + SetSize(pos.x, pos.y, new_size.x, new_size.y); + + UMAShowControl( m_macControl ) ; } void wxControl::MacAdjustControlRect() { - wxASSERT_MSG( m_macControl != NULL , "No valid mac control" ) ; + wxASSERT_MSG( m_macControl != NULL , wxT("No valid mac control") ) ; if ( m_width == -1 || m_height == -1 ) { Rect bestsize = { 0 , 0 , 0 , 0 } ; @@ -453,102 +511,127 @@ void wxControl::DoSetSize(int x, int y, return ; } - WindowRef rootwindow = GetMacRootWindow() ; - wxWindow* wxrootwindow = wxFindWinFromMacWindow( rootwindow ) ; - UMASetThemeWindowBackground( rootwindow , kThemeBrushDialogBackgroundActive , false ) ; - - int former_x = m_x ; - int former_y = m_y ; - int former_w = m_width ; - int former_h = m_height ; - - Rect contrlRect ; - GetControlBounds( m_macControl , &contrlRect ) ; - int former_mac_x = contrlRect.left ; - int former_mac_y = contrlRect.top ; - - int currentX, currentY; - GetPosition(¤tX, ¤tY); - int currentW,currentH; - GetSize(¤tW, ¤tH); - - int actualWidth = width; - int actualHeight = height; - int actualX = x; - int actualY = y; - if (x == -1 && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) - actualX = currentX; - if (y == -1 && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) - actualY = currentY; - if (width == -1) - actualWidth = currentW ; - if (height == -1) - actualHeight = currentH ; - - if ( actualX == currentX && actualY == currentY && actualWidth == currentW && actualHeight == currentH) - return ; - - AdjustForParentClientOrigin(actualX, actualY, sizeFlags); - WindowRef macrootwindow = GetMacRootWindow() ; - wxMacDrawingHelper focus( wxFindWinFromMacWindow( macrootwindow ) ) ; - - int mac_x = actualX ; - int mac_y = actualY ; - GetParent()->MacClientToRootWindow( & mac_x , & mac_y ) ; - - if ( mac_x != former_mac_x || mac_y != former_mac_y ) - { - { - Rect inval = { former_mac_y , former_mac_x , former_mac_y + m_height , former_mac_x + m_width } ; - InvalWindowRect( macrootwindow, &inval ) ; - } - UMAMoveControl( m_macControl , mac_x + m_macHorizontalBorder , mac_y + m_macVerticalBorder ) ; - { - Rect inval = { mac_y , mac_x , mac_y + m_height , mac_x + m_width } ; - InvalWindowRect(macrootwindow, &inval ) ; - } - } - - if ( actualX != former_x || actualY != former_y ) - { - m_x = actualX ; - m_y = actualY ; - - MacRepositionScrollBars() ; - // To consider -> should the parameters be the effective or the virtual coordinates (AdjustForParent..) - wxPoint point(m_x, m_y); - wxMoveEvent event(point, m_windowId); - event.SetEventObject(this); - GetEventHandler()->ProcessEvent(event); - } - if ( actualWidth != former_w || actualHeight != former_h ) - { - { - Rect inval = { mac_y , mac_x , mac_y + former_h , mac_x + former_w } ; - InvalWindowRect( macrootwindow, &inval ) ; - } - m_width = actualWidth ; - m_height = actualHeight ; - - UMASizeControl( m_macControl , m_width - 2 * m_macHorizontalBorder, m_height - 2 * m_macVerticalBorder ) ; - { - Rect inval = { mac_y , mac_x , mac_y + m_height , mac_x + m_width } ; - InvalWindowRect( macrootwindow , &inval ) ; - } - - MacRepositionScrollBars() ; - wxSize size(m_width, m_height); - wxSizeEvent event(size, m_windowId); - event.SetEventObject(this); - GetEventHandler()->ProcessEvent(event); - } - if ( wxrootwindow->IsKindOf( CLASSINFO( wxDialog ) ) ) - { - } - else - { - UMASetThemeWindowBackground( rootwindow , kThemeBrushDocumentWindowBackground , false ) ; - } + Rect oldbounds, newbounds; + int new_x, new_y, new_width, new_height; + int mac_x, mac_y; + + new_x = m_x; + new_y = m_y; + new_width = m_width; + new_height = m_height; + + if (sizeFlags & wxSIZE_ALLOW_MINUS_ONE) + { + new_x = x; + new_y = y; + new_width = width; + new_height = height; + } + else + { + if (x != -1) new_x = x; + if (y != -1) new_y = y; + if (width != -1) new_width = width; + if (height != -1) new_height = height; + } + + if(sizeFlags & wxSIZE_AUTO) + { + wxSize size = GetBestSize(); + if (sizeFlags & wxSIZE_AUTO_WIDTH) + { + if (width == -1) new_width = size.x; + } + if (sizeFlags & wxSIZE_AUTO_HEIGHT) + { + if (height == -1) new_height = size.y; + } + } + AdjustForParentClientOrigin(new_x, new_y, sizeFlags); + + mac_x = new_x; + mac_y = new_y; + if(GetParent()) { + GetParent()->MacClientToRootWindow(&mac_x, &mac_y); + } + GetControlBounds(m_macControl, &oldbounds); + oldbounds.right = oldbounds.left + m_width; + oldbounds.bottom = oldbounds.top + m_height; + + bool doMove = false; + bool doResize = false; + + if ( mac_x != (oldbounds.left - m_macHorizontalBorder) || + mac_y != (oldbounds.top - m_macVerticalBorder) ) + { + doMove = true ; + } + if ( new_width != oldbounds.right - oldbounds.left - 2 * m_macHorizontalBorder || + new_height != oldbounds.bottom - oldbounds.top - 2 * m_macVerticalBorder) + { + doResize = true ; + } + + if ( doMove || doResize ) + { + // Ensure resize is within constraints + if ((m_minWidth != -1) && (new_width < m_minWidth)) { + new_width = m_minWidth; + } + if ((m_minHeight != -1) && (new_height < m_minHeight)) { + new_height = m_minHeight; + } + if ((m_maxWidth != -1) && (new_width > m_maxWidth)) { + new_width = m_maxWidth; + } + if ((m_maxHeight != -1) && (new_height > m_maxHeight)) { + new_height = m_maxHeight; + } + + if ( doMove ) + { + m_x = new_x; + m_y = new_y; + + UMAMoveControl(m_macControl, + mac_x + m_macHorizontalBorder, mac_y + m_macVerticalBorder); + + wxMoveEvent event(wxPoint(m_x, m_y), m_windowId); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event) ; + } + if ( doResize ) + { + m_width = new_width; + m_height = new_height; + + UMASizeControl( m_macControl, + m_width - 2 * m_macHorizontalBorder, + m_height - 2 * m_macVerticalBorder ) ; + + wxSizeEvent event(wxSize(m_width, m_height), m_windowId); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event); + } + + // Set up port + WindowRef rootwindow = GetMacRootWindow() ; + wxWindow* wxrootwindow = wxFindWinFromMacWindow( rootwindow ) ; + wxMacDrawingHelper focus( wxrootwindow ); + + UMASetThemeWindowBackground( rootwindow , kThemeBrushDialogBackgroundActive , false ) ; + // Update window at old and new positions + SetRect(&newbounds, m_x, m_y, m_x + m_width, m_y + m_height); + InvalWindowRect( rootwindow , &oldbounds ); + InvalWindowRect( rootwindow , &newbounds ); + + MacRepositionScrollBars() ; + + if ( !wxrootwindow->IsKindOf( CLASSINFO( wxDialog ) ) ) + { + UMASetThemeWindowBackground( rootwindow, kThemeBrushDocumentWindowBackground, false ); + } + } } bool wxControl::Show(bool show) @@ -619,7 +702,6 @@ void wxControl::MacRedrawControl() // the mac control manager always assumes to have the origin at 0,0 SetOrigin( 0 , 0 ) ; - bool hasTabBehind = false ; wxWindow* parent = GetParent() ; while ( parent ) { @@ -660,8 +742,6 @@ void wxControl::OnPaint(wxPaintEvent& event) // the mac control manager always assumes to have the origin at 0,0 SetOrigin( 0 , 0 ) ; - - bool hasTabBehind = false ; wxWindow* parent = GetParent() ; while ( parent ) { @@ -732,7 +812,6 @@ void wxControl::OnMouseEvent( wxMouseEvent &event ) ControlHandle control ; Point localwhere ; - GrafPtr port ; SInt16 controlpart ; WindowRef window = GetMacRootWindow() ; diff --git a/src/mac/carbon/frame.cpp b/src/mac/carbon/frame.cpp index 6bde00fc74..fb3d2fee9f 100644 --- a/src/mac/carbon/frame.cpp +++ b/src/mac/carbon/frame.cpp @@ -315,7 +315,7 @@ void wxFrameMac::DoGetClientSize(int *x, int *y) const wxWindow::DoGetClientSize( x , y ) ; #if wxUSE_STATUSBAR - if ( GetStatusBar() ) + if ( GetStatusBar() && y ) { int statusX, statusY; GetStatusBar()->GetClientSize(&statusX, &statusY); @@ -324,8 +324,10 @@ void wxFrameMac::DoGetClientSize(int *x, int *y) const #endif // wxUSE_STATUSBAR wxPoint pt(GetClientAreaOrigin()); - *y -= pt.y; - *x -= pt.x; + if ( y ) + *y -= pt.y; + if ( x ) + *x -= pt.x; } void wxFrameMac::DoSetClientSize(int clientwidth, int clientheight) diff --git a/src/mac/carbon/notebmac.cpp b/src/mac/carbon/notebmac.cpp index ec38c6230c..496c75fe5b 100644 --- a/src/mac/carbon/notebmac.cpp +++ b/src/mac/carbon/notebmac.cpp @@ -149,7 +149,8 @@ void wxNotebook::SetPageSize(const wxSize& size) int wxNotebook::SetSelection(int nPage) { - wxASSERT( IS_VALID_PAGE(nPage) ); + if( !IS_VALID_PAGE(nPage) ) + return m_nSelection ; ChangePage(m_nSelection, nPage); SetControlValue( m_macControl , m_nSelection + 1 ) ; diff --git a/src/mac/carbon/radiobox.cpp b/src/mac/carbon/radiobox.cpp index f2651ba594..664e5c54d2 100644 --- a/src/mac/carbon/radiobox.cpp +++ b/src/mac/carbon/radiobox.cpp @@ -120,8 +120,6 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& label, m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , false , 0 , 0 , 1, kControlGroupBoxTextTitleProc , (long) this ) ; - MacPostControlCreate() ; - for (i = 0; i < n; i++) { wxRadioButton *radBtn = new wxRadioButton(this, NewControlId(),choices[i],wxPoint(5,20*i+10), @@ -132,7 +130,7 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& label, } SetSelection(0); - SetSize(pos.x,pos.y,size.x,size.y); + MacPostControlCreate() ; return TRUE; } @@ -481,6 +479,33 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags) } } +wxSize wxRadioBox::DoGetBestSize() const +{ + int charWidth, charHeight; + int maxWidth, maxHeight; + int eachWidth, eachHeight; + int totWidth, totHeight; + + wxFont font = GetParent()->GetFont(); + GetTextExtent(wxString("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), + &charWidth, &charHeight, NULL, NULL, &font); + charWidth /= 52; + + maxWidth = -1; + maxHeight = -1; + for (int i = 0 ; i < m_noItems; i++) + { + GetTextExtent(GetString(i), &eachWidth, &eachHeight); + eachWidth = (int)(eachWidth + RADIO_SIZE) ; + eachHeight = (int)((3 * eachHeight) / 2); + if (maxWidth < eachWidth) maxWidth = eachWidth; + if (maxHeight < eachHeight) maxHeight = eachHeight; + } + + totHeight = GetRowCount() * (maxHeight + charHeight/2) + charHeight * 3/2; + totWidth = GetColumnCount() * (maxWidth + charWidth) + charWidth; + return wxSize(totWidth, totHeight); +} //------------------------------------------------------------------------------------- // ¥ GetNumVer //------------------------------------------------------------------------------------- diff --git a/src/mac/carbon/slider.cpp b/src/mac/carbon/slider.cpp index bce30a4bd1..53ad11814e 100644 --- a/src/mac/carbon/slider.cpp +++ b/src/mac/carbon/slider.cpp @@ -23,6 +23,20 @@ BEGIN_EVENT_TABLE(wxSlider, wxControl) END_EVENT_TABLE() #endif + // The dimensions of the different styles of sliders (From Aqua document) + #define wxSLIDER_DIMENSIONACROSS 15 + #define wxSLIDER_DIMENSIONACROSS_WITHTICKMARKS 24 + #define wxSLIDER_DIMENSIONACROSS_ARROW 18 + + // Distance between slider and text + #define wxSLIDER_BORDERTEXT 5 + + /* NB! The default orientation for a slider is horizontal however if the user specifies + * some slider styles but dosen't specify the orientation we have to assume he wants a + * horizontal one. Therefore in this file when testing for the sliders orientation + * vertical is tested for if this is not set then we use the horizontal one + * eg. if(GetWindowStyle() & wxSL_VERTICAL) {} else { horizontal case }> + */ // Slider @@ -44,141 +58,67 @@ bool wxSlider::Create(wxWindow *parent, wxWindowID id, const wxValidator& validator, const wxString& name) { - Rect bounds ; - Str255 title ; - wxSize slsize; - int maxtextwidth, textheight; - - // Is control horizontal or vertical (Can be ambigous if user selects - // another style without also specifying horz or vert - if (!(style & wxSL_HORIZONTAL) && !(style & wxSL_VERTICAL)) { - // Default is horizontal so make it so - style |= wxSL_HORIZONTAL; - } - slsize = size; - // Check that size corresponds with users selection of vertical or - // horizontal slider and insert suitable default values - if (style & wxSL_HORIZONTAL) - { - slsize.y = 15; // Slider width - if (slsize.x == -1) { - slsize.x = 150; // Slider default length - } - } - else - { - slsize.x = 15; // Slider width - if (slsize.y == -1) { - slsize.y = 150; // Slider default length - } + Rect bounds ; + Str255 title ; + SInt16 procID; + + m_macMinimumStatic = NULL ; + m_macMaximumStatic = NULL ; + m_macValueStatic = NULL ; + + + m_lineSize = 1; + m_tickFreq = 0; + + m_rangeMax = maxValue; + m_rangeMin = minValue; + + m_pageSize = (int)((maxValue-minValue)/10); + + MacPreControlCreate( parent, id, "", pos, size, style, + validator, name, &bounds, title ); + + procID = kControlSliderProc + kControlSliderLiveFeedback; + if(style & wxSL_AUTOTICKS) { + procID += kControlSliderHasTickMarks; } - /* Set the height and width for the slider control region. The actual - * slider is set at 10 pixels across. If the slider has labels then the - * control region must be large enough to contain these labels - */ - if (style & wxSL_LABELS) - { - wxString text; - int ht, wd; - - // Get maximum text label width and height - text.Printf("%d", minValue); - parent->GetTextExtent(text, &maxtextwidth, &textheight); - text.Printf("%d", maxValue); - parent->GetTextExtent(text, &wd, &ht); - if(ht > textheight) { - textheight = ht; - } - if (wd > maxtextwidth) { - maxtextwidth = wd; - } - - if (style & wxSL_VERTICAL) { - slsize.x = (15 + maxtextwidth + 2); // Slider wd plus mac text width - } - if (style & wxSL_HORIZONTAL) { - slsize.y = (15 + textheight); // Slider ht plus text ht. - } - } - - MacPreControlCreate( parent , id , "" , pos , slsize , style, - validator , name , &bounds , title ) ; - - m_macMinimumStatic = NULL ; - m_macMaximumStatic = NULL ; - m_macValueStatic = NULL ; - m_lineSize = 1; - m_tickFreq = 0; - - m_rangeMax = maxValue; - m_rangeMin = minValue; - m_pageSize = (int)((maxValue-minValue)/10); - - // Must modify bounds to that of the slider dimensions from slider - // dimensions plus text labels. - if (style & wxSL_LABELS) - { - if ( style & wxSL_HORIZONTAL ) - { - bounds.bottom = bounds.top + 15; - bounds.right -= (5 + maxtextwidth); - } - else // Vertical slider - { - bounds.right = bounds.left + 15; - bounds.bottom -= (5 + textheight); - } + m_macControl = UMANewControl( parent->GetMacRootWindow(), &bounds, title, false, + value, minValue, maxValue, procID, (long) this); + + wxASSERT_MSG( m_macControl != NULL , "No valid mac control" ) ; + + ::SetControlAction( m_macControl , wxMacLiveScrollbarActionUPP ) ; + + if(style & wxSL_LABELS) + { + m_macMinimumStatic = new wxStaticText( this, -1, "" ); + m_macMaximumStatic = new wxStaticText( this, -1, "" ); + m_macValueStatic = new wxStaticText( this, -1, "" ); + SetRange(minValue, maxValue); + SetValue(value); } - m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , - title , false , value , minValue , maxValue, - kControlSliderProc + kControlSliderLiveFeedback + ( ( style & wxSL_AUTOTICKS ) ? kControlSliderHasTickMarks : 0 ) , (long) this ) ; - - wxASSERT_MSG( m_macControl != NULL , "No valid mac control" ) ; - - ::SetControlAction( m_macControl , wxMacLiveScrollbarActionUPP ) ; - - MacPostControlCreate() ; - - if ( style & wxSL_LABELS ) - { - if ( style & wxSL_HORIZONTAL ) - { - wxPoint leftpos( 0 , 15 ) ; - wxPoint rightpos( m_width - (maxtextwidth + 20) , 15 ) ; - wxPoint valuepos( m_width - maxtextwidth , 0 ) ; - wxString valuestring ; - - valuestring.Printf( "%d" , minValue ) ; - m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , leftpos ) ; - - valuestring.Printf( "%d" , maxValue ) ; - m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , rightpos ) ; - - valuestring.Printf( "%d" , value ) ; - m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , valuepos ) ; - } - else // Vertical slider - { - wxPoint toppos( 17 , 0 ) ; - wxPoint bottompos( 17 , m_height - (textheight + 15) ) ; - wxPoint valuepos( 0 , m_height - textheight ) ; - wxString valuestring ; - - valuestring.Printf( "%d" , minValue ) ; - m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , bottompos ) ; - - valuestring.Printf( "%d" , maxValue ) ; - m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , toppos ) ; - - valuestring.Printf( "%d" , value ) ; - m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , valuepos ) ; - } - } - - return true; + else { + m_macMinimumStatic = NULL ; + m_macMaximumStatic = NULL ; + m_macValueStatic = NULL ; + } + + if(style & wxSL_VERTICAL) { + SetSizeHints(10, -1, 10, -1); // Forces SetSize to use the proper width + } + else { + SetSizeHints(-1, 10, -1, 10); // Forces SetSize to use the proper height + } + // NB! SetSizeHints is overloaded by wxSlider and will substitute 10 with the + // proper dimensions, it also means other people cannot bugger the slider with + // other values + + MacPostControlCreate() ; + + return true; } wxSlider::~wxSlider() @@ -194,8 +134,8 @@ void wxSlider::SetValue(int value) { wxString valuestring ; valuestring.Printf( "%d" , value ) ; - if ( m_macMinimumStatic ) - m_macMinimumStatic->SetLabel( valuestring ) ; + if ( m_macValueStatic ) + m_macValueStatic->SetLabel( valuestring ) ; SetControlValue( m_macControl , value ) ; } @@ -206,7 +146,6 @@ void wxSlider::SetRange(int minValue, int maxValue) m_rangeMin = minValue; m_rangeMax = maxValue; - // TODO SetControlMinimum(m_macControl, m_rangeMin); SetControlMaximum(m_macControl, m_rangeMax); @@ -300,11 +239,6 @@ void wxSlider::Command (wxCommandEvent & event) ProcessCommand (event); } -bool wxSlider::Show( bool show ) -{ - return wxWindow::Show( show ) ; -} - void wxSlider::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) { SInt16 value = ::GetControlValue( m_macControl ) ; @@ -322,3 +256,235 @@ void wxSlider::MacHandleControlClick( ControlHandle control , SInt16 controlpart GetEventHandler()->ProcessEvent( cevent ); } + + /* This is overloaded in wxSlider so that the proper width/height will always be used + * for the slider different values would cause redrawing and mouse detection problems */ + void wxSlider::SetSizeHints( int minW, int minH, + int maxW , int maxH , + int incW , int incH ) + { + wxSize size = GetBestSize(); + + if(GetWindowStyle() & wxSL_VERTICAL) { + wxWindow::SetSizeHints(size.x, minH, size.x, maxH, incW, incH); + } + else { + wxWindow::SetSizeHints(minW, size.y, maxW, size.y, incW, incH); + } + } + + wxSize wxSlider::DoGetBestSize() const + { + wxSize size; + int textwidth, textheight; + + if(GetWindowStyle() & wxSL_LABELS) + { + wxString text; + int ht, wd; + + // Get maximum text label width and height + text.Printf("%d", m_rangeMin); + GetTextExtent(text, &textwidth, &textheight); + text.Printf("%d", m_rangeMax); + GetTextExtent(text, &wd, &ht); + if(ht > textheight) { + textheight = ht; + } + if (wd > textwidth) { + textwidth = wd; + } + } + + if(GetWindowStyle() & wxSL_VERTICAL) + { + if(GetWindowStyle() & wxSL_AUTOTICKS) { + size.x = wxSLIDER_DIMENSIONACROSS_WITHTICKMARKS; + } + else { + size.x = wxSLIDER_DIMENSIONACROSS_ARROW; + } + if(GetWindowStyle() & wxSL_LABELS) { + size.x += textwidth + wxSLIDER_BORDERTEXT; + } + size.y = 150; + } + else + { + if(GetWindowStyle() & wxSL_AUTOTICKS) { + size.y = wxSLIDER_DIMENSIONACROSS_WITHTICKMARKS; + } + else { + size.y = wxSLIDER_DIMENSIONACROSS_ARROW; + } + if(GetWindowStyle() & wxSL_LABELS) { + size.y += textheight + wxSLIDER_BORDERTEXT; + } + size.x = 150; + } + return size; + } + + void wxSlider::DoSetSize(int x, int y, int width, int height, int sizeFlags) + { + Rect oldbounds, newbounds; + int new_x, new_y, new_width, new_height; + int mac_x, mac_y; + + new_x = m_x; + new_y = m_y; + new_width = m_width; + new_height = m_height; + + if (sizeFlags & wxSIZE_ALLOW_MINUS_ONE) + { + new_x = x; + new_y = y; + new_width = width; + new_height = height; + } + else + { + if (x != -1) new_x = x; + if (y != -1) new_y = y; + if (width != -1) new_width = width; + if (height != -1) new_height = height; + } + + if(sizeFlags & wxSIZE_AUTO) + { + wxSize size = GetBestSize(); + if (sizeFlags & wxSIZE_AUTO_WIDTH) + { + if (width == -1) new_width = size.x; + } + if (sizeFlags & wxSIZE_AUTO_HEIGHT) + { + if (height == -1) new_height = size.y; + } + } + + AdjustForParentClientOrigin(new_x, new_y, sizeFlags); + + mac_x = new_x; + mac_y = new_y; + if(GetParent()) { + GetParent()->MacClientToRootWindow(&mac_x, &mac_y); + } + + GetControlBounds(m_macControl, &oldbounds); + oldbounds.right = oldbounds.left + m_width; + oldbounds.bottom = oldbounds.top + m_height; + + bool doMove = false; + bool doResize = false; + + if ( mac_x != oldbounds.left || mac_y != oldbounds.top ) + { + doMove = true ; + } + if ( new_width != m_width || new_height != m_height ) + { + doResize = true ; + } + + if ( doMove || doResize ) + { + // Ensure resize is within constraints + if ((m_minWidth != -1) && (new_width < m_minWidth)) { + new_width = m_minWidth; + } + if ((m_minHeight != -1) && (new_height < m_minHeight)) { + new_height = m_minHeight; + } + if ((m_maxWidth != -1) && (new_width > m_maxWidth)) { + new_width = m_maxWidth; + } + if ((m_maxHeight != -1) && (new_height > m_maxHeight)) { + new_height = m_maxHeight; + } + + DoMoveWindow(new_x, new_y, new_width, new_height); + + // Update window at old and new positions + SetRect(&newbounds, m_x, m_y, m_x + m_width, m_y + m_height); + WindowRef rootwindow = GetMacRootWindow(); + InvalWindowRect( rootwindow , &oldbounds ); + InvalWindowRect( rootwindow , &newbounds ); + + if ( doMove ) + { + wxMoveEvent event(wxPoint(m_x, m_y), m_windowId); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event) ; + } + if ( doResize ) + { + wxSizeEvent event(wxSize(m_width, m_height), m_windowId); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event); + } + } + } + + void wxSlider::DoMoveWindow(int x, int y, int width, int height) + { + m_x = x; + m_y = y; + m_width = width; + m_height = height; + + int xborder, yborder; + int minValWidth, maxValWidth, textwidth, textheight; + int sliderBreadth; + + xborder = yborder = 0; + + if (GetWindowStyle() & wxSL_LABELS) + { + wxString text; + int ht; + + // Get maximum text label width and height + text.Printf("%d", m_rangeMin); + GetTextExtent(text, &minValWidth, &textheight); + text.Printf("%d", m_rangeMax); + GetTextExtent(text, &maxValWidth, &ht); + if(ht > textheight) { + textheight = ht; + } + textwidth = (minValWidth > maxValWidth ? minValWidth : maxValWidth); + + xborder = textwidth + wxSLIDER_BORDERTEXT; + yborder = textheight + wxSLIDER_BORDERTEXT; + + // Get slider breadth + if(GetWindowStyle() & wxSL_AUTOTICKS) { + sliderBreadth = wxSLIDER_DIMENSIONACROSS_WITHTICKMARKS; + } + else { + sliderBreadth = wxSLIDER_DIMENSIONACROSS_ARROW; + } + + if(GetWindowStyle() & wxSL_VERTICAL) + { + m_macMinimumStatic->Move(sliderBreadth + wxSLIDER_BORDERTEXT, + height - yborder - textheight); + m_macMaximumStatic->Move(sliderBreadth + wxSLIDER_BORDERTEXT, 0); + m_macValueStatic->Move(0, height - textheight); + } + else + { + m_macMinimumStatic->Move(0, sliderBreadth + wxSLIDER_BORDERTEXT); + m_macMaximumStatic->Move(width - xborder - maxValWidth / 2, + sliderBreadth + wxSLIDER_BORDERTEXT); + m_macValueStatic->Move(width - textwidth, 0); + } + } + + if(GetParent()) { + GetParent()->MacClientToRootWindow(&x, &y); + } + UMAMoveControl(m_macControl, x, y); + UMASizeControl(m_macControl, width - xborder, height - yborder); +} \ No newline at end of file diff --git a/src/mac/carbon/spinctrl.cpp b/src/mac/carbon/spinctrl.cpp index 31aca32843..272c0791f3 100644 --- a/src/mac/carbon/spinctrl.cpp +++ b/src/mac/carbon/spinctrl.cpp @@ -18,7 +18,9 @@ #include "wx/spinctrl.h" +#if 0 +// now using the generic impl //----------------------------------------------------------------------------- // wxSpinCtrl //----------------------------------------------------------------------------- @@ -37,5 +39,7 @@ #endif // wxUSE_SPINBTN/!wxUSE_SPINBTN +#endif + #endif // wxUSE_SPINCTRL diff --git a/src/mac/carbon/window.cpp b/src/mac/carbon/window.cpp index 0cd659a9f0..72cc0f8290 100644 --- a/src/mac/carbon/window.cpp +++ b/src/mac/carbon/window.cpp @@ -341,20 +341,24 @@ void wxWindowMac::DragAcceptFiles(bool accept) // Get total size void wxWindowMac::DoGetSize(int *x, int *y) const { - *x = m_width ; - *y = m_height ; + if(x) *x = m_width ; + if(y) *y = m_height ; } void wxWindowMac::DoGetPosition(int *x, int *y) const { - *x = m_x ; - *y = m_y ; + int xx,yy; + + xx = m_x ; + yy = m_y ; if (GetParent()) { wxPoint pt(GetParent()->GetClientAreaOrigin()); - *x -= pt.x; - *y -= pt.y; + xx -= pt.x; + yy -= pt.y; } + if(x) *x = xx; + if(y) *y = yy; } #if wxUSE_MENUS @@ -378,9 +382,10 @@ void wxWindowMac::DoScreenToClient(int *x, int *y) const { WindowRef window = GetMacRootWindow() ; - Point localwhere ; - localwhere.h = * x ; - localwhere.v = * y ; + Point localwhere = {0,0} ; + + if(x) localwhere.h = * x ; + if(y) localwhere.v = * y ; GrafPtr port ; ::GetPort( &port ) ; @@ -388,8 +393,8 @@ void wxWindowMac::DoScreenToClient(int *x, int *y) const ::GlobalToLocal( &localwhere ) ; ::SetPort( port ) ; - *x = localwhere.h ; - *y = localwhere.v ; + if(x) *x = localwhere.h ; + if(y) *y = localwhere.v ; MacRootWindowToClient( x , y ) ; } @@ -400,9 +405,9 @@ void wxWindowMac::DoClientToScreen(int *x, int *y) const MacClientToRootWindow( x , y ) ; - Point localwhere ; - localwhere.h = * x ; - localwhere.v = * y ; + Point localwhere = { 0,0 }; + if(x) localwhere.h = * x ; + if(y) localwhere.v = * y ; GrafPtr port ; ::GetPort( &port ) ; @@ -410,32 +415,26 @@ void wxWindowMac::DoClientToScreen(int *x, int *y) const ::SetOrigin( 0 , 0 ) ; ::LocalToGlobal( &localwhere ) ; ::SetPort( port ) ; - *x = localwhere.h ; - *y = localwhere.v ; + if(x) *x = localwhere.h ; + if(y) *y = localwhere.v ; } void wxWindowMac::MacClientToRootWindow( int *x , int *y ) const { - if ( m_macWindowData ) - { - } - else + if ( m_macWindowData == NULL) { - *x += m_x ; - *y += m_y ; + if(x) *x += m_x ; + if(y) *y += m_y ; GetParent()->MacClientToRootWindow( x , y ) ; } } void wxWindowMac::MacRootWindowToClient( int *x , int *y ) const { - if ( m_macWindowData ) + if ( m_macWindowData == NULL) { - } - else - { - *x -= m_x ; - *y -= m_y ; + if(x) *x -= m_x ; + if(y) *y -= m_y ; GetParent()->MacRootWindowToClient( x , y ) ; } } @@ -480,11 +479,12 @@ bool wxWindowMac::SetCursor(const wxCursor& cursor) // Get size *available for subwindows* i.e. excluding menu bar etc. void wxWindowMac::DoGetClientSize(int *x, int *y) const { - *x = m_width ; - *y = m_height ; + int ww, hh; + ww = m_width ; + hh = m_height ; - *x -= MacGetLeftBorderSize( ) + MacGetRightBorderSize( ) ; - *y -= MacGetTopBorderSize( ) + MacGetBottomBorderSize( ); + ww -= MacGetLeftBorderSize( ) + MacGetRightBorderSize( ) ; + hh -= MacGetTopBorderSize( ) + MacGetBottomBorderSize( ); if ( (m_vScrollBar && m_vScrollBar->IsShown()) || (m_hScrollBar && m_hScrollBar->IsShown()) ) { @@ -496,7 +496,6 @@ void wxWindowMac::DoGetClientSize(int *x, int *y) const MacClientToRootWindow( &x1 , &y1 ) ; MacClientToRootWindow( &w , &h ) ; - WindowRef window = NULL ; wxWindowMac *iter = (wxWindowMac*)this ; int totW = 10000 , totH = 10000; @@ -514,21 +513,23 @@ void wxWindowMac::DoGetClientSize(int *x, int *y) const if (m_hScrollBar && m_hScrollBar->IsShown() ) { - (*y) -= MAC_SCROLLBAR_SIZE; + hh -= MAC_SCROLLBAR_SIZE; if ( h-y1 >= totH ) { - (*y)+= 1 ; + hh += 1 ; } } if (m_vScrollBar && m_vScrollBar->IsShown() ) { - (*x) -= MAC_SCROLLBAR_SIZE; + ww -= MAC_SCROLLBAR_SIZE; if ( w-x1 >= totW ) { - (*x) += 1 ; + ww += 1 ; } } } + if(x) *x = ww; + if(y) *y = hh; } @@ -789,7 +790,7 @@ bool wxWindowMac::Show(bool show) { WindowRef window = GetMacRootWindow() ; wxWindowMac* win = wxFindWinFromMacWindow( window ) ; - if ( !win->m_isBeingDeleted ) + if ( win && !win->m_isBeingDeleted ) Refresh() ; } else @@ -1797,7 +1798,6 @@ void wxWindowMac::MacMouseDown( EventRecord *ev , short part) void wxWindowMac::MacMouseUp( EventRecord *ev , short part) { - WindowPtr frontWindow ; switch (part) { case inContent: @@ -1810,7 +1810,6 @@ void wxWindowMac::MacMouseUp( EventRecord *ev , short part) void wxWindowMac::MacMouseMoved( EventRecord *ev , short part) { - WindowPtr frontWindow ; switch (part) { case inContent: @@ -1843,7 +1842,7 @@ void wxWindowMac::MacRedraw( RgnHandle updatergn , long time) // ownUpdateRgn is the area that this window has to invalidate i.e. its own area without its children RgnHandle ownUpdateRgn = NewRgn() ; CopyRgn( updatergn , ownUpdateRgn ) ; - wxWindowMac* win = wxFindWinFromMacWindow( window ) ; + { wxMacDrawingHelper focus( this ) ; // was client if ( focus.Ok() ) @@ -2042,7 +2041,6 @@ void wxWindowMac::MacUpdate( EventRecord *ev ) WindowRef wxWindowMac::GetMacRootWindow() const { - WindowRef window = NULL ; wxWindowMac *iter = (wxWindowMac*)this ; while( iter ) @@ -2121,7 +2119,6 @@ void wxWindowMac::MacRepositionScrollBars() MacClientToRootWindow( &x , &y ) ; MacClientToRootWindow( &w , &h ) ; - WindowRef window = NULL ; wxWindowMac *iter = (wxWindowMac*)this ; int totW = 10000 , totH = 10000; diff --git a/src/mac/choice.cpp b/src/mac/choice.cpp index 0559853584..30a17488d2 100644 --- a/src/mac/choice.cpp +++ b/src/mac/choice.cpp @@ -216,6 +216,13 @@ void wxChoice::MacHandleControlClick( ControlHandle control , SInt16 controlpart event.SetString(GetStringSelection()); ProcessCommand(event); } + +wxSize wxChoice::DoGetBestSize() const +{ + // TODO should modify this to take into account string length ala wxGTK + return wxSize(100,20); +} + /* void wxChoice::Command(wxCommandEvent & event) { diff --git a/src/mac/control.cpp b/src/mac/control.cpp index f0714b067a..1d23a5eaae 100644 --- a/src/mac/control.cpp +++ b/src/mac/control.cpp @@ -143,7 +143,50 @@ void wxControl::SetLabel(const wxString& title) wxSize wxControl::DoGetBestSize() const { - return wxSize(20, 20); + Rect bestsize = { 0 , 0 , 0 , 0 } ; + short baselineoffset ; + int bestWidth, bestHeight ; + UMAGetBestControlRect( m_macControl , &bestsize , &baselineoffset ) ; + + if ( EmptyRect( &bestsize ) ) + { + baselineoffset = 0; + bestsize.left = bestsize.top = 0 ; + bestsize.right = 16 ; + bestsize.bottom = 16 ; + if ( IsKindOf( CLASSINFO( wxScrollBar ) ) ) + { + bestsize.bottom = 16 ; + } + else if ( IsKindOf( CLASSINFO( wxSpinButton ) ) ) + { + bestsize.bottom = 24 ; + } + } + + if ( IsKindOf( CLASSINFO( wxButton ) ) ) + { + bestWidth = m_label.Length() * 8 + 12 ; + if ( bestWidth < 70 ) + bestWidth = 70 ; + } + else if ( IsKindOf( CLASSINFO( wxStaticText ) ) ) + { + bestWidth = m_label.Length() * 8 ; + } + else + bestWidth = bestsize.right - bestsize.left ; + + bestWidth += 2 * m_macHorizontalBorder ; + + bestHeight = bestsize.bottom - bestsize.top ; + if ( bestHeight < 10 ) + bestHeight = 13 ; + + bestHeight += 2 * m_macVerticalBorder; + + + return wxSize(bestWidth, bestHeight); } bool wxControl::ProcessCommand (wxCommandEvent & event) @@ -203,7 +246,7 @@ void wxControl::MacPreControlCreate( wxWindow *parent, wxWindowID id, wxString l SetValidator(validator); m_windowStyle = style; - parent->AddChild((wxButton *)this); + parent->AddChild(this); m_backgroundColour = parent->GetBackgroundColour() ; m_foregroundColour = parent->GetForegroundColour() ; @@ -213,20 +256,17 @@ void wxControl::MacPreControlCreate( wxWindow *parent, wxWindowID id, wxString l else m_windowId = id; + // These sizes will be adjusted in MacPostControlCreate + m_width = size.x ; m_height = size.y ; - int x = pos.x ; - int y = pos.y ; - AdjustForParentClientOrigin(x, y, wxSIZE_USE_EXISTING); - m_x = x ; - m_y = y ; + m_x = pos.x ; + m_y = pos.y ; - - parent->MacClientToRootWindow( &x , &y ) ; - outBounds->top = y + m_macVerticalBorder ; - outBounds->left = x + m_macHorizontalBorder ; - outBounds->bottom = outBounds->top + m_height - 2 * m_macVerticalBorder; - outBounds->right = outBounds->left + m_width - 2 * m_macHorizontalBorder ; + outBounds->top = -10; + outBounds->left = -10; + outBounds->bottom = 0; + outBounds->right = 0; char c_text[255]; strcpy( c_text , label ) ; @@ -268,17 +308,35 @@ void wxControl::MacPostControlCreate() ::UMASetControlFontStyle( m_macControl , &controlstyle ) ; } ControlHandle container = GetParent()->MacGetContainerForEmbedding() ; - wxASSERT_MSG( container != NULL , "No valid mac container control" ) ; + wxASSERT_MSG( container != NULL , wxT("No valid mac container control") ) ; ::UMAEmbedControl( m_macControl , container ) ; m_macControlIsShown = true ; - MacAdjustControlRect() ; + wxAssociateControlWithMacControl( m_macControl , this ) ; - UMAShowControl( m_macControl ) ; + + + // Adjust the controls size and position + wxPoint pos(m_x, m_y); + wxSize best_size( DoGetBestSize() ); + wxSize new_size( m_width, m_height ); + + m_x = m_y = m_width = m_height = -1; // Forces SetSize to move/size the control + + if (new_size.x == -1) { + new_size.x = best_size.x; + } + if (new_size.y == -1) { + new_size.y = best_size.y; + } + + SetSize(pos.x, pos.y, new_size.x, new_size.y); + + UMAShowControl( m_macControl ) ; } void wxControl::MacAdjustControlRect() { - wxASSERT_MSG( m_macControl != NULL , "No valid mac control" ) ; + wxASSERT_MSG( m_macControl != NULL , wxT("No valid mac control") ) ; if ( m_width == -1 || m_height == -1 ) { Rect bestsize = { 0 , 0 , 0 , 0 } ; @@ -453,102 +511,127 @@ void wxControl::DoSetSize(int x, int y, return ; } - WindowRef rootwindow = GetMacRootWindow() ; - wxWindow* wxrootwindow = wxFindWinFromMacWindow( rootwindow ) ; - UMASetThemeWindowBackground( rootwindow , kThemeBrushDialogBackgroundActive , false ) ; - - int former_x = m_x ; - int former_y = m_y ; - int former_w = m_width ; - int former_h = m_height ; - - Rect contrlRect ; - GetControlBounds( m_macControl , &contrlRect ) ; - int former_mac_x = contrlRect.left ; - int former_mac_y = contrlRect.top ; - - int currentX, currentY; - GetPosition(¤tX, ¤tY); - int currentW,currentH; - GetSize(¤tW, ¤tH); - - int actualWidth = width; - int actualHeight = height; - int actualX = x; - int actualY = y; - if (x == -1 && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) - actualX = currentX; - if (y == -1 && !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) - actualY = currentY; - if (width == -1) - actualWidth = currentW ; - if (height == -1) - actualHeight = currentH ; - - if ( actualX == currentX && actualY == currentY && actualWidth == currentW && actualHeight == currentH) - return ; - - AdjustForParentClientOrigin(actualX, actualY, sizeFlags); - WindowRef macrootwindow = GetMacRootWindow() ; - wxMacDrawingHelper focus( wxFindWinFromMacWindow( macrootwindow ) ) ; - - int mac_x = actualX ; - int mac_y = actualY ; - GetParent()->MacClientToRootWindow( & mac_x , & mac_y ) ; - - if ( mac_x != former_mac_x || mac_y != former_mac_y ) - { - { - Rect inval = { former_mac_y , former_mac_x , former_mac_y + m_height , former_mac_x + m_width } ; - InvalWindowRect( macrootwindow, &inval ) ; - } - UMAMoveControl( m_macControl , mac_x + m_macHorizontalBorder , mac_y + m_macVerticalBorder ) ; - { - Rect inval = { mac_y , mac_x , mac_y + m_height , mac_x + m_width } ; - InvalWindowRect(macrootwindow, &inval ) ; - } - } - - if ( actualX != former_x || actualY != former_y ) - { - m_x = actualX ; - m_y = actualY ; - - MacRepositionScrollBars() ; - // To consider -> should the parameters be the effective or the virtual coordinates (AdjustForParent..) - wxPoint point(m_x, m_y); - wxMoveEvent event(point, m_windowId); - event.SetEventObject(this); - GetEventHandler()->ProcessEvent(event); - } - if ( actualWidth != former_w || actualHeight != former_h ) - { - { - Rect inval = { mac_y , mac_x , mac_y + former_h , mac_x + former_w } ; - InvalWindowRect( macrootwindow, &inval ) ; - } - m_width = actualWidth ; - m_height = actualHeight ; - - UMASizeControl( m_macControl , m_width - 2 * m_macHorizontalBorder, m_height - 2 * m_macVerticalBorder ) ; - { - Rect inval = { mac_y , mac_x , mac_y + m_height , mac_x + m_width } ; - InvalWindowRect( macrootwindow , &inval ) ; - } - - MacRepositionScrollBars() ; - wxSize size(m_width, m_height); - wxSizeEvent event(size, m_windowId); - event.SetEventObject(this); - GetEventHandler()->ProcessEvent(event); - } - if ( wxrootwindow->IsKindOf( CLASSINFO( wxDialog ) ) ) - { - } - else - { - UMASetThemeWindowBackground( rootwindow , kThemeBrushDocumentWindowBackground , false ) ; - } + Rect oldbounds, newbounds; + int new_x, new_y, new_width, new_height; + int mac_x, mac_y; + + new_x = m_x; + new_y = m_y; + new_width = m_width; + new_height = m_height; + + if (sizeFlags & wxSIZE_ALLOW_MINUS_ONE) + { + new_x = x; + new_y = y; + new_width = width; + new_height = height; + } + else + { + if (x != -1) new_x = x; + if (y != -1) new_y = y; + if (width != -1) new_width = width; + if (height != -1) new_height = height; + } + + if(sizeFlags & wxSIZE_AUTO) + { + wxSize size = GetBestSize(); + if (sizeFlags & wxSIZE_AUTO_WIDTH) + { + if (width == -1) new_width = size.x; + } + if (sizeFlags & wxSIZE_AUTO_HEIGHT) + { + if (height == -1) new_height = size.y; + } + } + AdjustForParentClientOrigin(new_x, new_y, sizeFlags); + + mac_x = new_x; + mac_y = new_y; + if(GetParent()) { + GetParent()->MacClientToRootWindow(&mac_x, &mac_y); + } + GetControlBounds(m_macControl, &oldbounds); + oldbounds.right = oldbounds.left + m_width; + oldbounds.bottom = oldbounds.top + m_height; + + bool doMove = false; + bool doResize = false; + + if ( mac_x != (oldbounds.left - m_macHorizontalBorder) || + mac_y != (oldbounds.top - m_macVerticalBorder) ) + { + doMove = true ; + } + if ( new_width != oldbounds.right - oldbounds.left - 2 * m_macHorizontalBorder || + new_height != oldbounds.bottom - oldbounds.top - 2 * m_macVerticalBorder) + { + doResize = true ; + } + + if ( doMove || doResize ) + { + // Ensure resize is within constraints + if ((m_minWidth != -1) && (new_width < m_minWidth)) { + new_width = m_minWidth; + } + if ((m_minHeight != -1) && (new_height < m_minHeight)) { + new_height = m_minHeight; + } + if ((m_maxWidth != -1) && (new_width > m_maxWidth)) { + new_width = m_maxWidth; + } + if ((m_maxHeight != -1) && (new_height > m_maxHeight)) { + new_height = m_maxHeight; + } + + if ( doMove ) + { + m_x = new_x; + m_y = new_y; + + UMAMoveControl(m_macControl, + mac_x + m_macHorizontalBorder, mac_y + m_macVerticalBorder); + + wxMoveEvent event(wxPoint(m_x, m_y), m_windowId); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event) ; + } + if ( doResize ) + { + m_width = new_width; + m_height = new_height; + + UMASizeControl( m_macControl, + m_width - 2 * m_macHorizontalBorder, + m_height - 2 * m_macVerticalBorder ) ; + + wxSizeEvent event(wxSize(m_width, m_height), m_windowId); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event); + } + + // Set up port + WindowRef rootwindow = GetMacRootWindow() ; + wxWindow* wxrootwindow = wxFindWinFromMacWindow( rootwindow ) ; + wxMacDrawingHelper focus( wxrootwindow ); + + UMASetThemeWindowBackground( rootwindow , kThemeBrushDialogBackgroundActive , false ) ; + // Update window at old and new positions + SetRect(&newbounds, m_x, m_y, m_x + m_width, m_y + m_height); + InvalWindowRect( rootwindow , &oldbounds ); + InvalWindowRect( rootwindow , &newbounds ); + + MacRepositionScrollBars() ; + + if ( !wxrootwindow->IsKindOf( CLASSINFO( wxDialog ) ) ) + { + UMASetThemeWindowBackground( rootwindow, kThemeBrushDocumentWindowBackground, false ); + } + } } bool wxControl::Show(bool show) @@ -619,7 +702,6 @@ void wxControl::MacRedrawControl() // the mac control manager always assumes to have the origin at 0,0 SetOrigin( 0 , 0 ) ; - bool hasTabBehind = false ; wxWindow* parent = GetParent() ; while ( parent ) { @@ -660,8 +742,6 @@ void wxControl::OnPaint(wxPaintEvent& event) // the mac control manager always assumes to have the origin at 0,0 SetOrigin( 0 , 0 ) ; - - bool hasTabBehind = false ; wxWindow* parent = GetParent() ; while ( parent ) { @@ -732,7 +812,6 @@ void wxControl::OnMouseEvent( wxMouseEvent &event ) ControlHandle control ; Point localwhere ; - GrafPtr port ; SInt16 controlpart ; WindowRef window = GetMacRootWindow() ; diff --git a/src/mac/frame.cpp b/src/mac/frame.cpp index 6bde00fc74..fb3d2fee9f 100644 --- a/src/mac/frame.cpp +++ b/src/mac/frame.cpp @@ -315,7 +315,7 @@ void wxFrameMac::DoGetClientSize(int *x, int *y) const wxWindow::DoGetClientSize( x , y ) ; #if wxUSE_STATUSBAR - if ( GetStatusBar() ) + if ( GetStatusBar() && y ) { int statusX, statusY; GetStatusBar()->GetClientSize(&statusX, &statusY); @@ -324,8 +324,10 @@ void wxFrameMac::DoGetClientSize(int *x, int *y) const #endif // wxUSE_STATUSBAR wxPoint pt(GetClientAreaOrigin()); - *y -= pt.y; - *x -= pt.x; + if ( y ) + *y -= pt.y; + if ( x ) + *x -= pt.x; } void wxFrameMac::DoSetClientSize(int clientwidth, int clientheight) diff --git a/src/mac/notebmac.cpp b/src/mac/notebmac.cpp index ec38c6230c..496c75fe5b 100644 --- a/src/mac/notebmac.cpp +++ b/src/mac/notebmac.cpp @@ -149,7 +149,8 @@ void wxNotebook::SetPageSize(const wxSize& size) int wxNotebook::SetSelection(int nPage) { - wxASSERT( IS_VALID_PAGE(nPage) ); + if( !IS_VALID_PAGE(nPage) ) + return m_nSelection ; ChangePage(m_nSelection, nPage); SetControlValue( m_macControl , m_nSelection + 1 ) ; diff --git a/src/mac/radiobox.cpp b/src/mac/radiobox.cpp index f2651ba594..664e5c54d2 100644 --- a/src/mac/radiobox.cpp +++ b/src/mac/radiobox.cpp @@ -120,8 +120,6 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& label, m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , title , false , 0 , 0 , 1, kControlGroupBoxTextTitleProc , (long) this ) ; - MacPostControlCreate() ; - for (i = 0; i < n; i++) { wxRadioButton *radBtn = new wxRadioButton(this, NewControlId(),choices[i],wxPoint(5,20*i+10), @@ -132,7 +130,7 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& label, } SetSelection(0); - SetSize(pos.x,pos.y,size.x,size.y); + MacPostControlCreate() ; return TRUE; } @@ -481,6 +479,33 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags) } } +wxSize wxRadioBox::DoGetBestSize() const +{ + int charWidth, charHeight; + int maxWidth, maxHeight; + int eachWidth, eachHeight; + int totWidth, totHeight; + + wxFont font = GetParent()->GetFont(); + GetTextExtent(wxString("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), + &charWidth, &charHeight, NULL, NULL, &font); + charWidth /= 52; + + maxWidth = -1; + maxHeight = -1; + for (int i = 0 ; i < m_noItems; i++) + { + GetTextExtent(GetString(i), &eachWidth, &eachHeight); + eachWidth = (int)(eachWidth + RADIO_SIZE) ; + eachHeight = (int)((3 * eachHeight) / 2); + if (maxWidth < eachWidth) maxWidth = eachWidth; + if (maxHeight < eachHeight) maxHeight = eachHeight; + } + + totHeight = GetRowCount() * (maxHeight + charHeight/2) + charHeight * 3/2; + totWidth = GetColumnCount() * (maxWidth + charWidth) + charWidth; + return wxSize(totWidth, totHeight); +} //------------------------------------------------------------------------------------- // ¥ GetNumVer //------------------------------------------------------------------------------------- diff --git a/src/mac/slider.cpp b/src/mac/slider.cpp index bce30a4bd1..53ad11814e 100644 --- a/src/mac/slider.cpp +++ b/src/mac/slider.cpp @@ -23,6 +23,20 @@ BEGIN_EVENT_TABLE(wxSlider, wxControl) END_EVENT_TABLE() #endif + // The dimensions of the different styles of sliders (From Aqua document) + #define wxSLIDER_DIMENSIONACROSS 15 + #define wxSLIDER_DIMENSIONACROSS_WITHTICKMARKS 24 + #define wxSLIDER_DIMENSIONACROSS_ARROW 18 + + // Distance between slider and text + #define wxSLIDER_BORDERTEXT 5 + + /* NB! The default orientation for a slider is horizontal however if the user specifies + * some slider styles but dosen't specify the orientation we have to assume he wants a + * horizontal one. Therefore in this file when testing for the sliders orientation + * vertical is tested for if this is not set then we use the horizontal one + * eg. if(GetWindowStyle() & wxSL_VERTICAL) {} else { horizontal case }> + */ // Slider @@ -44,141 +58,67 @@ bool wxSlider::Create(wxWindow *parent, wxWindowID id, const wxValidator& validator, const wxString& name) { - Rect bounds ; - Str255 title ; - wxSize slsize; - int maxtextwidth, textheight; - - // Is control horizontal or vertical (Can be ambigous if user selects - // another style without also specifying horz or vert - if (!(style & wxSL_HORIZONTAL) && !(style & wxSL_VERTICAL)) { - // Default is horizontal so make it so - style |= wxSL_HORIZONTAL; - } - slsize = size; - // Check that size corresponds with users selection of vertical or - // horizontal slider and insert suitable default values - if (style & wxSL_HORIZONTAL) - { - slsize.y = 15; // Slider width - if (slsize.x == -1) { - slsize.x = 150; // Slider default length - } - } - else - { - slsize.x = 15; // Slider width - if (slsize.y == -1) { - slsize.y = 150; // Slider default length - } + Rect bounds ; + Str255 title ; + SInt16 procID; + + m_macMinimumStatic = NULL ; + m_macMaximumStatic = NULL ; + m_macValueStatic = NULL ; + + + m_lineSize = 1; + m_tickFreq = 0; + + m_rangeMax = maxValue; + m_rangeMin = minValue; + + m_pageSize = (int)((maxValue-minValue)/10); + + MacPreControlCreate( parent, id, "", pos, size, style, + validator, name, &bounds, title ); + + procID = kControlSliderProc + kControlSliderLiveFeedback; + if(style & wxSL_AUTOTICKS) { + procID += kControlSliderHasTickMarks; } - /* Set the height and width for the slider control region. The actual - * slider is set at 10 pixels across. If the slider has labels then the - * control region must be large enough to contain these labels - */ - if (style & wxSL_LABELS) - { - wxString text; - int ht, wd; - - // Get maximum text label width and height - text.Printf("%d", minValue); - parent->GetTextExtent(text, &maxtextwidth, &textheight); - text.Printf("%d", maxValue); - parent->GetTextExtent(text, &wd, &ht); - if(ht > textheight) { - textheight = ht; - } - if (wd > maxtextwidth) { - maxtextwidth = wd; - } - - if (style & wxSL_VERTICAL) { - slsize.x = (15 + maxtextwidth + 2); // Slider wd plus mac text width - } - if (style & wxSL_HORIZONTAL) { - slsize.y = (15 + textheight); // Slider ht plus text ht. - } - } - - MacPreControlCreate( parent , id , "" , pos , slsize , style, - validator , name , &bounds , title ) ; - - m_macMinimumStatic = NULL ; - m_macMaximumStatic = NULL ; - m_macValueStatic = NULL ; - m_lineSize = 1; - m_tickFreq = 0; - - m_rangeMax = maxValue; - m_rangeMin = minValue; - m_pageSize = (int)((maxValue-minValue)/10); - - // Must modify bounds to that of the slider dimensions from slider - // dimensions plus text labels. - if (style & wxSL_LABELS) - { - if ( style & wxSL_HORIZONTAL ) - { - bounds.bottom = bounds.top + 15; - bounds.right -= (5 + maxtextwidth); - } - else // Vertical slider - { - bounds.right = bounds.left + 15; - bounds.bottom -= (5 + textheight); - } + m_macControl = UMANewControl( parent->GetMacRootWindow(), &bounds, title, false, + value, minValue, maxValue, procID, (long) this); + + wxASSERT_MSG( m_macControl != NULL , "No valid mac control" ) ; + + ::SetControlAction( m_macControl , wxMacLiveScrollbarActionUPP ) ; + + if(style & wxSL_LABELS) + { + m_macMinimumStatic = new wxStaticText( this, -1, "" ); + m_macMaximumStatic = new wxStaticText( this, -1, "" ); + m_macValueStatic = new wxStaticText( this, -1, "" ); + SetRange(minValue, maxValue); + SetValue(value); } - m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds , - title , false , value , minValue , maxValue, - kControlSliderProc + kControlSliderLiveFeedback + ( ( style & wxSL_AUTOTICKS ) ? kControlSliderHasTickMarks : 0 ) , (long) this ) ; - - wxASSERT_MSG( m_macControl != NULL , "No valid mac control" ) ; - - ::SetControlAction( m_macControl , wxMacLiveScrollbarActionUPP ) ; - - MacPostControlCreate() ; - - if ( style & wxSL_LABELS ) - { - if ( style & wxSL_HORIZONTAL ) - { - wxPoint leftpos( 0 , 15 ) ; - wxPoint rightpos( m_width - (maxtextwidth + 20) , 15 ) ; - wxPoint valuepos( m_width - maxtextwidth , 0 ) ; - wxString valuestring ; - - valuestring.Printf( "%d" , minValue ) ; - m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , leftpos ) ; - - valuestring.Printf( "%d" , maxValue ) ; - m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , rightpos ) ; - - valuestring.Printf( "%d" , value ) ; - m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , valuepos ) ; - } - else // Vertical slider - { - wxPoint toppos( 17 , 0 ) ; - wxPoint bottompos( 17 , m_height - (textheight + 15) ) ; - wxPoint valuepos( 0 , m_height - textheight ) ; - wxString valuestring ; - - valuestring.Printf( "%d" , minValue ) ; - m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , bottompos ) ; - - valuestring.Printf( "%d" , maxValue ) ; - m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , toppos ) ; - - valuestring.Printf( "%d" , value ) ; - m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , valuepos ) ; - } - } - - return true; + else { + m_macMinimumStatic = NULL ; + m_macMaximumStatic = NULL ; + m_macValueStatic = NULL ; + } + + if(style & wxSL_VERTICAL) { + SetSizeHints(10, -1, 10, -1); // Forces SetSize to use the proper width + } + else { + SetSizeHints(-1, 10, -1, 10); // Forces SetSize to use the proper height + } + // NB! SetSizeHints is overloaded by wxSlider and will substitute 10 with the + // proper dimensions, it also means other people cannot bugger the slider with + // other values + + MacPostControlCreate() ; + + return true; } wxSlider::~wxSlider() @@ -194,8 +134,8 @@ void wxSlider::SetValue(int value) { wxString valuestring ; valuestring.Printf( "%d" , value ) ; - if ( m_macMinimumStatic ) - m_macMinimumStatic->SetLabel( valuestring ) ; + if ( m_macValueStatic ) + m_macValueStatic->SetLabel( valuestring ) ; SetControlValue( m_macControl , value ) ; } @@ -206,7 +146,6 @@ void wxSlider::SetRange(int minValue, int maxValue) m_rangeMin = minValue; m_rangeMax = maxValue; - // TODO SetControlMinimum(m_macControl, m_rangeMin); SetControlMaximum(m_macControl, m_rangeMax); @@ -300,11 +239,6 @@ void wxSlider::Command (wxCommandEvent & event) ProcessCommand (event); } -bool wxSlider::Show( bool show ) -{ - return wxWindow::Show( show ) ; -} - void wxSlider::MacHandleControlClick( ControlHandle control , SInt16 controlpart ) { SInt16 value = ::GetControlValue( m_macControl ) ; @@ -322,3 +256,235 @@ void wxSlider::MacHandleControlClick( ControlHandle control , SInt16 controlpart GetEventHandler()->ProcessEvent( cevent ); } + + /* This is overloaded in wxSlider so that the proper width/height will always be used + * for the slider different values would cause redrawing and mouse detection problems */ + void wxSlider::SetSizeHints( int minW, int minH, + int maxW , int maxH , + int incW , int incH ) + { + wxSize size = GetBestSize(); + + if(GetWindowStyle() & wxSL_VERTICAL) { + wxWindow::SetSizeHints(size.x, minH, size.x, maxH, incW, incH); + } + else { + wxWindow::SetSizeHints(minW, size.y, maxW, size.y, incW, incH); + } + } + + wxSize wxSlider::DoGetBestSize() const + { + wxSize size; + int textwidth, textheight; + + if(GetWindowStyle() & wxSL_LABELS) + { + wxString text; + int ht, wd; + + // Get maximum text label width and height + text.Printf("%d", m_rangeMin); + GetTextExtent(text, &textwidth, &textheight); + text.Printf("%d", m_rangeMax); + GetTextExtent(text, &wd, &ht); + if(ht > textheight) { + textheight = ht; + } + if (wd > textwidth) { + textwidth = wd; + } + } + + if(GetWindowStyle() & wxSL_VERTICAL) + { + if(GetWindowStyle() & wxSL_AUTOTICKS) { + size.x = wxSLIDER_DIMENSIONACROSS_WITHTICKMARKS; + } + else { + size.x = wxSLIDER_DIMENSIONACROSS_ARROW; + } + if(GetWindowStyle() & wxSL_LABELS) { + size.x += textwidth + wxSLIDER_BORDERTEXT; + } + size.y = 150; + } + else + { + if(GetWindowStyle() & wxSL_AUTOTICKS) { + size.y = wxSLIDER_DIMENSIONACROSS_WITHTICKMARKS; + } + else { + size.y = wxSLIDER_DIMENSIONACROSS_ARROW; + } + if(GetWindowStyle() & wxSL_LABELS) { + size.y += textheight + wxSLIDER_BORDERTEXT; + } + size.x = 150; + } + return size; + } + + void wxSlider::DoSetSize(int x, int y, int width, int height, int sizeFlags) + { + Rect oldbounds, newbounds; + int new_x, new_y, new_width, new_height; + int mac_x, mac_y; + + new_x = m_x; + new_y = m_y; + new_width = m_width; + new_height = m_height; + + if (sizeFlags & wxSIZE_ALLOW_MINUS_ONE) + { + new_x = x; + new_y = y; + new_width = width; + new_height = height; + } + else + { + if (x != -1) new_x = x; + if (y != -1) new_y = y; + if (width != -1) new_width = width; + if (height != -1) new_height = height; + } + + if(sizeFlags & wxSIZE_AUTO) + { + wxSize size = GetBestSize(); + if (sizeFlags & wxSIZE_AUTO_WIDTH) + { + if (width == -1) new_width = size.x; + } + if (sizeFlags & wxSIZE_AUTO_HEIGHT) + { + if (height == -1) new_height = size.y; + } + } + + AdjustForParentClientOrigin(new_x, new_y, sizeFlags); + + mac_x = new_x; + mac_y = new_y; + if(GetParent()) { + GetParent()->MacClientToRootWindow(&mac_x, &mac_y); + } + + GetControlBounds(m_macControl, &oldbounds); + oldbounds.right = oldbounds.left + m_width; + oldbounds.bottom = oldbounds.top + m_height; + + bool doMove = false; + bool doResize = false; + + if ( mac_x != oldbounds.left || mac_y != oldbounds.top ) + { + doMove = true ; + } + if ( new_width != m_width || new_height != m_height ) + { + doResize = true ; + } + + if ( doMove || doResize ) + { + // Ensure resize is within constraints + if ((m_minWidth != -1) && (new_width < m_minWidth)) { + new_width = m_minWidth; + } + if ((m_minHeight != -1) && (new_height < m_minHeight)) { + new_height = m_minHeight; + } + if ((m_maxWidth != -1) && (new_width > m_maxWidth)) { + new_width = m_maxWidth; + } + if ((m_maxHeight != -1) && (new_height > m_maxHeight)) { + new_height = m_maxHeight; + } + + DoMoveWindow(new_x, new_y, new_width, new_height); + + // Update window at old and new positions + SetRect(&newbounds, m_x, m_y, m_x + m_width, m_y + m_height); + WindowRef rootwindow = GetMacRootWindow(); + InvalWindowRect( rootwindow , &oldbounds ); + InvalWindowRect( rootwindow , &newbounds ); + + if ( doMove ) + { + wxMoveEvent event(wxPoint(m_x, m_y), m_windowId); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event) ; + } + if ( doResize ) + { + wxSizeEvent event(wxSize(m_width, m_height), m_windowId); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(event); + } + } + } + + void wxSlider::DoMoveWindow(int x, int y, int width, int height) + { + m_x = x; + m_y = y; + m_width = width; + m_height = height; + + int xborder, yborder; + int minValWidth, maxValWidth, textwidth, textheight; + int sliderBreadth; + + xborder = yborder = 0; + + if (GetWindowStyle() & wxSL_LABELS) + { + wxString text; + int ht; + + // Get maximum text label width and height + text.Printf("%d", m_rangeMin); + GetTextExtent(text, &minValWidth, &textheight); + text.Printf("%d", m_rangeMax); + GetTextExtent(text, &maxValWidth, &ht); + if(ht > textheight) { + textheight = ht; + } + textwidth = (minValWidth > maxValWidth ? minValWidth : maxValWidth); + + xborder = textwidth + wxSLIDER_BORDERTEXT; + yborder = textheight + wxSLIDER_BORDERTEXT; + + // Get slider breadth + if(GetWindowStyle() & wxSL_AUTOTICKS) { + sliderBreadth = wxSLIDER_DIMENSIONACROSS_WITHTICKMARKS; + } + else { + sliderBreadth = wxSLIDER_DIMENSIONACROSS_ARROW; + } + + if(GetWindowStyle() & wxSL_VERTICAL) + { + m_macMinimumStatic->Move(sliderBreadth + wxSLIDER_BORDERTEXT, + height - yborder - textheight); + m_macMaximumStatic->Move(sliderBreadth + wxSLIDER_BORDERTEXT, 0); + m_macValueStatic->Move(0, height - textheight); + } + else + { + m_macMinimumStatic->Move(0, sliderBreadth + wxSLIDER_BORDERTEXT); + m_macMaximumStatic->Move(width - xborder - maxValWidth / 2, + sliderBreadth + wxSLIDER_BORDERTEXT); + m_macValueStatic->Move(width - textwidth, 0); + } + } + + if(GetParent()) { + GetParent()->MacClientToRootWindow(&x, &y); + } + UMAMoveControl(m_macControl, x, y); + UMASizeControl(m_macControl, width - xborder, height - yborder); +} \ No newline at end of file diff --git a/src/mac/spinctrl.cpp b/src/mac/spinctrl.cpp index 31aca32843..272c0791f3 100644 --- a/src/mac/spinctrl.cpp +++ b/src/mac/spinctrl.cpp @@ -18,7 +18,9 @@ #include "wx/spinctrl.h" +#if 0 +// now using the generic impl //----------------------------------------------------------------------------- // wxSpinCtrl //----------------------------------------------------------------------------- @@ -37,5 +39,7 @@ #endif // wxUSE_SPINBTN/!wxUSE_SPINBTN +#endif + #endif // wxUSE_SPINCTRL diff --git a/src/mac/window.cpp b/src/mac/window.cpp index 0cd659a9f0..72cc0f8290 100644 --- a/src/mac/window.cpp +++ b/src/mac/window.cpp @@ -341,20 +341,24 @@ void wxWindowMac::DragAcceptFiles(bool accept) // Get total size void wxWindowMac::DoGetSize(int *x, int *y) const { - *x = m_width ; - *y = m_height ; + if(x) *x = m_width ; + if(y) *y = m_height ; } void wxWindowMac::DoGetPosition(int *x, int *y) const { - *x = m_x ; - *y = m_y ; + int xx,yy; + + xx = m_x ; + yy = m_y ; if (GetParent()) { wxPoint pt(GetParent()->GetClientAreaOrigin()); - *x -= pt.x; - *y -= pt.y; + xx -= pt.x; + yy -= pt.y; } + if(x) *x = xx; + if(y) *y = yy; } #if wxUSE_MENUS @@ -378,9 +382,10 @@ void wxWindowMac::DoScreenToClient(int *x, int *y) const { WindowRef window = GetMacRootWindow() ; - Point localwhere ; - localwhere.h = * x ; - localwhere.v = * y ; + Point localwhere = {0,0} ; + + if(x) localwhere.h = * x ; + if(y) localwhere.v = * y ; GrafPtr port ; ::GetPort( &port ) ; @@ -388,8 +393,8 @@ void wxWindowMac::DoScreenToClient(int *x, int *y) const ::GlobalToLocal( &localwhere ) ; ::SetPort( port ) ; - *x = localwhere.h ; - *y = localwhere.v ; + if(x) *x = localwhere.h ; + if(y) *y = localwhere.v ; MacRootWindowToClient( x , y ) ; } @@ -400,9 +405,9 @@ void wxWindowMac::DoClientToScreen(int *x, int *y) const MacClientToRootWindow( x , y ) ; - Point localwhere ; - localwhere.h = * x ; - localwhere.v = * y ; + Point localwhere = { 0,0 }; + if(x) localwhere.h = * x ; + if(y) localwhere.v = * y ; GrafPtr port ; ::GetPort( &port ) ; @@ -410,32 +415,26 @@ void wxWindowMac::DoClientToScreen(int *x, int *y) const ::SetOrigin( 0 , 0 ) ; ::LocalToGlobal( &localwhere ) ; ::SetPort( port ) ; - *x = localwhere.h ; - *y = localwhere.v ; + if(x) *x = localwhere.h ; + if(y) *y = localwhere.v ; } void wxWindowMac::MacClientToRootWindow( int *x , int *y ) const { - if ( m_macWindowData ) - { - } - else + if ( m_macWindowData == NULL) { - *x += m_x ; - *y += m_y ; + if(x) *x += m_x ; + if(y) *y += m_y ; GetParent()->MacClientToRootWindow( x , y ) ; } } void wxWindowMac::MacRootWindowToClient( int *x , int *y ) const { - if ( m_macWindowData ) + if ( m_macWindowData == NULL) { - } - else - { - *x -= m_x ; - *y -= m_y ; + if(x) *x -= m_x ; + if(y) *y -= m_y ; GetParent()->MacRootWindowToClient( x , y ) ; } } @@ -480,11 +479,12 @@ bool wxWindowMac::SetCursor(const wxCursor& cursor) // Get size *available for subwindows* i.e. excluding menu bar etc. void wxWindowMac::DoGetClientSize(int *x, int *y) const { - *x = m_width ; - *y = m_height ; + int ww, hh; + ww = m_width ; + hh = m_height ; - *x -= MacGetLeftBorderSize( ) + MacGetRightBorderSize( ) ; - *y -= MacGetTopBorderSize( ) + MacGetBottomBorderSize( ); + ww -= MacGetLeftBorderSize( ) + MacGetRightBorderSize( ) ; + hh -= MacGetTopBorderSize( ) + MacGetBottomBorderSize( ); if ( (m_vScrollBar && m_vScrollBar->IsShown()) || (m_hScrollBar && m_hScrollBar->IsShown()) ) { @@ -496,7 +496,6 @@ void wxWindowMac::DoGetClientSize(int *x, int *y) const MacClientToRootWindow( &x1 , &y1 ) ; MacClientToRootWindow( &w , &h ) ; - WindowRef window = NULL ; wxWindowMac *iter = (wxWindowMac*)this ; int totW = 10000 , totH = 10000; @@ -514,21 +513,23 @@ void wxWindowMac::DoGetClientSize(int *x, int *y) const if (m_hScrollBar && m_hScrollBar->IsShown() ) { - (*y) -= MAC_SCROLLBAR_SIZE; + hh -= MAC_SCROLLBAR_SIZE; if ( h-y1 >= totH ) { - (*y)+= 1 ; + hh += 1 ; } } if (m_vScrollBar && m_vScrollBar->IsShown() ) { - (*x) -= MAC_SCROLLBAR_SIZE; + ww -= MAC_SCROLLBAR_SIZE; if ( w-x1 >= totW ) { - (*x) += 1 ; + ww += 1 ; } } } + if(x) *x = ww; + if(y) *y = hh; } @@ -789,7 +790,7 @@ bool wxWindowMac::Show(bool show) { WindowRef window = GetMacRootWindow() ; wxWindowMac* win = wxFindWinFromMacWindow( window ) ; - if ( !win->m_isBeingDeleted ) + if ( win && !win->m_isBeingDeleted ) Refresh() ; } else @@ -1797,7 +1798,6 @@ void wxWindowMac::MacMouseDown( EventRecord *ev , short part) void wxWindowMac::MacMouseUp( EventRecord *ev , short part) { - WindowPtr frontWindow ; switch (part) { case inContent: @@ -1810,7 +1810,6 @@ void wxWindowMac::MacMouseUp( EventRecord *ev , short part) void wxWindowMac::MacMouseMoved( EventRecord *ev , short part) { - WindowPtr frontWindow ; switch (part) { case inContent: @@ -1843,7 +1842,7 @@ void wxWindowMac::MacRedraw( RgnHandle updatergn , long time) // ownUpdateRgn is the area that this window has to invalidate i.e. its own area without its children RgnHandle ownUpdateRgn = NewRgn() ; CopyRgn( updatergn , ownUpdateRgn ) ; - wxWindowMac* win = wxFindWinFromMacWindow( window ) ; + { wxMacDrawingHelper focus( this ) ; // was client if ( focus.Ok() ) @@ -2042,7 +2041,6 @@ void wxWindowMac::MacUpdate( EventRecord *ev ) WindowRef wxWindowMac::GetMacRootWindow() const { - WindowRef window = NULL ; wxWindowMac *iter = (wxWindowMac*)this ; while( iter ) @@ -2121,7 +2119,6 @@ void wxWindowMac::MacRepositionScrollBars() MacClientToRootWindow( &x , &y ) ; MacClientToRootWindow( &w , &h ) ; - WindowRef window = NULL ; wxWindowMac *iter = (wxWindowMac*)this ; int totW = 10000 , totH = 10000; -- 2.45.2