landing mailnews folder pane outliner branch. (#73865)

huge thanks jan varga and hwaara for doing the lion's share of the work
to convert the folder pane to use the outliner.

reviewed by waterson, andreww, ben, hewitt, pinkerton, attinasi, hwaara, varga, sspitzer, bienvenu.
super reviewed by hyatt and sspitzer

for the end user:  unread and total columns are back in folder pane (like 4.x)

also includes fixes for #80844 #85376 #89072 #90075 #93011 #93963 #95298 #54171 #78768 #85088
This commit is contained in:
sspitzer%netscape.com 2001-08-15 05:07:48 +00:00
parent dd47fcc7b6
commit 1e0e99191d
48 changed files with 1756 additions and 1699 deletions

View File

@ -56,6 +56,23 @@ interface nsIXULTemplateBuilder : nsISupports
[scriptable, uuid(f6ed69be-1dd1-11b2-adfc-9db02ac57d88)]
interface nsIXULOutlinerBuilderObserver : nsISupports
{
/**
* Methods used by the drag feedback code to determine if a drag is allowable at
* the current location. To get the behavior where drops are only allowed on
* items, such as the mailNews folder pane, always return false from |canDropBeforeAfter()|.
*/
boolean canDropOn(in long index);
boolean canDropBeforeAfter(in long index, in boolean before);
/**
* Called when the user drops something on this view. The |orientation| param
* specifies before/on/after the given |row|.
*/
const long inDropBefore = 1;
const long inDropOn = 2;
const long inDropAfter = 3;
void onDrop(in long row, in long orientation);
/**
* Called when an item is opened or closed.
*/

View File

@ -960,7 +960,7 @@ nsXULOutlinerBuilder::ReplaceMatch(nsIRDFResource* aMember,
// itself out.
// Notify the box object
mBoxObject->RowCountChanged(row, -delta);
mBoxObject->RowCountChanged(row, -delta - 1);
}
}
else if (aNewMatch) {
@ -1718,26 +1718,71 @@ nsXULOutlinerBuilder::SortSubtree(nsOutlinerRows::Subtree* aSubtree)
NS_IMETHODIMP
nsXULOutlinerBuilder::CanDropOn(PRInt32 index, PRBool *_retval)
{
return NS_ERROR_NOT_IMPLEMENTED;
*_retval = PR_FALSE;
if (mObservers) {
PRUint32 count;
mObservers->Count(&count);
for (PRUint32 i = 0; i < count; ++i) {
nsCOMPtr<nsIXULOutlinerBuilderObserver> observer;
mObservers->QueryElementAt(i, NS_GET_IID(nsIXULOutlinerBuilderObserver), getter_AddRefs(observer));
if (observer) {
observer->CanDropOn(index, _retval);
if (*_retval)
break;
}
}
}
return NS_OK;
}
/* boolean canDropBeforeAfter (in long index, in boolean before); */
NS_IMETHODIMP
nsXULOutlinerBuilder::CanDropBeforeAfter(PRInt32 index, PRBool before, PRBool *_retval)
{
return NS_ERROR_NOT_IMPLEMENTED;
*_retval = PR_FALSE;
if (mObservers) {
PRUint32 count;
mObservers->Count(&count);
for (PRUint32 i = 0; i < count; ++i) {
nsCOMPtr<nsIXULOutlinerBuilderObserver> observer;
mObservers->QueryElementAt(i, NS_GET_IID(nsIXULOutlinerBuilderObserver), getter_AddRefs(observer));
if (observer) {
observer->CanDropBeforeAfter(index, before, _retval);
if (*_retval)
break;
}
}
}
return NS_OK;
}
NS_IMETHODIMP
nsXULOutlinerBuilder::Drop(PRInt32 row, PRInt32 orient)
{
return NS_ERROR_NOT_IMPLEMENTED;
if (mObservers) {
PRUint32 count;
mObservers->Count(&count);
for (PRUint32 i = 0; i < count; ++i) {
nsCOMPtr<nsIXULOutlinerBuilderObserver> observer;
mObservers->QueryElementAt(i, NS_GET_IID(nsIXULOutlinerBuilderObserver), getter_AddRefs(observer));
if (observer) {
PRBool canDropOn = PR_FALSE;
observer->CanDropOn(row, &canDropOn);
if (canDropOn)
observer->OnDrop(row, orient);
}
}
}
return NS_OK;
}
NS_IMETHODIMP
nsXULOutlinerBuilder::IsSorted(PRBool *_retval)
{
*_retval = PR_FALSE;
*_retval = mSortVariable;
return NS_OK;
}

View File

@ -960,7 +960,7 @@ nsXULOutlinerBuilder::ReplaceMatch(nsIRDFResource* aMember,
// itself out.
// Notify the box object
mBoxObject->RowCountChanged(row, -delta);
mBoxObject->RowCountChanged(row, -delta - 1);
}
}
else if (aNewMatch) {
@ -1718,26 +1718,71 @@ nsXULOutlinerBuilder::SortSubtree(nsOutlinerRows::Subtree* aSubtree)
NS_IMETHODIMP
nsXULOutlinerBuilder::CanDropOn(PRInt32 index, PRBool *_retval)
{
return NS_ERROR_NOT_IMPLEMENTED;
*_retval = PR_FALSE;
if (mObservers) {
PRUint32 count;
mObservers->Count(&count);
for (PRUint32 i = 0; i < count; ++i) {
nsCOMPtr<nsIXULOutlinerBuilderObserver> observer;
mObservers->QueryElementAt(i, NS_GET_IID(nsIXULOutlinerBuilderObserver), getter_AddRefs(observer));
if (observer) {
observer->CanDropOn(index, _retval);
if (*_retval)
break;
}
}
}
return NS_OK;
}
/* boolean canDropBeforeAfter (in long index, in boolean before); */
NS_IMETHODIMP
nsXULOutlinerBuilder::CanDropBeforeAfter(PRInt32 index, PRBool before, PRBool *_retval)
{
return NS_ERROR_NOT_IMPLEMENTED;
*_retval = PR_FALSE;
if (mObservers) {
PRUint32 count;
mObservers->Count(&count);
for (PRUint32 i = 0; i < count; ++i) {
nsCOMPtr<nsIXULOutlinerBuilderObserver> observer;
mObservers->QueryElementAt(i, NS_GET_IID(nsIXULOutlinerBuilderObserver), getter_AddRefs(observer));
if (observer) {
observer->CanDropBeforeAfter(index, before, _retval);
if (*_retval)
break;
}
}
}
return NS_OK;
}
NS_IMETHODIMP
nsXULOutlinerBuilder::Drop(PRInt32 row, PRInt32 orient)
{
return NS_ERROR_NOT_IMPLEMENTED;
if (mObservers) {
PRUint32 count;
mObservers->Count(&count);
for (PRUint32 i = 0; i < count; ++i) {
nsCOMPtr<nsIXULOutlinerBuilderObserver> observer;
mObservers->QueryElementAt(i, NS_GET_IID(nsIXULOutlinerBuilderObserver), getter_AddRefs(observer));
if (observer) {
PRBool canDropOn = PR_FALSE;
observer->CanDropOn(row, &canDropOn);
if (canDropOn)
observer->OnDrop(row, orient);
}
}
}
return NS_OK;
}
NS_IMETHODIMP
nsXULOutlinerBuilder::IsSorted(PRBool *_retval)
{
*_retval = PR_FALSE;
*_retval = mSortVariable;
return NS_OK;
}

View File

@ -1329,7 +1329,9 @@ nsXULTreeOuterGroupFrame::ReflowFinished(nsIPresShell* aPresShell, PRBool* aFlus
// then mark everything as a style change. That
// will dirty the tree all the way to its leaves.
if (mRowHeightWasSet) {
treeBox->MarkStyleChange(state);
if (!treeBox)
return NS_ERROR_NULL_POINTER;
treeBox->MarkStyleChange(state);
PRInt32 pos = mCurrentIndex*mRowHeight;
if (mYPosition != pos)
mAdjustScroll = PR_TRUE;

View File

@ -171,6 +171,8 @@ nsOutlinerColumn::nsOutlinerColumn(nsIContent* aColElement, nsIFrame* aFrame)
// Cache our text alignment policy.
nsCOMPtr<nsIStyleContext> styleContext;
if (!aFrame)
return;
aFrame->GetStyleContext(getter_AddRefs(styleContext));
const nsStyleText* textStyle =
@ -1678,10 +1680,14 @@ NS_IMETHODIMP nsOutlinerBodyFrame::PaintCell(int aRowIndex,
// If we're the primary column, we need to indent and paint the twisty and any connecting lines
// between siblings.
PRInt32 level;
mView->GetLevel(aRowIndex, &level);
currX += mIndentation * level;
remainingWidth -= mIndentation * level;
// Always leave space for the twisty.
nsRect twistyRect(currX, cellRect.y, remainingWidth, cellRect.height);
nsRect dirtyRect;
if (dirtyRect.IntersectRect(aDirtyRect, twistyRect))
PaintTwisty(aRowIndex, aColumn, twistyRect, aPresContext, aRenderingContext, aDirtyRect, aWhichLayer,
remainingWidth, currX);
@ -1691,8 +1697,6 @@ NS_IMETHODIMP nsOutlinerBodyFrame::PaintCell(int aRowIndex,
const nsStyleVisibility* vis =
(const nsStyleVisibility*)lineContext->GetStyleData(eStyleStruct_Visibility);
PRInt32 level;
mView->GetLevel(aRowIndex, &level);
if (vis->IsVisibleOrCollapsed() && level && NS_FRAME_PAINT_LAYER_FOREGROUND == aWhichLayer) {
// Paint the connecting lines.
aRenderingContext.PushState();
@ -1744,9 +1748,9 @@ NS_IMETHODIMP nsOutlinerBodyFrame::PaintCell(int aRowIndex,
PRBool hasNextSibling;
mView->HasNextSibling(currentParent, aRowIndex, &hasNextSibling);
if (hasNextSibling)
aRenderingContext.DrawLine(x + (i - 1) * mIndentation, y, x + (i - 1) * mIndentation, y + mRowHeight);
aRenderingContext.DrawLine(x - (level - i + 1) * mIndentation, y, x - (level - i + 1) * mIndentation, y + mRowHeight);
else if (i == level)
aRenderingContext.DrawLine(x + (i - 1) * mIndentation, y, x + (i - 1) * mIndentation, y + mRowHeight / 2);
aRenderingContext.DrawLine(x - (level - i + 1) * mIndentation, y, x - (level - i + 1) * mIndentation, y + mRowHeight / 2);
}
PRInt32 parent;
@ -1758,7 +1762,7 @@ NS_IMETHODIMP nsOutlinerBodyFrame::PaintCell(int aRowIndex,
// Don't paint off our cell.
if (level == maxLevel)
aRenderingContext.DrawLine(x + (level - 1) * mIndentation, y + mRowHeight / 2, x + level * mIndentation, y + mRowHeight /2);
aRenderingContext.DrawLine(x - mIndentation + 16, y + mRowHeight / 2, x, y + mRowHeight /2);
PRBool clipState;
aRenderingContext.PopState(clipState);
@ -1766,9 +1770,6 @@ NS_IMETHODIMP nsOutlinerBodyFrame::PaintCell(int aRowIndex,
PrefillPropertyArray(aRowIndex, aColumn);
mView->GetCellProperties(aRowIndex, aColumn->GetID(), mScratchArray);
}
currX += mIndentation*level;
remainingWidth -= mIndentation*level;
}
// Now paint the icon for our cell.

View File

@ -139,6 +139,8 @@ nsOutlinerBoxObject::GetOutlinerBody()
FindBodyElement(startContent, getter_AddRefs(content));
mPresShell->GetPrimaryFrameFor(content, &frame);
if (!frame)
return nsnull;
// It's a frame. Refcounts are irrelevant.
nsCOMPtr<nsIOutlinerBoxObject> body;

View File

@ -171,6 +171,8 @@ nsOutlinerColumn::nsOutlinerColumn(nsIContent* aColElement, nsIFrame* aFrame)
// Cache our text alignment policy.
nsCOMPtr<nsIStyleContext> styleContext;
if (!aFrame)
return;
aFrame->GetStyleContext(getter_AddRefs(styleContext));
const nsStyleText* textStyle =
@ -1678,10 +1680,14 @@ NS_IMETHODIMP nsOutlinerBodyFrame::PaintCell(int aRowIndex,
// If we're the primary column, we need to indent and paint the twisty and any connecting lines
// between siblings.
PRInt32 level;
mView->GetLevel(aRowIndex, &level);
currX += mIndentation * level;
remainingWidth -= mIndentation * level;
// Always leave space for the twisty.
nsRect twistyRect(currX, cellRect.y, remainingWidth, cellRect.height);
nsRect dirtyRect;
if (dirtyRect.IntersectRect(aDirtyRect, twistyRect))
PaintTwisty(aRowIndex, aColumn, twistyRect, aPresContext, aRenderingContext, aDirtyRect, aWhichLayer,
remainingWidth, currX);
@ -1691,8 +1697,6 @@ NS_IMETHODIMP nsOutlinerBodyFrame::PaintCell(int aRowIndex,
const nsStyleVisibility* vis =
(const nsStyleVisibility*)lineContext->GetStyleData(eStyleStruct_Visibility);
PRInt32 level;
mView->GetLevel(aRowIndex, &level);
if (vis->IsVisibleOrCollapsed() && level && NS_FRAME_PAINT_LAYER_FOREGROUND == aWhichLayer) {
// Paint the connecting lines.
aRenderingContext.PushState();
@ -1744,9 +1748,9 @@ NS_IMETHODIMP nsOutlinerBodyFrame::PaintCell(int aRowIndex,
PRBool hasNextSibling;
mView->HasNextSibling(currentParent, aRowIndex, &hasNextSibling);
if (hasNextSibling)
aRenderingContext.DrawLine(x + (i - 1) * mIndentation, y, x + (i - 1) * mIndentation, y + mRowHeight);
aRenderingContext.DrawLine(x - (level - i + 1) * mIndentation, y, x - (level - i + 1) * mIndentation, y + mRowHeight);
else if (i == level)
aRenderingContext.DrawLine(x + (i - 1) * mIndentation, y, x + (i - 1) * mIndentation, y + mRowHeight / 2);
aRenderingContext.DrawLine(x - (level - i + 1) * mIndentation, y, x - (level - i + 1) * mIndentation, y + mRowHeight / 2);
}
PRInt32 parent;
@ -1758,7 +1762,7 @@ NS_IMETHODIMP nsOutlinerBodyFrame::PaintCell(int aRowIndex,
// Don't paint off our cell.
if (level == maxLevel)
aRenderingContext.DrawLine(x + (level - 1) * mIndentation, y + mRowHeight / 2, x + level * mIndentation, y + mRowHeight /2);
aRenderingContext.DrawLine(x - mIndentation + 16, y + mRowHeight / 2, x, y + mRowHeight /2);
PRBool clipState;
aRenderingContext.PopState(clipState);
@ -1766,9 +1770,6 @@ NS_IMETHODIMP nsOutlinerBodyFrame::PaintCell(int aRowIndex,
PrefillPropertyArray(aRowIndex, aColumn);
mView->GetCellProperties(aRowIndex, aColumn->GetID(), mScratchArray);
}
currX += mIndentation*level;
remainingWidth -= mIndentation*level;
}
// Now paint the icon for our cell.

View File

@ -139,6 +139,8 @@ nsOutlinerBoxObject::GetOutlinerBody()
FindBodyElement(startContent, getter_AddRefs(content));
mPresShell->GetPrimaryFrameFor(content, &frame);
if (!frame)
return nsnull;
// It's a frame. Refcounts are irrelevant.
nsCOMPtr<nsIOutlinerBoxObject> body;

View File

@ -50,7 +50,8 @@ function validate(data)
// - if the user ALSO entered an @domain, then we just chop it off
// - at some point it would be useful to keep the @domain, in case they
// wish to override the domain.
function validateEmail() {
function validateEmail()
{
var emailElement = document.getElementById("email");
var email = emailElement.value;
var emailArray = email.split('@');

View File

@ -16,6 +16,10 @@
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998-1999 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributors(s):
* Jan Varga <varga@utcru.sk>
* Håkan Waara (hwaara@chello.se)
*/
@ -45,22 +49,19 @@ function OpenURL(url)
messenger.OpenURL(url);
}
function GetMsgFolderFromNode(folderNode)
function GetMsgFolderFromResource(folderResource)
{
var folderURI = folderNode.getAttribute("id");
return GetMsgFolderFromURI(folderURI);
if (!folderResource)
return null;
var msgFolder = folderResource.QueryInterface(Components.interfaces.nsIMsgFolder);
return msgFolder;
}
function GetMsgFolderFromURI(folderURI)
{
var folderResource = RDF.GetResource(folderURI);
if(folderResource)
{
var msgFolder = folderResource.QueryInterface(Components.interfaces.nsIMsgFolder);
return msgFolder;
}
return null;
return GetMsgFolderFromResource(folderResource);
}
function GetServer(uri)
@ -100,35 +101,6 @@ function LoadMessageByUri(uri)
}
function ChangeFolderByDOMNode(folderNode)
{
var uri = folderNode.getAttribute('id');
dump(uri + "\n");
if (!uri) return;
var sortType = 0;
var sortOrder = 0;
var viewFlags = 0;
var viewType = 0;
var resource = RDF.GetResource(uri);
var msgfolder = resource.QueryInterface(Components.interfaces.nsIMsgFolder);
// don't get the db if this folder is a server
// we're going to be display account central
if (msgfolder && !msgfolder.isServer)
{
var msgdb = msgfolder.getMsgDatabase(msgWindow);
if (msgdb)
{
var dbFolderInfo = msgdb.dBFolderInfo;
sortType = dbFolderInfo.sortType;
sortOrder = dbFolderInfo.sortOrder;
viewFlags = dbFolderInfo.viewFlags;
viewType = dbFolderInfo.viewType;
}
}
ChangeFolderByURI(uri, viewType, viewFlags, sortType, sortOrder);
}
function setTitleFromFolder(msgfolder, subject)
{
if (!msgfolder) return;
@ -192,11 +164,14 @@ function ChangeFolderByURI(uri, viewType, viewFlags, sortType, sortOrder)
//if it's a server, clear the threadpane and don't bother trying to load.
if(msgfolder.isServer) {
msgWindow.openFolder = null;
ClearThreadPane();
// Load AccountCentral page here.
ShowAccountCentral();
return;
return;
}
else
{
@ -615,7 +590,7 @@ function UpdateSortIndicator(column,sortDirection)
// this is obsolete
}
function SortFolderPane(column, sortKey)
function SortFolderPane(column)
{
var node = FindInSidebar(window, column);
if(!node)
@ -623,60 +598,25 @@ function SortFolderPane(column, sortKey)
dump('Couldnt find sort column\n');
return false;
}
SortColumn(node, sortKey, null, null);
//Remove the sortActive attribute because we don't want this pane to have any
//sort styles.
node.setAttribute("sortActive", "false");
return true;
}
function SortColumn(node, sortKey, secondarySortKey, direction)
{
var xulSortService = Components.classes["@mozilla.org/xul/xul-sort-service;1"].getService();
if (xulSortService)
try
{
xulSortService = xulSortService.QueryInterface(Components.interfaces.nsIXULSortService);
if (xulSortService)
{
// sort!!!
var sortDirection;
if(direction)
sortDirection = direction;
else
{
var currentDirection = node.getAttribute('sortDirection');
if (currentDirection == "ascending")
sortDirection = "descending";
else if (currentDirection == "descending")
sortDirection = "ascending";
else sortDirection = "ascending";
}
try
{
if(secondarySortKey)
node.setAttribute('resource2', secondarySortKey);
xulSortService.Sort(node, sortKey, sortDirection);
}
catch(e)
{
//dump("Sort failed: " + e + "\n");
}
}
var folderOutliner = GetFolderOutliner();
folderOutliner.outlinerBoxObject.view.cycleHeader(column, node);
}
catch (ex)
{
dump("failed to cycle header: " + ex + "\n");
}
}
function GetSelectedFolderResource()
{
var folderTree = GetFolderTree();
var selectedFolderList = folderTree.selectedItems;
var selectedFolder = selectedFolderList[0];
var uri = selectedFolder.getAttribute('id');
var folderResource = RDF.GetResource(uri);
return folderResource;
var folderOutliner = GetFolderOutliner();
var startIndex = {};
var endIndex = {};
folderOutliner.outlinerBoxObject.selection.getRangeAt(0, startIndex, endIndex);
return GetFolderResource(folderOutliner, startIndex.value);
}
function OnMouseUpThreadAndMessagePaneSplitter()
@ -699,27 +639,61 @@ function OnClickThreadAndMessagePaneSplitterGrippy()
function FolderPaneSelectionChange()
{
var tree = GetFolderTree();
if(tree)
{
var selArray = tree.selectedItems;
if ( selArray && (selArray.length == 1) )
var folderOutliner = GetFolderOutliner();
if (folderOutliner.outlinerBoxObject.selection.count == 1)
{
ChangeFolderByDOMNode(selArray[0]);
var startIndex = {};
var endIndex = {};
folderOutliner.outlinerBoxObject.selection.getRangeAt(0, startIndex, endIndex);
var folderResource = GetFolderResource(folderOutliner, startIndex.value);
var msgFolder = folderResource.QueryInterface(Components.interfaces.nsIMsgFolder);
if (msgFolder == msgWindow.openFolder)
return;
else
{
var sortType = 0;
var sortOrder = 0;
var viewFlags = 0;
var viewType = 0;
// don't get the db if this folder is a server
// we're going to be display account central
if (!(msgFolder.isServer))
{
try
{
var msgDatabase = msgFolder.getMsgDatabase(msgWindow);
if (msgDatabase)
{
var dbFolderInfo = msgDatabase.dBFolderInfo;
sortType = dbFolderInfo.sortType;
sortOrder = dbFolderInfo.sortOrder;
viewFlags = dbFolderInfo.viewFlags;
viewType = dbFolderInfo.viewType;
}
}
catch (ex)
{
dump("failed to get view & sort values. ex = " + ex +"\n");
}
}
ChangeFolderByURI(folderResource.Value, viewType, viewFlags, sortType, sortOrder);
}
}
else
{
ClearThreadPane();
msgWindow.openFolder = null;
ClearThreadPane();
}
}
if (!gAccountCentralLoaded)
ClearMessagePane();
if (gDisplayStartupPage)
{
loadStartPage();
gDisplayStartupPage = false;
}
if (! gAccountCentralLoaded)
ClearMessagePane();
if (gDisplayStartupPage)
{
loadStartPage();
gDisplayStartupPage = false;
}
}
function ClearThreadPane()
@ -730,46 +704,6 @@ function ClearThreadPane()
}
}
function OpenFolderTreeToFolder(folderURI)
{
var tree = GetFolderTree();
return OpenToFolder(tree, folderURI);
}
function OpenToFolder(item, folderURI)
{
if(item.nodeType != Node.ELEMENT_NODE)
return null;
var uri = item.getAttribute('id');
dump(uri);
dump('\n');
if(uri == folderURI)
{
dump('found folder: ' + uri);
dump('\n');
return item;
}
var children = item.childNodes;
var length = children.length;
var i;
dump('folder ' + uri);
dump('has ' + length);
dump('children\n');
for(i = 0; i < length; i++)
{
var child = children[i];
var folder = OpenToFolder(child, folderURI);
if(folder)
{
child.setAttribute('open', 'true');
return folder;
}
}
return null;
}
function IsSpecialFolder(msgFolder, flags)
{
if (!msgFolder) {

View File

@ -20,6 +20,10 @@
Communications Corporation. Portions created by Netscape are
Copyright (C) 1998-1999 Netscape Communications Corporation. All
Rights Reserved.
Contributor(s):
Jan Varga <varga@utcru.sk>
Håkan Waara <hwaara@chello.se>
-->
<!DOCTYPE window SYSTEM "chrome://messenger/locale/folderpane.dtd">
@ -28,73 +32,107 @@
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<popup id="folderTooltip" class="tooltip" onpopupshowing="return FillInFolderTooltip(document.tooltipNode);" >
<text id="foldertooltipText"/>
</popup>
<outliner id="folderOutliner"
flex="1">
<outlinerbody flex="1"
datasources="rdf:null"
ondraggesture="return BeginDragFolderOutliner(event);"
onselect="FolderPaneSelectionChange();">
<template>
<rule>
<conditions>
<outlinerrow uri="?container"/>
<member container="?container" child="?member" />
</conditions>
<tree datasources="rdf:null"
id="folderTree" class="mail-folders"
onselect="top.FolderPaneSelectionChange();"
onblur="goOnEvent(this,'blur')" dd-nodropbetweenrows="true"
ondragover="return DragOverTree(event);"
ondraggesture="return BeginDragFolderTree(event);"
ondragdrop="return DropOnFolderTree(event);"
onclick="FolderPaneOnClick(event);">
<template>
<rule>
<treechildren flex="1">
<treeitem class="folderTreeItem" uri="..."
SpecialFolder="rdf:http://home.netscape.com/NC-rdf#SpecialFolder"
BiffState="rdf:http://home.netscape.com/NC-rdf#BiffState"
IsServer="rdf:http://home.netscape.com/NC-rdf#IsServer"
IsSecure="rdf:http://home.netscape.com/NC-rdf#IsSecure"
ServerType="rdf:http://home.netscape.com/NC-rdf#ServerType"
HasUnreadMessages="rdf:http://home.netscape.com/NC-rdf#HasUnreadMessages"
NewMessages="rdf:http://home.netscape.com/NC-rdf#NewMessages"
SubfoldersHaveUnreadMessages="rdf:http://home.netscape.com/NC-rdf#SubfoldersHaveUnreadMessages"
CanRename="rdf:http://home.netscape.com/NC-rdf#CanRename"
CanCompact="rdf:http://home.netscape.com/NC-rdf#CanCompact"
CanCreateSubfolders="rdf:http://home.netscape.com/NC-rdf#CanCreateSubfolders"
CanSubscribe="rdf:http://home.netscape.com/NC-rdf#CanSubscribe"
CanFileMessages="rdf:http://home.netscape.com/NC-rdf#CanFileMessages"
NoSelect="rdf:http://home.netscape.com/NC-rdf#NoSelect"
persist="open">
<treerow class="tree-folder-row"
IsServer="rdf:http://home.netscape.com/NC-rdf#IsServer"
HasUnreadMessages="rdf:http://home.netscape.com/NC-rdf#HasUnreadMessages"
NoSelect="rdf:http://home.netscape.com/NC-rdf#NoSelect">
<treecell tooltip="folderTooltip" indent="true" class="treecell-indent tree-cell-folderpane-icon"
label="rdf:http://home.netscape.com/NC-rdf#FolderTreeName"
SpecialFolder="rdf:http://home.netscape.com/NC-rdf#SpecialFolder"
BiffState="rdf:http://home.netscape.com/NC-rdf#BiffState"
IsServer="rdf:http://home.netscape.com/NC-rdf#IsServer"
IsSecure="rdf:http://home.netscape.com/NC-rdf#IsSecure"
NewMessages="rdf:http://home.netscape.com/NC-rdf#NewMessages"
ServerType="rdf:http://home.netscape.com/NC-rdf#ServerType"
HasUnreadMessages="rdf:http://home.netscape.com/NC-rdf#HasUnreadMessages"
SubfoldersHaveUnreadMessages="rdf:http://home.netscape.com/NC-rdf#SubfoldersHaveUnreadMessages"
CanRename="rdf:http://home.netscape.com/NC-rdf#CanRename"
CanCompact="rdf:http://home.netscape.com/NC-rdf#CanCompact"
CanCreateSubfolders="rdf:http://home.netscape.com/NC-rdf#CanCreateSubfolders"
CanSubscribe="rdf:http://home.netscape.com/NC-rdf#CanSubscribe"
CanFileMessages="rdf:http://home.netscape.com/NC-rdf#CanFileMessages"
NoSelect="rdf:http://home.netscape.com/NC-rdf#NoSelect"/>
</treerow>
</treeitem>
</treechildren>
</rule>
</template>
<treecolgroup>
<treecol persist="width" width="3*" flex="1" id="FolderColumn" resource="http://home.netscape.com/NC-rdf#FolderTreeName"/>
</treecolgroup>
<treehead>
<treerow>
</treerow>
</treehead>
</tree>
<bindings>
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#FolderTreeName"
object="?folderTreeName" />
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#FolderTreeName?sort=true"
object="?folderTreeNameSort" />
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#FolderTreeSimpleName"
object="?folderTreeSimpleName" />
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#FolderTreeSimpleName?sort=true"
object="?folderTreeSimpleNameSort" />
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#SpecialFolder"
object="?specialFolder" />
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#BiffState"
object="?biffState" />
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#IsServer"
object="?isServer" />
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#NewMessages"
object="?newMessages" />
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#HasUnreadMessages"
object="?hasUnreadMessages" />
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#IsSecure"
object="?isSecure" />
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#ServerType"
object="?serverType" />
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#NoSelect"
object="?noSelect" />
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#TotalUnreadMessages"
object="?unreadCount" />
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#TotalMessages"
object="?totalCount" />
</bindings>
<action>
<outlinerrow uri="?member">
<outlinercell id="folderNameCell"
ref="folderNameCol"
label="?folderTreeName"
properties="specialFolder-?specialFolder
biffState-?biffState
isServer-?isServer
newMessages-?newMessages
hasUnreadMessages-?hasUnreadMessages
isSecure-?isSecure
serverType-?serverType
noSelect-?noSelect"/>
<outlinercell ref="folderUnreadCol"
label="?unreadCount"
properties="hasUnreadMessages-?hasUnreadMessages"/>
<outlinercell ref="folderTotalCol"
label="?totalCount"
properties="hasUnreadMessages-?hasUnreadMessages"/>
</outlinerrow>
</action>
</rule>
</template>
</outlinerbody>
<outlinercol id="folderNameCol"
flex="5"
label="&nameColumn.label;"
class="outlinercol-header outlinercol-inset-header"
persist="width"
ignoreincolumnpicker="true"
primary="true"
sort="?folderTreeNameSort"/>
<splitter class="tree-splitter"/>
<outlinercol id="folderUnreadCol"
class="outlinercol-header outlinercol-inset-header"
persist="hidden width"
flex="1"
label="&unreadColumn.label;"/>
<splitter class="tree-splitter"/>
<outlinercol id="folderTotalCol"
class="outlinercol-header outlinercol-inset-header"
persist="hidden width"
flex="1"
label="&totalColumn.label;"/>
</outliner>
</overlay>

View File

@ -16,6 +16,10 @@
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998-2000 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributors(s):
* Jan Varga <varga@utcru.sk>
* Håkan Waara (hwaara@chello.se)
*/
var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
@ -43,55 +47,54 @@ var FolderPaneController =
isCommandEnabled: function(command)
{
// dump("FolderPaneController.IsCommandEnabled(" + command + ")\n");
switch ( command )
{
case "cmd_selectAll":
case "cmd_cut":
case "cmd_copy":
case "cmd_paste":
return false;
case "cmd_delete":
case "button_delete":
if ( command == "cmd_delete" )
goSetMenuValue(command, 'valueFolder');
var folderTree = GetFolderTree();
if ( folderTree && folderTree.selectedItems &&
folderTree.selectedItems.length > 0)
{
var canDeleteThisFolder;
var specialFolder = null;
var isServer = null;
var serverType = null;
try {
var selectedFolder = folderTree.selectedItems[0];
specialFolder = selectedFolder.getAttribute('SpecialFolder');
isServer = selectedFolder.getAttribute('IsServer');
serverType = selectedFolder.getAttribute('ServerType');
if (serverType == "nntp") {
if ( command == "cmd_delete" )
{
goSetMenuValue(command, 'valueNewsgroup');
goSetAccessKey(command, 'valueNewsgroupAccessKey');
// dump("FolderPaneController.IsCommandEnabled(" + command + ")\n");
switch ( command )
{
case "cmd_selectAll":
case "cmd_cut":
case "cmd_copy":
case "cmd_paste":
return false;
case "cmd_delete":
case "button_delete":
if ( command == "cmd_delete" )
goSetMenuValue(command, 'valueFolder');
var folderOutliner = GetFolderOutliner();
var startIndex = {};
var endIndex = {};
folderOutliner.outlinerBoxObject.selection.getRangeAt(0, startIndex, endIndex);
if (startIndex.value >= 0) {
var canDeleteThisFolder;
var specialFolder = null;
var isServer = null;
var serverType = null;
try {
var folderResource = GetFolderResource(folderOutliner, startIndex.value);
specialFolder = GetFolderAttribute(folderOutliner, folderResource, "SpecialFolder");
isServer = GetFolderAttribute(folderOutliner, folderResource, "IsServer");
serverType = GetFolderAttribute(folderOutliner, folderResource, "ServerType");
if (serverType == "nntp") {
if ( command == "cmd_delete" ) {
goSetMenuValue(command, 'valueNewsgroup');
goSetAccessKey(command, 'valueNewsgroupAccessKey');
}
}
}
catch (ex) {
//dump("specialFolder failure: " + ex + "\n");
}
if (specialFolder == "Inbox" || specialFolder == "Trash" || isServer == "true")
canDeleteThisFolder = false;
else
canDeleteThisFolder = true;
return canDeleteThisFolder && isCommandEnabled(command);
}
}
}
catch (ex) {
//dump("specialFolder failure: " + ex + "\n");
}
if (specialFolder == "Inbox" || specialFolder == "Trash" || isServer == "true")
canDeleteThisFolder = false;
else
canDeleteThisFolder = true;
return canDeleteThisFolder && isCommandEnabled(command);
}
else
return false;
else
return false;
default:
return false;
}
default:
return false;
}
},
doCommand: function(command)
@ -395,7 +398,7 @@ var DefaultController =
case "cmd_emptyTrash":
return IsEmptyTrashEnabled();
case "cmd_compactFolder":
return IsCompactFolderEnabled();
return IsCompactFolderEnabled();
case "cmd_setFolderCharset":
return IsFolderCharsetEnabled();
case "cmd_close":
@ -531,7 +534,7 @@ var DefaultController =
return;
case "cmd_sendUnsentMsgs":
MsgSendUnsentMsgs();
return
return;
case "cmd_openMessage":
MsgOpenSelectedMessages();
return;
@ -658,7 +661,7 @@ function FocusRingUpdate_Mail()
GetMessagePane().setAttribute("focusring","false");
}
else if(currentFocusedElement==GetFolderTree()) {
else if(currentFocusedElement==GetFolderOutliner()) {
// XXX fix me
GetThreadOutliner().setAttribute("focusring","false");
GetMessagePane().setAttribute("focusring","false");
@ -726,13 +729,13 @@ function WhichPaneHasFocus(){
var whichPane= null;
var currentNode = top.document.commandDispatcher.focusedElement;
var threadTree = GetThreadOutliner();
var folderTree = GetFolderTree();
var threadOutliner = GetThreadOutliner();
var folderOutliner = GetFolderOutliner();
var messagePane = GetMessagePane();
while (currentNode) {
if (currentNode === threadTree ||
currentNode === folderTree ||
if (currentNode === threadOutliner ||
currentNode === folderOutliner ||
currentNode === messagePane)
return currentNode;
@ -749,7 +752,7 @@ function SetupCommandUpdateHandlers()
var widget;
// folder pane
widget = GetFolderTree();
widget = GetFolderOutliner();
if ( widget )
widget.controllers.appendController(FolderPaneController);
@ -761,17 +764,17 @@ function SetupCommandUpdateHandlers()
top.controllers.insertControllerAt(0, DefaultController);
}
function IsSendUnsentMsgsEnabled(folderNode)
function IsSendUnsentMsgsEnabled(folderResource)
{
var identity;
try {
if (folderNode) {
// if folderNode is non-null, it is
// is the XULElement for the "Unsent Messages" folder
if (folderResource) {
// if folderResource is non-null, it is
// resource for the "Unsent Messages" folder
// we're here because we've done a right click on the "Unsent Messages"
// folder (context menu)
var folder = GetMsgFolderFromNode(folderNode);
return (folder.getTotalMessages(false) > 0);
var msgFolder = folderResource.QueryInterface(Components.interfaces.nsIMsgFolder);
return (msgFolder.getTotalMessages(false) > 0);
}
else {
var folders = GetSelectedMsgFolders();
@ -802,15 +805,16 @@ function IsSendUnsentMsgsEnabled(folderNode)
}
function IsRenameFolderEnabled()
{
var tree = GetFolderTree();
var folderList = tree.selectedItems;
if(folderList.length == 1)
{
var folderOutliner = GetFolderOutliner();
var selection = folderOutliner.outlinerBoxObject.selection;
if (selection.count == 1)
{
var canRename;
var folderNode = folderList[0];
canRename = (folderNode.getAttribute("CanRename") == "true");
var startIndex = {};
var endIndex = {};
selection.getRangeAt(0, startIndex, endIndex);
var folderResource = GetFolderResource(folderOutliner, startIndex.value);
var canRename = GetFolderAttribute(folderOutliner, folderResource, "CanRename") == "true";
return canRename && isCommandEnabled("cmd_renameFolder");
}
else
@ -834,16 +838,18 @@ function IsViewNavigationItemEnabled()
function IsFolderSelected()
{
var tree = GetFolderTree();
var folderList = tree.selectedItems;
if(folderList.length == 1)
{
var folderNode = folderList[0];
return(folderNode.getAttribute("IsServer") != "true");
}
else
return false;
var folderOutliner = GetFolderOutliner();
var selection = folderOutliner.outlinerBoxObject.selection;
if (selection.count == 1)
{
var startIndex = {};
var endIndex = {};
selection.getRangeAt(0, startIndex, endIndex);
var folderResource = GetFolderResource(folderOutliner, startIndex.value);
return GetFolderAttribute(folderOutliner, folderResource, "IsServer") != "true";
}
else
return false;
}
function IsFindEnabled()
@ -853,49 +859,42 @@ function IsFindEnabled()
function MsgDeleteFolder()
{
//get the selected elements
var tree = GetFolderTree();
var folderList = tree.selectedItems;
var i;
var folder, parent;
var specialFolder;
for(i = 0; i < folderList.length; i++)
{
folder = folderList[i];
folderuri = folder.getAttribute('id');
specialFolder = folder.getAttribute('SpecialFolder');
var folderOutliner = GetFolderOutliner();
var selectedFolders = GetSelectedMsgFolders();
for (var i = 0; i < selectedFolders.length; i++)
{
var selectedFolder = selectedFolders[i];
var folderResource = selectedFolder.QueryInterface(Components.interfaces.nsIRDFResource);
var specialFolder = GetFolderAttribute(folderOutliner, folderResource, "SpecialFolder");
if (specialFolder != "Inbox" && specialFolder != "Trash")
{
var msgfolder = GetMsgFolderFromURI(folderuri);
var protocolInfo = Components.classes["@mozilla.org/messenger/protocol/info;1?type=" + msgfolder.server.type].getService(Components.interfaces.nsIMsgProtocolInfo);
var protocolInfo = Components.classes["@mozilla.org/messenger/protocol/info;1?type=" + selectedFolder.server.type].getService(Components.interfaces.nsIMsgProtocolInfo);
// do not allow deletion of special folders on imap accounts
if ((specialFolder == "Sent" ||
specialFolder == "Drafts" ||
specialFolder == "Templates") &&
!protocolInfo.specialFoldersDeletionAllowed) {
!protocolInfo.specialFoldersDeletionAllowed)
{
var errorMessage = gMessengerBundle.getFormattedString("specialFolderDeletionErr",
[specialFolder]);
var specialFolderDeletionErrTitle = gMessengerBundle.getString("specialFolderDeletionErrTitle");
promptService.alert(window, specialFolderDeletionErrTitle, errorMessage);
continue;
}
else if (isNewsURI(folderuri)) {
var unsubscribe = ConfirmUnsubscribe(msgfolder);
if (unsubscribe) {
UnSubscribe(msgfolder);
}
else if (isNewsURI(folderResource.Value))
{
var unsubscribe = ConfirmUnsubscribe(selectedFolder);
if (unsubscribe)
UnSubscribe(selectedFolder);
}
else {
parent = folder.parentNode.parentNode;
var parenturi = parent.getAttribute('id');
messenger.DeleteFolders(tree.database,
parent.resource, folder.resource);
else
{
var parentResource = selectedFolder.parent.QueryInterface(Components.interfaces.nsIRDFResource);
messenger.DeleteFolders(GetFolderDatasource(), parentResource, folderResource);
}
}
}
}
}
// 3pane related commands. Need to go in own file. Putting here for the moment.
@ -949,40 +948,11 @@ function MsgViewAllMsgs()
}
}
function FillInFolderTooltip(cellNode)
{
var folderNode = cellNode.parentNode.parentNode;
var uri = folderNode.getAttribute('id');
var folderTree = GetFolderTree();
var name = GetFolderNameFromUri(uri, folderTree);
var folderResource = RDF.GetResource(uri);
var msgFolder = folderResource.QueryInterface(Components.interfaces.nsIMsgFolder);
var unreadCount = msgFolder.getNumUnread(false);
if(unreadCount < 0)
unreadCount = 0;
var totalCount = msgFolder.getTotalMessages(false);
if(totalCount < 0)
totalCount = 0;
var textNode = document.getElementById("foldertooltipText");
var folderTooltip = name;
if(!msgFolder.isServer)
folderTooltip += " (" + unreadCount + "/" + totalCount +")";
textNode.setAttribute('value', folderTooltip);
return true;
}
function GetFolderNameFromUri(uri, tree)
function GetFolderNameFromUri(uri, outliner)
{
var folderResource = RDF.GetResource(uri);
var db = tree.database;
var db = outliner.outlinerBoxObject.outlinerBody.database;
var nameProperty = RDF.GetResource('http://home.netscape.com/NC-rdf#Name');
@ -1029,7 +999,7 @@ function SwitchPaneFocus(direction)
SetFocusMessagePane();
}
}
else if(focusedElementId == "folderTree")
else if(focusedElementId == "folderOutliner")
{
if (!(IsThreadAndMessagePaneSplitterCollapsed()))
SetFocusMessagePane();
@ -1081,7 +1051,7 @@ function SwitchPaneFocus(direction)
SetFocusFolderPane();
}
else if(focusedElementId == "folderTree")
else if(focusedElementId == "folderOutliner")
SetFocusThreadPane();
}
catch(e)
@ -1095,23 +1065,20 @@ function SwitchPaneFocus(direction)
function SetFocusFolderPane()
{
var folderTree = GetFolderTree();
folderTree.focus();
return;
var folderOutliner = GetFolderOutliner();
folderOutliner.focus();
}
function SetFocusThreadPane()
{
var threadTree = GetThreadOutliner();
threadTree.focus();
return;
var threadOutliner = GetThreadOutliner();
threadOutliner.focus();
}
function SetFocusMessagePane()
{
var messagePaneFrame = GetMessagePaneFrame();
messagePaneFrame.focus();
return;
var messagePaneFrame = GetMessagePaneFrame();
messagePaneFrame.focus();
}
function is_collapsed(element)

View File

@ -150,9 +150,8 @@ Rights Reserved.
<vbox flex="1">
<hbox id="mail3PaneVertLayoutBox" persist="collapsed height" flex="1">
<vbox flex="1" autostretch="always" persist="width">
<sidebarheader type="box" class="sidebarheader-main" label="&mail-sidebar-header.label;"/>
<tree id="folderTree" flex="1" style="width:0px;" context="folderPaneContext" persist="collapsed width"/>
<vbox id="folderPaneBox" flex="1" autostretch="always" persist="width">
<outliner id="folderOutliner" flex="1" style="width:0px;" context="folderPaneContext" persist="collapsed width"/>
</vbox>
<splitter id="gray_vertical_splitter" collapse="before" persist="state"/>

View File

@ -18,6 +18,9 @@
* Copyright (C) 2000 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributors(s):
* Jan Varga <varga@utcru.sk>
* Hakan Waara <hwaara@chello.se>
*/
//NOTE: gMessengerBundle must be defined and set or this Overlay won't work
@ -48,8 +51,9 @@ function fillThreadPaneContextMenu()
ShowMenuItem("threadPaneContext-sep-reply", true);
SetupMoveMenuItem("threadPaneContext-moveMenu", numSelected, isNewsgroup, false);
SetupCopyMessageUrlMenuItem("threadPaneContext-copyMessageUrl", numSelected, isNewsgroup, numSelected != 1);
SetupCopyMenuItem("threadPaneContext-copyMenu", numSelected, false);
SetupMoveMenuItem("threadPaneContext-moveMenu", numSelected, isNewsgroup, false);
SetupSaveAsMenuItem("threadPaneContext-saveAs", numSelected, false);
SetupPrintMenuItem("threadPaneContext-print", numSelected, false);
SetupDeleteMenuItem("threadPaneContext-delete", numSelected, isNewsgroup, false);
@ -110,6 +114,12 @@ function SetupMoveMenuItem(menuID, numSelected, isNewsgroup, forceHide)
EnableMenuItem(menuID, (numSelected > 0));
}
function SetupCopyMessageUrlMenuItem(menuID, numSelected, isNewsgroup, forceHide)
{
ShowMenuItem(menuID, isNewsgroup && !forceHide);
EnableMenuItem(menuID, (numSelected > 0));
}
function SetupCopyMenuItem(menuID, numSelected, forceHide)
{
ShowMenuItem(menuID, !forceHide);
@ -163,21 +173,18 @@ function SetupAddAllToABMenuItem(menuID, numSelected, forceHide)
function fillFolderPaneContextMenu()
{
var tree = GetFolderTree();
var selectedItems = tree.selectedItems;
var numSelected = selectedItems.length;
var folderOutliner = GetFolderOutliner();
var startIndex = {};
var endIndex = {};
folderOutliner.outlinerBoxObject.selection.getRangeAt(0, startIndex, endIndex);
if (startIndex.value < 0)
return;
var numSelected = endIndex.value - startIndex.value + 1;
var folderResource = GetFolderResource(folderOutliner, startIndex.value);
var popupNode = document.getElementById('folderPaneContext');
var targetFolder = document.popupNode.parentNode.parentNode;
if (targetFolder.getAttribute('selected') != 'true')
{
tree.selectItem(targetFolder);
}
var isServer = targetFolder.getAttribute('IsServer') == 'true';
var serverType = targetFolder.getAttribute('ServerType');
var specialFolder = targetFolder.getAttribute('SpecialFolder');
var isServer = GetFolderAttribute(folderOutliner, folderResource, "IsServer") == 'true';
var serverType = GetFolderAttribute(folderOutliner, folderResource, "ServerType");
var specialFolder = GetFolderAttribute(folderOutliner, folderResource, "SpecialFolder");
var canSubscribeToFolder = (serverType == "nntp") || (serverType == "imap");
var isNewsgroup = !isServer && serverType == 'nntp';
var canGetMessages = (isServer && (serverType != "nntp") && (serverType !="none")) || isNewsgroup;
@ -189,9 +196,9 @@ function fillFolderPaneContextMenu()
ShowMenuItem("folderPaneContext-openNewWindow", (numSelected <= 1) && !isServer);
EnableMenuItem("folderPaneContext-openNewWindow", (true));
SetupRenameMenuItem(targetFolder, numSelected, isServer, serverType, specialFolder);
SetupRemoveMenuItem(targetFolder, numSelected, isServer, serverType, specialFolder);
SetupCompactMenuItem(targetFolder, numSelected);
SetupRenameMenuItem(folderResource, numSelected, isServer, serverType, specialFolder);
SetupRemoveMenuItem(folderResource, numSelected, isServer, serverType, specialFolder);
SetupCompactMenuItem(folderResource, numSelected);
ShowMenuItem("folderPaneContext-emptyTrash", (numSelected <= 1) && (specialFolder == 'Trash'));
EnableMenuItem("folderPaneContext-emptyTrash", true);
@ -199,12 +206,12 @@ function fillFolderPaneContextMenu()
var showSendUnsentMessages = (numSelected <= 1) && (specialFolder == 'Unsent Messages');
ShowMenuItem("folderPaneContext-sendUnsentMessages", showSendUnsentMessages);
if (showSendUnsentMessages) {
EnableMenuItem("folderPaneContext-sendUnsentMessages", IsSendUnsentMsgsEnabled(targetFolder));
EnableMenuItem("folderPaneContext-sendUnsentMessages", IsSendUnsentMsgsEnabled(folderResource));
}
ShowMenuItem("folderPaneContext-sep-edit", (numSelected <= 1));
SetupNewMenuItem(targetFolder, numSelected, isServer, serverType, specialFolder);
SetupNewMenuItem(folderResource, numSelected, isServer, serverType, specialFolder);
ShowMenuItem("folderPaneContext-subscribe", (numSelected <= 1) && canSubscribeToFolder);
EnableMenuItem("folderPaneContext-subscribe", true);
@ -224,14 +231,15 @@ function fillFolderPaneContextMenu()
return(true);
}
function SetupRenameMenuItem(targetFolder, numSelected, isServer, serverType, specialFolder)
function SetupRenameMenuItem(folderResource, numSelected, isServer, serverType, specialFolder)
{
var isSpecialFolder = specialFolder != 'none';
var isMail = serverType != 'nntp';
var canRename = (targetFolder.getAttribute('CanRename') == "true");
var folderOutliner = GetFolderOutliner();
var canRename = GetFolderAttribute(folderOutliner, folderResource, "CanRename") == "true";
ShowMenuItem("folderPaneContext-rename", (numSelected <= 1) && !isServer && (specialFolder == "none") && canRename);
var folder = GetMsgFolderFromNode(targetFolder);
var folder = GetMsgFolderFromResource(folderResource);
EnableMenuItem("folderPaneContext-rename", !isServer && folder.isCommandEnabled("cmd_renameFolder"));
if(canRename)
@ -240,7 +248,7 @@ function SetupRenameMenuItem(targetFolder, numSelected, isServer, serverType, sp
}
}
function SetupRemoveMenuItem(targetFolder, numSelected, isServer, serverType, specialFolder)
function SetupRemoveMenuItem(folderResource, numSelected, isServer, serverType, specialFolder)
{
var isMail = serverType != 'nntp';
var isSpecialFolder = specialFolder != "none";
@ -251,7 +259,7 @@ function SetupRemoveMenuItem(targetFolder, numSelected, isServer, serverType, sp
ShowMenuItem("folderPaneContext-remove", showRemove);
if(showRemove)
{
var folder = GetMsgFolderFromNode(targetFolder);
var folder = GetMsgFolderFromResource(folderResource);
EnableMenuItem("folderPaneContext-remove", folder.isCommandEnabled("cmd_delete"));
}
if(isMail && !isSpecialFolder)
@ -260,11 +268,12 @@ function SetupRemoveMenuItem(targetFolder, numSelected, isServer, serverType, sp
}
}
function SetupCompactMenuItem(targetFolder, numSelected)
function SetupCompactMenuItem(folderResource, numSelected)
{
var canCompact = (targetFolder.getAttribute('CanCompact') == "true");
var folderOutliner = GetFolderOutliner();
var canCompact = GetFolderAttribute(folderOutliner, folderResource, "CanCompact") == "true";
ShowMenuItem("folderPaneContext-compact", (numSelected <=1) && canCompact);
var folder = GetMsgFolderFromNode(targetFolder);
var folder = GetMsgFolderFromResource(folderResource);
EnableMenuItem("folderPaneContext-compact", folder.isCommandEnabled("cmd_compactFolder"));
if(canCompact)
@ -273,9 +282,10 @@ function SetupCompactMenuItem(targetFolder, numSelected)
}
}
function SetupNewMenuItem(targetFolder, numSelected, isServer, serverType, specialFolder)
function SetupNewMenuItem(folderResource, numSelected, isServer, serverType, specialFolder)
{
var canCreateNew = targetFolder.getAttribute('CanCreateSubfolders') == 'true';
var folderOutliner = GetFolderOutliner();
var canCreateNew = GetFolderAttribute(folderOutliner, folderResource, "CanCreateSubfolders") == "true";
var isInbox = specialFolder == "Inbox";
var showNew = ((numSelected <=1) && (serverType != 'nntp') && canCreateNew) || isInbox;
@ -348,9 +358,9 @@ function fillMessagePaneContextMenu(contextMenu)
SetupReplyToNewsgroupMenuItem("messagePaneContext-replyNewsgroup", numSelected, isNewsgroup, (numSelected == 0 || hideMailItems));
SetupReplyAllMenuItem("messagePaneContext-replyAll" , numSelected, (numSelected == 0 || hideMailItems));
SetupForwardMenuItem("messagePaneContext-forward", numSelected, (numSelected == 0 || hideMailItems));
SetupForwardAsAttachmentMenuItem("threadPaneContext-forwardAsAttachment", numSelected, hideMailItems);
SetupMoveMenuItem("messagePaneContext-moveMenu", numSelected, isNewsgroup, (numSelected == 0 || hideMailItems));
SetupCopyMessageUrlMenuItem("messagePaneContext-copyMessageUrl", numSelected, isNewsgroup, (numSelected == 0 || hideMailItems));
SetupCopyMenuItem("messagePaneContext-copyMenu", numSelected, (numSelected == 0 || hideMailItems));
SetupMoveMenuItem("messagePaneContext-moveMenu", numSelected, isNewsgroup, (numSelected == 0 || hideMailItems));
SetupSaveAsMenuItem("messagePaneContext-saveAs", numSelected, (numSelected == 0 || hideMailItems));
SetupPrintMenuItem("messagePaneContext-print", numSelected, (numSelected == 0 || hideMailItems));
SetupDeleteMenuItem("messagePaneContext-delete", numSelected, isNewsgroup, (numSelected == 0 || hideMailItems));
@ -397,6 +407,7 @@ function ShowMessagePaneEditSeparator()
{
return (IsMenuItemShowing("messagePaneContext-moveMenu") ||
IsMenuItemShowing("messagePaneContext-copyMenu") ||
IsMenuItemShowing("messagePaneContext-copyMessageUrl") ||
IsMenuItemShowing("messagePaneContext-saveAs") ||
IsMenuItemShowing("messagePaneContext-print") ||
IsMenuItemShowing("messagePaneContext-delete"));
@ -440,3 +451,32 @@ function IsMenuItemShowingWithStyle(menuID)
}
return false;
}
function CopyMessageUrl()
{
try {
var hdr = gDBView.hdrForFirstSelectedMessage;
var server = hdr.folder.server;
var url;
if (server.isSecure) {
url = "snews://";
}
else {
url = "news://"
}
url += server.hostName;
url += ":";
url += server.port;
url += "/";
url += hdr.messageId;
var contractid = "@mozilla.org/widget/clipboardhelper;1";
var iid = Components.interfaces.nsIClipboardHelper;
var clipboard = Components.classes[contractid].getService(iid);
clipboard.copyString(url);
}
catch (ex) {
dump("ex="+ex+"\n");
}
}

View File

@ -16,6 +16,10 @@
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998-1999 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributors(s):
* Jan Varga <varga@utcru.sk>
* Håkan Waara (hwaara@chello.se)
*/
//This file stores variables common to mail windows
@ -515,32 +519,32 @@ function HideAccountCentral()
// prompt if offline.
function OpenInboxForServer(server)
{
try {
HideAccountCentral();
OpenTwistyForServer(server);
var inboxFolder = GetInboxFolder(server);
var folderTree = GetFolderTree();
var inboxFolderUri = document.getElementById(inboxFolder.URI);
ChangeSelection(folderTree, inboxFolderUri);
try {
HideAccountCentral();
OpenTwistyForServer(server);
var inboxFolder = GetInboxFolder(server);
var folderResource = RDF.GetResource(inboxFolder.URI)
var folderOutliner = GetFolderOutliner();
var folderIndex = GetFolderIndex(folderOutliner, folderResource);
ChangeSelection(folderOutliner, folderIndex);
if(CheckOnline()) {
GetMessagesForInboxOnServer(server);
}
else {
var option = PromptGetMessagesOffline();
if(option == 0) {
if (!gOfflineManager)
GetOfflineMgrService();
if(CheckOnline())
GetMessagesForInboxOnServer(server);
else {
var option = PromptGetMessagesOffline();
if(option == 0) {
if (!gOfflineManager)
GetOfflineMgrService();
gOfflineManager.goOnline(false /* sendUnsentMessages */,
false /* playbackOfflineImapOperations */,
msgWindow);
GetMessagesForInboxOnServer(server);
}
gOfflineManager.goOnline(false /* sendUnsentMessages */,
false /* playbackOfflineImapOperations */,
msgWindow);
GetMessagesForInboxOnServer(server);
}
}
}
catch (ex) {
dump("Error opening inbox for server -> " + ex + "\n");
return;
}
}
catch (ex) {
dump("Error opening inbox for server -> " + ex + "\n");
return;
}
}

View File

@ -20,6 +20,7 @@
* Contributors: timeless
* slucy@objectivesw.co.uk
* Håkan Waara <hwaara@chello.se>
* Jan Varga <varga@utcru.sk>
*/
var gMessengerBundle;
@ -1081,18 +1082,18 @@ function IsEmptyTrashEnabled()
function IsCompactFolderEnabled()
{
var folderTree = GetFolderTree();
var selectedFolders = folderTree.selectedItems;
var numFolders = selectedFolders.length;
var folderOutliner = GetFolderOutliner();
var startIndex = {};
var endIndex = {};
folderOutliner.outlinerBoxObject.selection.getRangeAt(0, startIndex, endIndex);
if (startIndex.value < 0)
return false;
if (numFolders <= 0 )
return false;
var folderResource = GetFolderResource(folderOutliner, startIndex.value);
if (! folderResource)
return false;
var folder = selectedFolders[0];
if (!folder)
return false;
return (folder.getAttribute('CanCompact') == "true" && isCommandEnabled("cmd_compactFolder"));
return GetFolderAttribute(folderOutliner, folderResource, "CanCompact") == "true" && isCommandEnabled("cmd_compactFolder");
}
var gDeleteButton = null;

View File

@ -321,6 +321,10 @@ Rights Reserved.
accesskey="&contextEditAsNew.accesskey;"
oncommand="MsgEditMessageAsNew();"/>
<menuseparator id="threadPaneContext-sep-reply"/>
<menuitem id="threadPaneContext-copyMessageUrl"
label="&copyMessageLocation.label;"
accesskey="&copyMessageLocation.accesskey;"
oncommand="CopyMessageUrl()"/>
<menu id="threadPaneContext-moveMenu"
label="&contextMoveMsgMenu.label;"
accesskey="&contextMoveMsgMenu.accesskey;"
@ -566,6 +570,10 @@ Rights Reserved.
accesskey="&contextEditAsNew.accesskey;"
oncommand="MsgEditMessageAsNew();"/>
<menuseparator id="messagePaneContext-sep-reply"/>
<menuitem id="messagePaneContext-copyMessageUrl"
label="&copyMessageLocation.label;"
accesskey="&copyMessageLocation.accesskey;"
oncommand="CopyMessageUrl()"/>
<menu id="messagePaneContext-moveMenu"
label="&contextMoveMsgMenu.label;"
accesskey="&contextMoveMsgMenu.accesskey;"

View File

@ -29,6 +29,7 @@ var gCurrentMessageUri;
var gCurrentFolderUri;
var gThreadPaneCommandUpdater = null;
var gCurrentMessageIsDeleted = false;
var gNextMessageViewIndexAfterDelete = -1;
// the folderListener object
var folderListener = {

View File

@ -148,8 +148,7 @@ Rights Reserved.
<hbox style="height:100px" flex="1">
<vbox id="sidebar-box">
<sidebarheader type="box" class="sidebarheader-main" label="&mail-sidebar-header.label;"/>
<tree id="folderTree" flex="1000" context="folderPaneContext" />
<outliner id="folderOutliner" flex="1" context="folderPaneContext"/>
</vbox>
<splitter id="sidebar-splitter"/>

View File

@ -18,326 +18,229 @@
* Rights Reserved.
*
* Contributor(s):
* disttsc@bart.nl
* jarrod.k.gray@rose-hulman.edu
* disttsc@bart.nl
* jarrod.k.gray@rose-hulman.edu
* Jan Varga <varga@utcru.sk>
*/
// cache these services
var RDF = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService().QueryInterface(Components.interfaces.nsIRDFService);
var dragService = Components.classes["@mozilla.org/widget/dragservice;1"].getService().QueryInterface(Components.interfaces.nsIDragService);
var nsIDragService = Components.interfaces.nsIDragService;
var gSrcCanRename;
function debugDump(msg)
{
// uncomment for noise
// dump(msg+"\n");
//dump(msg+"\n");
}
function DragOverTree(event)
function CanDropOnFolderOutliner(index)
{
if (event.target.localName != "treecell" &&
event.target.localName != "treeitem") {
event.preventBubble();
return false;
}
var dragSession = null;
var dragFolder = false;
var flavor =false;
var flavor = false;
dragSession = dragService.getCurrentSession();
if ( !dragSession ) return(false);
if ( dragSession.isDataFlavorSupported("text/nsmessageOrfolder") ) flavor = true;
if (! dragSession)
return false;
var treeItem = event.target.parentNode.parentNode;
if (!treeItem) return(false);
if (dragSession.isDataFlavorSupported("text/nsmessageOrfolder"))
flavor = true;
var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable);
if ( !trans ) return(false);
var targetID = treeItem.getAttribute("id");
var targetNode = RDF.GetResource(targetID, true);
if (!targetNode) return(false);
var targetFolder = targetNode.QueryInterface(Components.interfaces.nsIMsgFolder);
if (! trans)
return false;
var folderOutliner = GetFolderOutliner();
var targetResource = GetFolderResource(folderOutliner, index);
var targetUri = targetResource.Value;
var targetFolder = targetResource.QueryInterface(Components.interfaces.nsIMsgFolder);
var targetServer = targetFolder.server;
var sourceServer;
trans.addDataFlavor("text/nsmessageOrfolder");
for ( var i = 0; i < dragSession.numDropItems; ++i )
for (var i = 0; i < dragSession.numDropItems; i++)
{
dragSession.getData ( trans, i );
var dataObj = new Object();
var bestFlavor = new Object();
var len = new Object();
try
{
trans.getAnyTransferData ( bestFlavor, dataObj, len );
}
catch (ex)
{
continue; //no data so continue;
}
if ( dataObj ) dataObj = dataObj.value.QueryInterface(Components.interfaces.nsISupportsWString);
if ( !dataObj ) continue;
dragSession.getData (trans, i);
var dataObj = new Object();
var bestFlavor = new Object();
var len = new Object();
try
{
trans.getAnyTransferData ( bestFlavor, dataObj, len );
}
catch (ex)
{
continue; //no data so continue;
}
if (dataObj)
dataObj = dataObj.value.QueryInterface(Components.interfaces.nsISupportsWString);
if (! dataObj)
continue;
// pull the URL out of the data object
var sourceID = dataObj.data.substring(0, len.value);
if (!sourceID) continue;
// pull the URL out of the data object
var sourceUri = dataObj.data.substring(0, len.value);
if (! sourceUri)
continue;
var sourceNode;
try
{
sourceNode = RDF.GetResource(sourceID, true);
var folder = sourceNode.QueryInterface(Components.interfaces.nsIFolder);
if (folder)
dragFolder = true;
}
catch(ex)
{
sourceNode = null;
var isServer = treeItem.getAttribute("IsServer");
if (isServer == "true")
{
debugDump("***isServer == true\n");
return(false);
}
var canFileMessages = treeItem.getAttribute("CanFileMessages");
if (canFileMessages != "true")
{
debugDump("***canFileMessages == false\n");
return(false);
}
var noSelect = treeItem.getAttribute("NoSelect");
if (noSelect == "true")
{
debugDump("***NoSelect == true\n");
return(false);
}
var hdr = messenger.messageServiceFromURI(sourceID).messageURIToMsgHdr(sourceID);
if (hdr.folder == targetFolder)
return (false);
break;
}
var sourceResource;
try
{
sourceResource = RDF.GetResource(sourceUri, true);
var folder = sourceResource.QueryInterface(Components.interfaces.nsIFolder);
if (folder)
dragFolder = true;
}
catch(ex)
{
sourceResource = null;
var isServer = GetFolderAttribute(folderOutliner, targetResource, "IsServer");
if (isServer == "true")
{
debugDump("***isServer == true\n");
return false;
}
var canFileMessages = GetFolderAttribute(folderOutliner, targetResource, "CanFileMessages");
if (canFileMessages != "true")
{
debugDump("***canFileMessages == false\n");
return false;
}
var noSelect = GetFolderAttribute(folderOutliner, targetResource, "NoSelect");
if (noSelect == "true")
{
debugDump("***NoSelect == true\n");
return false;
}
var hdr = messenger.messageServiceFromURI(sourceUri).messageURIToMsgHdr(sourceUri);
if (hdr.folder == targetFolder)
return false;
break;
}
// we should only get here if we are dragging and dropping folders
var sourceResource = folder.QueryInterface(Components.interfaces.nsIRDFResource);
var sourceFolder = sourceResource.QueryInterface(Components.interfaces.nsIMsgFolder);
sourceServer = sourceFolder.server;
// we should only get here if we are dragging and dropping folders
var sourceResource = folder.QueryInterface(Components.interfaces.nsIRDFResource);
var sourceFolder = sourceResource.QueryInterface(Components.interfaces.nsIMsgFolder);
sourceServer = sourceFolder.server;
if (targetID == sourceID)
return (false);
if (targetUri == sourceUri)
return false;
if (sourceServer != targetServer && targetServer.type == "imap") //don't allow drop on different imap servers.
return (false);
if (targetFolder.URI == sourceFolder.parent.URI) //don't allow immediate child to be dropped to it's parent
{
debugDump(targetFolder.URI + "\n");
debugDump(sourceFolder.parent.URI + "\n");
return (false);
}
var isAncestor = sourceFolder.isAncestorOf(targetFolder);
if (isAncestor) // don't allow parent to be dropped on its ancestors
return (false);
//don't allow drop on different imap servers.
if (sourceServer != targetServer && targetServer.type == "imap")
return false;
//don't allow immediate child to be dropped to it's parent
if (targetFolder.URI == sourceFolder.parent.URI)
{
debugDump(targetFolder.URI + "\n");
debugDump(sourceFolder.parent.URI + "\n");
return false;
}
var isAncestor = sourceFolder.isAncestorOf(targetFolder);
// don't allow parent to be dropped on its ancestors
if (isAncestor)
return false;
}
if (dragFolder)
{
debugDump("***isFolderFlavor == true \n"); //first check these conditions then proceed further
if (dragSession.dragAction == nsIDragService.DRAGDROP_ACTION_COPY) //no copy for folder drag
return(false);
//first check these conditions then proceed further
debugDump("***isFolderFlavor == true \n");
var canCreateSubfolders = treeItem.getAttribute('CanCreateSubfolders');
if ( canCreateSubfolders == "false") // if cannot create subfolders then a folder cannot be dropped here
{
debugDump("***canCreateSubfolders == false \n");
return(false);
}
var serverType = treeItem.getAttribute('ServerType');
// no copy for folder drag
if (dragSession.dragAction == nsIDragService.DRAGDROP_ACTION_COPY)
return false;
// if we've got a folder that can't be renamed
// allow us to drop it if we plan on dropping it on "Local Folders"
// (but not within the same server, to prevent renaming folders on "Local Folders" that
// should not be renamed)
if (gSrcCanRename == "false") {
if (sourceServer == targetServer) {
return(false);
}
if (serverType != "none") {
return(false);
}
}
var canCreateSubfolders = GetFolderAttribute(folderOutliner, targetResource, "CanCreateSubfolders");
// if cannot create subfolders then a folder cannot be dropped here
if (canCreateSubfolders == "false")
{
debugDump("***canCreateSubfolders == false \n");
return false;
}
var serverType = GetFolderAttribute(folderOutliner, targetResource, "ServerType");
// if we've got a folder that can't be renamed
// allow us to drop it if we plan on dropping it on "Local Folders"
// (but not within the same server, to prevent renaming folders on "Local Folders" that
// should not be renamed)
var srcCanRename = GetFolderAttribute(folderOutliner, sourceResource, "CanRename");
if (srcCanRename == "false") {
if (sourceServer == targetServer)
return false;
if (serverType != "none")
return false;
}
}
//XXX other flavors here...
// touch the attribute on the treeItem to trigger the repaint with the drop feedback
// (recall that it is two levels above the target, which is a treeCell).
//XXX this is really slow and likes to refresh N times per second.
if (flavor) //message or folder
//message or folder
if (flavor)
{
event.target.parentNode.parentNode.setAttribute ( "dd-triggerrepaint", 0 );
dragSession.canDrop = true;
event.preventBubble(); // do not propagate message
return true;
dragSession.canDrop = true;
return true;
}
return false;
}
function BeginDragTree(event, tree, flavor)
function CanDropBeforeAfterFolderOutliner(index, before)
{
if ( event.target == tree )
return(true); // continue propagating the event
var treeItem = event.target.parentNode.parentNode;
if (!treeItem) return(false);
var childWithDatabase = tree;
if ( ! childWithDatabase )
return(false);
var database = childWithDatabase.database;
if ((!RDF) || (!database)) { debugDump("CAN'T GET DATABASE\n"); return(false); }
var dragStarted = false;
var transArray = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);
if ( !transArray ) return(false);
var selArray = tree.selectedItems;
var count = selArray.length;
debugDump("selArray.length = " + count + "\n");
for ( var i = 0; i < count; ++i )
{
var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable);
if ( !trans ) return(false);
var genTextData = Components.classes["@mozilla.org/supports-wstring;1"].createInstance(Components.interfaces.nsISupportsWString);
if (!genTextData) return(false);
trans.addDataFlavor(flavor);
// get id (url)
var id = selArray[i].getAttribute("id");
genTextData.data = id;
debugDump(" ID #" + i + " = " + id + "\n");
trans.setTransferData ( flavor, genTextData, id.length * 2 ); // doublebyte byte data
// put it into the transferable as an |nsISupports|
var genTrans = trans.QueryInterface(Components.interfaces.nsISupports);
transArray.AppendElement(genTrans);
}
dragService.invokeDragSession ( event.target, transArray, null, nsIDragService.DRAGDROP_ACTION_COPY +
nsIDragService.DRAGDROP_ACTION_MOVE );
dragStarted = true;
return(!dragStarted); // don't propagate the event if a drag has begun
return false;
}
function BeginDragFolderTree(event)
function DropOnFolderOutliner(row, orientation)
{
debugDump("BeginDragFolderTree\n");
if (event.target.localName != "treecell" &&
event.target.localName != "treeitem")
return false;
if (orientation != Components.interfaces.nsIOutlinerView.inDropOn)
return;
var tree = GetFolderTree();
var folderOutliner = GetFolderOutliner();
var targetResource = GetFolderResource(folderOutliner, row);
var treeItem = event.target.parentNode.parentNode;
if (!treeItem) return(false);
var targetUri = targetResource.Value;
debugDump("***targetUri = " + targetUri + "\n");
if (treeItem.getAttribute('IsServer') == "true")
return false;
gSrcCanRename = treeItem.getAttribute('CanRename'); //used in DragOverTree
var serverType = treeItem.getAttribute('ServerType') // do not allow the drag when news is the source
if ( serverType == "nntp")
{
debugDump("***serverType == nntp \n");
return(false);
}
return BeginDragTree(event, tree, "text/nsmessageOrfolder");
}
function DropOnFolderTree(event)
{
debugDump("DropOnTree\n");
var treeRoot = GetFolderTree();
if (!treeRoot) return(false);
var treeDatabase = treeRoot.database;
if (!treeDatabase) return(false);
// target is the <treecell>, and "id" is on the <treeitem> two levels above
var treeItem = event.target.parentNode.parentNode;
if (!treeItem) return(false);
// drop action is always "on" not "before" or "after"
// get drop hint attributes
var dropBefore = treeItem.getAttribute("dd-droplocation");
var dropOn = treeItem.getAttribute("dd-dropon");
var dropAction;
if (dropOn == "true")
dropAction = "on";
else
return(false);
var targetID = treeItem.getAttribute("id");
if (!targetID) return(false);
debugDump("***targetID = " + targetID + "\n");
//make sure target is a folder
var dragSession = dragService.getCurrentSession();
if ( !dragSession ) return(false);
if (! dragSession )
return;
var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable);
if ( !trans ) return(false);
trans.addDataFlavor("text/nsmessageOrfolder");
var list = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);
var dropMessage = true;
var sourceNode;
var sourceUri;
var sourceResource;
var sourceFolder;
var sourceServer;
trans.addDataFlavor("text/nsmessageOrfolder");
for ( var i = 0; i < dragSession.numDropItems; ++i )
for (var i = 0; i < dragSession.numDropItems; i++)
{
dragSession.getData ( trans, i );
dragSession.getData (trans, i);
var dataObj = new Object();
var bestFlavor = new Object();
var len = new Object();
trans.getAnyTransferData ( bestFlavor, dataObj, len );
if ( dataObj ) dataObj = dataObj.value.QueryInterface(Components.interfaces.nsISupportsWString);
if ( !dataObj ) continue;
trans.getAnyTransferData(bestFlavor, dataObj, len);
if (dataObj)
dataObj = dataObj.value.QueryInterface(Components.interfaces.nsISupportsWString);
if (! dataObj)
continue;
// pull the URL out of the data object
var sourceID = dataObj.data.substring(0, len.value);
if (!sourceID) continue;
sourceUri = dataObj.data.substring(0, len.value);
if (! sourceUri)
continue;
debugDump(" Node #" + i + ": drop '" + sourceID + "' " + dropAction + " '" + targetID + "'\n");
debugDump(" Node #" + i + ": drop " + sourceUri + " to " + targetUri + "\n");
sourceNode = RDF.GetResource(sourceID, true);
sourceResource = RDF.GetResource(sourceUri, true);
// only do this for the first object, either they are all messages or they are all folders
if (i == 0) {
try {
sourceFolder = sourceNode.QueryInterface(Components.interfaces.nsIMsgFolder);
sourceFolder = sourceResource.QueryInterface(Components.interfaces.nsIMsgFolder);
if (sourceFolder) {
// we are dropping a folder
dropMessage = false;
@ -351,105 +254,110 @@ function DropOnFolderTree(event)
}
}
else {
if (!dropMessage) {
if (! dropMessage)
dump("drag and drop of multiple folders isn't supported\n");
}
}
if (dropMessage) {
// from the message uri, get the appropriate messenger service
// and then from that service, get the msgDbHdr
list.AppendElement(messenger.messageServiceFromURI(sourceID).messageURIToMsgHdr(sourceID));
// from the message uri, get the appropriate messenger service
// and then from that service, get the msgDbHdr
list.AppendElement(messenger.messageServiceFromURI(sourceUri).messageURIToMsgHdr(sourceUri));
}
else {
// Prevent dropping of a node before, after, or on itself
if (sourceNode == targetNode)
continue;
// Prevent dropping of a node before, after, or on itself
if (sourceResource == targetResource)
continue;
list.AppendElement(sourceNode);
list.AppendElement(sourceResource);
}
}
if (list.Count() < 1)
return false;
return false;
var isSourceNews = false;
isSourceNews = isNewsURI(sourceID);
isSourceNews = isNewsURI(sourceUri);
var targetNode = RDF.GetResource(targetID, true);
if (!targetNode) return(false);
var targetFolder = targetNode.QueryInterface(Components.interfaces.nsIMsgFolder);
var targetFolder = targetResource.QueryInterface(Components.interfaces.nsIMsgFolder);
var targetServer = targetFolder.server;
if (dropMessage) {
// fix this, to get the folder from the sourceID. this won't work with multiple 3 panes
// fix this, to get the folder from the sourceUri. this won't work with multiple 3 panes
sourceFolder = GetThreadPaneFolder();
sourceServer = sourceFolder.server;
try {
if (isSourceNews) {
// news to pop or imap is always a copy
messenger.CopyMessages(sourceFolder, targetFolder, list, false);
}
else {
// fix this, will not work for multiple 3 panes
if (dragSession.dragAction == nsIDragService.DRAGDROP_ACTION_MOVE) {
SetNextMessageAfterDelete();
if (isSourceNews) {
// news to pop or imap is always a copy
messenger.CopyMessages(sourceFolder, targetFolder, list, false);
}
else {
// fix this, will not work for multiple 3 panes
if (dragSession.dragAction == nsIDragService.DRAGDROP_ACTION_MOVE)
SetNextMessageAfterDelete();
var dragAction = dragSession.dragAction;
if (dragAction == nsIDragService.DRAGDROP_ACTION_COPY)
messenger.CopyMessages(sourceFolder, targetFolder, list, false);
else if (dragAction == nsIDragService.DRAGDROP_ACTION_MOVE)
messenger.CopyMessages(sourceFolder, targetFolder, list, true);
}
var dragAction = dragSession.dragAction;
if (dragAction == nsIDragService.DRAGDROP_ACTION_COPY)
messenger.CopyMessages(sourceFolder, targetFolder, list, false);
else if (dragAction == nsIDragService.DRAGDROP_ACTION_MOVE)
messenger.CopyMessages(sourceFolder, targetFolder, list, true);
}
}
catch (ex) {
dump("failed to copy messages: " + ex + "\n");
dump("failed to copy messages: " + ex + "\n");
}
}
else {
sourceServer = sourceFolder.server;
try
{
messenger.CopyFolders(treeDatabase,targetNode,list,(sourceServer == targetServer));
messenger.CopyFolders(GetFolderDatasource(), targetResource, list, (sourceServer == targetServer));
}
catch(ex)
{
dump ("Exception : CopyFolder " + ex + "\n");
dump ("Exception : CopyFolders " + ex + "\n");
}
}
return(false);
}
function DropOnThreadPane(event)
function BeginDragFolderOutliner(event)
{
debugDump("DropOnThreadPane()\n");
/* you can't drop on the thread pane */
return false;
debugDump("BeginDragFolderOutliner\n");
var folderOutliner = GetFolderOutliner();
var row = {};
var col = {};
var elt = {};
folderOutliner.outlinerBoxObject.getCellAt(event.clientX, event.clientY, row, col, elt);
var folderResource = GetFolderResource(folderOutliner, row.value);
if (GetFolderAttribute(folderOutliner, folderResource, "IsServer") == "true")
{
debugDump("***IsServer == true\n");
return false;
}
// do not allow the drag when news is the source
if (GetFolderAttribute(folderOutliner, folderResource, "ServerType") == "nntp")
{
debugDump("***ServerType == nntp\n");
return false;
}
var selectedFolders = GetSelectedFolders();
return BeginDragOutliner(event, folderOutliner, selectedFolders, "text/nsmessageOrfolder");
}
function BeginDragThreadPane(event)
{
debugDump("BeginDragThreadPane\n");
debugDump("event.target.localName = " + event.target.localName + "\n");
if (event.target.localName != "outlinerbody") return false;
debugDump("BeginDragThreadPane\n");
var outliner = GetThreadOutliner();
return BeginDragOutliner(event, outliner, "text/nsmessageOrfolder");
var threadOutliner = GetThreadOutliner();
var selectedMessages = GetSelectedMessages();
return BeginDragOutliner(event, threadOutliner, selectedMessages, "text/nsmessageOrfolder");
}
function BeginDragOutliner(event, outliner, flavor)
function BeginDragOutliner(event, outliner, selArray, flavor)
{
if (event.target == outliner) {
return(true); // continue propagating the event
}
if (!outliner) {
return(false);
}
var dragStarted = false;
var transArray = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);
@ -460,8 +368,8 @@ function BeginDragOutliner(event, outliner, flavor)
try {
region = Components.classesByID["{da5b130a-1dd1-11b2-ad47-f455b1814a78}"].createInstance(Components.interfaces.nsIScriptableRegion);
region.init();
var bo = document.getElementById("threadOutlinerBody").boxObject.QueryInterface(Components.interfaces.nsIBoxObject);
var obo = outliner.boxObject.QueryInterface(Components.interfaces.nsIOutlinerBoxObject);
var obo = outliner.outlinerBoxObject;
var bo = obo.outlinerBody.boxObject;
var obosel= obo.selection;
var rowX = bo.x;
@ -484,7 +392,6 @@ function BeginDragOutliner(event, outliner, flavor)
region = null;
}
var selArray = GetSelectedMessages();
var count = selArray.length;
debugDump("selArray.length = " + count + "\n");
for (i = 0; i < count; ++i ) {

View File

@ -16,17 +16,22 @@
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998-1999 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* Jan Varga (varga@utcru.sk)
* Håkan Waara (hwaara@chello.se)
*/
/* This is where functions related to the 3 pane window are kept */
const MSG_FOLDER_FLAG_ELIDED = 0x0010;
var showPerformance = false;
var gFolderTree;
var gThreadOutliner;
var gFolderOutliner;
var gMessagePane;
var gMessagePaneFrame;
var gThreadOutliner;
var gThreadAndMessagePaneSplitter = null;
var gUnreadCount = null;
@ -172,11 +177,63 @@ var folderListener = {
else if (eventType == "DeleteOrMoveMsgFailed") {
HandleDeleteOrMoveMsgFailed(folder);
}
else if (eventType == "CompactCompleted") {
HandleCompactCompleted(folder);
HandleCompactCompleted(folder);
}
}
}
var folderObserver = {
canDropOn: function(index)
{
return CanDropOnFolderOutliner(index);
},
canDropBeforeAfter: function(index, before)
{
return CanDropBeforeAfterFolderOutliner(index, before);
},
onDrop: function(row, orientation)
{
DropOnFolderOutliner(row, orientation);
},
onToggleOpenState: function()
{
},
onCycleHeader: function(colID, elt)
{
},
onCycleCell: function(row, colID)
{
},
onSelectionChanged: function()
{
},
isEditable: function(row, colID)
{
return false;
},
onSetCellText: function(row, colID, value)
{
},
onPerformAction: function(action)
{
},
onPerformActionOnRow: function(action, row)
{
},
onPerformActionOnCell: function(action, row, colID)
{
}
}
@ -242,7 +299,6 @@ function HandleDeleteOrMoveMsgCompleted(folder)
function HandleCompactCompleted (folder)
{
dump ("Compact Completed \n\n");
if(folder)
{
var resource = folder.QueryInterface(Components.interfaces.nsIRDFResource);
@ -312,14 +368,14 @@ function OnLoadMessenger()
HideAccountCentral();
loadStartPage();
InitMsgWindow();
InitMsgWindow();
messenger.SetWindow(window, msgWindow);
messenger.SetWindow(window, msgWindow);
InitializeDataSources();
InitPanes();
InitializeDataSources();
InitPanes();
accountManager.SetSpecialFoldersForIdentities();
accountManager.SetSpecialFoldersForIdentities();
AddToSession();
//need to add to session before trying to load start folder otherwise listeners aren't
@ -383,7 +439,6 @@ function OnLoadMessenger()
var timeToLoad = (afterLoadMessenger.getTime() - beforeLoadMessenger.getTime())/1000;
dump("Time in OnLoadMessger is " + timeToLoad + " seconds\n");
}
}
function OnUnloadMessenger()
@ -395,50 +450,40 @@ function Create3PaneGlobals()
{
}
function PerformExpandForAllOpenServers(tree)
function OpenAndExpandElidedServers()
{
//dump("PerformExpandForAllOpenServers()\n");
var uri = null;
var open = null;
var treechild = null;
var server = null;
if ( tree && tree.childNodes ) {
for ( var i = tree.childNodes.length - 1; i >= 0; i-- ) {
treechild = tree.childNodes[i];
if (treechild.localName == 'treechildren') {
var treeitems = treechild.childNodes;
for ( var j = treeitems.length - 1; j >= 0; j--) {
open = treeitems[j].getAttribute('open');
//dump("open="+open+"\n");
if (open == "true") {
var isServer = (treeitems[j].getAttribute('IsServer') == "true");
//dump("isServer="+isServer+"\n");
if (isServer) {
uri = treeitems[j].getAttribute('id');
//dump("uri="+uri+"\n");
server = GetServer(uri);
if (server) {
// don't do this for imap servers.
// see bug #41943
if (server.type != "imap") {
//dump("PerformExpand on " + uri + "\n");
server.PerformExpand(msgWindow);
}
}
}
}
}
}
}
}
var folderOutliner = GetFolderOutliner();
var view = folderOutliner.outlinerBoxObject.view;
for (var i = 0; i < view.rowCount; i++)
{
if (view.isContainer(i))
{
var folderResource = GetFolderResource(folderOutliner, i);
var msgFolder = folderResource.QueryInterface(Components.interfaces.nsIMsgFolder);
var open = msgFolder.getFlag(MSG_FOLDER_FLAG_ELIDED)
if (open)
{
view.toggleOpenState(i);
var isServer = GetFolderAttribute(folderOutliner, folderResource, "IsServer");
if (isServer == "true")
{
var server = msgFolder.server;
// Don't do this for imap servers. See bug #41943
if (server.type != "imap")
server.PerformExpand(msgWindow);
}
}
}
}
}
function loadStartFolder(initialUri)
{
OpenAndExpandElidedServers();
var folderOutliner = GetFolderOutliner();
var defaultServer = null;
var startFolderUri = initialUri;
var startFolderResource = null;
var isLoginAtStartUpEnabled = false;
var enabledNewMailCheckOnce = false;
var mailCheckOncePref = "mail.startup.enabledMailCheckOnce";
@ -446,7 +491,9 @@ function loadStartFolder(initialUri)
//First get default account
try
{
if(!startFolderUri)
if(initialUri)
startFolderResource = RDF.GetResource(initialUri);
else
{
var defaultAccount = accountManager.defaultAccount;
@ -454,8 +501,7 @@ function loadStartFolder(initialUri)
var rootFolder = defaultServer.RootFolder;
var rootMsgFolder = rootFolder.QueryInterface(Components.interfaces.nsIMsgFolder);
var folderResource = rootMsgFolder.QueryInterface(Components.interfaces.nsIRDFResource);
startFolderUri = folderResource.Value;
startFolderResource = rootMsgFolder.QueryInterface(Components.interfaces.nsIRDFResource);
enabledNewMailCheckOnce = pref.GetBoolPref(mailCheckOncePref);
@ -477,48 +523,40 @@ function loadStartFolder(initialUri)
//now find Inbox
var outNumFolders = new Object();
var inboxFolder = rootMsgFolder.getFoldersWithFlag(0x1000, 1, outNumFolders);
if(!inboxFolder) return;
if (!inboxFolder) return;
var resource = inboxFolder.QueryInterface(Components.interfaces.nsIRDFResource);
startFolderUri = resource.Value;
startFolderResource = inboxFolder.QueryInterface(Components.interfaces.nsIRDFResource);
}
}
var startFolder = document.getElementById(startFolderUri);
var startFolderIndex = GetFolderIndex(folderOutliner, startFolderResource);
//if it's not here we will have to make sure it's open.
if(!startFolder && startFolderUri && isLoginAtStartUpEnabled)
if(startFolderIndex < 0 && startFolderResource && isLoginAtStartUpEnabled)
{
// Opens the twisty for the default account
OpenTwistyForServer(defaultServer);
startFolder = document.getElementById(startFolderUri);
OpenTwistyForServer(folderOutliner, defaultServer);
startFolderIndex = GetFolderIndex(folderOutliner, startFolderResource);
}
var folderTree= GetFolderTree();
ChangeSelection(folderTree, startFolder);
ChangeSelection(folderOutliner, startFolderIndex);
// only do this on startup, when we pass in null
if (!initialUri && isLoginAtStartUpEnabled)
{
// Perform biff on the server to check for new mail, except for imap
if (defaultServer.type != "imap" )
if (defaultServer.type != "imap")
{
var localFolder = inboxFolder.QueryInterface(Components.interfaces.nsIMsgLocalMailFolder);
if (localFolder)
{
if (!localFolder.parsingInbox)
defaultServer.PerformBiff();
else
localFolder.checkForNewMessagesAfterParsing = true;
if (!localFolder.parsingInbox)
defaultServer.PerformBiff();
else
localFolder.checkForNewMessagesAfterParsing = true;
}
else //it can be only nntp
defaultServer.PerformBiff();
}
}
// because the "open" state persists, we'll call
// PerformExpand() for all servers that are open at startup.
PerformExpandForAllOpenServers(folderTree);
}
catch(ex)
{
@ -530,44 +568,32 @@ function loadStartFolder(initialUri)
{
MsgGetMessagesForAllServers(defaultServer);
}
}
function OpenTwistyForServer(server)
function OpenTwistyForServer(folderOutliner, server)
{
var treeNode = GetTreeNodeForServerURI(server.serverURI);
var folderIndex = GetFolderIndexForServerURI(folderOutliner, server.serverURI);
if (treeNode)
treeNode.setAttribute('open', 'true');
}
function GetTreeNodeForServerURI(serverURI)
{
var treeNode = null;
var tree = GetFolderTree();
// Iterate through folder tree to find the node associated with given serverURI
if ( tree && tree.childNodes ) {
for ( var i = tree.childNodes.length - 1; i >= 0; i-- ) {
var treechild = tree.childNodes[i];
if (treechild.localName == 'treechildren') {
var treeitems = treechild.childNodes;
for ( var j = treeitems.length - 1; j >= 0; j--) {
var isServer = treeitems[j].getAttribute('IsServer');
if (isServer == "true") {
var uri = treeitems[j].getAttribute('id');
if (uri == serverURI) {
treeNode = treeitems[j];
break;
}
}
}
}
}
if (folderIndex >= 0)
{
var isContainerOpen = folderOutliner.outlinerBoxObject.view.isContainerOpen(folderIndex);
if (! isContainerOpen)
folderOutliner.outlinerBoxObject.view.toggleOpenState(folderIndex);
}
return treeNode;
}
function GetFolderIndexForServerURI(folderOutliner, serverURI)
{
var folderResource = RDF.GetResource(serverURI);
var isServer = GetFolderAttribute(folderOutliner, folderResource, "IsServer");
if (isServer == "true")
{
var folderIndex = GetFolderIndex(folderOutliner, folderResource);
return folderIndex;
}
else
return -1;
}
function TriggerGetMessages(server)
@ -589,14 +615,10 @@ function AddToSession()
}
}
function InitPanes()
{
var folderTree = GetFolderTree();
if(folderTree)
OnLoadFolderPane(folderTree);
SetupCommandUpdateHandlers();
OnLoadFolderPane();
SetupCommandUpdateHandlers();
}
function InitializeDataSources()
@ -611,42 +633,67 @@ function InitializeDataSources()
SetupMoveCopyMenus('threadPaneContext-copyMenu', accountManagerDataSource, folderDataSource);
}
function OnLoadFolderPane(folderTree)
function OnFolderUnreadColAttrModified(event)
{
gFolderTree = folderTree;
SortFolderPane('FolderColumn', 'http://home.netscape.com/NC-rdf#FolderTreeName');
if (event.attrName == "hidden")
{
var folderNameCell = document.getElementById("folderNameCell");
var folderNameCol = document.getElementById("folderNameCol");
if (event.newValue == "true")
{
folderNameCell.setAttribute("label", "?folderTreeName");
folderNameCol.setAttribute("sort", "?folderTreeNameSort");
}
else if (event.attrChange == Components.interfaces.nsIDOMMutationEvent.REMOVAL)
{
folderNameCell.setAttribute("label", "?folderTreeSimpleName");
folderNameCol.setAttribute("sort", "?folderTreeSimpleNameSort");
}
}
}
//Add folderDataSource and accountManagerDataSource to folderPane
accountManagerDataSource = accountManagerDataSource.QueryInterface(Components.interfaces.nsIRDFDataSource);
folderDataSource = folderDataSource.QueryInterface(Components.interfaces.nsIRDFDataSource);
var database = GetFolderDatasource();
function OnLoadFolderPane()
{
var folderUnreadCol = document.getElementById("folderUnreadCol");
var hidden = folderUnreadCol.getAttribute("hidden");
if (!hidden)
{
var folderNameCell = document.getElementById("folderNameCell");
var folderNameCol = document.getElementById("folderNameCol");
folderNameCell.setAttribute("label", "?folderTreeSimpleName");
folderNameCol.setAttribute("sort", "?folderTreeSimpleNameSort");
}
folderUnreadCol.addEventListener("DOMAttrModified", OnFolderUnreadColAttrModified, false);
database.AddDataSource(accountManagerDataSource);
SortFolderPane("folderNameCol");
//Add folderDataSource and accountManagerDataSource to folderPane
accountManagerDataSource = accountManagerDataSource.QueryInterface(Components.interfaces.nsIRDFDataSource);
folderDataSource = folderDataSource.QueryInterface(Components.interfaces.nsIRDFDataSource);
var database = GetFolderDatasource();
database.AddDataSource(accountManagerDataSource);
database.AddDataSource(folderDataSource);
folderTree.setAttribute('ref', 'msgaccounts:/');
var folderOutliner = GetFolderOutliner();
folderOutliner.outlinerBoxObject.outlinerBody.setAttribute("ref", "msgaccounts:/");
var folderOutlinerBuilder = folderOutliner.outlinerBoxObject.outlinerBody.builder.QueryInterface(Components.interfaces.nsIXULOutlinerBuilder);
folderOutlinerBuilder.addObserver(folderObserver);
folderOutliner.addEventListener("click",FolderPaneOnClick,true);
}
function GetFolderDatasource()
{
var folderTree = GetFolderTree();
var db = folderTree.database;
if (!db) return false;
return db;
}
function OnLoadThreadPane(threadTree)
{
setTimeout("ShowThreads(false);", 0);
var folderOutliner = GetFolderOutliner();
return folderOutliner.outlinerBoxObject.outlinerBody.database;
}
/* Functions for accessing particular parts of the window*/
function GetFolderTree()
function GetFolderOutliner()
{
if (gFolderTree) return gFolderTree;
var folderTree = document.getElementById('folderTree');
gFolderTree = folderTree;
return folderTree;
if (! gFolderOutliner)
gFolderOutliner = document.getElementById("folderOutliner");
return gFolderOutliner;
}
function GetMessagePane()
@ -724,7 +771,8 @@ function ClearThreadPaneSelection()
if (gDBView) {
var outlinerView = gDBView.QueryInterface(Components.interfaces.nsIOutlinerView);
var outlinerSelection = outlinerView.selection;
outlinerSelection.clearSelection();
if (outlinerSelection)
outlinerSelection.clearSelection();
}
}
catch (ex) {
@ -746,113 +794,102 @@ function ClearMessagePane()
}
function GetSelectedFolder()
function GetSelectedFolderIndex()
{
try {
var tree = GetFolderTree();
var selection = tree.selectedItems;
if(selection.length > 0)
return selection[0];
else
return null;
}
catch (ex) {
return null;
}
var folderOutliner = GetFolderOutliner();
var startIndex = {};
var endIndex = {};
folderOutliner.outlinerBoxObject.selection.getRangeAt(0, startIndex, endIndex);
return startIndex.value;
}
function FolderPaneOnClick(event)
{
debug("in FolderPaneClick()\n");
// we only care about button 0 (left click) events
if (event.button != 0) return;
// we only care about button 0 (left click) events
if (event.button != 0)
return;
var t = event.originalTarget;
var item;
var uri;
var folderOutliner = GetFolderOutliner();
var row = {};
var col = {};
var elt = {};
folderOutliner.outlinerBoxObject.getCellAt(event.clientX, event.clientY, row, col, elt);
if (t.getAttribute('twisty') == 'true') {
// The twisty is nested three below the treeitem:
// <treeitem>
// <treerow>
// <treecell>
// <button class="tree-cell-twisty"> <!-- anonymous -->
var treeitem = t.parentNode.parentNode.parentNode;
var open = treeitem.getAttribute('open');
if(open == "true") {
//dump("twisty open\n");
if (elt.value == "twisty")
{
var folderResource = GetFolderResource(folderOutliner, row.value);
var msgFolder = folderResource.QueryInterface(Components.interfaces.nsIMsgFolder);
item = t.parentNode.parentNode.parentNode;
if (item.localName == "treeitem") {
var isServer = (treeitem.getAttribute('IsServer') == "true");
if (isServer) {
uri = treeitem.getAttribute("id");
var server = GetServer(uri);
if (server) {
server.PerformExpand(msgWindow);
}
}
else {
var isImap = (treeitem.getAttribute('ServerType') == "imap");
if (isImap) {
uri = treeitem.getAttribute("id");
var folder = GetMsgFolderFromUri(uri);
if (folder) {
var imapFolder = folder.QueryInterface(Components.interfaces.nsIMsgImapMailFolder);
if (imapFolder) {
imapFolder.performExpand(msgWindow);
}
}
}
}
}
}
if (folderOutliner.outlinerBoxObject.view.isContainerOpen(row.value))
msgFolder.clearFlag(MSG_FOLDER_FLAG_ELIDED);
else
{
msgFolder.setFlag(MSG_FOLDER_FLAG_ELIDED);
var isServer = GetFolderAttribute(folderOutliner, folderResource, "IsServer");
if (isServer == "true")
{
var server = msgFolder.server;
server.PerformExpand(msgWindow);
}
else
{
var serverType = GetFolderAttribute(folderOutliner, folderResource, "ServerType");
if (serverType == "imap")
{
var imapFolder = folderResource.QueryInterface(Components.interfaces.nsIMsgImapMailFolder);
imapFolder.performExpand(msgWindow);
}
}
}
}
else if ((event.originalTarget.localName == "outlinercol") ||
(event.originalTarget.localName == "scrollbarbutton")) {
// clicking on the name column in the folder pane should not sort
event.preventBubble();
}
else if (event.detail == 2) {
FolderPaneDoubleClick(row.value, event);
}
else if(event.detail == 2)
{
item = t.parentNode.parentNode;
if (item.localName == "treeitem")
FolderPaneDoubleClick(item);
}
}
function FolderPaneDoubleClick(treeitem)
function FolderPaneDoubleClick(folderIndex, event)
{
var isServer = false;
var folderOutliner = GetFolderOutliner();
var folderResource = GetFolderResource(folderOutliner, folderIndex);
var msgFolder = folderResource.QueryInterface(Components.interfaces.nsIMsgFolder);
var isServer = GetFolderAttribute(folderOutliner, folderResource, "IsServer");
if (treeitem) {
isServer = (treeitem.getAttribute('IsServer') == "true");
if (isServer) {
var open = treeitem.getAttribute('open');
if (open == "true") {
var uri = treeitem.getAttribute("id");
server = GetServer(uri);
if (server) {
// double clicking open, PerformExpand()
server.PerformExpand(msgWindow);
}
}
else {
// double clicking close, don't PerformExpand()
}
}
}
if (isServer == "true")
{
if (folderOutliner.outlinerBoxObject.view.isContainerOpen(folderIndex))
msgFolder.clearFlag(MSG_FOLDER_FLAG_ELIDED);
else
{
msgFolder.setFlag(MSG_FOLDER_FLAG_ELIDED);
var server = msgFolder.server;
server.PerformExpand(msgWindow);
}
}
else
{
// Open a new msg window only if we are double clicking on
// folders or newsgroups.
MsgOpenNewWindowForFolder(folderResource.Value);
// don't open a new msg window if we are double clicking on a server.
// only do it for folders or newsgroups
if (!isServer) {
MsgOpenNewWindowForFolder(treeitem.getAttribute('id'));
}
// double clicking should not toggle the open / close state of the
// folder. this will happen if we don't prevent the event from
// bubbling to the default handler in outliner.xml
event.preventBubble();
}
}
function ChangeSelection(tree, newSelection)
function ChangeSelection(outliner, newIndex)
{
if(newSelection)
{
tree.clearItemSelection();
tree.selectItem(newSelection);
tree.ensureElementIsVisible(newSelection);
}
if(newIndex >= 0)
{
outliner.outlinerBoxObject.selection.select(newIndex);
outliner.outlinerBoxObject.ensureRowIsVisible(newIndex);
}
}
function SetActiveThreadPaneSortColumn(column)
@ -876,27 +913,49 @@ function ClearActiveThreadPaneSortColumn()
}
function GetSelectedFolders()
{
var folderArray = [];
var k = 0;
var folderOutliner = GetFolderOutliner();
var rangeCount = folderOutliner.outlinerBoxObject.selection.getRangeCount();
for(var i = 0; i < rangeCount; i++)
{
var startIndex = {};
var endIndex = {};
folderOutliner.outlinerBoxObject.selection.getRangeAt(i, startIndex, endIndex);
for (var j = startIndex.value; j <= endIndex.value; j++)
{
var folderResource = GetFolderResource(folderOutliner, j);
folderArray[k++] = folderResource.Value;
}
}
return folderArray;
}
function GetSelectedMsgFolders()
{
var folderTree = GetFolderTree();
var selectedFolders = folderTree.selectedItems;
var numFolders = selectedFolders.length;
var folderArray = [];
var k = 0;
var folderOutliner = GetFolderOutliner();
var rangeCount = folderOutliner.outlinerBoxObject.selection.getRangeCount();
var folderArray = new Array(numFolders);
for(var i = 0; i < rangeCount; i++)
{
var startIndex = {};
var endIndex = {};
folderOutliner.outlinerBoxObject.selection.getRangeAt(i, startIndex, endIndex);
for (var j = startIndex.value; j <= endIndex.value; j++)
{
var msgFolder = GetFolderResource(folderOutliner, j).QueryInterface(Components.interfaces.nsIMsgFolder);
if(msgFolder)
folderArray[k++] = msgFolder;
}
}
for(var i = 0; i < numFolders; i++)
{
var folder = selectedFolders[i];
var folderUri = folder.getAttribute("id");
var folderResource = RDF.GetResource(folderUri);
var msgFolder = folderResource.QueryInterface(Components.interfaces.nsIMsgFolder);
if(msgFolder)
{
folderArray[i] = msgFolder;
}
}
return folderArray;
return folderArray;
}
function GetFirstSelectedMessage()
@ -962,25 +1021,22 @@ function ClearMessageSelection()
function GetCompositeDataSource(command)
{
if (command == "GetNewMessages" || command == "NewFolder" || command == "MarkAllMessagesRead")
{
return GetFolderDatasource();
}
return null;
}
function SetNextMessageAfterDelete()
{
//dump("setting next msg view index after delete to " + gDBView.msgToSelectAfterDelete + "\n");
gNextMessageViewIndexAfterDelete = gDBView.msgToSelectAfterDelete;
}
function SelectFolder(folderUri)
{
var tree = GetFolderTree();
var treeitem = document.getElementById(folderUri);
if(tree && treeitem)
ChangeSelection(tree, treeitem);
var folderOutliner = GetFolderOutliner();
var folderResource = RDF.GetResource(folderUri);
var folderIndex = GetFolderIndex(folderOutliner, folderResource);
ChangeSelection(folderOutliner, folderIndex);
}
function SelectMessage(messageUri)
@ -1003,12 +1059,31 @@ function SetBusyCursor(window, enable)
var numFrames = window.frames.length;
for(var i = 0; i < numFrames; i++)
{
SetBusyCursor(window.frames[i], enable);
}
}
function GetDBView()
{
return gDBView;
}
function GetFolderResource(outliner, index)
{
var outlinerBuilder = outliner.outlinerBoxObject.outlinerBody.builder.QueryInterface(Components.interfaces.nsIXULOutlinerBuilder);
return outlinerBuilder.getResourceAtIndex(index);
}
function GetFolderIndex(outliner, resource)
{
var outlinerBuilder = outliner.outlinerBoxObject.outlinerBody.builder.QueryInterface(Components.interfaces.nsIXULOutlinerBuilder);
return outlinerBuilder.getIndexOfResource(resource);
}
function GetFolderAttribute(outliner, source, attribute)
{
var property = RDF.GetResource("http://home.netscape.com/NC-rdf#" + attribute);
var target = outliner.outlinerBoxObject.outlinerBody.database.GetTarget(source, property, true);
if (target)
target = target.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
return target;
}

View File

@ -29,7 +29,9 @@ Contributors:
<?xul-overlay href="chrome://global/content/dialogOverlay.xul"?>
<!DOCTYPE window SYSTEM "chrome://messenger/locale/msgSynchronize.dtd" >
<window xmlns:NC="http://home.netscape.com/NC-rdf#"
<window xmlns:nc="http://home.netscape.com/NC-rdf#"
xmlns:html="http://www.w3.org/1999/xhtml"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
id="select-offline"
title="&MsgSelect.label;"
@ -42,12 +44,12 @@ Contributors:
<script src="chrome://global/content/strres.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/mailWindowOverlay.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/commandglue.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/msgSynchronize.js"/>
<stringbundle id="bundle_messenger" src="chrome://messenger/locale/messenger.properties"/>
<stringbundle id="bundle_brand" src="chrome://global/locale/brand.properties"/>
<script type="application/x-javascript" src="chrome://messenger/content/mailCommands.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/mailWindow.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/msgMail3PaneWindow.js"/>
<script type="application/x-javascript" src="chrome://messenger/content/msgSynchronize.js"/>
<keyset id="keyset"/>
<html class="desc">&MsgSelectDesc.label;</html>
@ -57,47 +59,62 @@ Contributors:
<rows>
<row flex="1">
<tree class="inset" flex="1" id="synchronizetree" datasources="rdf:null"
onclick="onSpaceClick(event);">
<outliner flex="1" id="synchronizeOutliner">
<outlinerbody flex="1" datasources="rdf:msgaccountmanager rdf:mailnewsfolders" ref="msgaccounts:/" onclick="onSynchronizeClick(event);">
<template>
<rule>
<conditions>
<outlinerrow uri="?container"/>
<member container="?container" child="?member"/>
<triple subject="?member" predicate="http://home.netscape.com/NC-rdf#SupportsOffline" object="true"/>
</conditions>
<template>
<rule NC:SupportsOffline="true">
<treechildren flex="1">
<treeitem class="folderTreeItem" uri="..."
SpecialFolder="rdf:http://home.netscape.com/NC-rdf#SpecialFolder"
IsServer="rdf:http://home.netscape.com/NC-rdf#IsServer"
ServerType="rdf:http://home.netscape.com/NC-rdf#ServerType"
Synchronize="rdf:http://home.netscape.com/NC-rdf#Synchronize">
<bindings>
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#FolderTreeName"
object="?folderTreeName" />
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#FolderTreeName?sort=true"
object="?folderTreeNameSort" />
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#SpecialFolder"
object="?specialFolder" />
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#IsServer"
object="?isServer" />
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#IsSecure"
object="?isSecure" />
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#ServerType"
object="?serverType" />
<binding subject="?member"
predicate="http://home.netscape.com/NC-rdf#Synchronize"
object="?synchronize" />
</bindings>
<action>
<outlinerrow uri="?member">
<outlinercell ref="folderNameCol"
label="?folderTreeName"
properties="specialFolder-?specialFolder
isServer-?isServer
isSecure-?isSecure
serverType-?serverType"/>
<outlinercell ref="syncCol"
properties="synchronize-?synchronize
isServer-?isServer"/>
</outlinerrow>
</action>
</rule>
</template>
</outlinerbody>
<treerow class="tree-folder-row" IsServer="rdf:http://home.netscape.com/NC-rdf#IsServer">
<treecell indent="true" class="treecell-indent tree-cell-folderpane-icon"
label="rdf:http://home.netscape.com/NC-rdf#FolderTreeName"
SpecialFolder="rdf:http://home.netscape.com/NC-rdf#SpecialFolder"
IsServer="rdf:http://home.netscape.com/NC-rdf#IsServer"
ServerType="rdf:http://home.netscape.com/NC-rdf#ServerType"/>
<treecell indent="true" allowevents="true" align="center">
<checkbox id="selectBox" checked="rdf:http://home.netscape.com/NC-rdf#Synchronize"
hidden="rdf:http://home.netscape.com/NC-rdf#SyncDisabled" class="tree-folder-checkbox"/>
</treecell>
</treerow>
</treeitem>
</treechildren>
</rule>
</template>
<outlinercol class="outlinercol-header outlinercol-inset-header" id="folderNameCol" flex="5" persist="hidden width" label="&MsgSelectItems.label;" primary="true" />
<splitter class="tree-splitter"/>
<outlinercol class="outlinercol-header outlinercol-inset-header" id="syncCol" flex="1" persist="hidden width" label="&MsgSelectInd.label;" />
</outliner>
<treecolgroup>
<treecol persist="hidden width" flex="5" id="SyncColumn" resource="http://home.netscape.com/NC-rdf#Synchronize"/>
<splitter class="tree-splitter"/>
<treecol persist="hidden width" flex="1" id="FolderColumn" resource="http://home.netscape.com/NC-rdf#FolderTreeName"/>
</treecolgroup>
<treehead>
<treerow>
<treecell class="treecell-header" label="&MsgSelectItems.label;"/>
<treecell class="treecell-header" label="&MsgSelectInd.label;"/>
</treerow>
</treehead>
</tree>
</row>
</rows>
</grid>

View File

@ -23,9 +23,14 @@ var gSyncMail = false;
var gSyncNews = false;
var gSendMessage = true;
var gWorkOffline = false;
var gSynchronizeTree = null;
var gSynchronizeOutliner = null;
var gAccountManager = null;
var gParentMsgWindow;
var gMsgWindow;
// RDF needs to be defined for GetFolderAttribute in msgMail3PaneWindow.js
var RDF = Components.classes['@mozilla.org/rdf/rdf-service;1'].getService().QueryInterface(Components.interfaces.nsIRDFService);
const MSG_FOLDER_FLAG_OFFLINE = 0x8000000;
function OnLoad()
@ -101,40 +106,26 @@ function selectOnLoad()
{
doSetOKCancel(selectOkButton,selectCancelButton);
msgWindow = Components.classes[msgWindowContractID].createInstance(Components.interfaces.nsIMsgWindow);
msgWindow.SetDOMWindow(window);
gMsgWindow = Components.classes[msgWindowContractID].createInstance(Components.interfaces.nsIMsgWindow);
gMsgWindow.SetDOMWindow(window);
gAccountManager = Components.classes["@mozilla.org/messenger/account-manager;1"].getService(Components.interfaces.nsIMsgAccountManager);
gSynchronizeTree = document.getElementById('synchronizetree');
gSynchronizeOutliner = document.getElementById('synchronizeOutliner');
// Add folderDataSource and accountManagerDataSource to tree datatbase
var datasourceContractIDPrefix = "@mozilla.org/rdf/datasource;1?name=";
var accountManagerDSContractID = datasourceContractIDPrefix + "msgaccountmanager";
var folderDSContractID = datasourceContractIDPrefix + "mailnewsfolders";
var accountManagerDataSource = Components.classes[accountManagerDSContractID].createInstance();
var folderDataSource = Components.classes[folderDSContractID].createInstance();
accountManagerDataSource = accountManagerDataSource.QueryInterface(Components.interfaces.nsIRDFDataSource);
folderDataSource = folderDataSource.QueryInterface(Components.interfaces.nsIRDFDataSource);
gSynchronizeTree.database.AddDataSource(accountManagerDataSource);
gSynchronizeTree.database.AddDataSource(folderDataSource);
gSynchronizeTree.setAttribute('ref', 'msgaccounts:/');
SetServerOpen();
SortFolder('FolderColumn', 'http://home.netscape.com/NC-rdf#FolderTreeName');
LoadSyncTree();
SortSynchronizePane('folderNameCol', '?folderTreeNameSort');
}
function SortFolder(column, sortKey)
function SortSynchronizePane(column, sortKey)
{
var node = FindInWindow(window, column);
if(!node) {
dump('Couldnt find sort column\n');
return false;
}
SortColumn(node, sortKey, null, null);
node.setAttribute("sortActive", "false");
return true;
node.setAttribute("sort", sortKey);
node.setAttribute("sortDirection", "natural");
gSynchronizeOutliner.outlinerBoxObject.view.cycleHeader(column, node);
}
function FindInWindow(currentWindow, id)
@ -153,88 +144,53 @@ function FindInWindow(currentWindow, id)
}
function LoadSyncTree()
function onSynchronizeClick(event)
{
var allServers = gAccountManager.allServers;
for (var i=0;i<allServers.Count();i++) {
// we only care about button 0 (left click) events
if (event.button != 0)
return;
var currentServer = allServers.GetElementAt(i).QueryInterface(Components.interfaces.nsIMsgIncomingServer);
var rootURI = currentServer.serverURI;
var rootFolder = currentServer.RootFolder;
var row = {}
var col = {}
var elt = {}
var rootMsgFolder = rootFolder.QueryInterface(Components.interfaces.nsIMsgFolder);
var rootFolderResource = rootMsgFolder.QueryInterface(Components.interfaces.nsIRDFResource);
gSynchronizeOutliner.outlinerBoxObject.getCellAt(event.clientX, event.clientY, row, col, elt);
if(currentServer.type == "imap"){
var imapFolder = rootMsgFolder.QueryInterface(Components.interfaces.nsIMsgImapMailFolder)
imapFolder.performExpand(msgWindow);
}
else if(currentServer.type == "nntp") {
currentServer.PerformExpand(msgWindow);
}
}
}
if (elt.value == "twisty") {
var folderResource = GetFolderResource(gSynchronizeOutliner, row.value);
var msgFolder = folderResource.QueryInterface(Components.interfaces.nsIMsgFolder);
function SetServerOpen()
{
if ( gSynchronizeTree && gSynchronizeTree.childNodes ) {
for ( var i = gSynchronizeTree.childNodes.length - 1; i >= 0; i-- ) {
var treechild = gSynchronizeTree.childNodes[i];
if (treechild.localName == 'treechildren') {
var treeitems = treechild.childNodes;
for ( var j = treeitems.length - 1; j >= 0; j--) {
var isServer = treeitems[j].getAttribute("IsServer");
if (isServer) {
if(treeitems[j].getAttribute('ServerType') == "imap" ||
treeitems[j].getAttribute('ServerType') == "nntp") {
treeitems[j].setAttribute('open', true);
}
else {
treeitems[j].setAttribute('open', false);
}
}
if (!(gSynchronizeOutliner.outlinerBoxObject.view.isContainerOpen(row.value))) {
var serverType = GetFolderAttribute(gSynchronizeOutliner, folderResource, "ServerType");
// imap is the only server type that does folder discovery
if (serverType != "imap") return;
if (GetFolderAttribute(gSynchronizeOutliner, folderResource, "IsServer") == "true") {
var server = msgFolder.server;
server.PerformExpand(gMsgWindow);
}
else {
var imapFolder = folderResource.QueryInterface(Components.interfaces.nsIMsgImapMailFolder);
if (imapFolder) {
imapFolder.performExpand(gMsgWindow);
}
}
}
}
}
function onSpaceClick(event)
{
// if click checkbox, reverse selected status,
var t = event.originalTarget;
if (t.localName == "checkbox") {
var node = t.parentNode.parentNode.parentNode;
if (node.localName == "treeitem") {
var nodeType = node.getAttribute("ServerType");
if(nodeType =="imap" || nodeType =="nntp")
UpdateNode(node, t);
}
else {
if (col.value == "syncCol") {
UpdateNode(GetFolderResource(gSynchronizeOutliner, row.value), row.value);
}
}
}
function UpdateNode(node, target)
function UpdateNode(resource, row)
{
var folder = null;
var uri = node.getAttribute("id");
if(uri)
folder = GetMsgFolderFromUri(uri);
if(folder) {
var folder = resource.QueryInterface(Components.interfaces.nsIMsgFolder);
if(folder.isServer) {
target.setAttribute('value', false);
return;
}
if (folder.isServer)
return;
var oldFlag = folder.getFlag(MSG_FOLDER_FLAG_OFFLINE);
if(!oldFlag) {
folder.setFlag(MSG_FOLDER_FLAG_OFFLINE);
}
else {
folder.clearFlag(MSG_FOLDER_FLAG_OFFLINE);
}
}
var oldFlag = folder.toggleFlag(MSG_FOLDER_FLAG_OFFLINE);
}

View File

@ -55,6 +55,10 @@ function ThreadPaneOnClick(event)
var col = document.getElementById(colID.value);
if (col && col.getAttribute("cycler") != "true" && (childElt.value != "twisty")) {
ThreadPaneDoubleClick();
// double clicking should not toggle the open / close state of the
// thread. this will happen if we don't prevent the event from
// bubbling to the default handler in outliner.xml
event.preventBubble();
}
}
}
@ -116,17 +120,17 @@ function MsgComposeDraftMessage()
function ThreadPaneDoubleClick()
{
if (IsSpecialFolderSelected(MSG_FOLDER_FLAG_DRAFTS)) {
MsgComposeDraftMessage();
}
else if(IsSpecialFolderSelected(MSG_FOLDER_FLAG_TEMPLATES)) {
var loadedFolder = GetLoadedMsgFolder();
var messageArray = GetSelectedMessages();
ComposeMessage(msgComposeType.Template, msgComposeFormat.Default, loadedFolder, messageArray);
}
else {
MsgOpenSelectedMessages();
}
if (IsSpecialFolderSelected(MSG_FOLDER_FLAG_DRAFTS)) {
MsgComposeDraftMessage();
}
else if(IsSpecialFolderSelected(MSG_FOLDER_FLAG_TEMPLATES)) {
var loadedFolder = GetLoadedMsgFolder();
var messageArray = GetSelectedMessages();
ComposeMessage(msgComposeType.Template, msgComposeFormat.Default, loadedFolder, messageArray);
}
else {
MsgOpenSelectedMessages();
}
}
function ThreadPaneKeyPress(event)
@ -294,3 +298,11 @@ function EnsureRowInThreadOutlinerIsVisible(index)
var outliner = GetThreadOutliner();
outliner.boxObject.QueryInterface(Components.interfaces.nsIOutlinerBoxObject).ensureRowIsVisible(index);
}
function ThreadPaneOnLoad()
{
var outliner = GetThreadOutliner();
outliner.addEventListener("click",ThreadPaneOnClick,true);
}
addEventListener("load",ThreadPaneOnLoad,true);

View File

@ -31,9 +31,6 @@ Rights Reserved.
<script src="chrome://messenger/content/threadPane.js"/>
<outliner id="threadOutliner" flex="1"
ondraggesture="return BeginDragThreadPane(event);"
ondragdrop="return DropOnThreadPane(event);"
onclick="ThreadPaneOnClick(event);"
onkeypress="ThreadPaneKeyPress(event);">
<outlinercol id="threadCol" display="&threadColumn.label;" class="outlinercol-header outlinercol-image outlinercol-inset-header threadColumnHeader" currentView="unthreaded" cycler="true" persist="hidden" fixed="true" />
<outlinercol id="subjectCol" class="outlinercol-header outlinercell-inset-header sortDirectionIndicator" persist="hidden width" flex="7" label="&subjectColumn.label;" primary="true"/>
@ -56,7 +53,9 @@ Rights Reserved.
<splitter class="tree-splitter"/>
<outlinercol id="totalCol" class="outlinercol-header outlinercol-inset-header sortDirectionIndicator" persist="hidden width" flex="1" label="&totalColumn.label;"/>
<outlinercol id="locationCol" class="outlinercol-header outlinercol-inset-header sortDirectionIndicator" persist="width" flex="1" hidden="true" ignoreincolumnpicker="true" label="&locationColumn.label;"/>
<outlinerbody id ="threadOutlinerBody" flex="1" onselect="this.parentNode.outlinerBoxObject.view.selectionChanged();"/>
<outlinerbody flex="1"
onselect="this.parentNode.outlinerBoxObject.view.selectionChanged();"
ondraggesture="return BeginDragThreadPane(event);"/>
</outliner>
</overlay>

View File

@ -16,6 +16,10 @@
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998-1999 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* Jan Varga (varga@utcru.sk)
* Håkan Waara (hwaara@chello.se)
*/
/*
@ -42,45 +46,26 @@ function ConvertDOMListToResourceArray(nodeList)
function GetSelectedFolderURI()
{
var uri = null;
var selectedFolder = null;
try {
var folderTree = GetFolderTree();
var selectedFolderList = folderTree.selectedItems;
// you can only select one folder / server to add new folder / subscribe to
if (selectedFolderList.length == 1) {
selectedFolder = selectedFolderList[0];
}
else {
//dump("number of selected folder was " + selectedFolderList.length + "\n");
}
}
catch (ex) {
// dump("failed to get the selected folder\n");
uri = null;
}
var folderOutliner = GetFolderOutliner();
var selection = folderOutliner.outlinerBoxObject.selection;
if (selection.count == 1)
{
var startIndex = {};
var endIndex = {};
selection.getRangeAt(0, startIndex, endIndex);
var folderResource = GetFolderResource(folderOutliner, startIndex.value);
return folderResource.Value;
}
try {
if (selectedFolder) {
uri = selectedFolder.getAttribute('id');
// dump("folder to preselect: " + preselectedURI + "\n");
}
}
catch (ex) {
uri = null;
}
return uri;
return null;
}
function MsgRenameFolder()
{
var preselectedURI = GetSelectedFolderURI();
var folderTree = GetFolderTree();
var folderOutliner = GetFolderOutliner();
var name = GetFolderNameFromUri(preselectedURI, folderTree);
var name = GetFolderNameFromUri(preselectedURI, folderOutliner);
dump("preselectedURI = " + preselectedURI + "\n");
var dialog = window.openDialog(
@ -94,8 +79,8 @@ function MsgRenameFolder()
function RenameFolder(name,uri)
{
dump("uri,name = " + uri + "," + name + "\n");
var folderTree = GetFolderTree();
if (folderTree)
var folderOutliner = GetFolderOutliner();
if (folderOutliner)
{
if (uri && (uri != "") && name && (name != "")) {
var selectedFolder = GetResourceFromUri(uri);
@ -111,7 +96,7 @@ function RenameFolder(name,uri)
ClearThreadPane();
ClearMessagePane();
folderTree.clearItemSelection();
folderOutliner.outlinerBoxObject.selection.clearSelection();
}
else {
dump("no name or nothing selected\n");
@ -124,106 +109,73 @@ function RenameFolder(name,uri)
function MsgEmptyTrash()
{
var tree = GetFolderTree();
if (tree)
var folderOutliner = GetFolderOutliner();
var startIndex = {};
var endIndex = {};
folderOutliner.outlinerBoxObject.selection.getRangeAt(0, startIndex, endIndex);
if (startIndex.value >= 0)
{
var folderList = tree.selectedItems;
if (folderList)
{
var folder;
folder = folderList[0];
if (folder)
{
var trashUri = GetSelectTrashUri(folder);
if (trashUri)
{
var trashElement = document.getElementById(trashUri);
if (trashElement)
{
dump ('found trash folder\n');
trashElement.setAttribute('open','');
}
var trashSelected = IsSpecialFolderSelected(MSG_FOLDER_FLAG_TRASH);
if(trashSelected)
{
tree.clearItemSelection();
}
try {
messenger.EmptyTrash(tree.database, folder.resource);
}
catch(e)
{
dump ("Exception : messenger.EmptyTrash \n");
}
if (trashSelected)
{
trashElement = document.getElementById(trashUri);
if (trashElement)
ChangeSelection(tree, trashElement);
}
}
}
var folderResource = GetFolderResource(folderOutliner, startIndex.value);
try {
messenger.EmptyTrash(GetFolderDatasource(), folderResource);
}
catch(e)
{
dump ("Exception : messenger.EmptyTrash \n");
}
}
}
function MsgCompactFolder(isAll)
{
//get the selected elements
var tree = GetFolderTree();
if (tree)
{
var folderList = tree.selectedItems;
if (folderList)
{
var folder = folderList[0];
if (folder)
{
dump("folder = " + folder.localName + "\n");
var selectedFolderUri = folder.getAttribute('id');
var isImap=false;
if (selectedFolderUri.indexOf("imap:") != -1)
isImap = true;
if (!isImap) //can be local only
{
var resource = RDF.GetResource(selectedFolderUri);
var msgfolder = resource.QueryInterface(Components.interfaces.nsIMsgFolder);
var expungedBytes = msgfolder.expungedBytes;
// Get the selected folders.
var selectedFolders = GetSelectedMsgFolders();
if (expungedBytes > 0)
{
if (gDBView)
gCurrentlyDisplayedMessage = gDBView.currentlyDisplayedMessage;
ClearThreadPaneSelection();
ClearThreadPane();
ClearMessagePane();
}
else
{
if (!isAll) //you have one local folder with no room to compact
return;
}
}
try
{
messenger.CompactFolder(tree.database, folder.resource, isAll);
}
catch(e)
{
dump ("Exception : messenger.CompactFolder \n");
}
}
}
if (selectedFolders.length == 1)
{
var selectedFolder = selectedFolders[0];
var resource = selectedFolder.QueryInterface(Components.interfaces.nsIRDFResource);
if (selectedFolder.server.type != "imap") //can be local only
{
var msgfolder = resource.QueryInterface(Components.interfaces.nsIMsgFolder);
var expungedBytes = msgfolder.expungedBytes;
if (expungedBytes > 0)
{
if (gDBView)
{
gCurrentlyDisplayedMessage = gDBView.currentlyDisplayedMessage;
}
ClearThreadPaneSelection();
ClearThreadPane();
ClearMessagePane();
}
else
{
if (!isAll) //you have one local folder with no room to compact
return;
}
}
try
{
messenger.CompactFolder(GetFolderDatasource(), resource, isAll);
}
catch(ex)
{
dump("Exception : messenger.CompactFolder : " + ex + "\n");
}
}
}
function MsgFolderProperties()
{
var preselectedURI = GetSelectedFolderURI();
var serverType = GetMsgFolderFromUri(preselectedURI).server.type;
var folderTree = GetFolderTree();
var folderOutliner = GetFolderOutliner();
var name = GetFolderNameFromUri(preselectedURI, folderTree);
var name = GetFolderNameFromUri(preselectedURI, folderOutliner);
var windowTitle = gMessengerBundle.getString("folderProperties");
var dialog = window.openDialog(
@ -231,7 +183,7 @@ function MsgFolderProperties()
"",
"chrome,centerscreen,titlebar,modal",
{preselectedURI:preselectedURI, serverType:serverType,
msgWindow:msgWindow, title:windowTitle,
msgWindow:msgWindow, title:windowTitle,
okCallback:FolderProperties,
tabID:"", tabIndex:0, name:name});
}

View File

@ -343,6 +343,8 @@ Rights Reserved.
<!ENTITY editMsgAsNewCmd.key "e">
<!ENTITY moveMsgMenu.label "Move Message">
<!ENTITY moveMsgMenu.accesskey "M">
<!ENTITY copyMessageLocation.label "Copy Message Location">
<!ENTITY copyMessageLocation.accesskey "M">
<!ENTITY copyMsgMenu.label "Copy Message">
<!ENTITY copyMsgMenu.accesskey "C">
<!ENTITY killThreadMenu.label "Ignore Thread">
@ -377,8 +379,10 @@ Rights Reserved.
<!ENTITY openMessageWindowCmd.accesskey "O">
<!ENTITY openMessageWindowCmd.key "o">
<!-- Sidebar -->
<!ENTITY mail-sidebar-header.label "Mail Folders">
<!-- Folder Pane -->
<!ENTITY nameColumn.label "Name">
<!ENTITY unreadColumn.label "Unread">
<!ENTITY totalColumn.label "Total">
<!-- Toolbar items -->
<!ENTITY getMsgButton.label "Get Msg">

View File

@ -76,8 +76,10 @@ nsIRDFResource* nsMsgAccountManagerDataSource::kNC_AccountRoot=nsnull;
// attributes of accounts
nsIRDFResource* nsMsgAccountManagerDataSource::kNC_Name=nsnull;
nsIRDFResource* nsMsgAccountManagerDataSource::kNC_FolderTreeName=nsnull;
nsIRDFResource* nsMsgAccountManagerDataSource::kNC_FolderTreeSimpleName=nsnull;
nsIRDFResource* nsMsgAccountManagerDataSource::kNC_NameSort=nsnull;
nsIRDFResource* nsMsgAccountManagerDataSource::kNC_FolderTreeNameSort=nsnull;
nsIRDFResource* nsMsgAccountManagerDataSource::kNC_FolderTreeSimpleNameSort=nsnull;
nsIRDFResource* nsMsgAccountManagerDataSource::kNC_PageTag=nsnull;
nsIRDFResource* nsMsgAccountManagerDataSource::kNC_IsDefaultServer=nsnull;
nsIRDFResource* nsMsgAccountManagerDataSource::kNC_SupportsFilters=nsnull;
@ -135,8 +137,10 @@ nsMsgAccountManagerDataSource::nsMsgAccountManagerDataSource()
getRDFService()->GetResource(NC_RDF_CHILD, &kNC_Child);
getRDFService()->GetResource(NC_RDF_NAME, &kNC_Name);
getRDFService()->GetResource(NC_RDF_FOLDERTREENAME, &kNC_FolderTreeName);
getRDFService()->GetResource(NC_RDF_FOLDERTREESIMPLENAME, &kNC_FolderTreeSimpleName);
getRDFService()->GetResource(NC_RDF_NAME_SORT, &kNC_NameSort);
getRDFService()->GetResource(NC_RDF_FOLDERTREENAME_SORT, &kNC_FolderTreeNameSort);
getRDFService()->GetResource(NC_RDF_FOLDERTREESIMPLENAME_SORT, &kNC_FolderTreeSimpleNameSort);
getRDFService()->GetResource(NC_RDF_PAGETAG, &kNC_PageTag);
getRDFService()->GetResource(NC_RDF_ISDEFAULTSERVER, &kNC_IsDefaultServer);
getRDFService()->GetResource(NC_RDF_SUPPORTSFILTERS, &kNC_SupportsFilters);
@ -177,8 +181,10 @@ nsMsgAccountManagerDataSource::~nsMsgAccountManagerDataSource()
NS_IF_RELEASE(kNC_Child);
NS_IF_RELEASE(kNC_Name);
NS_IF_RELEASE(kNC_FolderTreeName);
NS_IF_RELEASE(kNC_FolderTreeSimpleName);
NS_IF_RELEASE(kNC_NameSort);
NS_IF_RELEASE(kNC_FolderTreeNameSort);
NS_IF_RELEASE(kNC_FolderTreeSimpleNameSort);
NS_IF_RELEASE(kNC_PageTag);
NS_IF_RELEASE(kNC_IsDefaultServer);
NS_IF_RELEASE(kNC_SupportsFilters);
@ -269,7 +275,7 @@ nsMsgAccountManagerDataSource::GetTarget(nsIRDFResource *source,
rv = NS_RDF_NO_VALUE;
nsAutoString str;
if (property == kNC_Name || property == kNC_FolderTreeName) {
if (property == kNC_Name || property == kNC_FolderTreeName || property == kNC_FolderTreeSimpleName) {
rv = getStringBundle();
NS_ENSURE_SUCCESS(rv, rv);
@ -343,7 +349,8 @@ nsMsgAccountManagerDataSource::GetTarget(nsIRDFResource *source,
// handle sorting of servers
else if ((property == kNC_NameSort) ||
(property == kNC_FolderTreeNameSort)) {
(property == kNC_FolderTreeNameSort) ||
(property == kNC_FolderTreeSimpleNameSort)) {
// make sure we're handling a root folder that is a server
nsCOMPtr<nsIMsgIncomingServer> server;
@ -644,8 +651,10 @@ nsMsgAccountManagerDataSource::getAccountArcs(nsISupportsArray **aResult)
mAccountArcsOut->AppendElement(kNC_Settings);
mAccountArcsOut->AppendElement(kNC_Name);
mAccountArcsOut->AppendElement(kNC_FolderTreeName);
mAccountArcsOut->AppendElement(kNC_FolderTreeSimpleName);
mAccountArcsOut->AppendElement(kNC_NameSort);
mAccountArcsOut->AppendElement(kNC_FolderTreeNameSort);
mAccountArcsOut->AppendElement(kNC_FolderTreeSimpleNameSort);
mAccountArcsOut->AppendElement(kNC_PageTag);
}
@ -669,8 +678,10 @@ nsMsgAccountManagerDataSource::getAccountRootArcs(nsISupportsArray **aResult)
mAccountRootArcsOut->AppendElement(kNC_Settings);
mAccountRootArcsOut->AppendElement(kNC_Name);
mAccountRootArcsOut->AppendElement(kNC_FolderTreeName);
mAccountRootArcsOut->AppendElement(kNC_FolderTreeSimpleName);
mAccountRootArcsOut->AppendElement(kNC_NameSort);
mAccountRootArcsOut->AppendElement(kNC_FolderTreeNameSort);
mAccountRootArcsOut->AppendElement(kNC_FolderTreeSimpleNameSort);
mAccountRootArcsOut->AppendElement(kNC_PageTag);
}

View File

@ -106,8 +106,10 @@ protected:
static nsIRDFResource* kNC_Name;
static nsIRDFResource* kNC_FolderTreeName;
static nsIRDFResource* kNC_FolderTreeSimpleName;
static nsIRDFResource* kNC_NameSort;
static nsIRDFResource* kNC_FolderTreeNameSort;
static nsIRDFResource* kNC_FolderTreeSimpleNameSort;
static nsIRDFResource* kNC_PageTag;
static nsIRDFResource* kNC_IsDefaultServer;
static nsIRDFResource* kNC_SupportsFilters;

View File

@ -834,7 +834,7 @@ NS_IMETHODIMP nsMsgDBView::HasNextSibling(PRInt32 rowIndex, PRInt32 afterIndex,
PRInt32 i;
PRInt32 count;
GetRowCount(&count);
for(i = afterIndex + 1; i < count - 1; i++) {
for(i = afterIndex + 1; i < count; i++) {
PRInt32 l;
GetLevel(i, &l);
if (l < rowIndexLevel)

View File

@ -52,12 +52,13 @@ static NS_DEFINE_CID(kMsgMailSessionCID, NS_MSGMAILSESSION_CID);
static NS_DEFINE_CID(kMsgCopyServiceCID, NS_MSGCOPYSERVICE_CID);
nsIRDFResource* nsMsgFolderDataSource::kNC_Child = nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_MessageChild = nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_Folder= nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_Name= nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_FolderTreeName= nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_FolderTreeSimpleName= nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_NameSort= nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_FolderTreeNameSort= nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_FolderTreeSimpleNameSort= nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_SpecialFolder= nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_ServerType = nsnull;
nsIRDFResource* nsMsgFolderDataSource::kNC_CanCreateFoldersOnServer = nsnull;
@ -103,6 +104,8 @@ nsIAtom * nsMsgFolderDataSource::kNewMessagesAtom = nsnull;
nsIAtom * nsMsgFolderDataSource::kTotalMessagesAtom = nsnull;
nsIAtom * nsMsgFolderDataSource::kTotalUnreadMessagesAtom = nsnull;
nsIAtom * nsMsgFolderDataSource::kNameAtom = nsnull;
nsIAtom * nsMsgFolderDataSource::kSynchronizeAtom = nsnull;
nsMsgFolderDataSource::nsMsgFolderDataSource()
{
@ -111,12 +114,13 @@ nsMsgFolderDataSource::nsMsgFolderDataSource()
if (gFolderResourceRefCnt++ == 0) {
rdf->GetResource(NC_RDF_CHILD, &kNC_Child);
rdf->GetResource(NC_RDF_MESSAGECHILD, &kNC_MessageChild);
rdf->GetResource(NC_RDF_FOLDER, &kNC_Folder);
rdf->GetResource(NC_RDF_NAME, &kNC_Name);
rdf->GetResource(NC_RDF_FOLDERTREENAME, &kNC_FolderTreeName);
rdf->GetResource(NC_RDF_FOLDERTREESIMPLENAME, &kNC_FolderTreeSimpleName);
rdf->GetResource(NC_RDF_NAME_SORT, &kNC_NameSort);
rdf->GetResource(NC_RDF_FOLDERTREENAME_SORT, &kNC_FolderTreeNameSort);
rdf->GetResource(NC_RDF_FOLDERTREESIMPLENAME_SORT, &kNC_FolderTreeSimpleNameSort);
rdf->GetResource(NC_RDF_SPECIALFOLDER, &kNC_SpecialFolder);
rdf->GetResource(NC_RDF_SERVERTYPE, &kNC_ServerType);
rdf->GetResource(NC_RDF_CANCREATEFOLDERSONSERVER, &kNC_CanCreateFoldersOnServer);
@ -159,8 +163,9 @@ nsMsgFolderDataSource::nsMsgFolderDataSource()
kTotalMessagesAtom = NS_NewAtom("TotalMessages");
kTotalUnreadMessagesAtom = NS_NewAtom("TotalUnreadMessages");
kBiffStateAtom = NS_NewAtom("BiffState");
kNewMessagesAtom = NS_NewAtom("NewMessages");
kNameAtom = NS_NewAtom("Name");
kNewMessagesAtom = NS_NewAtom("NewMessages");
kNameAtom = NS_NewAtom("Name");
kSynchronizeAtom = NS_NewAtom("Synchronize");
}
CreateLiterals(rdf);
@ -174,12 +179,13 @@ nsMsgFolderDataSource::~nsMsgFolderDataSource (void)
{
nsrefcnt refcnt;
NS_RELEASE2(kNC_Child, refcnt);
NS_RELEASE2(kNC_MessageChild, refcnt);
NS_RELEASE2(kNC_Folder, refcnt);
NS_RELEASE2(kNC_Name, refcnt);
NS_RELEASE2(kNC_FolderTreeName, refcnt);
NS_RELEASE2(kNC_FolderTreeSimpleName, refcnt);
NS_RELEASE2(kNC_NameSort, refcnt);
NS_RELEASE2(kNC_FolderTreeNameSort, refcnt);
NS_RELEASE2(kNC_FolderTreeSimpleNameSort, refcnt);
NS_RELEASE2(kNC_SpecialFolder, refcnt);
NS_RELEASE2(kNC_ServerType, refcnt);
NS_RELEASE2(kNC_CanCreateFoldersOnServer, refcnt);
@ -223,6 +229,7 @@ nsMsgFolderDataSource::~nsMsgFolderDataSource (void)
NS_RELEASE(kBiffStateAtom);
NS_RELEASE(kNewMessagesAtom);
NS_RELEASE(kNameAtom);
NS_RELEASE(kSynchronizeAtom);
}
}
@ -405,6 +412,7 @@ NS_IMETHODIMP nsMsgFolderDataSource::GetTargets(nsIRDFResource* source,
}
else if ((kNC_Name == property) ||
(kNC_FolderTreeName == property) ||
(kNC_FolderTreeSimpleName == property) ||
(kNC_SpecialFolder == property) ||
(kNC_IsServer == property) ||
(kNC_IsSecure == property) ||
@ -495,6 +503,7 @@ nsMsgFolderDataSource::HasArcOut(nsIRDFResource *aSource, nsIRDFResource *aArc,
if (NS_SUCCEEDED(rv)) {
*result = (aArc == kNC_Name ||
aArc == kNC_FolderTreeName ||
aArc == kNC_FolderTreeSimpleName ||
aArc == kNC_SpecialFolder ||
aArc == kNC_ServerType ||
aArc == kNC_CanCreateFoldersOnServer ||
@ -557,6 +566,7 @@ nsMsgFolderDataSource::getFolderArcLabelsOut(nsISupportsArray **arcs)
(*arcs)->AppendElement(kNC_Name);
(*arcs)->AppendElement(kNC_FolderTreeName);
(*arcs)->AppendElement(kNC_FolderTreeSimpleName);
(*arcs)->AppendElement(kNC_SpecialFolder);
(*arcs)->AppendElement(kNC_ServerType);
(*arcs)->AppendElement(kNC_CanCreateFoldersOnServer);
@ -867,23 +877,25 @@ nsMsgFolderDataSource::OnItemBoolPropertyChanged(nsISupports *item,
PRBool oldValue,
PRBool newValue)
{
nsCOMPtr<nsIMsgFolder> folder(do_QueryInterface(item));
if(folder)
{
nsCOMPtr<nsIRDFResource> resource(do_QueryInterface(item));
if(resource)
{
if (kNewMessagesAtom == property)
{
if (newValue != oldValue) {
nsIRDFNode* newMessagesNode = newValue?kTrueLiteral:kFalseLiteral;
NotifyPropertyChanged(resource, kNC_NewMessages, newMessagesNode);
}
}
}
}
nsresult rv = NS_OK;
return NS_OK;
nsCOMPtr<nsIMsgFolder> folder(do_QueryInterface(item));
if (!folder) return rv;
nsCOMPtr<nsIRDFResource> resource(do_QueryInterface(item));
if (!item) return rv;
if (newValue != oldValue) {
nsIRDFNode* literalNode = newValue?kTrueLiteral:kFalseLiteral;
if (kNewMessagesAtom == property) {
NotifyPropertyChanged(resource, kNC_NewMessages, literalNode);
}
else if (kSynchronizeAtom == property) {
NotifyPropertyChanged(resource, kNC_Synchronize, literalNode);
}
}
return rv;
}
NS_IMETHODIMP
@ -937,15 +949,19 @@ nsresult nsMsgFolderDataSource::createFolderNode(nsIMsgFolder* folder,
nsresult rv = NS_RDF_NO_VALUE;
if (kNC_NameSort == property)
rv = createFolderNameNode(folder, target, PR_TRUE);
rv = createFolderNameNode(folder, target, PR_TRUE);
else if(kNC_FolderTreeNameSort == property)
rv = createFolderTreeNameNode(folder, target, PR_TRUE);
rv = createFolderTreeNameNode(folder, target, PR_TRUE);
else if(kNC_FolderTreeSimpleNameSort == property)
rv = createFolderTreeSimpleNameNode(folder, target, PR_TRUE);
else if (kNC_Name == property)
rv = createFolderNameNode(folder, target, PR_FALSE);
rv = createFolderNameNode(folder, target, PR_FALSE);
else if (kNC_FolderTreeName == property)
rv = createFolderTreeNameNode(folder, target, PR_FALSE);
rv = createFolderTreeNameNode(folder, target, PR_FALSE);
else if (kNC_FolderTreeSimpleName == property)
rv = createFolderTreeSimpleNameNode(folder, target, PR_FALSE);
else if ((kNC_SpecialFolder == property))
rv = createFolderSpecialNode(folder,target);
rv = createFolderSpecialNode(folder,target);
else if ((kNC_ServerType == property))
rv = createFolderServerTypeNode(folder, target);
else if ((kNC_CanCreateFoldersOnServer == property))
@ -1040,6 +1056,20 @@ nsresult nsMsgFolderDataSource::createFolderTreeNameNode(nsIMsgFolder *folder,
return NS_OK;
}
nsresult nsMsgFolderDataSource::createFolderTreeSimpleNameNode(nsIMsgFolder * folder, nsIRDFNode **target, PRBool sort)
{
nsXPIDLString name;
nsresult rv = folder->GetAbbreviatedName(getter_Copies(name));
if (NS_FAILED(rv)) return rv;
nsAutoString nameString(name);
if(sort)
{
CreateNameSortString(folder, nameString);
}
createNode(nameString, target, getRDFService());
return NS_OK;
}
nsresult nsMsgFolderDataSource::CreateNameSortString(nsIMsgFolder *folder, nsAutoString &name)
{
PRInt32 order;
@ -1564,7 +1594,6 @@ nsMsgFolderDataSource::NotifyFolderTreeNameChanged(nsIMsgFolder* aFolder,
return NS_OK;
}
// <<<<<<<<< >>>>>>>>>>>>>>>>..
// New Messages
nsresult
@ -1639,8 +1668,6 @@ nsMsgFolderDataSource::GetNewMessagesString(PRBool newMessages, nsCAutoString& n
return NS_OK;
}
// <<<<<<<<< >>>>>>>>>>>>>>>>..
nsresult
nsMsgFolderDataSource::OnTotalMessagePropertyChanged(nsIMsgFolder *folder, PRInt32 oldValue, PRInt32 newValue)
@ -1914,7 +1941,8 @@ nsresult nsMsgFolderDataSource::DoFolderHasAssertion(nsIMsgFolder *folder,
}
}
else if ((kNC_Name == property) ||
(kNC_FolderTreeName == property) ||
(kNC_FolderTreeName == property) ||
(kNC_FolderTreeSimpleName == property) ||
(kNC_SpecialFolder == property) ||
(kNC_ServerType == property) ||
(kNC_CanCreateFoldersOnServer == property) ||

View File

@ -107,13 +107,14 @@ public:
nsISupportsArray/*<nsIRDFResource>*/* aArguments);
protected:
nsresult GetSenderName(nsAutoString& sender, nsAutoString *senderUserName);
nsresult GetSenderName(nsAutoString& sender, nsAutoString *senderUserName);
nsresult createFolderNode(nsIMsgFolder *folder, nsIRDFResource* property,
nsresult createFolderNode(nsIMsgFolder *folder, nsIRDFResource* property,
nsIRDFNode **target);
nsresult createFolderNameNode(nsIMsgFolder *folder, nsIRDFNode **target, PRBool sort);
nsresult createFolderTreeNameNode(nsIMsgFolder *folder, nsIRDFNode **target, PRBool sort);
nsresult createFolderSpecialNode(nsIMsgFolder *folder, nsIRDFNode **target);
nsresult createFolderNameNode(nsIMsgFolder *folder, nsIRDFNode **target, PRBool sort);
nsresult createFolderTreeNameNode(nsIMsgFolder *folder, nsIRDFNode **target, PRBool sort);
nsresult createFolderTreeSimpleNameNode(nsIMsgFolder *folder, nsIRDFNode **target, PRBool sort);
nsresult createFolderSpecialNode(nsIMsgFolder *folder, nsIRDFNode **target);
nsresult createFolderServerTypeNode(nsIMsgFolder *folder,
nsIRDFNode **target);
nsresult createFolderCanCreateFoldersOnServerNode(nsIMsgFolder *folder,
@ -190,12 +191,13 @@ protected:
nsresult CreateLiterals(nsIRDFService *rdf);
static nsIRDFResource* kNC_Child;
static nsIRDFResource* kNC_MessageChild;
static nsIRDFResource* kNC_Folder;
static nsIRDFResource* kNC_Name;
static nsIRDFResource* kNC_FolderTreeName;
static nsIRDFResource* kNC_FolderTreeSimpleName;
static nsIRDFResource* kNC_NameSort;
static nsIRDFResource* kNC_FolderTreeNameSort;
static nsIRDFResource* kNC_FolderTreeSimpleNameSort;
static nsIRDFResource* kNC_Columns;
static nsIRDFResource* kNC_MSGFolderRoot;
static nsIRDFResource* kNC_SpecialFolder;
@ -246,6 +248,7 @@ protected:
static nsIAtom* kBiffStateAtom;
static nsIAtom* kNewMessagesAtom;
static nsIAtom* kNameAtom;
static nsIAtom* kSynchronizeAtom;
static nsrefcnt gFolderResourceRefCnt;

View File

@ -59,9 +59,9 @@ typedef struct _nsMsgRDFNotification {
#define NC_RDF_THREADSTATE NC_NAMESPACE_URI "ThreadState"
#define NC_RDF_CHILD NC_NAMESPACE_URI "child"
#define NC_RDF_MESSAGECHILD NC_NAMESPACE_URI "MessageChild"
#define NC_RDF_NAME NC_NAMESPACE_URI "Name"
#define NC_RDF_FOLDERTREENAME NC_NAMESPACE_URI "FolderTreeName"
#define NC_RDF_FOLDERTREESIMPLENAME NC_NAMESPACE_URI "FolderTreeSimpleName"
#define NC_RDF_FOLDER NC_NAMESPACE_URI "Folder"
#define NC_RDF_SPECIALFOLDER NC_NAMESPACE_URI "SpecialFolder"
#define NC_RDF_SERVERTYPE NC_NAMESPACE_URI "ServerType"
@ -100,6 +100,7 @@ typedef struct _nsMsgRDFNotification {
#define NC_RDF_NAME_SORT NC_NAMESPACE_URI "Name?sort=true"
#define NC_RDF_FOLDERTREENAME_SORT NC_NAMESPACE_URI "FolderTreeName?sort=true"
#define NC_RDF_FOLDERTREESIMPLENAME_SORT NC_NAMESPACE_URI "FolderTreeSimpleName?sort=true"
//Folder Commands
#define NC_RDF_DELETE NC_NAMESPACE_URI "Delete"

View File

@ -83,6 +83,7 @@ nsIAtom * nsMsgFolder::kTotalUnreadMessagesAtom = nsnull;
nsIAtom * nsMsgFolder::kFlaggedAtom = nsnull;
nsIAtom * nsMsgFolder::kStatusAtom = nsnull;
nsIAtom * nsMsgFolder::kNameAtom = nsnull;
nsIAtom * nsMsgFolder::kSynchronizeAtom = nsnull;
#ifdef MSG_FASTER_URI_PARSING
nsCOMPtr<nsIURL> nsMsgFolder::mParsingURL;
@ -126,6 +127,7 @@ nsMsgFolder::nsMsgFolder(void)
kTotalMessagesAtom = NS_NewAtom("TotalMessages");
kStatusAtom = NS_NewAtom("Status");
kFlaggedAtom = NS_NewAtom("Flagged");
kSynchronizeAtom = NS_NewAtom("Synchronize");
initializeStrings();
@ -166,6 +168,7 @@ nsMsgFolder::~nsMsgFolder(void)
NS_IF_RELEASE(kFlaggedAtom);
NS_IF_RELEASE(kStatusAtom);
NS_IF_RELEASE(kNameAtom);
NS_IF_RELEASE(kSynchronizeAtom);
CRTFREEIF(kInboxName);
CRTFREEIF(kTrashName);
@ -1588,9 +1591,15 @@ NS_IMETHODIMP nsMsgFolder::OnFlagChange(PRUint32 flag)
folderInfo->SetFlags((PRInt32) mFlags);
if (db)
db->Commit(nsMsgDBCommitType::kLargeCommit);
if (flag & MSG_FOLDER_FLAG_OFFLINE) {
PRBool newValue = mFlags & MSG_FOLDER_FLAG_OFFLINE;
rv = NotifyBoolPropertyChanged(kSynchronizeAtom, !newValue, newValue);
NS_ENSURE_SUCCESS(rv,rv);
}
}
folderInfo = null_nsCOMPtr();
return rv;
folderInfo = nsnull;
return rv;
}
NS_IMETHODIMP nsMsgFolder::SetFlags(PRUint32 aFlags)
@ -1617,6 +1626,12 @@ NS_IMETHODIMP nsMsgFolder::GetFoldersWithFlag(PRUint32 flags, PRUint32 resultsiz
nsresult rv;
nsCOMPtr<nsIMsgFolder> folder;
PRUint32 cnt;
// call GetSubFolders() to ensure that mSubFolders is initialized
nsCOMPtr <nsIEnumerator> enumerator;
rv = GetSubFolders(getter_AddRefs(enumerator));
NS_ENSURE_SUCCESS(rv,rv);
rv = mSubFolders->Count(&cnt);
if (NS_SUCCEEDED(rv)) {
for (PRUint32 i=0; i < cnt; i++)

View File

@ -295,6 +295,7 @@ protected:
static nsIAtom* kStatusAtom;
static nsIAtom* kFlaggedAtom;
static nsIAtom* kNameAtom;
static nsIAtom* kSynchronizeAtom;
#ifdef MSG_FASTER_URI_PARSING
// cached parsing URL object

View File

@ -20,6 +20,12 @@
<RDF:Description about="chrome://messenger/content/messenger.xul#sizeCol">
<hidden>true</hidden>
</RDF:Description>
<RDF:Description about="chrome://messenger/content/messenger.xul#folderUnreadCol">
<hidden>true</hidden>
</RDF:Description>
<RDF:Description about="chrome://messenger/content/messenger.xul#folderTotalCol">
<hidden>true</hidden>
</RDF:Description>
<RDF:Description about="chrome://messenger/content/messenger.xul">
<NC:persist resource="chrome://messenger/content/messenger.xul#statusCol"/>
<NC:persist resource="chrome://messenger/content/messenger.xul#sizeCol"/>
@ -27,6 +33,8 @@
<NC:persist resource="chrome://messenger/content/messenger.xul#totalCol"/>
<NC:persist resource="chrome://messenger/content/messenger.xul#OrderReceivedColumn"/>
<NC:persist resource="chrome://messenger/content/messenger.xul#flaggedCol"/>
<NC:persist resource="chrome://messenger/content/messenger.xul#folderUnreadCol"/>
<NC:persist resource="chrome://messenger/content/messenger.xul#folderTotalCol"/>
<NC:persist resource="chrome://messenger/content/messenger.xul#messengerWindow"/>
<NC:persist resource="chrome://messenger/content/messenger.xul#sidebar-panels"/>
<NC:persist resource="chrome://messenger/content/messenger.xul#sidebar-panels-splitter-box"/>
@ -87,6 +95,12 @@
<RDF:Description about="chrome://messenger/content/mail3PaneWindowVertLayout.xul#sizeCol">
<hidden>true</hidden>
</RDF:Description>
<RDF:Description about="chrome://messenger/content/mail3PaneWindowVertLayout.xul#folderUnreadCol">
<hidden>true</hidden>
</RDF:Description>
<RDF:Description about="chrome://messenger/content/mail3PaneWindowVertLayout.xul#folderTotalCol">
<hidden>true</hidden>
</RDF:Description>
<RDF:Description about="chrome://messenger/content/mail3PaneWindowVertLayout.xul">
<NC:persist resource="chrome://messenger/content/mail3PaneWindowVertLayout.xul#statusCol"/>
<NC:persist resource="chrome://messenger/content/mail3PaneWindowVertLayout.xul#sizeCol"/>
@ -94,5 +108,7 @@
<NC:persist resource="chrome://messenger/content/mail3PaneWindowVertLayout.xul#totalCol"/>
<NC:persist resource="chrome://messenger/content/mail3PaneWindowVertLayout.xul#OrderReceivedColumn"/>
<NC:persist resource="chrome://messenger/content/mail3PaneWindowVertLayout.xul#flaggedCol"/>
<NC:persist resource="chrome://messenger/content/mail3PaneWindowVertLayout.xul#folderUnreadCol"/>
<NC:persist resource="chrome://messenger/content/mail3PaneWindowVertLayout.xul#folderTotalCol"/>
</RDF:Description>
</RDF:RDF>

View File

@ -26,8 +26,8 @@ outlinerbody {
outlinerbody:-moz-outliner-row
{
height: 17px;
border-bottom : 1px solid #FFFFFF;
height: 18px;
border-bottom : 1px solid #FFFFFF;
}
outlinerbody:-moz-outliner-row(selected)
@ -148,3 +148,6 @@ outlinerbody:-moz-outliner-twisty(open) {
list-style-image: url("chrome://global/skin/twisty-open.gif");
}
outlinerbody:-moz-outliner-indentation {
width: 16px;
}

View File

@ -28,7 +28,7 @@ outlinerbody {
}
outlinerbody:-moz-outliner-row {
height: 17px;
height: 18px;
border: 1px solid transparent;
}
@ -144,3 +144,6 @@ outlinerbody:-moz-outliner-twisty(open) {
list-style-image: url("chrome://global/skin/twisty-open.gif");
}
outlinerbody:-moz-outliner-indentation {
width: 16px;
}

View File

@ -16,182 +16,159 @@
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998-1999 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* Håkan Waara <hwaara@chello.se>
* Jan Varga <varga@utcru.sk>
*/
/* basic mail folders */
.tree-cell-folderpane-icon
{
list-style-image : url("chrome://messenger/skin/folder-closed.gif");
}
/* Basic mail folders */
outlinerbody:-moz-outliner-image(folderNameCol) {
padding-right: 2px;
list-style-image : url("chrome://messenger/skin/folder-closed.gif");
}
treeitem.folderTreeItem[open="true"] > treerow > .tree-cell-folderpane-icon
{
list-style-image : url("chrome://messenger/skin/folder-open.gif");
}
outlinerbody:-moz-outliner-image(folderNameCol, newMessages-true) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/folder-new-closed.gif");
}
/* special folder */
/** Inbox **/
.tree-cell-folderpane-icon[SpecialFolder="Inbox"]
{
list-style-image : url("chrome://messenger/skin/folder-inbox.gif");
}
outlinerbody:-moz-outliner-cell-text(folderNameCol, newMessages-true) {
font-weight: bold;
}
/* Special folders */
/* ..... Inbox ..... */
outlinerbody:-moz-outliner-image(folderNameCol, specialFolder-Inbox) {
padding-right: 2px;
list-style-image : url("chrome://messenger/skin/folder-inbox.gif");
}
outlinerbody:-moz-outliner-image(folderNameCol, specialFolder-Inbox, newMessages-true) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/folder-inbox-new.gif");
}
/* ..... Sent ..... */
.tree-cell-folderpane-icon[SpecialFolder="Sent"] {
outlinerbody:-moz-outliner-image(folderNameCol, specialFolder-Sent) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/folder-sent.gif");
}
/* ..... Unsent ..... */
/* ..... Drafts ..... */
.tree-cell-folderpane-icon[SpecialFolder="Drafts"] {
list-style-image: url("chrome://messenger/skin/folder-draft.gif");
}
/* ..... Templates ..... */
.tree-cell-folderpane-icon[SpecialFolder="Templates"] {
list-style-image: url("chrome://messenger/skin/folder-template.gif");
}
/* ..... Unsent Messages ..... */
.tree-cell-folderpane-icon[SpecialFolder="Unsent Messages"] {
outlinerbody:-moz-outliner-image(folderNameCol, specialFolder-Unsent Messages) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/folder-outbox.gif");
}
/* ..... Drafts ..... */
/** Trash **/
.tree-cell-folderpane-icon[SpecialFolder="Trash"]
{
list-style-image: url("chrome://messenger/skin/folder-trash.gif");
outlinerbody:-moz-outliner-image(folderNameCol, specialFolder-Drafts) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/folder-draft.gif");
}
/* ..... Templates ..... */
/** Server Mail **/
.tree-cell-folderpane-icon[IsServer="true"]
{
list-style-image: url("chrome://messenger/skin/server-mail.gif");
outlinerbody:-moz-outliner-image(folderNameCol, specialFolder-Templates) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/folder-template.gif");
}
treeitem.folderTreeItem[open="true"] > treerow > .tree-cell-folderpane-icon[IsServer="true"]
{
list-style-image: url("chrome://messenger/skin/server-mail.gif");
/* ..... Trash ..... */
outlinerbody:-moz-outliner-image(folderNameCol, specialFolder-Trash) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/folder-trash.gif");
}
.tree-cell-folderpane-icon[BiffState="NewMail"][IsServer="true"]
{
list-style-image: url("chrome://messenger/skin/server-mail-new.gif");
/* Server Mail */
outlinerbody:-moz-outliner-image(folderNameCol, isServer-true) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/server-mail.gif");
}
treeitem[open="true"] > treerow > .tree-cell-folderpane-icon[BiffState="NewMail"][IsServer="true"]
{
list-style-image: url("chrome://messenger/skin/server-mail-new.gif");
outlinerbody:-moz-outliner-image(folderNameCol, biffState-NewMail, isServer-true) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/server-mail-new.gif");
}
/* differentiate new messages on inbox/folders from biff on the server */
.tree-cell-folderpane-icon[NewMessages="true"]
{
list-style-image: url("chrome://messenger/skin/folder-new-closed.gif");
font-weight: bold;
}
/* POP3 servers */
.tree-cell-folderpane-icon[SpecialFolder="Inbox"][NewMessages="true"]
{
list-style-image: url("chrome://messenger/skin/folder-inbox-new.gif");
font-weight: bold;
}
treeitem[open="true"] > treerow > .tree-cell-folderpane-icon[NewMessages="true"]
{
list-style-image: url("chrome://messenger/skin/folder-new-open.gif");
font-weight: bold;
outlinerbody:-moz-outliner-image(folderNameCol, isServer-true, serverType-pop3, isSecure-true) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/server-remote-lock.gif");
}
/* IMAP folders */
.tree-cell-folderpane-icon[IsServer="true"][ServerType="imap"][IsSecure="true"]
{
list-style-image : url("chrome://messenger/skin/server-remote-lock.gif");
}
treeitem.folderTreeItem[open="true"] > treerow > .tree-cell-folderpane-icon[IsServer="true"][ServerType="imap"][IsSecure="true"]
{
list-style-image: url("chrome://messenger/skin/server-remote-lock.gif");
outlinerbody:-moz-outliner-image(folderNameCol, isServer-true, serverType-imap, isSecure-true) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/server-remote-lock.gif");
}
/* Local servers */
.tree-cell-folderpane-icon[IsServer="true"][ServerType="none"]
{
list-style-image : url("chrome://messenger/skin/server-local.gif");
}
treeitem.folderTreeItem[open="true"] > treerow > .tree-cell-folderpane-icon[IsServer="true"][ServerType="none"]
{
list-style-image: url("chrome://messenger/skin/server-local.gif");
outlinerbody:-moz-outliner-image(folderNameCol, isServer-true, serverType-none) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/server-local.gif");
}
/* News folders */
.tree-cell-folderpane-icon[ServerType="nntp"]
{
list-style-image : url("chrome://messenger/skin/folder-newsgroup.gif");
}
.tree-cell-folderpane-icon[IsServer="true"][ServerType="nntp"][IsSecure="true"]
{
list-style-image : url("chrome://messenger/skin/server-news-lock.gif");
}
treeitem.folderTreeItem[open="true"] > treerow > .tree-cell-folderpane-icon[IsServer="true"][ServerType="nntp"][IsSecure="true"]
{
list-style-image: url("chrome://messenger/skin/server-news-lock.gif");
outlinerbody:-moz-outliner-image(folderNameCol, serverType-nntp) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/folder-newsgroup.gif");
}
.tree-cell-folderpane-icon[IsServer="true"][ServerType="nntp"]
{
list-style-image : url("chrome://messenger/skin/server-news.gif");
}
treeitem.folderTreeItem[open="true"] > treerow > .tree-cell-folderpane-icon[IsServer="true"][ServerType="nntp"]
{
list-style-image: url("chrome://messenger/skin/server-news.gif");
outlinerbody:-moz-outliner-image(folderNameCol, isServer-true, serverType-nntp) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/server-news.gif");
}
/*All Servers*/
.tree-folder-row[IsServer="true"]
{
font-weight : bold;
}
outlinerbody:-moz-outliner-image(folderNameCol, isServer-true, serverType-nntp, isSecure-true) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/server-news-lock.gif");
}
.tree-folder-row[HasUnreadMessages="true"]
{
font-weight : bold;
}
/* All Servers */
.tree-folder-row[NoSelect="true"]
{
color : gray;
font-style : italic;
}
outlinerbody:-moz-outliner-cell-text(folderNameCol, isServer-true),
outlinerbody:-moz-outliner-cell-text(hasUnreadMessages-true) {
font-weight: bold;
}
#folder-panel
{
min-width : 10px;
}
outlinerbody:-moz-outliner-cell-text(folderNameCol, noSelect-true) {
color: gray;
font-style: italic;
}
#folder-panel {
min-width: 10px;
}
/* using tree-cell-folderpane-icon to isolate this rule to the folderpane
and prevent such crawls on the threadpane */
treeitem[empty="true"] > treerow > .tree-cell-folderpane-icon > .tree-cell-twisty
{
visibility : hidden;
}
treeitem[empty="true"] > treerow > .tree-cell-folderpane-icon > .tree-cell-twisty {
visibility : hidden;
}
.tree-folder-checkbox {
list-style-image: none;
}
outlinerbody:-moz-outliner-image(syncCol) {
list-style-image: url("chrome://messenger/skin/dot.gif");
}
outlinerbody:-moz-outliner-image(syncCol, synchronize-true) {
list-style-image: url("chrome://messenger/skin/check.gif");
}
outlinerbody:-moz-outliner-image(syncCol, isServer-true) {
list-style-image: none;
}
.tree-folder-checkbox
{
list-style-image: none;
}

View File

@ -63,6 +63,7 @@
/* for search */
outlinerbody:-moz-outliner-image(nameCol, nntp) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/folder-newsgroup.gif");
}

View File

@ -140,30 +140,37 @@ outlinerbody:-moz-outliner-image(flaggedCol, flagged) {
/* ..... subject column ..... */
outlinerbody:-moz-outliner-image(subjectCol) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/message-mail.gif");
}
outlinerbody:-moz-outliner-image(subjectCol, new) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/message-mail-new.gif");
}
outlinerbody:-moz-outliner-image(subjectCol, attach) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/message-mail-attach.gif");
}
outlinerbody:-moz-outliner-image(subjectCol, imapdeleted) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/message-mail-imapdelete.gif");
}
outlinerbody:-moz-outliner-image(subjectCol, news) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/message-news.gif");
}
outlinerbody:-moz-outliner-image(subjectCol, news, new) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/message-news-new.gif");
}
outlinerbody:-moz-outliner-image(subjectCol, news, attach) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/message-news-attach.gif");
}

View File

@ -16,201 +16,164 @@
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998-1999 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* Jan Varga (varga@utcru.sk)
* Håkan Waara (hwaara@chello.se)
*/
/* basic mail folders */
.tree-cell-folderpane-icon
{
list-style-image : url("chrome://messenger/skin/folder-closed.gif");
}
/* Basic mail folders */
treeitem.folderTreeItem[open="true"] > treerow > .tree-cell-folderpane-icon
{
list-style-image : url("chrome://messenger/skin/folder-open.gif");
}
outlinerbody:-moz-outliner-image(folderNameCol) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/folder-closed.gif");
}
/* special folder */
/** Inbox **/
.tree-cell-folderpane-icon[SpecialFolder="Inbox"]
{
list-style-image : url("chrome://messenger/skin/folder-inbox.gif");
}
outlinerbody:-moz-outliner-image(folderNameCol, newMessages-true) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/folder-new-closed.gif");
}
/* Special folders */
/* ..... Inbox ..... */
outlinerbody:-moz-outliner-image(folderNameCol, specialFolder-Inbox) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/folder-inbox.gif");
}
outlinerbody:-moz-outliner-image(folderNameCol, specialFolder-Inbox, newMessages-true) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/folder-inbox-new.gif");
}
/* ..... Sent ..... */
.tree-cell-folderpane-icon[SpecialFolder="Sent"] {
outlinerbody:-moz-outliner-image(folderNameCol, specialFolder-Sent) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/folder-sent.gif");
}
/* ..... Unsent ..... */
.tree-cell-folderpane-icon[SpecialFolder="Unsent Messages"] {
outlinerbody:-moz-outliner-image(folderNameCol, specialFolder-Unsent Messages) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/folder-outbox.gif");
}
/* ..... Drafts ..... */
.tree-cell-folderpane-icon[SpecialFolder="Drafts"] {
outlinerbody:-moz-outliner-image(folderNameCol, specialFolder-Drafts) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/folder-draft.gif");
}
/* ..... Templates ..... */
.tree-cell-folderpane-icon[SpecialFolder="Templates"] {
outlinerbody:-moz-outliner-image(folderNameCol, specialFolder-Templates) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/folder-template.gif");
}
/* ..... Trash ..... */
outlinerbody:-moz-outliner-image(folderNameCol, specialFolder-Trash) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/folder-trash.gif");
}
outlinerbody:-moz-outliner-image(folderNameCol, isServer-true) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/server-mail.gif");
}
outlinerbody:-moz-outliner-image(folderNameCol, biffState-NewMail, isServer-true) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/server-mail-new.gif");
}
outlinerbody:-moz-outliner-cell-text(folderNameCol, newMessages-true),
outlinerbody:-moz-outliner-cell-text(folderNameCol, specialFolder-Inbox, newMessages-true) {
font-weight: bold;
}
/** Trash **/
.tree-cell-folderpane-icon[SpecialFolder="Trash"]
{
list-style-image : url("chrome://messenger/skin/folder-trash.gif");
}
/* XXX this is so evil, but it looks nice on en-US. Should really be a
special type that we can style... */
.tree-cell-folderpane-icon[SpecialFolder="Drafts"]
{
list-style-image : url("chrome://messenger/skin/folder-draft.gif");
}
.folderTreeItem[selected="true"] > treerow > .tree-cell-folderpane-icon[SpecialFolder="Drafts"]
{
list-style-image : url("chrome://messenger/skin/folder-draft.gif");
}
/* POP3 servers */
.tree-cell-folderpane-icon[IsServer="true"]
{
list-style-image : url("chrome://messenger/skin/server-mail.gif");
}
.folderTreeItem[open="true"] > treerow > .tree-cell-folderpane-icon[IsServer="true"]
{
list-style-image : url("chrome://messenger/skin/server-mail.gif");
}
.tree-cell-folderpane-icon[BiffState="NewMail"][IsServer="true"]
{
list-style-image : url("chrome://messenger/skin/server-mail-new.gif");
}
treeitem[open="true"] > treerow > .tree-cell-folderpane-icon[BiffState="NewMail"][IsServer="true"]
{
list-style-image : url("chrome://messenger/skin/server-mail-new.gif");
}
/* differentiate new messages on inbox/folders from biff on the server */
.tree-cell-folderpane-icon[NewMessages="true"]
{
list-style-image : url("chrome://messenger/skin/folder-new-closed.gif");
font-weight : bold;
}
.tree-cell-folderpane-icon[SpecialFolder="Inbox"][NewMessages="true"]
{
list-style-image : url("chrome://messenger/skin/folder-inbox-new.gif");
font-weight : bold;
}
treeitem[open="true"] > treerow > .tree-cell-folderpane-icon[NewMessages="true"]
{
list-style-image : url("chrome://messenger/skin/folder-new-open.gif");
font-weight : bold;
}
outlinerbody:-moz-outliner-image(folderNameCol, isServer-true, serverType-pop3, isSecure-true) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/server-remote-lock.gif");
}
/* IMAP folders */
.tree-cell-folderpane-icon[IsServer="true"][ServerType="imap"][IsSecure="true"]
{
list-style-image : url("chrome://messenger/skin/server-remote-lock.gif");
}
.folderTreeItem[open="true"] > treerow > .tree-cell-folderpane-icon[IsServer="true"][ServerType="imap"][IsSecure="true"]
{
list-style-image : url("chrome://messenger/skin/server-remote-lock.gif");
}
outlinerbody:-moz-outliner-image(folderNameCol, isServer-true, serverType-imap, isSecure-true) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/server-remote-lock.gif");
}
/* Local servers */
.tree-cell-folderpane-icon[IsServer="true"][ServerType="none"]
{
list-style-image : url("chrome://messenger/skin/server-local.gif");
}
.folderTreeItem[open="true"] > treerow > .tree-cell-folderpane-icon[IsServer="true"][ServerType="none"]
{
list-style-image : url("chrome://messenger/skin/server-local.gif");
}
outlinerbody:-moz-outliner-image(folderNameCol, isServer-true, serverType-none) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/server-local.gif");
}
/* News folders */
.tree-cell-folderpane-icon[ServerType="nntp"]
{
list-style-image : url("chrome://messenger/skin/folder-newsgroup.gif");
}
.tree-cell-folderpane-icon[IsServer="true"][ServerType="nntp"][IsSecure="true"]
{
list-style-image : url("chrome://messenger/skin/server-news-lock.gif");
}
outlinerbody:-moz-outliner-image(folderNameCol, serverType-nntp) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/folder-newsgroup.gif");
}
.folderTreeItem[open="true"] > treerow > .tree-cell-folderpane-icon[IsServer="true"][ServerType="nntp"][IsSecure="true"]
{
list-style-image : url("chrome://messenger/skin/server-news-lock.gif");
}
.tree-cell-folderpane-icon[IsServer="true"][ServerType="nntp"]
{
list-style-image : url("chrome://messenger/skin/server-news.gif");
}
.folderTreeItem[open="true"] > treerow > .tree-cell-folderpane-icon[IsServer="true"][ServerType="nntp"]
{
list-style-image : url("chrome://messenger/skin/server-news.gif");
}
outlinerbody:-moz-outliner-image(folderNameCol, isServer-true, serverType-nntp) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/server-news.gif");
}
outlinerbody:-moz-outliner-image(folderNameCol, isServer-true, serverType-nntp, isSecure-true) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/server-news-lock.gif");
}
/*All Servers*/
.tree-folder-row[IsServer="true"]
{
font-weight : bold;
}
.tree-folder-row[HasUnreadMessages="true"]
{
font-weight : bold;
}
outlinerbody:-moz-outliner-cell-text(folderNameCol, isServer-true),
outlinerbody:-moz-outliner-cell-text(hasUnreadMessages-true) {
font-weight: bold;
}
.tree-folder-row[NoSelect="true"]
{
color : gray;
font-style : italic;
}
outlinerbody:-moz-outliner-cell-text(folderNameCol, noSelect-true) {
color: gray;
font-style: italic;
}
#folder-panel
{
min-width : 10px;
}
#folder-panel {
min-width: 10px;
}
#folderTree
{
border: none;
}
#folderTree {
border: none;
}
/* using tree-cell-folderpane-icon to isolate this rule to the folderpane
and prevent such crawls on the threadpane */
treeitem[empty="true"] > treerow > .tree-cell-folderpane-icon > .tree-cell-twisty
{
visibility : hidden;
}
treeitem[empty="true"] > treerow > .tree-cell-folderpane-icon > .tree-cell-twisty {
visibility: hidden;
}
.tree-folder-checkbox {
list-style-image: none;
}
outlinerbody:-moz-outliner-image(syncCol) {
list-style-image: url("chrome://messenger/skin/dot.gif");
}
outlinerbody:-moz-outliner-image(syncCol, synchronize-true) {
list-style-image: url("chrome://messenger/skin/check.gif");
}
outlinerbody:-moz-outliner-image(syncCol, isServer-true) {
list-style-image: none;
}
.tree-folder-checkbox
{
list-style-image: none;
}

