fix it so we show the right sort indicator when viewing a folder (or newsgroup) for the first time.

add "View | Sort By | Thread" back to the menus.

add an accelerator for "Select Thread" (ctrl shift a). #21094

make it so when we delete the last message in the folder, we clear  out the message pane.
make it so when we compact folders, we blank out the thread pane. #72674

fix some crashers when clicking on the thread pane and there is no db or there are no rows.  #72282

kill thread should not be "ctrl w", it should be "w".  #73260

sr=bienvenu
This commit is contained in:
sspitzer%netscape.com 2001-03-24 01:12:33 +00:00
Родитель da0a38e431
Коммит 140940d7ea
13 изменённых файлов: 112 добавлений и 179 удалений

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

@ -161,7 +161,7 @@ function setTitleFromFolder(msgfolder, subject)
function ChangeFolderByURI(uri, viewType, viewFlags, sortType, sortOrder)
{
dump('In ChangeFolderByURI uri = ' + uri + "\n");
//dump("In ChangeFolderByURI uri = " + uri + " sortType = " + sortType + "\n");
if (uri == gCurrentLoadingFolderURI)
return;
var resource = RDF.GetResource(uri);
@ -174,7 +174,6 @@ function ChangeFolderByURI(uri, viewType, viewFlags, sortType, sortOrder)
dump("error setting title: " + ex + "\n");
}
//if it's a server, clear the threadpane and don't bother trying to load.
if(msgfolder.isServer) {
ClearThreadPane();
@ -228,16 +227,16 @@ function ChangeFolderByURI(uri, viewType, viewFlags, sortType, sortOrder)
else
{
SetBusyCursor(window, true);
gCurrentFolderToReroot = "";
gCurrentLoadingFolderViewFlags = 0; // is this correct?
gCurrentLoadingFolderSortType = 0; // is this correct?
gCurrentLoadingFolderSortOrder = 0; // is this correct?
gCurrentFolderToReroot = "";
gCurrentLoadingFolderViewFlags = 0; // is this correct?
gCurrentLoadingFolderSortType = 0; // is this correct?
gCurrentLoadingFolderSortOrder = 0; // is this correct?
gCurrentLoadingFolderViewType = 0; // is this correct?
RerootFolder(uri, msgfolder, viewType, viewFlags, sortType, sortOrder);
RerootFolder(uri, msgfolder, viewType, viewFlags, sortType, sortOrder);
//Need to do this after rerooting folder. Otherwise possibility of receiving folder loaded
//notification before folder has actually changed.
msgfolder.updateFolder(msgWindow);
//Need to do this after rerooting folder. Otherwise possibility of receiving folder loaded
//notification before folder has actually changed.
msgfolder.updateFolder(msgWindow);
}
document.commandDispatcher.updateCommands('mail-toolbar');
@ -255,32 +254,26 @@ function isNewsURI(uri)
function RerootFolder(uri, newFolder, viewType, viewFlags, sortType, sortOrder)
{
dump('In reroot folder\n');
//dump("In reroot folder, sortType = " + sortType + "\n");
// workaround for #39655
gFolderJustSwitched = true;
ClearThreadTreeSelection();
ClearThreadPaneSelection();
//Clear the new messages of the old folder
var oldFolder = msgWindow.openFolder;
if (oldFolder) {
if (oldFolder.hasNewMessages) {
oldFolder.clearNewMessages();
}
}
//Set the window's new open folder.
msgWindow.openFolder = newFolder;
SetViewFlags(viewFlags);
//Clear the new messages of the old folder
dump("some work needed here\n");
/*
var oldFolderURI = folder.getAttribute("ref");
if(oldFolderURI && (oldFolderURI != "null") && (oldFolderURI !=""))
{
var oldFolder = GetMsgFolderFromURI(oldFolderURI);
if(oldFolder)
{
if (oldFolder.hasNewMessages)
oldFolder.clearNewMessages();
}
}
*/
//the new folder being selected should have its biff state get cleared.
if(newFolder)
{
@ -372,7 +365,7 @@ function SetSentFolderColumns(isSentFolder)
function SetNewsFolderColumns(isNewsFolder)
{
dump("fix me, I need to show lines or size depending on if the folder is news or not\n");
dump("XXX fix me, I need to show lines or size depending on if the folder is news or not\n");
/*
var sizeColumn = document.getElementById("SizeColumnHeader");
var sizeColumnTemplate = document.getElementById("SizeColumnTemplate");
@ -396,8 +389,6 @@ function SetNewsFolderColumns(isNewsFolder)
*/
}
function UpdateStatusMessageCounts(folder)
{
var unreadElement = GetUnreadCountElement();
@ -418,23 +409,6 @@ function UpdateStatusMessageCounts(folder)
}
function SaveThreadPaneSelection()
{
var tree = GetThreadTree();
var selectedItems = tree.selectedItems;
var numSelected = selectedItems.length;
var selectionArray = new Array(numSelected);
for(var i = 0; i < numSelected; i++)
{
selectionArray[i] = selectedItems[i].getAttribute("id");
}
return selectionArray;
}
// XXX remove this?
function ConvertColumnIDToSortType(columnID)
{
var sortKey;
@ -468,7 +442,7 @@ function ConvertColumnIDToSortType(columnID)
sortKey = nsMsgViewSortType.byThread;
break;
default:
dump("unsupported sort: " + columnID + "\n");
dump("unsupported sort column: " + columnID + "\n");
sortKey = 0;
break;
}
@ -479,7 +453,8 @@ function ConvertSortTypeToColumnID(sortKey)
{
var columnID;
// hack to turn this into an integer, if it was a string;
// hack to turn this into an integer, if it was a string
// it would be a string if it came from localStore.rdf
sortKey = sortKey - 0;
switch (sortKey) {
@ -515,7 +490,7 @@ function ConvertSortTypeToColumnID(sortKey)
columnID = null;
break;
default:
dump("unsupported sort: " + sortKey + "\n");
dump("unsupported sort key: " + sortKey + "\n");
columnID = null;
break;
}
@ -531,6 +506,7 @@ var nsMsgNavigationType = Components.interfaces.nsMsgNavigationType;
var gDBView = null;
var gCurViewFlags;
var gCurSortType;
// CreateDBView is called when we have a thread pane. CreateBareDBView is called when there is no
// outliner associated with the view. CreateDBView will call into CreateBareDBView...
@ -584,6 +560,8 @@ function CreateBareDBView(msgFolder, viewType, viewFlags, sortType, sortOrder)
if (!gThreadPaneCommandUpdater)
gThreadPaneCommandUpdater = new nsMsgDBViewCommandUpdater();
gCurSortType = sortType;
gDBView.init(messenger, msgWindow, gThreadPaneCommandUpdater);
gDBView.open(msgFolder, sortType, sortOrder, viewFlags, count);
}
@ -603,7 +581,7 @@ function CreateDBView(msgFolder, viewType, viewFlags, sortType, sortOrder)
else
gDBView.supressMsgDisplay = false;
var colID = ConvertSortTypeToColumnID(sortType);
var colID = ConvertSortTypeToColumnID(gCurSortType);
if (colID) {
var column = document.getElementById(colID);
gDBView.sortedColumn = column;
@ -615,7 +593,7 @@ function CreateDBView(msgFolder, viewType, viewFlags, sortType, sortOrder)
function ShowAppropriateColumns()
{
if (gDBView.sortType == nsMsgViewSortType.byThread) {
if (gDBView && (gDBView.sortType == nsMsgViewSortType.byThread)) {
// don't hide them when sorted by thread
SetHiddenAttributeOnThreadOnlyColumns("");
}
@ -740,10 +718,8 @@ function OnClickThreadAndMessagePaneSplitter()
function PositionThreadPane()
{
dump("XXX need for cross folder navigation. fix me: PositionThreadPane()\n");
dump("XXX fix PositionThreadPane\n");
/*
var tree = GetThreadTree();
var selArray = tree.selectedItems;
if ( selArray && (selArray.length > 0))
@ -781,7 +757,7 @@ function FolderPaneSelectionChange()
function ClearThreadPane()
{
dump("XXX implement ClearThreadPane()\n");
gDBView = null;
}
function OpenFolderTreeToFolder(folderURI)
@ -837,10 +813,6 @@ function IsSpecialFolder(msgFolder, flags)
function SelectNextMessage(nextMessage)
{
dump("XXX implement SelectNextMessage()\n");
/*
var tree = GetThreadTree();
ChangeSelection(tree, nextMessage);
*/
}
function GetSelectTrashUri(folder)

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

@ -417,7 +417,7 @@ function loadStartPage() {
if (startpage != "") {
window.frames["messagepane"].location = startpage;
//dump("start message pane with: " + startpage + "\n");
ClearMessageSelection();
ClearMessageSelection();
}
}
}

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

@ -128,6 +128,7 @@ function InitViewSortByMenu()
setSortByMenuItemCheckState("sortBySizeMenuitem", (sortType == nsMsgViewSortType.bySize));
setSortByMenuItemCheckState("sortByStatusMenuitem", (sortType == nsMsgViewSortType.byStatus));
setSortByMenuItemCheckState("sortBySubjectMenuitem", (sortType == nsMsgViewSortType.bySubject));
setSortByMenuItemCheckState("sortByThreadMenuitem", (sortType == nsMsgViewSortType.byThread));
setSortByMenuItemCheckState("sortByUnreadMenuitem", (sortType == nsMsgViewSortType.byUnread));
var sortOrder = gDBView.sortOrder;

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

@ -211,6 +211,7 @@ Rights Reserved.
<key id="key_delete" oncommand="goDoCommand('cmd_delete');" shift="false"/>
<key id="cmd_shiftDelete" oncommand="goDoCommand('cmd_shiftDelete')"/>
<key id="key_selectAll"/>
<key id="key_selectThread" key="&selectThreadCmd.key;" oncommand="goDoCommand('cmd_selectThread');" modifiers="accel, shift"/>
<key id="key_toggleRead" key="&markAsReadCmd.key;" oncommand="goDoCommand('cmd_markAsRead');"/>
<key id="key_markAllRead" key="&markAllReadCmd.key;" oncommand="goDoCommand('cmd_markAllRead');" modifiers="accel, shift"/>
@ -223,7 +224,7 @@ Rights Reserved.
<key id="key_replyall" key="&replyToAllMsgCmd.key;" oncommand="goDoCommand('cmd_replyall')" modifiers="accel, shift"/>
<key id="key_forward" key="&forwardMsgCmd.key;" oncommand="goDoCommand('cmd_forward')" modifiers="accel"/>
<key id="key_editAsNew" key="&editMsgAsNewCmd.key;" oncommand="goDoCommand('cmd_editAsNew')" modifiers="accel"/>
<key id="key_watchThread" key="&watchThreadMenu.key;" oncommand="goDoCommand('cmd_watchThread')" modifiers="accel"/>
<key id="key_watchThread" key="&watchThreadMenu.key;" oncommand="goDoCommand('cmd_watchThread')" />
<key id="key_killThread" key="&killThreadMenu.key;" oncommand="goDoCommand('cmd_killThread')" />
<key id="key_openMessage" key="&openMessageWindowCmd.key;" oncommand="goDoCommand('cmd_openMessage')" modifiers="accel"/>
<key id="key_print" key="&printCmd.key;" oncommand="goDoCommand('cmd_print')" modifiers="accel"/>
@ -824,6 +825,7 @@ Rights Reserved.
<menupopup>
<menuitem label="&selectThreadCmd.label;"
accesskey="&selectThreadCmd.accesskey;"
key="key_selectThread"
observes="cmd_selectThread"/>
<menuitem label="&selectFlaggedCmd.label;"
accesskey="&selectFlaggedCmd.accesskey;"
@ -872,6 +874,7 @@ Rights Reserved.
<menuitem id="sortBySizeMenuitem" type="checkbox" label="&sortBySizeCmd.label;" accesskey="&sortBySizeCmd.accesskey;" oncommand="MsgSortBySize()"/>
<menuitem id="sortByStatusMenuitem" type="checkbox" label="&sortByStatusCmd.label;" accesskey="&sortByStatusCmd.accesskey;" oncommand="MsgSortByStatus()"/>
<menuitem id="sortBySubjectMenuitem" type="checkbox" label="&sortBySubjectCmd.label;" accesskey="&sortBySubjectCmd.accesskey;" oncommand="MsgSortBySubject()"/>
<menuitem id="sortByThreadMenuitem" type="checkbox" label="&sortByThreadCmd.label;" accesskey="&sortByThreadCmd.accesskey;" oncommand="MsgSortByThread()"/>
<menuitem id="sortByUnreadMenuitem" type="checkbox" label="&sortByUnreadCmd.label;" accesskey="&sortByUnreadCmd.accesskey;" oncommand="MsgSortByUnread()"/>
<menuseparator/>
<menuitem id="sortAscending" type="checkbox" label="&sortAscending.label;" accesskey="&sortAscending.accesskey;" oncommand="MsgSortAscending()"/>

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

@ -424,7 +424,7 @@ function DropOnFolderTree(event)
function DropOnThreadPane(event)
{
debugDump("DropOnThreadTree\n");
debugDump("DropOnThreadPane()\n");
/* you can't drop on the thread pane */
return false;
}

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

@ -24,7 +24,6 @@
var showPerformance = false;
var gFolderTree;
var gThreadTree;
var gThreadOutliner;
var gMessagePane;
var gMessagePaneFrame;
@ -52,10 +51,8 @@ var gStartFolderUri = null;
//If we've loaded a message, set to true. Helps us keep the start page around.
var gHaveLoadedMessage;
var gBatching = false;
var gDisplayStartupPage = false;
// the folderListener object
var folderListener = {
OnItemAdded: function(parentItem, item, view) {},
@ -108,7 +105,7 @@ var folderListener = {
if(resource)
{
var uri = resource.Value;
dump("In OnFolderLoaded for " + uri +"\n");
//dump("In OnFolderLoaded for " + uri +"\n");
if(uri == gCurrentFolderToReroot)
{
@ -178,35 +175,24 @@ function HandleDeleteOrMoveMsgFailed(folder)
}
}
if (gBatching) {
gBatching = false;
//threadTree.treeBoxObject.endBatch();
//dump("XXX end tree batch (delete or move failed)\n");
}
// fix me???
// ThreadPaneSelectionChange(true);
// ThreadPaneSelectionChange(true);
}
function HandleDeleteOrMoveMsgCompleted(folder)
{
var threadTree = GetThreadTree();
// if(IsCurrentLoadedFolder(folder)) ### rewrite/implement this
// {
if(gNextMessageViewIndexAfterDelete != -1)
{
if (IsCurrentLoadedFolder(folder)) {
if (gNextMessageViewIndexAfterDelete != -1) {
var outlinerView = gDBView.QueryInterface(Components.interfaces.nsIOutlinerView);
var outlinerSelection = outlinerView.selection;
viewSize = outlinerView.rowCount;
dump("view size = " + viewSize + "\n");
if (gNextMessageViewIndexAfterDelete >= viewSize)
{
if (gNextMessageViewIndexAfterDelete >= viewSize) {
if (viewSize > 0)
gNextMessageViewIndexAfterDelete = viewSize - 1;
else
gNextMessageViewIndexAfterDelete = -1;
}
// if we are about to set the selection with a new element then DON'T clear
// the selection then add the next message to select. This just generates
// an extra round of command updating notifications that we are trying to
@ -222,29 +208,17 @@ function HandleDeleteOrMoveMsgCompleted(folder)
outlinerView.selectionChanged();
EnsureRowInThreadOutlinerIsVisible(gNextMessageViewIndexAfterDelete);
}
else
else {
outlinerSelection.clearSelection(); /* clear selection in either case */
ClearMessagePane();
}
gNextMessageViewIndexAfterDelete = -1;
}
/*
//if there's nothing to select then see if the tree has any messages.
//if not, then clear the message pane.
else
{
var tree = GetThreadTree();
// var topmost = msgNavigationService.FindFirstMessage(tree);
if(!topmost)
ClearMessagePane()
}
// }
if (gBatching) {
gBatching = false;
//threadTree.treeBoxObject.endBatch();
//dump("XXX end tree batch (delete or move succeeded)\n");
gNextMessageViewIndexAfterDelete = -1;
}
*/
else {
ClearMessagePane();
}
}
}
@ -553,10 +527,6 @@ function AddToSession()
function InitPanes()
{
// var threadTree = GetThreadTree();
// if(threadTree);
// OnLoadThreadPane(threadTree);
var folderTree = GetFolderTree();
if(folderTree)
OnLoadFolderPane(folderTree);
@ -683,9 +653,18 @@ function FindMessenger()
return messenger;
}
function ClearThreadTreeSelection()
function ClearThreadPaneSelection()
{
// mscott --> implement me
try {
if (gDBView) {
var outlinerView = gDBView.QueryInterface(Components.interfaces.nsIOutlinerView);
var outlinerSelection = outlinerView.selection;
outlinerSelection.clearSelection();
}
}
catch (ex) {
dump("ClearThreadPaneSelection: ex = " + ex + "\n");
}
}
function ClearMessagePane()
@ -778,12 +757,12 @@ function FolderPaneDoubleClick(treeitem)
var uri = treeitem.getAttribute("id");
server = GetServer(uri);
if (server) {
//dump("double clicking open, PerformExpand()\n");
// double clicking open, PerformExpand()
server.PerformExpand(msgWindow);
}
}
else {
//dump("double clicking close, don't PerformExpand()\n");
// double clicking close, don't PerformExpand()
}
}
}
@ -906,7 +885,7 @@ function GetLoadedMessage()
//Clear everything related to the current message. called after load start page.
function ClearMessageSelection()
{
ClearThreadTreeSelection();
ClearThreadPaneSelection();
}
function GetCompositeDataSource(command)
@ -917,12 +896,11 @@ function GetCompositeDataSource(command)
}
return null;
}
function SetNextMessageAfterDelete()
{
dump("setting next msg view index after delete to " + gDBView.firstSelected + "\n");
//dump("setting next msg view index after delete to " + gDBView.firstSelected + "\n");
gNextMessageViewIndexAfterDelete = gDBView.firstSelected;
}
@ -936,8 +914,8 @@ function SelectFolder(folderUri)
function SelectMessage(messageUri)
{
dump("fix this or remove this\n");
// this isn't going to work anymore
dump("XXX fix this or remove SelectMessage()\n");
}
function ReloadMessage()

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

@ -74,42 +74,6 @@ function FindNextFolder(originalFolderURI)
function ScrollToFirstNewMessage()
{
dump("XXX ScrollToFirstNewMessage needs to be rewritten.\n");
/*
var tree = GetThreadTree();
var treeFolder = GetThreadTreeFolder();
var folderURI = treeFolder.getAttribute('ref');
var folderResource = RDF.GetResource(folderURI);
var folder = folderResource.QueryInterface(Components.interfaces.nsIMsgFolder);
var hasNew = folder.hasNewMessages;
if(hasNew)
{
var newMessage = folder.firstNewMessage;
if(messageView.showThreads)
{
//if we're in thread mode, then we need to actually make sure the message is showing.
var topLevelMessage = GetTopLevelMessageForMessage(newMessage, folder);
var topLevelResource = topLevelMessage.QueryInterface(Components.interfaces.nsIRDFResource);
var topLevelURI = topLevelResource.Value;
var topElement = document.getElementById(topLevelURI);
if(topElement)
{
// msgNavigationService.OpenTreeitemAndDescendants(topElement);
}
}
var messageResource = newMessage.QueryInterface(Components.interfaces.nsIRDFResource);
var messageURI = messageResource.Value;
var messageElement = document.getElementById(messageURI);
if(messageElement)
{
tree.ensureElementIsVisible(messageElement);
}
}
*/
}
function GetTopLevelMessageForMessage(message, folder)
@ -232,7 +196,7 @@ function GoNextMessage(type, startFromBeginning)
CrossFolderNavigation(type, true);
}
catch (ex) {
dump("XXX ex = " + ex + "\n");
dump("GoNextMessage ex = " + ex + "\n");
}
}

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

