storage: save/load Rule.Tag
[abstract.git] / view / aaTreeView.cpp
blob17636a57d4437bd72475d25e6801bd9f22477674
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:set ts=2 sw=2 sts=2 et cindent tw=79 ft=cpp: */
3 /*
4 * Copyright (C) 2007,2008 Sergey Yanovich <ynvich@gmail.com>
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of the
9 * License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public
17 * License along with this program; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
22 #include "xpcom-config.h"
24 #include "nsCOMPtr.h"
25 #include "nsStringAPI.h"
26 #include "nsIDOMElement.h"
27 #include "nsIDOMNode.h"
28 #include "nsIDOMDocument.h"
29 #include "nsIDOMXULElement.h"
30 #include "nsIInterfaceRequestorUtils.h"
31 #include "nsISHistory.h"
32 #include "nsServiceManagerUtils.h"
33 #include "nsIObserverService.h"
35 /* Unfrozen API */
36 #include "nsITreeSelection.h"
37 #include "nsITreeColumns.h"
38 #include "nsITreeBoxObject.h"
39 #include "nsIArray.h"
40 #include "nsArrayUtils.h"
42 /* Project includes */
43 #include "aaISession.h"
44 #include "aaISqlTransaction.h"
45 #include "aaISqlRequest.h"
46 #include "aaTreeView.h"
48 aaTreeView::aaTreeView()
49 :mFlags(0)
53 aaTreeView::~aaTreeView()
57 nsresult
58 aaTreeView::Init(nsISupports *aParam)
60 nsresult rv;
61 mSession = do_QueryInterface(aParam, &rv);
62 NS_ENSURE_SUCCESS(rv, rv);
64 return NS_OK;
67 NS_IMPL_ISUPPORTS2(aaTreeView,
68 aaIDataTreeView,
69 nsITreeView)
71 NS_IMETHODIMP
72 aaTreeView::GetRowCount(PRInt32 *aRowCount)
74 NS_ENSURE_ARG_POINTER(aRowCount);
75 *aRowCount = 0;
76 if (! mDataSet)
77 return NS_OK;
79 return mDataSet->GetLength((PRUint32 *) aRowCount);
82 NS_IMETHODIMP
83 aaTreeView::GetSelection(nsITreeSelection * *aSelection)
85 NS_ENSURE_ARG_POINTER( aSelection );
86 NS_IF_ADDREF(*aSelection = mSelection);
87 return NS_OK;
89 NS_IMETHODIMP
90 aaTreeView::SetSelection(nsITreeSelection * aSelection)
92 mSelection = aSelection;
94 return NS_OK;
97 NS_IMETHODIMP
98 aaTreeView::GetRowProperties(PRInt32 index, nsISupportsArray *properties)
100 return NS_ERROR_NOT_IMPLEMENTED;
103 NS_IMETHODIMP
104 aaTreeView::GetCellProperties(PRInt32 row, nsITreeColumn *col, nsISupportsArray *properties)
106 return NS_ERROR_NOT_IMPLEMENTED;
109 NS_IMETHODIMP
110 aaTreeView::GetColumnProperties(nsITreeColumn *col, nsISupportsArray *properties)
112 return NS_ERROR_NOT_IMPLEMENTED;
115 NS_IMETHODIMP
116 aaTreeView::IsContainer(PRInt32 index, PRBool *_retval)
118 NS_ENSURE_ARG_POINTER(_retval);
119 *_retval = PR_FALSE;
120 return NS_OK;
123 NS_IMETHODIMP
124 aaTreeView::IsContainerOpen(PRInt32 index, PRBool *_retval)
126 return NS_ERROR_NOT_IMPLEMENTED;
129 NS_IMETHODIMP
130 aaTreeView::IsContainerEmpty(PRInt32 index, PRBool *_retval)
132 return NS_ERROR_NOT_IMPLEMENTED;
135 NS_IMETHODIMP
136 aaTreeView::IsSeparator(PRInt32 index, PRBool *_retval)
138 NS_ENSURE_ARG_POINTER(_retval);
139 *_retval = PR_FALSE;
140 return NS_OK;
143 NS_IMETHODIMP
144 aaTreeView::IsSorted(PRBool *_retval)
146 return NS_ERROR_NOT_IMPLEMENTED;
149 NS_IMETHODIMP
150 aaTreeView::CanDrop(PRInt32 index, PRInt32 orientation, PRBool *_retval)
152 return NS_ERROR_NOT_IMPLEMENTED;
155 NS_IMETHODIMP
156 aaTreeView::Drop(PRInt32 row, PRInt32 orientation)
158 return NS_ERROR_NOT_IMPLEMENTED;
161 NS_IMETHODIMP
162 aaTreeView::GetParentIndex(PRInt32 rowIndex, PRInt32 *_retval)
164 return NS_ERROR_NOT_IMPLEMENTED;
167 NS_IMETHODIMP
168 aaTreeView::HasNextSibling(PRInt32 rowIndex, PRInt32 afterIndex, PRBool *_retval)
170 NS_ENSURE_ARG_POINTER(_retval);
171 nsresult rv;
172 PRInt32 count;
173 rv = GetRowCount(&count);
174 NS_ENSURE_SUCCESS(rv, rv);
175 if (rowIndex == afterIndex && rowIndex < count) {
176 *_retval = PR_TRUE;
177 } else {
178 *_retval = PR_FALSE;
180 return NS_OK;
183 NS_IMETHODIMP
184 aaTreeView::GetLevel(PRInt32 index, PRInt32 *_retval)
186 NS_ENSURE_ARG_POINTER(_retval);
187 *_retval = 0;
188 return NS_OK;
191 NS_IMETHODIMP
192 aaTreeView::GetImageSrc(PRInt32 row, nsITreeColumn *col, nsAString & _retval)
194 return NS_ERROR_NOT_IMPLEMENTED;
197 NS_IMETHODIMP
198 aaTreeView::GetProgressMode(PRInt32 row, nsITreeColumn *col, PRInt32 *_retval)
200 return NS_ERROR_NOT_IMPLEMENTED;
203 NS_IMETHODIMP
204 aaTreeView::GetCellValue(PRInt32 row, nsITreeColumn *col, nsAString & _retval)
206 return NS_ERROR_NOT_IMPLEMENTED;
209 NS_IMETHODIMP
210 aaTreeView::GetCellText(PRInt32 row, nsITreeColumn *col, nsAString & _retval)
212 /**
213 * There may be a bug in <tree> implementation. This function is
214 * occasionally called after mTree is detached by SetTree(nsnull);
216 NS_ENSURE_TRUE(mDataSet, NS_ERROR_NOT_INITIALIZED);
217 NS_ENSURE_TRUE(row >= 0, NS_ERROR_INVALID_ARG);
218 return doGetCellText(row, col, _retval);
221 NS_IMETHODIMP
222 aaTreeView::SetTree(nsITreeBoxObject *tree)
224 mTree = tree;
225 return NS_OK;
228 NS_IMETHODIMP
229 aaTreeView::ToggleOpenState(PRInt32 index)
231 return NS_ERROR_NOT_IMPLEMENTED;
234 NS_IMETHODIMP
235 aaTreeView::CycleHeader(nsITreeColumn *col)
237 return NS_ERROR_NOT_IMPLEMENTED;
240 NS_IMETHODIMP
241 aaTreeView::SelectionChanged()
243 return NS_OK;
246 NS_IMETHODIMP
247 aaTreeView::CycleCell(PRInt32 row, nsITreeColumn *col)
249 return NS_ERROR_NOT_IMPLEMENTED;
252 NS_IMETHODIMP
253 aaTreeView::IsEditable(PRInt32 row, nsITreeColumn *col, PRBool *_retval)
255 return NS_ERROR_NOT_IMPLEMENTED;
258 NS_IMETHODIMP
259 aaTreeView::IsSelectable(PRInt32 row, nsITreeColumn *col, PRBool *_retval)
261 NS_ENSURE_ARG_POINTER(_retval);
262 *_retval = PR_TRUE;
263 return NS_OK;
266 NS_IMETHODIMP
267 aaTreeView::SetCellValue(PRInt32 row, nsITreeColumn *col, const nsAString & value)
269 return NS_ERROR_NOT_IMPLEMENTED;
272 NS_IMETHODIMP
273 aaTreeView::SetCellText(PRInt32 row, nsITreeColumn *col, const nsAString & value)
275 return NS_ERROR_NOT_IMPLEMENTED;
278 NS_IMETHODIMP
279 aaTreeView::PerformAction(const PRUnichar *action)
281 return NS_ERROR_NOT_IMPLEMENTED;
284 NS_IMETHODIMP
285 aaTreeView::PerformActionOnRow(const PRUnichar *action, PRInt32 row)
287 return NS_ERROR_NOT_IMPLEMENTED;
290 NS_IMETHODIMP
291 aaTreeView::PerformActionOnCell(const PRUnichar *action, PRInt32 row, nsITreeColumn *col)
293 return NS_ERROR_NOT_IMPLEMENTED;
296 /* aaIDataTreeView */
297 NS_IMETHODIMP
298 aaTreeView::GetDataSet(nsIArray * * aDataSet)
300 NS_ENSURE_ARG_POINTER(aDataSet);
301 NS_IF_ADDREF(*aDataSet = mDataSet);
302 return NS_OK;
305 NS_IMETHODIMP
306 aaTreeView::Update(nsISupports *aParam = 0)
308 NS_ENSURE_TRUE(mDataLoader || mComplexLoader, NS_ERROR_NOT_INITIALIZED);
309 nsresult rv;
311 if (mTree) {
312 PRInt32 oldCount;
313 rv = GetRowCount(&oldCount);
314 NS_ENSURE_SUCCESS(rv, rv);
315 mTree->RowCountChanged(0, - oldCount);
318 if (mDataLoader) {
319 rv = mSession->Load(mDataLoader, getter_AddRefs(mDataSet));
320 NS_ENSURE_SUCCESS(rv, rv);
322 rv = postLoadHandler();
323 NS_ENSURE_SUCCESS(rv, rv);
325 else {
326 if (aParam) {
327 rv = mComplexLoader->SetParam(aParam);
328 NS_ENSURE_SUCCESS(rv, rv);
331 rv = mSession->Execute(mComplexLoader, getter_AddRefs(mDataSet));
332 NS_ENSURE_SUCCESS(rv, rv);
335 if (mTree) {
336 PRInt32 newCount;
337 rv = GetRowCount(&newCount);
338 NS_ENSURE_SUCCESS(rv, rv);
339 mTree->RowCountChanged(0, newCount);
342 nsCOMPtr<nsIObserverService> broadcaster = do_GetService(
343 "@mozilla.org/observer-service;1");
344 NS_ENSURE_TRUE(broadcaster, NS_OK);
345 broadcaster->NotifyObservers(this, "tree-view-load", nsnull);
347 return NS_OK;
350 NS_IMETHODIMP
351 aaTreeView::GetFlags(PRUint32 *aFlags)
353 NS_ENSURE_ARG_POINTER(aFlags);
354 *aFlags = mFlags;
355 return NS_OK;
357 NS_IMETHODIMP
358 aaTreeView::SetFlags(PRUint32 aFlags)
360 PRBool needUpdate = (aFlags != mFlags);
361 mFlags = aFlags;
362 if (NS_LIKELY( needUpdate && mTree )) {
363 mTree->Invalidate();
364 nsCOMPtr<nsIObserverService> broadcaster = do_GetService(
365 "@mozilla.org/observer-service;1");
366 NS_ENSURE_TRUE(broadcaster, NS_OK);
367 broadcaster->NotifyObservers(this, "tree-flags-change", nsnull);
369 return NS_OK;
372 /* Protected methods */
373 nsresult
374 aaTreeView::postLoadHandler()
376 return NS_OK;
379 PRInt32
380 aaTreeView::getColumnIndex(nsITreeColumn *col, PRUint32 colPtrSz)
382 nsresult rv;
383 NS_ENSURE_TRUE(col, -1);
385 PRInt32 ci;
386 rv = col->GetIndex(&ci);
387 NS_ENSURE_SUCCESS(rv, -1);
389 NS_ENSURE_TRUE(ci >= 0 && ci < (PRInt32) (colPtrSz / sizeof(int *)), -1);
391 return ci;