Line data Source code
1 : /* This Source Code Form is subject to the terms of the Mozilla Public
2 : * License, v. 2.0. If a copy of the MPL was not distributed with this
3 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 :
5 : #include "nsAutoCompleteSimpleResult.h"
6 :
7 : #define CHECK_MATCH_INDEX(_index, _insert) \
8 : if (_index < 0 || \
9 : static_cast<MatchesArray::size_type>(_index) > mMatches.Length() || \
10 : (!_insert && static_cast<MatchesArray::size_type>(_index) == mMatches.Length())) { \
11 : MOZ_ASSERT(false, "Trying to use an invalid index on mMatches"); \
12 : return NS_ERROR_ILLEGAL_VALUE; \
13 : } \
14 :
15 0 : NS_IMPL_ISUPPORTS(nsAutoCompleteSimpleResult,
16 : nsIAutoCompleteResult,
17 : nsIAutoCompleteSimpleResult)
18 :
19 0 : struct AutoCompleteSimpleResultMatch
20 : {
21 0 : AutoCompleteSimpleResultMatch(const nsAString& aValue,
22 : const nsAString& aComment,
23 : const nsAString& aImage,
24 : const nsAString& aStyle,
25 : const nsAString& aFinalCompleteValue,
26 : const nsAString& aLabel)
27 0 : : mValue(aValue)
28 : , mComment(aComment)
29 : , mImage(aImage)
30 : , mStyle(aStyle)
31 : , mFinalCompleteValue(aFinalCompleteValue)
32 0 : , mLabel(aLabel)
33 : {
34 0 : }
35 :
36 : nsString mValue;
37 : nsString mComment;
38 : nsString mImage;
39 : nsString mStyle;
40 : nsString mFinalCompleteValue;
41 : nsString mLabel;
42 : };
43 :
44 0 : nsAutoCompleteSimpleResult::nsAutoCompleteSimpleResult() :
45 : mDefaultIndex(-1),
46 0 : mSearchResult(RESULT_NOMATCH)
47 : {
48 0 : }
49 :
50 : nsresult
51 0 : nsAutoCompleteSimpleResult::AppendResult(nsIAutoCompleteResult* aResult)
52 : {
53 0 : nsAutoString searchString;
54 0 : nsresult rv = aResult->GetSearchString(searchString);
55 0 : NS_ENSURE_SUCCESS(rv, rv);
56 0 : mSearchString = searchString;
57 :
58 : uint16_t searchResult;
59 0 : rv = aResult->GetSearchResult(&searchResult);
60 0 : NS_ENSURE_SUCCESS(rv, rv);
61 0 : mSearchResult = searchResult;
62 :
63 0 : nsAutoString errorDescription;
64 0 : if (NS_SUCCEEDED(aResult->GetErrorDescription(errorDescription)) &&
65 0 : !errorDescription.IsEmpty()) {
66 0 : mErrorDescription = errorDescription;
67 : }
68 :
69 0 : int32_t defaultIndex = -1;
70 0 : if (NS_SUCCEEDED(aResult->GetDefaultIndex(&defaultIndex)) &&
71 0 : defaultIndex >= 0) {
72 0 : mDefaultIndex = defaultIndex;
73 : }
74 :
75 : nsCOMPtr<nsIAutoCompleteSimpleResult> simpleResult =
76 0 : do_QueryInterface(aResult);
77 0 : if (simpleResult) {
78 0 : nsCOMPtr<nsIAutoCompleteSimpleResultListener> listener;
79 0 : if (NS_SUCCEEDED(simpleResult->GetListener(getter_AddRefs(listener))) &&
80 0 : listener) {
81 0 : listener.swap(mListener);
82 : }
83 : }
84 :
85 : // Copy matches.
86 0 : uint32_t matchCount = 0;
87 0 : rv = aResult->GetMatchCount(&matchCount);
88 0 : NS_ENSURE_SUCCESS(rv, rv);
89 0 : for (size_t i = 0; i < matchCount; ++i) {
90 0 : nsAutoString value, comment, image, style, finalCompleteValue, label;
91 :
92 0 : rv = aResult->GetValueAt(i, value);
93 0 : NS_ENSURE_SUCCESS(rv, rv);
94 0 : rv = aResult->GetCommentAt(i, comment);
95 0 : NS_ENSURE_SUCCESS(rv, rv);
96 0 : rv = aResult->GetImageAt(i, image);
97 0 : NS_ENSURE_SUCCESS(rv, rv);
98 0 : rv = aResult->GetStyleAt(i, style);
99 0 : NS_ENSURE_SUCCESS(rv, rv);
100 0 : rv = aResult->GetFinalCompleteValueAt(i, finalCompleteValue);
101 0 : NS_ENSURE_SUCCESS(rv, rv);
102 0 : rv = aResult->GetLabelAt(i, label);
103 0 : NS_ENSURE_SUCCESS(rv, rv);
104 :
105 0 : rv = AppendMatch(value, comment, image, style, finalCompleteValue, label);
106 0 : NS_ENSURE_SUCCESS(rv, rv);
107 : }
108 :
109 0 : return NS_OK;
110 : }
111 :
112 : // searchString
113 : NS_IMETHODIMP
114 0 : nsAutoCompleteSimpleResult::GetSearchString(nsAString &aSearchString)
115 : {
116 0 : aSearchString = mSearchString;
117 0 : return NS_OK;
118 : }
119 : NS_IMETHODIMP
120 0 : nsAutoCompleteSimpleResult::SetSearchString(const nsAString &aSearchString)
121 : {
122 0 : mSearchString.Assign(aSearchString);
123 0 : return NS_OK;
124 : }
125 :
126 : // searchResult
127 : NS_IMETHODIMP
128 0 : nsAutoCompleteSimpleResult::GetSearchResult(uint16_t *aSearchResult)
129 : {
130 0 : *aSearchResult = mSearchResult;
131 0 : return NS_OK;
132 : }
133 : NS_IMETHODIMP
134 0 : nsAutoCompleteSimpleResult::SetSearchResult(uint16_t aSearchResult)
135 : {
136 0 : mSearchResult = aSearchResult;
137 0 : return NS_OK;
138 : }
139 :
140 : // defaultIndex
141 : NS_IMETHODIMP
142 0 : nsAutoCompleteSimpleResult::GetDefaultIndex(int32_t *aDefaultIndex)
143 : {
144 0 : *aDefaultIndex = mDefaultIndex;
145 0 : return NS_OK;
146 : }
147 : NS_IMETHODIMP
148 0 : nsAutoCompleteSimpleResult::SetDefaultIndex(int32_t aDefaultIndex)
149 : {
150 0 : mDefaultIndex = aDefaultIndex;
151 0 : return NS_OK;
152 : }
153 :
154 : // errorDescription
155 : NS_IMETHODIMP
156 0 : nsAutoCompleteSimpleResult::GetErrorDescription(nsAString & aErrorDescription)
157 : {
158 0 : aErrorDescription = mErrorDescription;
159 0 : return NS_OK;
160 : }
161 : NS_IMETHODIMP
162 0 : nsAutoCompleteSimpleResult::SetErrorDescription(
163 : const nsAString &aErrorDescription)
164 : {
165 0 : mErrorDescription.Assign(aErrorDescription);
166 0 : return NS_OK;
167 : }
168 :
169 : NS_IMETHODIMP
170 0 : nsAutoCompleteSimpleResult::InsertMatchAt(int32_t aIndex,
171 : const nsAString& aValue,
172 : const nsAString& aComment,
173 : const nsAString& aImage,
174 : const nsAString& aStyle,
175 : const nsAString& aFinalCompleteValue,
176 : const nsAString& aLabel)
177 : {
178 0 : CHECK_MATCH_INDEX(aIndex, true);
179 :
180 0 : AutoCompleteSimpleResultMatch match(aValue, aComment, aImage, aStyle, aFinalCompleteValue, aLabel);
181 :
182 0 : if (!mMatches.InsertElementAt(aIndex, match)) {
183 0 : return NS_ERROR_OUT_OF_MEMORY;
184 : }
185 :
186 0 : return NS_OK;
187 : }
188 :
189 : NS_IMETHODIMP
190 0 : nsAutoCompleteSimpleResult::AppendMatch(const nsAString& aValue,
191 : const nsAString& aComment,
192 : const nsAString& aImage,
193 : const nsAString& aStyle,
194 : const nsAString& aFinalCompleteValue,
195 : const nsAString& aLabel)
196 : {
197 0 : return InsertMatchAt(mMatches.Length(), aValue, aComment, aImage, aStyle,
198 0 : aFinalCompleteValue, aLabel);
199 : }
200 :
201 : NS_IMETHODIMP
202 0 : nsAutoCompleteSimpleResult::GetMatchCount(uint32_t *aMatchCount)
203 : {
204 0 : *aMatchCount = mMatches.Length();
205 0 : return NS_OK;
206 : }
207 :
208 : NS_IMETHODIMP
209 0 : nsAutoCompleteSimpleResult::GetValueAt(int32_t aIndex, nsAString& _retval)
210 : {
211 0 : CHECK_MATCH_INDEX(aIndex, false);
212 0 : _retval = mMatches[aIndex].mValue;
213 0 : return NS_OK;
214 : }
215 :
216 : NS_IMETHODIMP
217 0 : nsAutoCompleteSimpleResult::GetLabelAt(int32_t aIndex, nsAString& _retval)
218 : {
219 0 : CHECK_MATCH_INDEX(aIndex, false);
220 0 : _retval = mMatches[aIndex].mLabel;
221 0 : if (_retval.IsEmpty()) {
222 0 : _retval = mMatches[aIndex].mValue;
223 : }
224 0 : return NS_OK;
225 : }
226 :
227 : NS_IMETHODIMP
228 0 : nsAutoCompleteSimpleResult::GetCommentAt(int32_t aIndex, nsAString& _retval)
229 : {
230 0 : CHECK_MATCH_INDEX(aIndex, false);
231 0 : _retval = mMatches[aIndex].mComment;
232 0 : return NS_OK;
233 : }
234 :
235 : NS_IMETHODIMP
236 0 : nsAutoCompleteSimpleResult::GetImageAt(int32_t aIndex, nsAString& _retval)
237 : {
238 0 : CHECK_MATCH_INDEX(aIndex, false);
239 0 : _retval = mMatches[aIndex].mImage;
240 0 : return NS_OK;
241 : }
242 :
243 : NS_IMETHODIMP
244 0 : nsAutoCompleteSimpleResult::GetStyleAt(int32_t aIndex, nsAString& _retval)
245 : {
246 0 : CHECK_MATCH_INDEX(aIndex, false);
247 0 : _retval = mMatches[aIndex].mStyle;
248 0 : return NS_OK;
249 : }
250 :
251 : NS_IMETHODIMP
252 0 : nsAutoCompleteSimpleResult::GetFinalCompleteValueAt(int32_t aIndex,
253 : nsAString& _retval)
254 : {
255 0 : CHECK_MATCH_INDEX(aIndex, false);
256 0 : _retval = mMatches[aIndex].mFinalCompleteValue;
257 0 : if (_retval.IsEmpty()) {
258 0 : _retval = mMatches[aIndex].mValue;
259 : }
260 0 : return NS_OK;
261 : }
262 :
263 : NS_IMETHODIMP
264 0 : nsAutoCompleteSimpleResult::SetListener(nsIAutoCompleteSimpleResultListener* aListener)
265 : {
266 0 : mListener = aListener;
267 0 : return NS_OK;
268 : }
269 :
270 : NS_IMETHODIMP
271 0 : nsAutoCompleteSimpleResult::GetListener(nsIAutoCompleteSimpleResultListener** aListener)
272 : {
273 0 : nsCOMPtr<nsIAutoCompleteSimpleResultListener> listener(mListener);
274 0 : listener.forget(aListener);
275 0 : return NS_OK;
276 : }
277 :
278 : NS_IMETHODIMP
279 0 : nsAutoCompleteSimpleResult::RemoveValueAt(int32_t aRowIndex,
280 : bool aRemoveFromDb)
281 : {
282 0 : CHECK_MATCH_INDEX(aRowIndex, false);
283 :
284 0 : nsString value = mMatches[aRowIndex].mValue;
285 0 : mMatches.RemoveElementAt(aRowIndex);
286 :
287 0 : if (mListener) {
288 0 : mListener->OnValueRemoved(this, value, aRemoveFromDb);
289 : }
290 :
291 0 : return NS_OK;
292 : }
|