@ -27,9 +27,6 @@ function NewBrowserWindow() {}
function NewBlankPage() {}
function TemplatePage() {}
function WizardPage() {}
function CharacterSet(){}
function MessengerSetDefaultCharacterSet(aCharset)
@ -41,7 +38,7 @@ function MessengerSetDefaultCharacterSet(aCharset)
// folder charset to be set by folder property not by charset menu
// var folderResource = GetSelectedFolderResource();
// SetFolderCharset(folderResource, aCharset);
// RefreshThreadTreeView();
// RefreshThreadPane();
// DO NOT try to reload the message here. we do this automatically now in
// messenger.SetDocumentCharset. You'll just break things and reak havoc
// if you call MsgReload() here...

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

@ -182,7 +182,7 @@ function MsgSortBySize()
function MsgSortByLines()
{
dump("XXX fix this\n");
dump("XXX fix MsgSortByLines()\n");
//MsgSortThreadPane(nsMsgViewSortType.byLines);
}
@ -198,7 +198,7 @@ function MsgSortByOrderReceived()
function MsgSortByTotal()
{
dump("XXX fix this\n");
dump("XXX fix MsgSortByTotal\n");
//MsgSortThreadPane(nsMsgViewSortType.byTotal);
}
@ -260,14 +260,3 @@ function EnsureRowInThreadOutlinerIsVisible(index)
var outliner = GetThreadOutliner();
outliner.boxObject.QueryInterface(Components.interfaces.nsIOutlinerBoxObject).ensureRowIsVisible(index);
}
function GetThreadTree()
{
dump("GetThreadTree, fix (or remove?) this\n");
}
function GetThreadTreeFolder()
{
dump("GetThreadTreeFolder, fix (or remove?) this\n");
}

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

