зеркало из https://github.com/mozilla/gecko-dev.git
Add thread counts.
This commit is contained in:
Родитель
c2a363c16b
Коммит
2f0913800f
|
@ -35,11 +35,13 @@
|
|||
static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID);
|
||||
|
||||
|
||||
nsIRDFResource* nsMessageViewDataSource::kNC_MessageChild;
|
||||
nsIRDFResource* nsMessageViewDataSource::kNC_Subject;
|
||||
nsIRDFResource* nsMessageViewDataSource::kNC_Sender;
|
||||
nsIRDFResource* nsMessageViewDataSource::kNC_Date;
|
||||
nsIRDFResource* nsMessageViewDataSource::kNC_Status;
|
||||
nsIRDFResource* nsMessageViewDataSource::kNC_MessageChild = nsnull;
|
||||
nsIRDFResource* nsMessageViewDataSource::kNC_Subject = nsnull;
|
||||
nsIRDFResource* nsMessageViewDataSource::kNC_Sender = nsnull;
|
||||
nsIRDFResource* nsMessageViewDataSource::kNC_Date = nsnull;
|
||||
nsIRDFResource* nsMessageViewDataSource::kNC_Status = nsnull;
|
||||
nsIRDFResource* nsMessageViewDataSource::kNC_Total = nsnull;
|
||||
nsIRDFResource* nsMessageViewDataSource::kNC_Unread = nsnull;
|
||||
|
||||
NS_IMPL_ADDREF(nsMessageViewDataSource)
|
||||
|
||||
|
@ -114,6 +116,8 @@ nsMessageViewDataSource::~nsMessageViewDataSource (void)
|
|||
NS_RELEASE2(kNC_Date, refcnt);
|
||||
NS_RELEASE2(kNC_Sender, 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
|
||||
mRDFService = nsnull;
|
||||
|
||||
|
@ -140,6 +144,8 @@ nsMessageViewDataSource::Init()
|
|||
mRDFService->GetResource(NC_RDF_DATE, &kNC_Date);
|
||||
mRDFService->GetResource(NC_RDF_SENDER, &kNC_Sender);
|
||||
mRDFService->GetResource(NC_RDF_STATUS , &kNC_Status);
|
||||
mRDFService->GetResource(NC_RDF_TOTALMESSAGES , &kNC_Total);
|
||||
mRDFService->GetResource(NC_RDF_TOTALUNREADMESSAGES , &kNC_Unread);
|
||||
}
|
||||
mInitialized = PR_TRUE;
|
||||
|
||||
|
@ -170,10 +176,21 @@ NS_IMETHODIMP nsMessageViewDataSource::GetTarget(nsIRDFResource* source,
|
|||
PRBool tv,
|
||||
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)
|
||||
return mDataSource->GetTarget(source, property, tv, target);
|
||||
else
|
||||
return NS_OK;
|
||||
return NS_RDF_NO_VALUE;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsMessageViewDataSource::GetSources(nsIRDFResource* property,
|
||||
|
@ -385,6 +402,8 @@ NS_IMETHODIMP nsMessageViewDataSource::ArcLabelsOut(nsIRDFResource* source,
|
|||
arcs->AppendElement(kNC_Sender);
|
||||
arcs->AppendElement(kNC_Date);
|
||||
arcs->AppendElement(kNC_Status);
|
||||
arcs->AppendElement(kNC_Total);
|
||||
arcs->AppendElement(kNC_Unread);
|
||||
|
||||
nsCOMPtr<nsIMsgFolder> folder;
|
||||
rv = message->GetMsgFolder(getter_AddRefs(folder));
|
||||
|
@ -394,6 +413,7 @@ NS_IMETHODIMP nsMessageViewDataSource::ArcLabelsOut(nsIRDFResource* source,
|
|||
rv =folder->GetThreadForMessage(message, getter_AddRefs(thread));
|
||||
if(thread && NS_SUCCEEDED(rv))
|
||||
{
|
||||
|
||||
nsCOMPtr<nsIEnumerator> messages;
|
||||
nsMsgKey msgKey;
|
||||
message->GetMessageKey(&msgKey);
|
||||
|
@ -598,6 +618,125 @@ NS_IMETHODIMP nsMessageViewDataSource::SetShowThreads(PRBool showThreads)
|
|||
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 //////////////////
|
||||
|
||||
|
||||
|
|
|
@ -155,6 +155,13 @@ public:
|
|||
NS_IMETHOD SetShowWatched();
|
||||
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
|
||||
|
@ -169,6 +176,8 @@ protected:
|
|||
static nsIRDFResource* kNC_Date;
|
||||
static nsIRDFResource* kNC_Sender;
|
||||
static nsIRDFResource* kNC_Status;
|
||||
static nsIRDFResource* kNC_Unread;
|
||||
static nsIRDFResource* kNC_Total;
|
||||
|
||||
};
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче