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: */
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"
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"
36 #include "nsITreeSelection.h"
37 #include "nsITreeColumns.h"
38 #include "nsITreeBoxObject.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()
53 aaTreeView::~aaTreeView()
58 aaTreeView::Init(nsISupports
*aParam
)
61 mSession
= do_QueryInterface(aParam
, &rv
);
62 NS_ENSURE_SUCCESS(rv
, rv
);
67 NS_IMPL_ISUPPORTS2(aaTreeView
,
72 aaTreeView::GetRowCount(PRInt32
*aRowCount
)
74 NS_ENSURE_ARG_POINTER(aRowCount
);
79 return mDataSet
->GetLength((PRUint32
*) aRowCount
);
83 aaTreeView::GetSelection(nsITreeSelection
* *aSelection
)
85 NS_ENSURE_ARG_POINTER( aSelection
);
86 NS_IF_ADDREF(*aSelection
= mSelection
);
90 aaTreeView::SetSelection(nsITreeSelection
* aSelection
)
92 mSelection
= aSelection
;
98 aaTreeView::GetRowProperties(PRInt32 index
, nsISupportsArray
*properties
)
100 return NS_ERROR_NOT_IMPLEMENTED
;
104 aaTreeView::GetCellProperties(PRInt32 row
, nsITreeColumn
*col
, nsISupportsArray
*properties
)
106 return NS_ERROR_NOT_IMPLEMENTED
;
110 aaTreeView::GetColumnProperties(nsITreeColumn
*col
, nsISupportsArray
*properties
)
112 return NS_ERROR_NOT_IMPLEMENTED
;
116 aaTreeView::IsContainer(PRInt32 index
, PRBool
*_retval
)
118 NS_ENSURE_ARG_POINTER(_retval
);
124 aaTreeView::IsContainerOpen(PRInt32 index
, PRBool
*_retval
)
126 return NS_ERROR_NOT_IMPLEMENTED
;
130 aaTreeView::IsContainerEmpty(PRInt32 index
, PRBool
*_retval
)
132 return NS_ERROR_NOT_IMPLEMENTED
;
136 aaTreeView::IsSeparator(PRInt32 index
, PRBool
*_retval
)
138 NS_ENSURE_ARG_POINTER(_retval
);
144 aaTreeView::IsSorted(PRBool
*_retval
)
146 return NS_ERROR_NOT_IMPLEMENTED
;
150 aaTreeView::CanDrop(PRInt32 index
, PRInt32 orientation
, PRBool
*_retval
)
152 return NS_ERROR_NOT_IMPLEMENTED
;
156 aaTreeView::Drop(PRInt32 row
, PRInt32 orientation
)
158 return NS_ERROR_NOT_IMPLEMENTED
;
162 aaTreeView::GetParentIndex(PRInt32 rowIndex
, PRInt32
*_retval
)
164 return NS_ERROR_NOT_IMPLEMENTED
;
168 aaTreeView::HasNextSibling(PRInt32 rowIndex
, PRInt32 afterIndex
, PRBool
*_retval
)
170 NS_ENSURE_ARG_POINTER(_retval
);
173 rv
= GetRowCount(&count
);
174 NS_ENSURE_SUCCESS(rv
, rv
);
175 if (rowIndex
== afterIndex
&& rowIndex
< count
) {
184 aaTreeView::GetLevel(PRInt32 index
, PRInt32
*_retval
)
186 NS_ENSURE_ARG_POINTER(_retval
);
192 aaTreeView::GetImageSrc(PRInt32 row
, nsITreeColumn
*col
, nsAString
& _retval
)
194 return NS_ERROR_NOT_IMPLEMENTED
;
198 aaTreeView::GetProgressMode(PRInt32 row
, nsITreeColumn
*col
, PRInt32
*_retval
)
200 return NS_ERROR_NOT_IMPLEMENTED
;
204 aaTreeView::GetCellValue(PRInt32 row
, nsITreeColumn
*col
, nsAString
& _retval
)
206 return NS_ERROR_NOT_IMPLEMENTED
;
210 aaTreeView::GetCellText(PRInt32 row
, nsITreeColumn
*col
, nsAString
& _retval
)
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
);
222 aaTreeView::SetTree(nsITreeBoxObject
*tree
)
229 aaTreeView::ToggleOpenState(PRInt32 index
)
231 return NS_ERROR_NOT_IMPLEMENTED
;
235 aaTreeView::CycleHeader(nsITreeColumn
*col
)
237 return NS_ERROR_NOT_IMPLEMENTED
;
241 aaTreeView::SelectionChanged()
247 aaTreeView::CycleCell(PRInt32 row
, nsITreeColumn
*col
)
249 return NS_ERROR_NOT_IMPLEMENTED
;
253 aaTreeView::IsEditable(PRInt32 row
, nsITreeColumn
*col
, PRBool
*_retval
)
255 return NS_ERROR_NOT_IMPLEMENTED
;
259 aaTreeView::IsSelectable(PRInt32 row
, nsITreeColumn
*col
, PRBool
*_retval
)
261 NS_ENSURE_ARG_POINTER(_retval
);
267 aaTreeView::SetCellValue(PRInt32 row
, nsITreeColumn
*col
, const nsAString
& value
)
269 return NS_ERROR_NOT_IMPLEMENTED
;
273 aaTreeView::SetCellText(PRInt32 row
, nsITreeColumn
*col
, const nsAString
& value
)
275 return NS_ERROR_NOT_IMPLEMENTED
;
279 aaTreeView::PerformAction(const PRUnichar
*action
)
281 return NS_ERROR_NOT_IMPLEMENTED
;
285 aaTreeView::PerformActionOnRow(const PRUnichar
*action
, PRInt32 row
)
287 return NS_ERROR_NOT_IMPLEMENTED
;
291 aaTreeView::PerformActionOnCell(const PRUnichar
*action
, PRInt32 row
, nsITreeColumn
*col
)
293 return NS_ERROR_NOT_IMPLEMENTED
;
296 /* aaIDataTreeView */
298 aaTreeView::GetDataSet(nsIArray
* * aDataSet
)
300 NS_ENSURE_ARG_POINTER(aDataSet
);
301 NS_IF_ADDREF(*aDataSet
= mDataSet
);
306 aaTreeView::Update(nsISupports
*aParam
= 0)
308 NS_ENSURE_TRUE(mDataLoader
|| mComplexLoader
, NS_ERROR_NOT_INITIALIZED
);
313 rv
= GetRowCount(&oldCount
);
314 NS_ENSURE_SUCCESS(rv
, rv
);
315 mTree
->RowCountChanged(0, - oldCount
);
319 rv
= mSession
->Load(mDataLoader
, getter_AddRefs(mDataSet
));
320 NS_ENSURE_SUCCESS(rv
, rv
);
322 rv
= postLoadHandler();
323 NS_ENSURE_SUCCESS(rv
, rv
);
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
);
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
);
351 aaTreeView::GetFlags(PRUint32
*aFlags
)
353 NS_ENSURE_ARG_POINTER(aFlags
);
358 aaTreeView::SetFlags(PRUint32 aFlags
)
360 PRBool needUpdate
= (aFlags
!= mFlags
);
362 if (NS_LIKELY( needUpdate
&& mTree
)) {
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
);
372 /* Protected methods */
374 aaTreeView::postLoadHandler()
380 aaTreeView::getColumnIndex(nsITreeColumn
*col
, PRUint32 colPtrSz
)
383 NS_ENSURE_TRUE(col
, -1);
386 rv
= col
->GetIndex(&ci
);
387 NS_ENSURE_SUCCESS(rv
, -1);
389 NS_ENSURE_TRUE(ci
>= 0 && ci
< (PRInt32
) (colPtrSz
/ sizeof(int *)), -1);