From 140940d7ead52b6b9743db1e84a8f8892299eac5 Mon Sep 17 00:00:00 2001 From: "sspitzer%netscape.com" Date: Sat, 24 Mar 2001 01:12:33 +0000 Subject: [PATCH] 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 --- .../base/resources/content/commandglue.js | 90 +++++++------------ mailnews/base/resources/content/mailWindow.js | 2 +- .../resources/content/mailWindowOverlay.js | 1 + .../resources/content/mailWindowOverlay.xul | 5 +- .../base/resources/content/messengerdnd.js | 2 +- .../resources/content/msgMail3PaneWindow.js | 82 +++++++---------- .../resources/content/msgViewNavigation.js | 38 +------- mailnews/base/resources/content/shareglue.js | 5 +- mailnews/base/resources/content/threadPane.js | 15 +--- mailnews/base/resources/content/widgetglue.js | 2 +- .../base/resources/locale/en-US/messenger.dtd | 3 + mailnews/base/src/nsMsgDBView.cpp | 44 ++++++--- mailnews/base/src/nsMsgThreadedDBView.cpp | 2 + 13 files changed, 112 insertions(+), 179 deletions(-) diff --git a/mailnews/base/resources/content/commandglue.js b/mailnews/base/resources/content/commandglue.js index ba9513323f6..17f2ba76676 100644 --- a/mailnews/base/resources/content/commandglue.js +++ b/mailnews/base/resources/content/commandglue.js @@ -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) diff --git a/mailnews/base/resources/content/mailWindow.js b/mailnews/base/resources/content/mailWindow.js index 95b65649188..f46de5a6c0d 100644 --- a/mailnews/base/resources/content/mailWindow.js +++ b/mailnews/base/resources/content/mailWindow.js @@ -417,7 +417,7 @@ function loadStartPage() { if (startpage != "") { window.frames["messagepane"].location = startpage; //dump("start message pane with: " + startpage + "\n"); - ClearMessageSelection(); + ClearMessageSelection(); } } } diff --git a/mailnews/base/resources/content/mailWindowOverlay.js b/mailnews/base/resources/content/mailWindowOverlay.js index 42567860828..2be6555a97f 100644 --- a/mailnews/base/resources/content/mailWindowOverlay.js +++ b/mailnews/base/resources/content/mailWindowOverlay.js @@ -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; diff --git a/mailnews/base/resources/content/mailWindowOverlay.xul b/mailnews/base/resources/content/mailWindowOverlay.xul index 70532dd6b96..801c6b79cd1 100644 --- a/mailnews/base/resources/content/mailWindowOverlay.xul +++ b/mailnews/base/resources/content/mailWindowOverlay.xul @@ -211,6 +211,7 @@ Rights Reserved. + @@ -223,7 +224,7 @@ Rights Reserved. - + @@ -824,6 +825,7 @@ Rights Reserved. + diff --git a/mailnews/base/resources/content/messengerdnd.js b/mailnews/base/resources/content/messengerdnd.js index a8b302518ef..0eb4c022a24 100644 --- a/mailnews/base/resources/content/messengerdnd.js +++ b/mailnews/base/resources/content/messengerdnd.js @@ -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; } diff --git a/mailnews/base/resources/content/msgMail3PaneWindow.js b/mailnews/base/resources/content/msgMail3PaneWindow.js index 919df9cd9fa..676583b61dc 100644 --- a/mailnews/base/resources/content/msgMail3PaneWindow.js +++ b/mailnews/base/resources/content/msgMail3PaneWindow.js @@ -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() diff --git a/mailnews/base/resources/content/msgViewNavigation.js b/mailnews/base/resources/content/msgViewNavigation.js index 23362afb6eb..87f0a8690e9 100644 --- a/mailnews/base/resources/content/msgViewNavigation.js +++ b/mailnews/base/resources/content/msgViewNavigation.js @@ -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"); } } diff --git a/mailnews/base/resources/content/shareglue.js b/mailnews/base/resources/content/shareglue.js index edee7e9ed9c..a6b50a1052e 100644 --- a/mailnews/base/resources/content/shareglue.js +++ b/mailnews/base/resources/content/shareglue.js @@ -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... diff --git a/mailnews/base/resources/content/threadPane.js b/mailnews/base/resources/content/threadPane.js index febb9c8c463..c58c3e2dc0d 100644 --- a/mailnews/base/resources/content/threadPane.js +++ b/mailnews/base/resources/content/threadPane.js @@ -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"); -} - diff --git a/mailnews/base/resources/content/widgetglue.js b/mailnews/base/resources/content/widgetglue.js index d1aa5620acf..29f9cfde539 100644 --- a/mailnews/base/resources/content/widgetglue.js +++ b/mailnews/base/resources/content/widgetglue.js @@ -187,7 +187,7 @@ function MsgCompactFolder(isAll) } else { - ClearThreadTreeSelection(); + ClearThreadPaneSelection(); ClearMessagePane(); } } diff --git a/mailnews/base/resources/locale/en-US/messenger.dtd b/mailnews/base/resources/locale/en-US/messenger.dtd index 4558a5cc591..39d1ecf2c2f 100644 --- a/mailnews/base/resources/locale/en-US/messenger.dtd +++ b/mailnews/base/resources/locale/en-US/messenger.dtd @@ -90,6 +90,7 @@ Rights Reserved. + @@ -142,6 +143,8 @@ Rights Reserved. + + diff --git a/mailnews/base/src/nsMsgDBView.cpp b/mailnews/base/src/nsMsgDBView.cpp index 3e560e798e8..f097a3912b7 100644 --- a/mailnews/base/src/nsMsgDBView.cpp +++ b/mailnews/base/src/nsMsgDBView.cpp @@ -506,7 +506,8 @@ NS_IMETHODIMP nsMsgDBView::LoadMessageByMsgKey(nsMsgKey aMsgKey) if (viewPosition != nsMsgViewIndex_None) { nsCOMPtr 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; } diff --git a/mailnews/base/src/nsMsgThreadedDBView.cpp b/mailnews/base/src/nsMsgThreadedDBView.cpp index d1bb583f8b6..31f3f1990ec 100644 --- a/mailnews/base/src/nsMsgThreadedDBView.cpp +++ b/mailnews/base/src/nsMsgThreadedDBView.cpp @@ -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); }