This commit is contained in:
putterman%netscape.com 1999-07-06 22:44:00 +00:00
Родитель c2a363c16b
Коммит 2f0913800f
2 изменённых файлов: 154 добавлений и 6 удалений

Просмотреть файл

@ -35,11 +35,13 @@
static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID); static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID);
nsIRDFResource* nsMessageViewDataSource::kNC_MessageChild; nsIRDFResource* nsMessageViewDataSource::kNC_MessageChild = nsnull;
nsIRDFResource* nsMessageViewDataSource::kNC_Subject; nsIRDFResource* nsMessageViewDataSource::kNC_Subject = nsnull;
nsIRDFResource* nsMessageViewDataSource::kNC_Sender; nsIRDFResource* nsMessageViewDataSource::kNC_Sender = nsnull;
nsIRDFResource* nsMessageViewDataSource::kNC_Date; nsIRDFResource* nsMessageViewDataSource::kNC_Date = nsnull;
nsIRDFResource* nsMessageViewDataSource::kNC_Status; nsIRDFResource* nsMessageViewDataSource::kNC_Status = nsnull;
nsIRDFResource* nsMessageViewDataSource::kNC_Total = nsnull;
nsIRDFResource* nsMessageViewDataSource::kNC_Unread = nsnull;
NS_IMPL_ADDREF(nsMessageViewDataSource) NS_IMPL_ADDREF(nsMessageViewDataSource)
@ -114,6 +116,8 @@ nsMessageViewDataSource::~nsMessageViewDataSource (void)
NS_RELEASE2(kNC_Date, refcnt); NS_RELEASE2(kNC_Date, refcnt);
NS_RELEASE2(kNC_Sender, refcnt); NS_RELEASE2(kNC_Sender, refcnt);
NS_RELEASE2(kNC_Status, refcnt); NS_RELEASE2(kNC_Status, refcnt);
NS_RELEASE2(kNC_Total, refcnt);
NS_RELEASE2(kNC_Unread, refcnt);
nsServiceManager::ReleaseService(kRDFServiceCID, mRDFService); // XXX probably need shutdown listener here nsServiceManager::ReleaseService(kRDFServiceCID, mRDFService); // XXX probably need shutdown listener here
mRDFService = nsnull; mRDFService = nsnull;
@ -140,6 +144,8 @@ nsMessageViewDataSource::Init()
mRDFService->GetResource(NC_RDF_DATE, &kNC_Date); mRDFService->GetResource(NC_RDF_DATE, &kNC_Date);
mRDFService->GetResource(NC_RDF_SENDER, &kNC_Sender); mRDFService->GetResource(NC_RDF_SENDER, &kNC_Sender);
mRDFService->GetResource(NC_RDF_STATUS , &kNC_Status); mRDFService->GetResource(NC_RDF_STATUS , &kNC_Status);
mRDFService->GetResource(NC_RDF_TOTALMESSAGES , &kNC_Total);
mRDFService->GetResource(NC_RDF_TOTALUNREADMESSAGES , &kNC_Unread);
} }
mInitialized = PR_TRUE; mInitialized = PR_TRUE;
@ -170,10 +176,21 @@ NS_IMETHODIMP nsMessageViewDataSource::GetTarget(nsIRDFResource* source,
PRBool tv, PRBool tv,
nsIRDFNode** target) nsIRDFNode** target)
{ {
nsresult rv;
//First see if we handle this
nsCOMPtr<nsIMessage> message(do_QueryInterface(source));
if(message)
{
rv = createMessageNode(message, property, target);
if(NS_SUCCEEDED(rv) && rv != NS_RDF_NO_VALUE)
return rv;
}
if(mDataSource) if(mDataSource)
return mDataSource->GetTarget(source, property, tv, target); return mDataSource->GetTarget(source, property, tv, target);
else else
return NS_OK; return NS_RDF_NO_VALUE;
} }
NS_IMETHODIMP nsMessageViewDataSource::GetSources(nsIRDFResource* property, NS_IMETHODIMP nsMessageViewDataSource::GetSources(nsIRDFResource* property,
@ -385,6 +402,8 @@ NS_IMETHODIMP nsMessageViewDataSource::ArcLabelsOut(nsIRDFResource* source,
arcs->AppendElement(kNC_Sender); arcs->AppendElement(kNC_Sender);
arcs->AppendElement(kNC_Date); arcs->AppendElement(kNC_Date);
arcs->AppendElement(kNC_Status); arcs->AppendElement(kNC_Status);
arcs->AppendElement(kNC_Total);
arcs->AppendElement(kNC_Unread);
nsCOMPtr<nsIMsgFolder> folder; nsCOMPtr<nsIMsgFolder> folder;
rv = message->GetMsgFolder(getter_AddRefs(folder)); rv = message->GetMsgFolder(getter_AddRefs(folder));
@ -394,6 +413,7 @@ NS_IMETHODIMP nsMessageViewDataSource::ArcLabelsOut(nsIRDFResource* source,
rv =folder->GetThreadForMessage(message, getter_AddRefs(thread)); rv =folder->GetThreadForMessage(message, getter_AddRefs(thread));
if(thread && NS_SUCCEEDED(rv)) if(thread && NS_SUCCEEDED(rv))
{ {
nsCOMPtr<nsIEnumerator> messages; nsCOMPtr<nsIEnumerator> messages;
nsMsgKey msgKey; nsMsgKey msgKey;
message->GetMessageKey(&msgKey); message->GetMessageKey(&msgKey);
@ -598,6 +618,125 @@ NS_IMETHODIMP nsMessageViewDataSource::SetShowThreads(PRBool showThreads)
return NS_OK; return NS_OK;
} }
nsresult
nsMessageViewDataSource::createMessageNode(nsIMessage *message,
nsIRDFResource *property,
nsIRDFNode **target)
{
if (mShowThreads && ( kNC_Total == property))
return createTotalNode(message, target);
else if (mShowThreads && (kNC_Unread == property))
return createUnreadNode(message, target);
else
return NS_RDF_NO_VALUE;
}
nsresult nsMessageViewDataSource::createTotalNode(nsIMessage *message, nsIRDFNode **target)
{
nsCOMPtr<nsIMsgFolder> folder;
nsCOMPtr<nsIMsgThread> thread;
nsresult rv;
nsString emptyString("");
rv = GetMessageFolderAndThread(message, getter_AddRefs(folder), getter_AddRefs(thread));
if(NS_SUCCEEDED(rv) && thread)
{
if(IsThreadsFirstMessage(thread, message))
{
PRUint32 numChildren;
rv = thread->GetNumChildren(&numChildren);
if(NS_SUCCEEDED(rv))
{
if(numChildren > 1)
rv = createNode(numChildren, target);
else
rv = createNode(emptyString, target);
}
}
else
{
rv = createNode(emptyString, target);
}
}
if(NS_SUCCEEDED(rv))
return rv;
else
return NS_RDF_NO_VALUE;
}
nsresult nsMessageViewDataSource::createUnreadNode(nsIMessage *message, nsIRDFNode **target)
{
nsCOMPtr<nsIMsgFolder> folder;
nsCOMPtr<nsIMsgThread> thread;
nsresult rv;
nsString emptyString("");
rv = GetMessageFolderAndThread(message, getter_AddRefs(folder), getter_AddRefs(thread));
if(NS_SUCCEEDED(rv) && thread)
{
if(IsThreadsFirstMessage(thread, message))
{
PRUint32 numUnread;
rv = thread->GetNumUnreadChildren(&numUnread);
if(NS_SUCCEEDED(rv))
{
if(numUnread > 0)
rv = createNode(numUnread, target);
else
rv = createNode(emptyString, target);
}
}
else
{
rv = createNode(emptyString, target);
}
}
if(NS_SUCCEEDED(rv))
return rv;
else
return NS_RDF_NO_VALUE;
}
nsresult nsMessageViewDataSource::GetMessageFolderAndThread(nsIMessage *message,
nsIMsgFolder **folder,
nsIMsgThread **thread)
{
nsresult rv;
rv = message->GetMsgFolder(folder);
if(NS_SUCCEEDED(rv))
{
rv = (*folder)->GetThreadForMessage(message, thread);
}
return rv;
}
PRBool nsMessageViewDataSource::IsThreadsFirstMessage(nsIMsgThread *thread, nsIMessage *message)
{
nsCOMPtr<nsIMsgDBHdr> firstHdr;
nsresult rv;
rv = thread->GetChildHdrAt(0, getter_AddRefs(firstHdr));
if(NS_FAILED(rv))
return PR_FALSE;
nsMsgKey messageKey, firstHdrKey;
rv = message->GetMessageKey(&messageKey);
if(NS_FAILED(rv))
return PR_FALSE;
rv = firstHdr->GetMessageKey(&firstHdrKey);
if(NS_FAILED(rv))
return PR_FALSE;
return messageKey == firstHdrKey;
}
////////////////////////// nsMessageViewMessageEnumerator ////////////////// ////////////////////////// nsMessageViewMessageEnumerator //////////////////

Просмотреть файл

@ -155,6 +155,13 @@ public:
NS_IMETHOD SetShowWatched(); NS_IMETHOD SetShowWatched();
NS_IMETHOD SetShowThreads(PRBool showThreads); NS_IMETHOD SetShowThreads(PRBool showThreads);
protected:
nsresult createMessageNode(nsIMessage *message, nsIRDFResource *property, nsIRDFNode **target);
nsresult createUnreadNode(nsIMessage *message, nsIRDFNode **target);
nsresult createTotalNode(nsIMessage *message, nsIRDFNode **target);
nsresult GetMessageFolderAndThread(nsIMessage *message, nsIMsgFolder **folder,
nsIMsgThread **thread);
PRBool IsThreadsFirstMessage(nsIMsgThread *thread, nsIMessage *message);
// caching frequently used resources // caching frequently used resources
@ -169,6 +176,8 @@ protected:
static nsIRDFResource* kNC_Date; static nsIRDFResource* kNC_Date;
static nsIRDFResource* kNC_Sender; static nsIRDFResource* kNC_Sender;
static nsIRDFResource* kNC_Status; static nsIRDFResource* kNC_Status;
static nsIRDFResource* kNC_Unread;
static nsIRDFResource* kNC_Total;
}; };