]> git.saurik.com Git - wxWidgets.git/blob - src/osx/carbon/srchctrl.cpp
Also update focus rect when changing selection in single selection mode, fixes #11332
[wxWidgets.git] / src / osx / carbon / srchctrl.cpp
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: src/osx/carbon/srchctrl.cpp
3 // Purpose: implements mac carbon wxSearchCtrl
4 // Author: Vince Harron
5 // Created: 2006-02-19
6 // RCS-ID: $Id$
7 // Copyright: Vince Harron
8 // License: wxWindows licence
9 ///////////////////////////////////////////////////////////////////////////////
10
11 // For compilers that support precompilation, includes "wx.h".
12 #include "wx/wxprec.h"
13
14 #ifdef __BORLANDC__
15 #pragma hdrstop
16 #endif
17
18 #if wxUSE_SEARCHCTRL
19
20 #include "wx/srchctrl.h"
21
22 #ifndef WX_PRECOMP
23 #include "wx/menu.h"
24 #endif //WX_PRECOMP
25
26 #if wxUSE_NATIVE_SEARCH_CONTROL
27
28 #include "wx/osx/uma.h"
29 #include "wx/osx/carbon/private/mactext.h"
30
31 // ============================================================================
32 // wxMacSearchFieldControl
33 // ============================================================================
34
35 class wxMacSearchFieldControl : public wxMacUnicodeTextControl, public wxSearchWidgetImpl
36 {
37 public :
38 wxMacSearchFieldControl( wxTextCtrl *wxPeer,
39 const wxString& str,
40 const wxPoint& pos,
41 const wxSize& size, long style ) ;
42
43 // search field options
44 virtual void ShowSearchButton( bool show );
45 virtual bool IsSearchButtonVisible() const;
46
47 virtual void ShowCancelButton( bool show );
48 virtual bool IsCancelButtonVisible() const;
49
50 virtual void SetSearchMenu( wxMenu* menu );
51
52 virtual void SetDescriptiveText(const wxString& text);
53
54 virtual bool SetFocus();
55
56 private:
57 } ;
58
59 static const EventTypeSpec eventList[] =
60 {
61 { kEventClassSearchField, kEventSearchFieldCancelClicked } ,
62 { kEventClassSearchField, kEventSearchFieldSearchClicked } ,
63 };
64
65 // ============================================================================
66 // implementation
67 // ============================================================================
68
69 static pascal OSStatus wxMacSearchControlEventHandler( EventHandlerCallRef WXUNUSED(handler) , EventRef event , void *data )
70 {
71 OSStatus result = eventNotHandledErr ;
72
73 wxMacCarbonEvent cEvent( event ) ;
74
75 ControlRef controlRef ;
76 wxSearchCtrl* thisWindow = (wxSearchCtrl*) data ;
77 cEvent.GetParameter( kEventParamDirectObject , &controlRef ) ;
78
79 switch( GetEventKind( event ) )
80 {
81 case kEventSearchFieldCancelClicked :
82 thisWindow->HandleSearchFieldCancelHit() ;
83 break ;
84 case kEventSearchFieldSearchClicked :
85 thisWindow->HandleSearchFieldSearchHit() ;
86 break ;
87 }
88
89 return result ;
90 }
91
92 DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacSearchControlEventHandler )
93
94 wxMacSearchFieldControl::wxMacSearchFieldControl( wxTextCtrl *wxPeer,
95 const wxString& str,
96 const wxPoint& pos,
97 const wxSize& size, long style ) : wxMacUnicodeTextControl( wxPeer )
98 {
99 m_font = wxPeer->GetFont() ;
100 m_windowStyle = style ;
101 m_selection.selStart = m_selection.selEnd = 0;
102 Rect bounds = wxMacGetBoundsForControl( wxPeer , pos , size ) ;
103 wxString st = str ;
104 wxMacConvertNewlines10To13( &st ) ;
105 wxCFStringRef cf(st , m_font.GetEncoding()) ;
106
107 m_valueTag = kControlEditTextCFStringTag ;
108
109 OptionBits attributes = kHISearchFieldAttributesSearchIcon;
110
111 HIRect hibounds = { { bounds.left, bounds.top }, { bounds.right-bounds.left, bounds.bottom-bounds.top } };
112 verify_noerr( HISearchFieldCreate(
113 &hibounds,
114 attributes,
115 0, // MenuRef
116 CFSTR(""),
117 &m_controlRef
118 ) );
119 HIViewSetVisible (m_controlRef, true);
120
121 verify_noerr( SetData<CFStringRef>( 0, kControlEditTextCFStringTag , cf ) ) ;
122
123 ::InstallControlEventHandler( m_controlRef, GetwxMacSearchControlEventHandlerUPP(),
124 GetEventTypeCount(eventList), eventList, wxPeer, NULL);
125 SetNeedsFrame(false);
126 wxMacUnicodeTextControl::InstallEventHandlers();
127 }
128
129 // search field options
130 void wxMacSearchFieldControl::ShowSearchButton( bool show )
131 {
132 OptionBits set = 0;
133 OptionBits clear = 0;
134 if ( show )
135 {
136 set |= kHISearchFieldAttributesSearchIcon;
137 }
138 else
139 {
140 clear |= kHISearchFieldAttributesSearchIcon;
141 }
142 HISearchFieldChangeAttributes( m_controlRef, set, clear );
143 }
144
145 bool wxMacSearchFieldControl::IsSearchButtonVisible() const
146 {
147 OptionBits attributes = 0;
148 verify_noerr( HISearchFieldGetAttributes( m_controlRef, &attributes ) );
149 return ( attributes & kHISearchFieldAttributesSearchIcon ) != 0;
150 }
151
152 void wxMacSearchFieldControl::ShowCancelButton( bool show )
153 {
154 OptionBits set = 0;
155 OptionBits clear = 0;
156 if ( show )
157 {
158 set |= kHISearchFieldAttributesCancel;
159 }
160 else
161 {
162 clear |= kHISearchFieldAttributesCancel;
163 }
164 HISearchFieldChangeAttributes( m_controlRef, set, clear );
165 }
166
167 bool wxMacSearchFieldControl::IsCancelButtonVisible() const
168 {
169 OptionBits attributes = 0;
170 verify_noerr( HISearchFieldGetAttributes( m_controlRef, &attributes ) );
171 return ( attributes & kHISearchFieldAttributesCancel ) != 0;
172 }
173
174 void wxMacSearchFieldControl::SetSearchMenu( wxMenu* menu )
175 {
176 if ( menu )
177 {
178 verify_noerr( HISearchFieldSetSearchMenu( m_controlRef, MAC_WXHMENU(menu->GetHMenu()) ) );
179 }
180 else
181 {
182 verify_noerr( HISearchFieldSetSearchMenu( m_controlRef, 0 ) );
183 }
184 }
185
186 void wxMacSearchFieldControl::SetDescriptiveText(const wxString& text)
187 {
188 verify_noerr( HISearchFieldSetDescriptiveText(
189 m_controlRef,
190 wxCFStringRef( text, wxFont::GetDefaultEncoding() )));
191 }
192
193 bool wxMacSearchFieldControl::SetFocus()
194 {
195 // NB: We have to implement SetFocus a little differently because kControlFocusNextPart
196 // leads to setting the focus on the search icon rather than the text area.
197 // We get around this by explicitly telling the control to set focus to the
198 // text area.
199
200 OSStatus err = SetKeyboardFocus( GetControlOwner( m_controlRef ), m_controlRef, kControlEditTextPart );
201 if ( err == errCouldntSetFocus )
202 return false ;
203 SetUserFocusWindow(GetControlOwner( m_controlRef ) );
204 return true;
205 }
206
207 wxWidgetImplType* wxWidgetImpl::CreateSearchControl( wxTextCtrl* wxpeer,
208 wxWindowMac* WXUNUSED(parent),
209 wxWindowID WXUNUSED(id),
210 const wxString& str,
211 const wxPoint& pos,
212 const wxSize& size,
213 long style,
214 long WXUNUSED(extraStyle))
215 {
216 wxMacControl* peer = new wxMacSearchFieldControl( wxpeer , str , pos , size , style );
217
218 return peer;
219 }
220
221 #endif // wxUSE_NATIVE_SEARCH_CONTROL
222
223 #endif // wxUSE_SEARCHCTRL