]> git.saurik.com Git - wxWidgets.git/blob - src/osx/cocoa/srchctrl.mm
Workaround for #15404: wxRichTextCtrl: caret does not disappear when focus is lost...
[wxWidgets.git] / src / osx / cocoa / srchctrl.mm
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: src/osx/cocoa/srchctrl.mm
3 // Purpose: implements mac carbon wxSearchCtrl
4 // Author: Vince Harron
5 // Created: 2006-02-19
6 // Copyright: Vince Harron
7 // Licence: wxWindows licence
8 ///////////////////////////////////////////////////////////////////////////////
9
10 // For compilers that support precompilation, includes "wx.h".
11 #include "wx/wxprec.h"
12
13 #ifdef __BORLANDC__
14 #pragma hdrstop
15 #endif
16
17 #if wxUSE_SEARCHCTRL
18
19 #include "wx/srchctrl.h"
20
21 #ifndef WX_PRECOMP
22 #include "wx/menu.h"
23 #endif //WX_PRECOMP
24
25 #if wxUSE_NATIVE_SEARCH_CONTROL
26
27 #include "wx/osx/private.h"
28 #include "wx/osx/cocoa/private/textimpl.h"
29
30
31 @interface wxNSSearchField : NSSearchField
32 {
33 }
34
35 @end
36
37 @implementation wxNSSearchField
38
39 + (void)initialize
40 {
41 static BOOL initialized = NO;
42 if (!initialized)
43 {
44 initialized = YES;
45 wxOSXCocoaClassAddWXMethods( self );
46 }
47 }
48
49 - (id)initWithFrame:(NSRect)frame
50 {
51 self = [super initWithFrame:frame];
52 return self;
53 }
54
55 - (void)controlTextDidChange:(NSNotification *)aNotification
56 {
57 wxUnusedVar(aNotification);
58 wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
59 if ( impl )
60 impl->controlTextDidChange();
61 }
62
63 - (NSArray *)control:(NSControl *)control textView:(NSTextView *)textView completions:(NSArray *)words
64 forPartialWordRange:(NSRange)charRange indexOfSelectedItem:(int*)index
65 {
66 NSMutableArray* matches = NULL;
67 NSString* partialString;
68
69 partialString = [[textView string] substringWithRange:charRange];
70 matches = [NSMutableArray array];
71
72 // wxTextWidgetImpl* impl = (wxTextWidgetImpl* ) wxWidgetImpl::FindFromWXWidget( self );
73 wxArrayString completions;
74
75 // adapt to whatever strategy we have for getting the strings
76 // impl->GetTextEntry()->GetCompletions(wxCFStringRef::AsString(partialString), completions);
77
78 for (size_t i = 0; i < completions.GetCount(); ++i )
79 [matches addObject: wxCFStringRef(completions[i]).AsNSString()];
80
81 // [matches sortUsingSelector:@selector(compare:)];
82
83
84 return matches;
85 }
86
87 @end
88
89 // ============================================================================
90 // wxMacSearchFieldControl
91 // ============================================================================
92
93 class wxNSSearchFieldControl : public wxNSTextFieldControl, public wxSearchWidgetImpl
94 {
95 public :
96 wxNSSearchFieldControl( wxTextCtrl *wxPeer, wxNSSearchField* w ) : wxNSTextFieldControl(wxPeer, w)
97 {
98 m_searchFieldCell = [w cell];
99 m_searchField = w;
100 }
101 ~wxNSSearchFieldControl();
102
103 // search field options
104 virtual void ShowSearchButton( bool show )
105 {
106 if ( show )
107 [m_searchFieldCell resetSearchButtonCell];
108 else
109 [m_searchFieldCell setSearchButtonCell:nil];
110 [m_searchField setNeedsDisplay:YES];
111 }
112
113 virtual bool IsSearchButtonVisible() const
114 {
115 return [m_searchFieldCell searchButtonCell] != nil;
116 }
117
118 virtual void ShowCancelButton( bool show )
119 {
120 if ( show )
121 [m_searchFieldCell resetCancelButtonCell];
122 else
123 [m_searchFieldCell setCancelButtonCell:nil];
124 [m_searchField setNeedsDisplay:YES];
125 }
126
127 virtual bool IsCancelButtonVisible() const
128 {
129 return [m_searchFieldCell cancelButtonCell] != nil;
130 }
131
132 virtual void SetSearchMenu( wxMenu* menu )
133 {
134 if ( menu )
135 [m_searchFieldCell setSearchMenuTemplate:menu->GetHMenu()];
136 else
137 [m_searchFieldCell setSearchMenuTemplate:nil];
138 [m_searchField setNeedsDisplay:YES];
139 }
140
141 virtual void SetDescriptiveText(const wxString& text)
142 {
143 [m_searchFieldCell setPlaceholderString:
144 wxCFStringRef( text , m_wxPeer->GetFont().GetEncoding() ).AsNSString()];
145 }
146
147 virtual bool SetFocus()
148 {
149 return wxNSTextFieldControl::SetFocus();
150 }
151
152 void controlAction( WXWidget WXUNUSED(slf), void *WXUNUSED(_cmd), void *WXUNUSED(sender))
153 {
154 wxSearchCtrl* wxpeer = (wxSearchCtrl*) GetWXPeer();
155 if ( wxpeer )
156 {
157 NSString *searchString = [m_searchField stringValue];
158 if ( searchString == nil )
159 {
160 wxpeer->HandleSearchFieldCancelHit();
161 }
162 else
163 {
164 wxpeer->HandleSearchFieldSearchHit();
165 }
166 }
167 }
168
169 private:
170 wxNSSearchField* m_searchField;
171 NSSearchFieldCell* m_searchFieldCell;
172 } ;
173
174 wxNSSearchFieldControl::~wxNSSearchFieldControl()
175 {
176 }
177
178 wxWidgetImplType* wxWidgetImpl::CreateSearchControl( wxSearchCtrl* wxpeer,
179 wxWindowMac* WXUNUSED(parent),
180 wxWindowID WXUNUSED(id),
181 const wxString& str,
182 const wxPoint& pos,
183 const wxSize& size,
184 long WXUNUSED(style),
185 long WXUNUSED(extraStyle))
186 {
187 NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
188 wxNSSearchField* v = [[wxNSSearchField alloc] initWithFrame:r];
189 [[v cell] setSendsWholeSearchString:YES];
190 // per wx default cancel is not shown
191 [[v cell] setCancelButtonCell:nil];
192
193 wxNSSearchFieldControl* c = new wxNSSearchFieldControl( wxpeer, v );
194 c->SetNeedsFrame( false );
195 c->SetStringValue( str );
196 return c;
197 }
198
199 #endif // wxUSE_NATIVE_SEARCH_CONTROL
200
201 #endif // wxUSE_SEARCHCTRL