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:
waterson%netscape.com
1998-11-14 00:19:00 +00:00
parent 1980ba8ade
commit e54ec51180
7 changed files with 161 additions and 54 deletions

View File

@@ -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

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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)

View File

@@ -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__

View File

@@ -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

View File

@@ -84,7 +84,7 @@ public:
private:
nsVector mColumns;
void CreateColumns(void);
nsresult CreateColumns(void);
};