@ -187,7 +187,7 @@ function MsgCompactFolder(isAll)
}
else
{
ClearThreadTreeSelection();
ClearThreadPaneSelection();
ClearMessagePane();
}
}

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

@ -90,6 +90,7 @@ Rights Reserved.
<!ENTITY selectMenu.accesskey "l">
<!ENTITY selectThreadCmd.label "Thread">
<!ENTITY selectThreadCmd.accesskey "t">
<!ENTITY selectThreadCmd.key "a">
<!ENTITY selectFlaggedCmd.label "Flagged Messages">
<!ENTITY selectFlaggedCmd.accesskey "f">
<!ENTITY selectInvertCmd.label ".Invert Selection">
@ -142,6 +143,8 @@ Rights Reserved.
<!ENTITY sortBySubjectCmd.accesskey "s">
<!ENTITY sortByUnreadCmd.label "Unread">
<!ENTITY sortByUnreadCmd.accesskey "n">
<!ENTITY sortByThreadCmd.label "Thread">
<!ENTITY sortByThreadCmd.accesskey "t">
<!ENTITY sortByOrderReceivedCmd.label "Order Received">
<!ENTITY sortByOrderReceivedCmd.accesskey "o">
<!ENTITY sortAscending.label "Ascending">

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

@ -506,7 +506,8 @@ NS_IMETHODIMP nsMsgDBView::LoadMessageByMsgKey(nsMsgKey aMsgKey)
if (viewPosition != nsMsgViewIndex_None)
{
nsCOMPtr <nsIMsgDBHdr> msgHdr;
GetMsgHdrForViewIndex(viewPosition, getter_AddRefs(msgHdr));
rv = GetMsgHdrForViewIndex(viewPosition, getter_AddRefs(msgHdr));
NS_ENSURE_SUCCESS(rv,rv);
nsXPIDLString subject;
FetchSubject(msgHdr, m_flags[viewPosition], getter_Copies(subject));
mCommandUpdater->DisplayMessageChanged(m_folder, subject);
@ -615,18 +616,18 @@ NS_IMETHODIMP nsMsgDBView::GetCellProperties(PRInt32 aRow, const PRUnichar *colI
msgHdr = m_cachedHdr;
else
{
GetMsgHdrForViewIndex(aRow, getter_AddRefs(msgHdr));
rv = GetMsgHdrForViewIndex(aRow, getter_AddRefs(msgHdr));
if (NS_SUCCEEDED(rv))
{
m_cachedHdr = msgHdr;
m_cachedMsgKey = key;
}
else
return rv;
}
if (!msgHdr)
if (NS_FAILED(rv) || !msgHdr) {
ClearHdrCache();
return NS_MSG_INVALID_DBVIEW_INDEX;
}
char flags = m_flags.GetAt(aRow);
if (!(flags & MSG_FLAG_READ))
@ -787,17 +788,18 @@ NS_IMETHODIMP nsMsgDBView::GetCellText(PRInt32 aRow, const PRUnichar * aColID, P
msgHdr = m_cachedHdr;
else
{
GetMsgHdrForViewIndex(aRow, getter_AddRefs(msgHdr));
rv = GetMsgHdrForViewIndex(aRow, getter_AddRefs(msgHdr));
if (NS_SUCCEEDED(rv))
{
m_cachedHdr = msgHdr;
m_cachedMsgKey = key;
}
else
return rv;
}
if (!msgHdr)
if (NS_FAILED(rv) || !msgHdr) {
ClearHdrCache();
return NS_MSG_INVALID_DBVIEW_INDEX;
}
*aValue = 0;
// just a hack
@ -1015,6 +1017,9 @@ NS_IMETHODIMP nsMsgDBView::CycleHeader(const PRUnichar * aColID, nsIDOMElement *
NS_IMETHODIMP nsMsgDBView::CycleCell(PRInt32 row, const PRUnichar *colID)
{
if (!IsValidIndex(row))
return NS_MSG_INVALID_DBVIEW_INDEX;
switch (colID[0])
{
case 'u': // unreadButtonColHeader
@ -3211,12 +3216,31 @@ NS_IMETHODIMP nsMsgDBView::OnParentChanged (nsMsgKey aKeyChanged, nsMsgKey oldPa
NS_IMETHODIMP nsMsgDBView::OnAnnouncerGoingAway(nsIDBChangeAnnouncer *instigator)
{
ClearHdrCache();
if (m_db)
{
m_db->RemoveListener(this);
m_db = nsnull;
}
ClearHdrCache();
// this is important, because the outliner will ask us for our
// row count, which get determine from the number of keys.
m_keys.RemoveAll();
// be consistent
m_flags.RemoveAll();
m_levels.RemoveAll();
// clear the existing selection.
if (mOutlinerSelection) {
mOutlinerSelection->ClearSelection();
}
// this will force the outliner to ask for the cell values
// since we don't have a db and we don't have any keys,
// the thread pane goes blank
mOutliner->Invalidate();
return NS_OK;
}

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

@ -194,6 +194,8 @@ nsresult nsMsgThreadedDBView::ListThreadIds(nsMsgKey *startMsg, PRBool unreadOnl
}
else
{
NS_ASSERTION(m_db, "no db");
if (!m_db) return NS_ERROR_UNEXPECTED;
rv = m_db->EnumerateThreads(getter_AddRefs(m_threadEnumerator));
NS_ENSURE_SUCCESS(rv, rv);
}