Added nsIRDFResource interface to clean up some internal downcasting kludges and stop their evil propagation.
git-svn-id: svn://10.0.0.236/trunk@14639 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
|
||||
@@ -20,6 +20,10 @@
|
||||
#include "nsRDFDataModelItem.h"
|
||||
#include "rdf-int.h"
|
||||
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
static NS_DEFINE_IID(kIDMItemIID, NS_IDMITEM_IID);
|
||||
static NS_DEFINE_IID(kIRDFResourceIID, NS_IDMITEM_IID);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
nsRDFDataModelItem::nsRDFDataModelItem(nsRDFDataModel& model, RDF_Resource resource)
|
||||
@@ -44,8 +48,27 @@ nsRDFDataModelItem::~nsRDFDataModelItem(void)
|
||||
NS_IMPL_ADDREF(nsRDFDataModelItem);
|
||||
NS_IMPL_RELEASE(nsRDFDataModelItem);
|
||||
|
||||
static NS_DEFINE_IID(kIDMItemIID, NS_IDMITEM_IID);
|
||||
NS_IMPL_QUERY_INTERFACE(nsRDFDataModelItem, kIDMItemIID);
|
||||
NS_IMETHODIMP
|
||||
nsRDFDataModelItem::QueryInterface(const nsIID& iid, void** result)
|
||||
{
|
||||
if (! result)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
*result = NULL;
|
||||
if (iid.Equals(kIDMItemIID) ||
|
||||
iid.Equals(kISupportsIID)) {
|
||||
*result = static_cast<nsIDMItem*>(this);
|
||||
AddRef();
|
||||
return NS_OK;
|
||||
}
|
||||
else if (iid.Equals(kIRDFResourceIID)) {
|
||||
*result = static_cast<nsIRDFResource*>(this);
|
||||
AddRef();
|
||||
return NS_OK;
|
||||
}
|
||||
return NS_ERROR_NO_INTERFACE;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// nsIDMItem interface
|
||||
@@ -120,7 +143,20 @@ nsRDFDataModelItem::GetIntPropertyValue(PRInt32& value, const nsString& itemProp
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// nsIRDFResource interface
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsRDFDataModelItem::GetResource(RDF_Resource& resource /* out */) const
|
||||
{
|
||||
resource = mResource;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// Implementation methods
|
||||
|
||||
void
|
||||
nsRDFDataModelItem::InvalidateCachedSubtreeSize(void)
|
||||
@@ -204,7 +240,7 @@ nsRDFDataModelItem::Open(void)
|
||||
// Arcs are outbound, that is, from a parent to it's
|
||||
// child. Find all targets whose source is "me".
|
||||
cursor = RDF_GetTargets(mDataModel.GetDB(),
|
||||
GetResource(),
|
||||
mResource,
|
||||
mDataModel.GetArcProperty(),
|
||||
RDF_RESOURCE_TYPE,
|
||||
PR_TRUE);
|
||||
@@ -213,7 +249,7 @@ nsRDFDataModelItem::Open(void)
|
||||
// Arcs are inbound, that is, from a child to it's
|
||||
// parent. Find all sources whose target is "me".
|
||||
cursor = RDF_GetSources(mDataModel.GetDB(),
|
||||
GetResource(),
|
||||
mResource,
|
||||
mDataModel.GetArcProperty(),
|
||||
RDF_RESOURCE_TYPE,
|
||||
PR_TRUE);
|
||||
|
||||
@@ -21,13 +21,14 @@
|
||||
|
||||
#include "rdf.h"
|
||||
#include "nsIDMItem.h"
|
||||
#include "nsIRDFResource.h"
|
||||
#include "nsVector.h"
|
||||
|
||||
class nsRDFDataModel;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class nsRDFDataModelItem : public nsIDMItem {
|
||||
class nsRDFDataModelItem : public nsIDMItem, public nsIRDFResource {
|
||||
private:
|
||||
nsRDFDataModel& mDataModel;
|
||||
RDF_Resource mResource;
|
||||
@@ -76,15 +77,17 @@ public:
|
||||
NS_IMETHOD GetIntPropertyValue(PRInt32& value, const nsString& itemProperty) const;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// nsIRDFResource interface
|
||||
|
||||
NS_IMETHOD GetResource(RDF_Resource& resource /* out */) const;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// Implementation methods
|
||||
|
||||
nsRDFDataModel& GetDataModel(void) const {
|
||||
return mDataModel;
|
||||
}
|
||||
|
||||
RDF_Resource GetResource(void) const {
|
||||
return mResource;
|
||||
}
|
||||
|
||||
PRBool IsOpen(void) const {
|
||||
return mOpen;
|
||||
}
|
||||
|
||||
@@ -21,8 +21,10 @@
|
||||
#include "nsIDMWidget.h"
|
||||
#include "nsIDataModel.h"
|
||||
|
||||
static NS_DEFINE_IID(kIDataModelIID, NS_IDATAMODEL_IID);
|
||||
static NS_DEFINE_IID(kITreeColumnIID, NS_ITREECOLUMN_IID);
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
static NS_DEFINE_IID(kIDataModelIID, NS_IDATAMODEL_IID);
|
||||
static NS_DEFINE_IID(kITreeColumnIID, NS_ITREECOLUMN_IID);
|
||||
static NS_DEFINE_IID(kIRDFResourceIID, NS_IRDFRESOURCE_IID);
|
||||
|
||||
const PRUint32 nsRDFTreeColumn::kDefaultWidth = 64; // XXX
|
||||
|
||||
@@ -51,7 +53,27 @@ nsRDFTreeColumn::~nsRDFTreeColumn(void)
|
||||
|
||||
NS_IMPL_ADDREF(nsRDFTreeColumn);
|
||||
NS_IMPL_RELEASE(nsRDFTreeColumn);
|
||||
NS_IMPL_QUERY_INTERFACE(nsRDFTreeColumn, kITreeColumnIID);
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsRDFTreeColumn::QueryInterface(const nsIID& iid, void** result)
|
||||
{
|
||||
if (! result)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
*result = NULL;
|
||||
if (iid.Equals(kITreeColumnIID) ||
|
||||
iid.Equals(kISupportsIID)) {
|
||||
*result = static_cast<nsITreeColumn*>(this);
|
||||
AddRef();
|
||||
return NS_OK;
|
||||
}
|
||||
else if (iid.Equals(kIRDFResourceIID)) {
|
||||
*result = static_cast<nsIRDFResource*>(this);
|
||||
AddRef();
|
||||
return NS_OK;
|
||||
}
|
||||
return NS_ERROR_NO_INTERFACE;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
@@ -98,6 +120,18 @@ nsRDFTreeColumn::SetPixelWidth(PRUint32 newWidth)
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// nsIRDFResource interface
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsRDFTreeColumn::GetResource(RDF_Resource& result) const
|
||||
{
|
||||
result = mProperty;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// Implementation methods
|
||||
|
||||
void
|
||||
nsRDFTreeColumn::SetVisibility(PRBool visible)
|
||||
|
||||
@@ -21,11 +21,12 @@
|
||||
|
||||
#include "nsString.h"
|
||||
#include "nsITreeColumn.h"
|
||||
#include "nsIRDFResource.h"
|
||||
#include "rdf.h"
|
||||
|
||||
class nsRDFTreeDataModel;
|
||||
|
||||
class nsRDFTreeColumn : public nsITreeColumn {
|
||||
class nsRDFTreeColumn : public nsITreeColumn, public nsIRDFResource {
|
||||
private:
|
||||
nsRDFTreeDataModel& mTree;
|
||||
nsString mName;
|
||||
@@ -63,14 +64,16 @@ public:
|
||||
NS_IMETHOD SetPixelWidth(PRUint32 newWidth);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// nsIRDFResource interface
|
||||
|
||||
NS_IMETHOD GetResource(RDF_Resource& result /* out */) const;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// Implementation methods
|
||||
|
||||
void SetVisibility(PRBool visible);
|
||||
|
||||
PRBool IsVisible(void) const;
|
||||
|
||||
RDF_Resource GetProperty(void) const {
|
||||
return mProperty;
|
||||
}
|
||||
};
|
||||
|
||||
#endif // nsRDFTreeColumn_h__
|
||||
|
||||
@@ -21,9 +21,10 @@
|
||||
#include "nsRDFTreeDataModelItem.h"
|
||||
#include "rdf-int.h"
|
||||
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
static NS_DEFINE_IID(kIDataModelIID, NS_IDATAMODEL_IID);
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
static NS_DEFINE_IID(kIDataModelIID, NS_IDATAMODEL_IID);
|
||||
static NS_DEFINE_IID(kITreeDataModelIID, NS_ITREEDATAMODEL_IID);
|
||||
static NS_DEFINE_IID(kIRDFResourceIID, NS_IRDFRESOURCE_IID);
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
@@ -80,7 +81,11 @@ nsRDFTreeDataModel::QueryInterface(const nsIID& iid, void** result)
|
||||
NS_IMETHODIMP
|
||||
nsRDFTreeDataModel::InitFromURL(const nsString& url)
|
||||
{
|
||||
return nsRDFDataModel::InitFromURL(url);
|
||||
nsresult res = nsRDFDataModel::InitFromURL(url);
|
||||
if (NS_SUCCEEDED(res))
|
||||
res = CreateColumns();
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
@@ -170,12 +175,6 @@ nsRDFTreeDataModel::GetNthTreeItem(nsITreeDMItem*& pItem, PRUint32 n) const
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
#ifdef DYNAMIC_CASTING
|
||||
#define DYNAMIC_CAST(__type, __pointer) dynamic_cast<__type>(__pointer)
|
||||
#else
|
||||
#define DYNAMIC_CAST(__type, __pointer) ((__type)(__pointer))
|
||||
#endif
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsRDFTreeDataModel::GetItemTextForColumn(nsString& nodeText,
|
||||
nsITreeDMItem* pItem,
|
||||
@@ -185,34 +184,60 @@ nsRDFTreeDataModel::GetItemTextForColumn(nsString& nodeText,
|
||||
// HT_GetNodeData() does. Hopefully it's enough to do the job for
|
||||
// now.
|
||||
|
||||
// XXX may need to turn off the dynamic_cast stuff...
|
||||
nsRDFTreeDataModelItem* item =
|
||||
DYNAMIC_CAST(nsRDFTreeDataModelItem*, pItem);
|
||||
nsresult res = NS_OK;
|
||||
nsIRDFResource* itemRsrc = NULL;
|
||||
nsIRDFResource* columnRsrc = NULL;
|
||||
|
||||
PR_ASSERT(item);
|
||||
if (! item)
|
||||
return NS_ERROR_UNEXPECTED; // XXX
|
||||
do {
|
||||
if (NS_FAILED(pItem->QueryInterface(kIRDFResourceIID, (void**) &itemRsrc))) {
|
||||
res = NS_ERROR_INVALID_ARG;
|
||||
PR_ASSERT(0);
|
||||
break;
|
||||
}
|
||||
|
||||
nsRDFTreeColumn* column =
|
||||
DYNAMIC_CAST(nsRDFTreeColumn*, pColumn);
|
||||
if (NS_FAILED(pColumn->QueryInterface(kIRDFResourceIID, (void**) &columnRsrc))) {
|
||||
res = NS_ERROR_INVALID_ARG;
|
||||
PR_ASSERT(0);
|
||||
break;
|
||||
}
|
||||
|
||||
PR_ASSERT(column);
|
||||
if (! column)
|
||||
return NS_ERROR_UNEXPECTED; // XXX
|
||||
RDF_Resource item;
|
||||
if (NS_FAILED(itemRsrc->GetResource(item))) {
|
||||
res = NS_ERROR_UNEXPECTED;
|
||||
PR_ASSERT(0);
|
||||
break;
|
||||
}
|
||||
|
||||
RDF_Resource property;
|
||||
if (NS_FAILED(columnRsrc->GetResource(property))) {
|
||||
res = NS_ERROR_UNEXPECTED;
|
||||
PR_ASSERT(0);
|
||||
break;
|
||||
}
|
||||
|
||||
const char* result =
|
||||
(const char*) RDF_GetSlotValue(GetDB(),
|
||||
item->GetResource(), // resource
|
||||
column->GetProperty(), // property
|
||||
RDF_STRING_TYPE,
|
||||
PR_FALSE,
|
||||
PR_TRUE);
|
||||
const char* result =
|
||||
(const char*) RDF_GetSlotValue(GetDB(),
|
||||
item,
|
||||
property, // property
|
||||
RDF_STRING_TYPE,
|
||||
PR_FALSE,
|
||||
PR_TRUE);
|
||||
|
||||
PR_ASSERT(result);
|
||||
if (! result)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
if (! result) {
|
||||
res = NS_ERROR_UNEXPECTED;
|
||||
PR_ASSERT(0);
|
||||
break;
|
||||
}
|
||||
|
||||
nodeText = result;
|
||||
} while (0);
|
||||
|
||||
if (columnRsrc)
|
||||
columnRsrc->Release();
|
||||
|
||||
if (itemRsrc)
|
||||
itemRsrc->Release();
|
||||
|
||||
nodeText = result;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@@ -220,23 +245,27 @@ nsRDFTreeDataModel::GetItemTextForColumn(nsString& nodeText,
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// nsRDFTreeDataModel implementation methods
|
||||
|
||||
void
|
||||
nsresult
|
||||
nsRDFTreeDataModel::CreateColumns(void)
|
||||
{
|
||||
// This mostly came over from HT_NewView()
|
||||
nsRDFDataModelItem* root = GetRoot();
|
||||
PR_ASSERT(root);
|
||||
if (! root)
|
||||
return;
|
||||
return NS_ERROR_NULL_POINTER; // XXX need something better here
|
||||
|
||||
RDF_Resource rootResource;
|
||||
if (NS_FAILED(root->GetResource(rootResource)))
|
||||
return NS_ERROR_UNEXPECTED;
|
||||
|
||||
RDF_Cursor cursor;
|
||||
cursor = RDF_GetTargets(GetDB(), root->GetResource(),
|
||||
cursor = RDF_GetTargets(GetDB(), rootResource,
|
||||
gNavCenter->RDF_Column,
|
||||
RDF_RESOURCE_TYPE, PR_TRUE);
|
||||
|
||||
PR_ASSERT(cursor != NULL);
|
||||
if (cursor == NULL)
|
||||
return;
|
||||
return NS_ERROR_UNEXPECTED; // XXX need something better here
|
||||
|
||||
RDF_Resource r;
|
||||
while ((r = static_cast<RDF_Resource>(RDF_NextValue(cursor))) != NULL) {
|
||||
@@ -270,6 +299,8 @@ nsRDFTreeDataModel::CreateColumns(void)
|
||||
mColumns.Add(column);
|
||||
}
|
||||
RDF_DisposeCursor(cursor);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -84,7 +84,7 @@ public:
|
||||
private:
|
||||
nsVector mColumns;
|
||||
|
||||
void CreateColumns(void);
|
||||
nsresult CreateColumns(void);
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user