View File

@ -63,6 +63,7 @@
/* for search */
outlinerbody:-moz-outliner-image(nameCol, nntp) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/folder-newsgroup.gif");
}

View File

@ -150,30 +150,37 @@ outlinerbody:-moz-outliner-image(flaggedCol, flagged) {
/* ..... subject column ..... */
outlinerbody:-moz-outliner-image(subjectCol) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/message-mail.gif");
}
outlinerbody:-moz-outliner-image(subjectCol, new) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/message-mail-new.gif");
}
outlinerbody:-moz-outliner-image(subjectCol, attach) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/message-mail-attach.gif");
}
outlinerbody:-moz-outliner-image(subjectCol, imapdeleted) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/message-mail-imapdelete.gif");
}
outlinerbody:-moz-outliner-image(subjectCol, news) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/message-news.gif");
}
outlinerbody:-moz-outliner-image(subjectCol, news, new) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/message-news-new.gif");
}
outlinerbody:-moz-outliner-image(subjectCol, news, attach) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/message-news-attach.gif");
}

View File

@ -42,7 +42,7 @@ outlinerbody {
outlinerbody:-moz-outliner-row {
border: 1px solid transparent;
height: 17px;
height: 18px;
}
outlinerbody:-moz-outliner-row(selected) {
@ -166,3 +166,7 @@ outlinerbody:-moz-outliner-twisty(open) {
width: 10px; /* The image's width is 10 pixels */
list-style-image: url("chrome://global/skin/tree/twisty-open.gif");
}
outlinerbody:-moz-outliner-indentation {
width: 16px;
}

View File

@ -19,6 +19,8 @@
*
* Contributor(s):
* Joe Hewitt (hewitt@netscape.com)
* Håkan Waara (hwaara@chello.se)
* Jan Varga (varga@utcru.sk)
*/
/* ===== folderPane.css =================================================
@ -29,163 +31,119 @@
/* ::::: mail folder ::::: */
.folderTreeItem {
outlinerbody:-moz-outliner-image(folderNameCol) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/folder-closed.gif");
font-weight: normal;
}
.folderTreeItem[selected="true"]
.folderTreeItem[open="true"] {
list-style-image: url("chrome://messenger/skin/icons/folder-open.gif");
}
.folderTreeItem[NewMessages="true"] {
outlinerbody:-moz-outliner-image(folderNameCol, newMessages-true) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/folder-new.gif");
font-weight: bold;
}
.folderTreeItem[selected="true"][NewMessages="true"],
.folderTreeItem[open="true"][NewMessages="true"] {
list-style-image: url("chrome://messenger/skin/icons/folder-new-open.gif");
}
/* ..... Inbox ..... */
.folderTreeItem[SpecialFolder="Inbox"] {
outlinerbody:-moz-outliner-image(folderNameCol, specialFolder-Inbox) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/folder-inbox.gif");
}
.folderTreeItem[selected="true"][SpecialFolder="Inbox"],
.folderTreeItem[open="true"][SpecialFolder="Inbox"] {
list-style-image: url("chrome://messenger/skin/icons/folder-inbox-open.gif");
}
.folderTreeItem[SpecialFolder="Inbox"][NewMessages="true"],
.folderTreeItem[NewMessages="true"][SpecialFolder="Inbox"][selected="true"],
.folderTreeItem[NewMessages="true"][SpecialFolder="Inbox"][open="true"] {
outlinerbody:-moz-outliner-image(folderNameCol, specialFolder-Inbox, newMessages-true) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/folder-inbox-new.gif");
font-weight: bold;
}
/* ..... Sent ..... */
.folderTreeItem[SpecialFolder="Sent"] {
outlinerbody:-moz-outliner-image(folderNameCol, specialFolder-Sent) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/folder-sent.gif");
}
.folderTreeItem[selected="true"][SpecialFolder="Sent"],
.folderTreeItem[selected="true"][SpecialFolder="Sent"][NewMessages="true"],
.folderTreeItem[open="true"][SpecialFolder="Sent"] {
list-style-image: url("chrome://messenger/skin/icons/folder-sent-open.gif");
}
/* ..... Drafts ..... */
.folderTreeItem[SpecialFolder="Drafts"] {
outlinerbody:-moz-outliner-image(folderNameCol, specialFolder-Drafts) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/folder-draft.gif");
}
.folderTreeItem[selected="true"][SpecialFolder="Drafts"],
.folderTreeItem[selected="true"][SpecialFolder="Drafts"][NewMessages="true"],
.folderTreeItem[open="true"][SpecialFolder="Drafts"] {
list-style-image: url("chrome://messenger/skin/icons/folder-draft-open.gif");
}
/* ..... Templates ..... */
.folderTreeItem[SpecialFolder="Templates"] {
outlinerbody:-moz-outliner-image(folderNameCol, specialFolder-Templates) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/folder-template.gif");
}
.folderTreeItem[selected="true"][SpecialFolder="Templates"],
.folderTreeItem[selected="true"][SpecialFolder="Templates"][NewMessages="true"],
.folderTreeItem[open="true"][SpecialFolder="Templates"] {
list-style-image: url("chrome://messenger/skin/icons/folder-template-open.gif");
}
/* ..... Unsent Messages ..... */
.folderTreeItem[SpecialFolder="Unsent Messages"] {
outlinerbody:-moz-outliner-image(folderNameCol, specialFolder-Unsent Messages) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/folder-outbox.gif");
}
.folderTreeItem[selected="true"][SpecialFolder="Unsent Messages"] {
list-style-image: url("chrome://messenger/skin/icons/folder-outbox-open.gif");
}
/* ..... Trash ..... */
.folderTreeItem[SpecialFolder="Trash"] {
outlinerbody:-moz-outliner-image(folderNameCol, specialFolder-Trash) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/folder-trash.gif");
}
.folderTreeItem[selected="true"][SpecialFolder="Trash"],
.folderTreeItem[selected="true"][SpecialFolder="Trash"][NewMessages="true"],
.folderTreeItem[open="true"][SpecialFolder="Trash"][NewMessages="true"] {
list-style-image: url("chrome://messenger/skin/icons/folder-trash-open.gif");
}
/* ..... Server Folders ..... */
.folderTreeItem[IsServer="true"],
.folderTreeItem[IsServer="true"][selected="true"],
.folderTreeItem[IsServer="true"][open="true"] {
outlinerbody:-moz-outliner-image(folderNameCol, isServer-true) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/server-mail.gif");
}
.folderTreeItem[BiffState="NewMail"][IsServer="true"],
.folderTreeItem[BiffState="NewMail"][IsServer="true"][selected="true"],
.folderTreeItem[BiffState="NewMail"][IsServer="true"][open="true"] {
outlinerbody:-moz-outliner-image(folderNameCol, biffState-NewMail, isServer-true) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/server-mail-new.gif");
}
.folderTreeItem[IsServer="true"][ServerType="imap"][IsSecure="true"],
.folderTreeItem[IsServer="true"][ServerType="imap"][IsSecure="true"][selected="true"],
.folderTreeItem[IsServer="true"][ServerType="imap"][IsSecure="true"][open="true"] {
outlinerbody:-moz-outliner-image(folderNameCol, isServer-true, serverType-pop3, isSecure-true) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/server-remote-lock.gif");
}
outlinerbody:-moz-outliner-image(folderNameCol, isServer-true, serverType-imap, isSecure-true) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/server-remote-lock.gif");
}
/* ..... Local Servers ..... */
.folderTreeItem[IsServer="true"][ServerType="none"],
.folderTreeItem[IsServer="true"][ServerType="none"][selected="true"],
.folderTreeItem[IsServer="true"][ServerType="none"][open="true"] {
outlinerbody:-moz-outliner-image(folderNameCol, isServer-true, serverType-none) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/server-local.gif");
}
/* ..... News Servers ..... */
.folderTreeItem[IsServer="true"][ServerType="nntp"],
.folderTreeItem[IsServer="true"][ServerType="nntp"][selected="true"],
.folderTreeItem[IsServer="true"][ServerType="nntp"][open="true"] {
list-style-image: url("chrome://messenger/skin/icons/server-news.gif");
}
.folderTreeItem[IsServer="true"][ServerType="nntp"][IsSecure="true"],
.folderTreeItem[IsServer="true"][ServerType="nntp"][IsSecure="true"][selected="true"],
.folderTreeItem[IsServer="true"][ServerType="nntp"][IsSecure="true"][open="true"] {
list-style-image: url("chrome://messenger/skin/icons/server-news-lock.gif");
}
/* ..... News Folders ..... */
.folderTreeItem[ServerType="nntp"],
.folderTreeItem[ServerType="nntp"][selected="true"],
.folderTreeItem[ServerType="nntp"][open="true"] {
outlinerbody:-moz-outliner-image(folderNameCol, serverType-nntp) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/folder-newsgroup.gif");
}
/* ..... News Servers ..... */
outlinerbody:-moz-outliner-image(folderNameCol, isServer-true, serverType-nntp) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/server-news.gif");
}
outlinerbody:-moz-outliner-image(folderNameCol, isServer-true, serverType-nntp, isSecure-true) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/server-news-lock.gif");
}
/* ::::: All Servers ::::: */
.tree-folder-row[IsServer="true"] {
outlinerbody:-moz-outliner-cell-text(folderNameCol, isServer-true),
outlinerbody:-moz-outliner-cell-text(hasUnreadMessages-true) {
font-weight: bold;
}
.tree-folder-row[HasUnreadMessages="true"] {
font-weight: bold;
}
.tree-folder-row[NoSelect="true"] {
outlinerbody:-moz-outliner-cell-text(folderNameCol, noSelect-true) {
color: gray;
font-style: italic;
}
@ -193,3 +151,18 @@
.tree-folder-checkbox {
list-style-image: none;
}
outlinerbody:-moz-outliner-image(syncCol) {
list-style-image: url("chrome://global/skin/checkbox/cbox.gif");
}
outlinerbody:-moz-outliner-image(syncCol, synchronize-true) {
list-style-image: url("chrome://global/skin/checkbox/cbox-check.gif");
}
outlinerbody:-moz-outliner-image(syncCol, isServer-true) {
list-style-image: none;
}

View File

@ -79,6 +79,7 @@ statusbarpanel,
/* for search in subscribe */
outlinerbody:-moz-outliner-image(nameCol, nntp) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/folder-newsgroup.gif");
}

View File

@ -144,46 +144,57 @@ outlinerbody:-moz-outliner-image(flaggedCol, flagged) {
/* ..... subject column ..... */
outlinerbody:-moz-outliner-image(subjectCol) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/message-mail.gif");
}
outlinerbody:-moz-outliner-image(subjectCol, new) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/message-mail-new.gif");
}
outlinerbody:-moz-outliner-image(subjectCol, attach) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/message-mail-attach.gif");
}
outlinerbody:-moz-outliner-image(subjectCol, imapdeleted) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/message-mail-imapdelete.gif");
}
outlinerbody:-moz-outliner-image(subjectCol, offline) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/message-mail-offl.gif");
}
outlinerbody:-moz-outliner-image(subjectCol, new, offline) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/message-mail-new-offl.gif");
}
outlinerbody:-moz-outliner-image(subjectCol, attach, offline) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/message-mail-attach-offl.gif");
}
outlinerbody:-moz-outliner-image(subjectCol, imapdeleted, offline) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/message-mail-delete-offl.gif");
}
outlinerbody:-moz-outliner-image(subjectCol, news) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/message-news.gif");
}
outlinerbody:-moz-outliner-image(subjectCol, news, new) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/message-news-new.gif");
}
outlinerbody:-moz-outliner-image(subjectCol, news, attach) {
padding-right: 2px;
list-style-image: url("chrome://messenger/skin/icons/message-news-attach.gif");
}