Themework for imap folder and newsgroup subscribe UI.
Get rid of the column headers, make the dialog look like the virtual folder picker dialog. git-svn-id: svn://10.0.0.236/trunk@165607 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
parent
aeebedba3a
commit
02d675d15f
534
mozilla/mail/base/content/subscribe.js
Normal file
534
mozilla/mail/base/content/subscribe.js
Normal file
@ -0,0 +1,534 @@
|
||||
var gSubscribeTree = null;
|
||||
var gSearchTree;
|
||||
var okCallback = null;
|
||||
var gChangeTable = {};
|
||||
var gServerURI = null;
|
||||
var gSubscribableServer = null;
|
||||
var gStatusBar = null;
|
||||
var gNameField = null;
|
||||
var gNameFieldLabel = null;
|
||||
var gFolderDelimiter = ".";
|
||||
var gStatusFeedback = new nsMsgStatusFeedback;
|
||||
var gTimelineEnabled = false;
|
||||
var gMessengerBundle = null;
|
||||
var gSubscribeDeck = null;
|
||||
var gSearchView = null;
|
||||
var gSearchTreeBoxObject = null;
|
||||
// the rdf service
|
||||
var RDF = Components.classes['@mozilla.org/rdf/rdf-service;1'].getService(Components.interfaces.nsIRDFService);
|
||||
var subscribeDS = RDF.GetDataSource("rdf:subscribe");
|
||||
|
||||
// get the "subscribed" atom
|
||||
var atomService = Components.classes["@mozilla.org/atom-service;1"].getService().QueryInterface(Components.interfaces.nsIAtomService);
|
||||
var gSubscribedAtom = atomService.getAtom("subscribed").QueryInterface(Components.interfaces.nsISupports);
|
||||
|
||||
var gSubscribeBundle;
|
||||
|
||||
function goDoCommand()
|
||||
{
|
||||
}
|
||||
|
||||
function Stop()
|
||||
{
|
||||
//dump("Stop()\n")
|
||||
if (gSubscribableServer) {
|
||||
gSubscribableServer.stopPopulating(msgWindow);
|
||||
}
|
||||
}
|
||||
|
||||
function SetServerTypeSpecificTextValues()
|
||||
{
|
||||
if (!gServerURI) return;
|
||||
|
||||
var serverType = GetMsgFolderFromUri(gServerURI, true).server.type;
|
||||
|
||||
// set the server specific ui elements
|
||||
var stringName = "foldersheaderfor-" + serverType;
|
||||
var stringval = gSubscribeBundle.getString(stringName);
|
||||
var element = document.getElementById("subscribeFolderLabel");
|
||||
element.setAttribute('value',stringval);
|
||||
|
||||
//set the delimiter
|
||||
try {
|
||||
gFolderDelimiter = gSubscribableServer.delimiter;
|
||||
}
|
||||
catch (ex) {
|
||||
//dump(ex + "\n");
|
||||
gFolderDelimiter = ".";
|
||||
}
|
||||
}
|
||||
|
||||
function onServerClick(event)
|
||||
{
|
||||
var item = event.target;
|
||||
gServerURI = item.id;
|
||||
//dump("gServerURI="+gServerURI+"\n");
|
||||
|
||||
SetUpTree(false);
|
||||
|
||||
SetServerTypeSpecificTextValues();
|
||||
}
|
||||
|
||||
function SetUpServerMenu()
|
||||
{
|
||||
//dump("SetUpServerMenu()\n");
|
||||
|
||||
var serverMenu = document.getElementById("serverMenu");
|
||||
var menuitems = serverMenu.getElementsByAttribute("id", gServerURI);
|
||||
|
||||
try {
|
||||
//dump("gServerURI="+gServerURI+"\n");
|
||||
//dump("menuitems="+menuitems+"\n");
|
||||
//dump("menuitems[0]="+menuitems[0]+"\n");
|
||||
//dump("serverMenu="+serverMenu+"\n");
|
||||
serverMenu.selectedItem = menuitems[0];
|
||||
}
|
||||
catch (ex) {
|
||||
//dump("failed to set the selected server: " + ex + "\n");
|
||||
}
|
||||
|
||||
SetServerTypeSpecificTextValues();
|
||||
}
|
||||
|
||||
var MySubscribeListener = {
|
||||
OnDonePopulating: function() {
|
||||
gStatusFeedback._stopMeteors();
|
||||
|
||||
// only re-root the tree, if it is null.
|
||||
// otherwise, we are in here because we are populating
|
||||
// a part of the tree
|
||||
|
||||
var refValue = gSubscribeTree.getAttribute('ref');
|
||||
if (!refValue) {
|
||||
//dump("root subscribe tree at: "+ gServerURI +"\n");
|
||||
gSubscribeTree.database.AddDataSource(subscribeDS);
|
||||
gSubscribeTree.setAttribute('ref',gServerURI);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function SetUpTree(forceToServer)
|
||||
{
|
||||
//dump("SetUpTree()\n");
|
||||
|
||||
gStatusBar = document.getElementById('statusbar-icon');
|
||||
if (!gServerURI) return;
|
||||
|
||||
var folder = GetMsgFolderFromUri(gServerURI, true);
|
||||
var server = folder.server;
|
||||
|
||||
try {
|
||||
CleanUpSearchView();
|
||||
gSubscribableServer = server.QueryInterface(Components.interfaces.nsISubscribableServer);
|
||||
gSubscribeTree.setAttribute('ref',null);
|
||||
|
||||
// enable (or disable) the search related UI
|
||||
EnableSearchUI();
|
||||
|
||||
// clear out the text field when switching server
|
||||
gNameField.value = "";
|
||||
|
||||
// since there is no text, switch to the non-search view...
|
||||
SwitchToNormalView();
|
||||
|
||||
gSubscribeTree.database.RemoveDataSource(subscribeDS);
|
||||
gSubscribableServer.subscribeListener = MySubscribeListener;
|
||||
|
||||
gStatusFeedback._startMeteors();
|
||||
gStatusFeedback.showStatusString(gSubscribeBundle.getString("pleaseWaitString"));
|
||||
|
||||
gSubscribableServer.startPopulating(msgWindow, forceToServer);
|
||||
}
|
||||
catch (ex) {
|
||||
//dump("failed to populate subscribe ds: " + ex + "\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function SubscribeOnUnload()
|
||||
{
|
||||
try {
|
||||
CleanUpSearchView();
|
||||
gSubscribeTree.database.RemoveDataSource(subscribeDS);
|
||||
}
|
||||
catch (ex) {
|
||||
dump("failed to remove the subscribe ds: " + ex + "\n");
|
||||
}
|
||||
}
|
||||
|
||||
function EnableSearchUI()
|
||||
{
|
||||
if (gSubscribableServer.supportsSubscribeSearch) {
|
||||
gNameField.removeAttribute('disabled');
|
||||
gNameFieldLabel.removeAttribute('disabled');
|
||||
}
|
||||
else {
|
||||
gNameField.setAttribute('disabled',true);
|
||||
gNameFieldLabel.setAttribute('disabled',true);
|
||||
}
|
||||
}
|
||||
|
||||
function SubscribeOnLoad()
|
||||
{
|
||||
//dump("SubscribeOnLoad()\n");
|
||||
gSubscribeBundle = document.getElementById("bundle_subscribe");
|
||||
gMessengerBundle = document.getElementById("bundle_messenger");
|
||||
|
||||
gSubscribeTree = document.getElementById("subscribeTree");
|
||||
gSearchTree = document.getElementById("searchTree");
|
||||
gSearchTreeBoxObject = document.getElementById("searchTree").treeBoxObject;
|
||||
gNameField = document.getElementById("namefield");
|
||||
gNameFieldLabel = document.getElementById("namefieldlabel");
|
||||
|
||||
gSubscribeDeck = document.getElementById("subscribedeck");
|
||||
|
||||
msgWindow = Components.classes[msgWindowContractID].createInstance(Components.interfaces.nsIMsgWindow);
|
||||
msgWindow.statusFeedback = gStatusFeedback;
|
||||
msgWindow.SetDOMWindow(window);
|
||||
|
||||
// look in arguments[0] for parameters
|
||||
if (window.arguments && window.arguments[0]) {
|
||||
if ( window.arguments[0].okCallback ) {
|
||||
top.okCallback = window.arguments[0].okCallback;
|
||||
}
|
||||
}
|
||||
|
||||
gServerURI = null;
|
||||
if (window.arguments[0].preselectedURI) {
|
||||
var uri = window.arguments[0].preselectedURI;
|
||||
//dump("subscribe: got a uri," + uri + "\n");
|
||||
var folder = GetMsgFolderFromUri(uri, true);
|
||||
//dump("folder="+folder+"\n");
|
||||
//dump("folder.server="+folder.server+"\n");
|
||||
try {
|
||||
CleanUpSearchView();
|
||||
gSubscribableServer = folder.server.QueryInterface(Components.interfaces.nsISubscribableServer);
|
||||
// enable (or disable) the search related UI
|
||||
EnableSearchUI();
|
||||
gServerURI = folder.server.serverURI;
|
||||
}
|
||||
catch (ex) {
|
||||
//dump("not a subscribable server\n");
|
||||
CleanUpSearchView();
|
||||
gSubscribableServer = null;
|
||||
gServerURI = null;
|
||||
}
|
||||
}
|
||||
|
||||
if (!gServerURI) {
|
||||
//dump("subscribe: no uri\n");
|
||||
//dump("xxx todo: use the default news server. right now, I'm just using the first server\n");
|
||||
var serverMenu = document.getElementById("serverMenu");
|
||||
var menuitems = serverMenu.getElementsByTagName("menuitem");
|
||||
|
||||
if (menuitems.length > 1) {
|
||||
gServerURI = menuitems[1].id;
|
||||
}
|
||||
else {
|
||||
//dump("xxx todo none of your servers are subscribable\n");
|
||||
//dump("xxx todo fix this by disabling subscribe if no subscribable server or, add a CREATE SERVER button, like in 4.x\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
SetUpServerMenu();
|
||||
|
||||
SetUpTree(false);
|
||||
|
||||
gNameField.focus();
|
||||
}
|
||||
|
||||
function subscribeOK()
|
||||
{
|
||||
//dump("in subscribeOK()\n")
|
||||
if (top.okCallback) {
|
||||
top.okCallback(top.gChangeTable);
|
||||
}
|
||||
Stop();
|
||||
if (gSubscribableServer) {
|
||||
gSubscribableServer.subscribeCleanup();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function subscribeCancel()
|
||||
{
|
||||
Stop();
|
||||
if (gSubscribableServer) {
|
||||
gSubscribableServer.subscribeCleanup();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function SetState(name,state)
|
||||
{
|
||||
var changed = gSubscribableServer.setState(name, state);
|
||||
if (changed)
|
||||
StateChanged(name,state);
|
||||
}
|
||||
|
||||
function changeTableRecord(server, name, state)
|
||||
{
|
||||
this.server = server;
|
||||
this.name = name;
|
||||
this.state = state;
|
||||
}
|
||||
|
||||
function StateChanged(name,state)
|
||||
{
|
||||
if (gServerURI in gChangeTable) {
|
||||
if (name in gChangeTable[gServerURI]) {
|
||||
var oldValue = gChangeTable[gServerURI][name];
|
||||
if (oldValue != state)
|
||||
delete gChangeTable[gServerURI][name];
|
||||
}
|
||||
else {
|
||||
gChangeTable[gServerURI][name] = state;
|
||||
}
|
||||
}
|
||||
else {
|
||||
gChangeTable[gServerURI] = {};
|
||||
gChangeTable[gServerURI][name] = state;
|
||||
}
|
||||
}
|
||||
|
||||
function InSearchMode()
|
||||
{
|
||||
// search is the second card in the deck
|
||||
return (gSubscribeDeck.getAttribute("selectedIndex") == "1");
|
||||
}
|
||||
|
||||
function SearchOnClick(event)
|
||||
{
|
||||
// we only care about button 0 (left click) events
|
||||
if (event.button != 0 || event.originalTarget.localName != "treechildren") return;
|
||||
|
||||
var row = {}, col = {}, childElt = {};
|
||||
gSearchTreeBoxObject.getCellAt(event.clientX, event.clientY, row, col, childElt);
|
||||
if (row.value == -1 || row.value > gSearchView.rowCount-1)
|
||||
return;
|
||||
|
||||
if (col.value.id == "subscribedColumn2") {
|
||||
if (event.detail != 2) {
|
||||
// single clicked on the check box
|
||||
// (in the "subscribedColumn2" column) reverse state
|
||||
// if double click, do nothing
|
||||
ReverseStateFromRow(row.value);
|
||||
}
|
||||
} else if (event.detail == 2) {
|
||||
// double clicked on a row, reverse state
|
||||
ReverseStateFromRow(row.value);
|
||||
}
|
||||
|
||||
// invalidate the row
|
||||
InvalidateSearchTreeRow(row.value);
|
||||
}
|
||||
|
||||
function ReverseStateFromRow(row)
|
||||
{
|
||||
// to determine if the row is subscribed or not,
|
||||
// we get the properties for the "subscribedColumn2" cell in the row
|
||||
// and look for the "subscribed" property
|
||||
// if the "subscribed" atom is in the list of properties
|
||||
// we are subscribed
|
||||
var properties = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);
|
||||
var col = gSearchTree.columns["subscribedColumn2"];
|
||||
gSearchView.getCellProperties(row, col, properties);
|
||||
|
||||
var isSubscribed = (properties.GetIndexOf(gSubscribedAtom) != -1);
|
||||
SetStateFromRow(row, !isSubscribed);
|
||||
}
|
||||
|
||||
function SetStateFromRow(row, state)
|
||||
{
|
||||
var col = gSearchTree.columns["nameColumn2"];
|
||||
var name = gSearchView.getCellText(row, col);
|
||||
// we need to escape the name because
|
||||
// some news servers have newsgroups with non ASCII names
|
||||
// we need to escape those name before calling SetState()
|
||||
SetState(encodeURI(name), state);
|
||||
}
|
||||
|
||||
function SetSubscribeState(state)
|
||||
{
|
||||
try {
|
||||
// we need to iterate over the tree selection, and set the state for
|
||||
// all rows in the selection
|
||||
var inSearchMode = InSearchMode();
|
||||
var view = inSearchMode ? gSearchView : gSubscribeTree.view;
|
||||
var colId = inSearchMode ? "nameColumn2" : "nameColumn";
|
||||
|
||||
var sel = view.selection;
|
||||
for (var i = 0; i < sel.getRangeCount(); ++i) {
|
||||
var start = {}, end = {};
|
||||
sel.getRangeAt(i, start, end);
|
||||
for (var k = start.value; k <= end.value; ++k) {
|
||||
if (inSearchMode)
|
||||
SetStateFromRow(k, state);
|
||||
else {
|
||||
var rowRes = gSubscribeTree.builderView.getResourceAtIndex(k);
|
||||
var name = GetRDFProperty(rowRes, "Name");
|
||||
SetState(name, state);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (inSearchMode) {
|
||||
// force a repaint
|
||||
InvalidateSearchTree();
|
||||
}
|
||||
}
|
||||
catch (ex) {
|
||||
dump("SetSubscribedState failed: " + ex + "\n");
|
||||
}
|
||||
}
|
||||
|
||||
function ReverseStateFromNode(row)
|
||||
{
|
||||
var rowRes = gSubscribeTree.builderView.getResourceAtIndex(row);
|
||||
var isSubscribed = GetRDFProperty(rowRes, "Subscribed");
|
||||
var name = GetRDFProperty(rowRes, "Name");
|
||||
|
||||
SetState(name, isSubscribed != "true");
|
||||
}
|
||||
|
||||
function GetRDFProperty(aRes, aProp)
|
||||
{
|
||||
var propRes = RDF.GetResource("http://home.netscape.com/NC-rdf#"+aProp);
|
||||
var valueRes = gSubscribeTree.database.GetTarget(aRes, propRes, true);
|
||||
return valueRes ? valueRes.QueryInterface(Components.interfaces.nsIRDFLiteral).Value : null;
|
||||
}
|
||||
|
||||
function SubscribeOnClick(event)
|
||||
{
|
||||
// we only care about button 0 (left click) events
|
||||
if (event.button != 0 || event.originalTarget.localName != "treechildren")
|
||||
return;
|
||||
|
||||
var row = {}, col = {}, obj = {};
|
||||
gSubscribeTree.treeBoxObject.getCellAt(event.clientX, event.clientY, row, col, obj);
|
||||
if (row.value == -1 || row.value > (gSubscribeTree.view.rowCount - 1))
|
||||
return;
|
||||
|
||||
if (event.detail == 2) {
|
||||
// only toggle subscribed state when double clicking something
|
||||
// that isn't a container
|
||||
if (!gSubscribeTree.view.isContainer(row.value)) {
|
||||
ReverseStateFromNode(row.value);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (event.detail == 1)
|
||||
{
|
||||
if (obj.value == "twisty") {
|
||||
if (gSubscribeTree.view.isContainerOpen(row.value)) {
|
||||
var uri = gSubscribeTree.builderView.getResourceAtIndex(row.value).Value;
|
||||
|
||||
gStatusFeedback._startMeteors();
|
||||
gStatusFeedback.showStatusString(gSubscribeBundle.getString("pleaseWaitString"));
|
||||
|
||||
gSubscribableServer.startPopulatingWithUri(msgWindow, true /* force to server */, uri);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// if the user single clicks on the subscribe check box, we handle it here
|
||||
if (col.value.id == "subscribedColumn")
|
||||
ReverseStateFromNode(row.value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function Refresh()
|
||||
{
|
||||
// clear out the textfield's entry on call of Refresh()
|
||||
gNameField.value = "";
|
||||
// force it to talk to the server
|
||||
SetUpTree(true);
|
||||
}
|
||||
|
||||
function InvalidateSearchTreeRow(row)
|
||||
{
|
||||
gSearchTreeBoxObject.invalidateRow(row);
|
||||
}
|
||||
|
||||
function InvalidateSearchTree()
|
||||
{
|
||||
gSearchTreeBoxObject.invalidate();
|
||||
}
|
||||
|
||||
function SwitchToNormalView()
|
||||
{
|
||||
// the first card in the deck is the "normal" view
|
||||
gSubscribeDeck.setAttribute("selectedIndex","0");
|
||||
}
|
||||
|
||||
function SwitchToSearchView()
|
||||
{
|
||||
// the second card in the deck is the "search" view
|
||||
gSubscribeDeck.setAttribute("selectedIndex","1");
|
||||
}
|
||||
|
||||
function Search()
|
||||
{
|
||||
var searchValue = gNameField.value;
|
||||
if (searchValue.length && gSubscribableServer.supportsSubscribeSearch) {
|
||||
SwitchToSearchView();
|
||||
gSubscribableServer.setSearchValue(searchValue);
|
||||
|
||||
if (!gSearchView && gSubscribableServer) {
|
||||
gSearchView = gSubscribableServer.QueryInterface(Components.interfaces.nsITreeView);
|
||||
gSearchView.selection = null;
|
||||
gSearchTreeBoxObject.view = gSearchView;
|
||||
}
|
||||
}
|
||||
else {
|
||||
SwitchToNormalView();
|
||||
}
|
||||
}
|
||||
|
||||
function CleanUpSearchView()
|
||||
{
|
||||
if (gSearchView) {
|
||||
gSearchView.selection = null;
|
||||
gSearchView = null;
|
||||
}
|
||||
}
|
||||
|
||||
function onSearchTreeKeyPress(event)
|
||||
{
|
||||
// for now, only do something on space key
|
||||
if (event.charCode != KeyEvent.DOM_VK_SPACE)
|
||||
return;
|
||||
|
||||
var treeSelection = gSearchView.selection;
|
||||
for (var i=0;i<treeSelection.getRangeCount();i++) {
|
||||
var start = {}, end = {};
|
||||
treeSelection.getRangeAt(i,start,end);
|
||||
for (var k=start.value;k<=end.value;k++)
|
||||
ReverseStateFromRow(k);
|
||||
|
||||
// force a repaint
|
||||
InvalidateSearchTree();
|
||||
}
|
||||
}
|
||||
|
||||
function onSubscribeTreeKeyPress(event)
|
||||
{
|
||||
// for now, only do something on space key
|
||||
if (event.charCode != KeyEvent.DOM_VK_SPACE)
|
||||
return;
|
||||
|
||||
var treeSelection = gSubscribeTree.view.selection;
|
||||
for (var i=0;i<treeSelection.getRangeCount();i++) {
|
||||
var start = {}, end = {};
|
||||
treeSelection.getRangeAt(i,start,end);
|
||||
for (var k=start.value;k<=end.value;k++)
|
||||
ReverseStateFromNode(k);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function doHelpButton()
|
||||
{
|
||||
openHelp("mail-subscribe");
|
||||
}
|
||||
@ -85,11 +85,15 @@
|
||||
<separator class="thin"/>
|
||||
<spacer/>
|
||||
</row>
|
||||
<row>
|
||||
<label id="subscribeFolderLabel"/>
|
||||
</row>
|
||||
<row flex="1">
|
||||
<deck id="subscribedeck" selectedIndex="0">
|
||||
<hbox id="normalview">
|
||||
<tree id="subscribeTree"
|
||||
flex="1"
|
||||
hidecolumnpicker="true"
|
||||
seltype="multiple"
|
||||
datasources="rdf:null"
|
||||
flags="dont-build-content"
|
||||
@ -128,8 +132,6 @@
|
||||
<treerow>
|
||||
<treecell label="?LeafName" properties="ServerType-?ServerType Subscribable-?Subscribable"/>
|
||||
<treecell properties="Subscribed-?Subscribed Subscribable-?Subscribable"/>
|
||||
<!-- commenting out until bug 38906 is fixed
|
||||
<treecell label="?TotalMessages"/> -->
|
||||
</treerow>
|
||||
</treeitem>
|
||||
</treechildren>
|
||||
@ -138,16 +140,10 @@
|
||||
</template>
|
||||
|
||||
<treecols id="theSubscribeColumns">
|
||||
<treecol id="nameColumn" persist="hidden" flex="1" primary="true" label="..."
|
||||
sort="?LeafName"/>
|
||||
<treecol id="nameColumn" primary="true" sort="?LeafName" flex="10" hideheader="true"/>
|
||||
<splitter class="tree-splitter"/>
|
||||
<treecol id="subscribedColumn" persist="hidden" cycler="true" label="&subscribedHeader.label;"
|
||||
sort="?Subscribed"/>
|
||||
<!-- commenting out until bug 38906 is fixed
|
||||
<splitter class="tree-splitter"/>
|
||||
<treecol id="messagesColumn" persist="hidden" label="&messagesHeader.label;"
|
||||
sort="?TotalMessages"/> -->
|
||||
</treecols>
|
||||
<treecol id="subscribedColumn" hideheader="true" flex="1" sort="?Subscribed"/>
|
||||
</treecols>
|
||||
</tree>
|
||||
</hbox>
|
||||
<hbox id="searchview">
|
||||
@ -156,12 +152,9 @@
|
||||
onkeypress="onSearchTreeKeyPress(event);"
|
||||
onclick="SearchOnClick(event);">
|
||||
<treecols>
|
||||
<treecol id="nameColumn2" persist="hidden" flex="1" primary="true" label="..." />
|
||||
<treecol id="nameColumn2" primary="true" sort="?LeafName" flex="10" hideheader="true"/>
|
||||
<splitter class="tree-splitter"/>
|
||||
<treecol id="subscribedColumn2" persist="hidden" cycler="true" label="&subscribedHeader.label;" />
|
||||
<!-- commenting out until bug 38906 is fixed
|
||||
<splitter class="tree-splitter"/>
|
||||
<treecol id="messagesColumn2" persist="hidden" label="&messagesHeader.label;" /> -->
|
||||
<treecol id="subscribedColumn2" hideheader="true" flex="1" sort="?Subscribed"/>
|
||||
</treecols>
|
||||
<treechildren id="searchTreeBody"/>
|
||||
</tree>
|
||||
|
||||
@ -26,6 +26,7 @@ messenger.jar:
|
||||
*+ content/messenger/FilterListDialog.xul (content/FilterListDialog.xul)
|
||||
*+ content/messenger/FilterListDialog.js (content/FilterListDialog.js)
|
||||
*+ content/messenger/subscribe.xul (content/subscribe.xul)
|
||||
+ content/messenger/subscribe.js (content/subscribe.js)
|
||||
*+ content/messenger/aboutDialog.xul (content/aboutDialog.xul)
|
||||
*+ content/messenger/junkMail.xul (content/junkMail.xul)
|
||||
*+ content/messenger/junkMail.js (content/junkMail.js)
|
||||
|
||||
@ -0,0 +1,24 @@
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Seth Spitzer <sspitzer@netscape.com>
|
||||
#
|
||||
|
||||
foldersheaderfor-nntp=Select the newsgroups to subscribe to:
|
||||
foldersheaderfor-imap=Select the folders to subscribe to:
|
||||
pleaseWaitString=Please wait...
|
||||
@ -8,8 +8,9 @@
|
||||
locale/@AB_CD@/messenger/h2.png (@AB_CD@/chrome/messenger/h2.png)
|
||||
locale/@AB_CD@/messenger/back.png (@AB_CD@/chrome/messenger/back.png)
|
||||
locale/@AB_CD@/messenger/aboutDialog.dtd (@AB_CD@/chrome/messenger/aboutDialog.dtd)
|
||||
locale/@AB_CD@/virtualFolderProperties.dtd (@AB_CD@/chrome/messenger/virtualFolderProperties.dtd)
|
||||
locale/@AB_CD@/virtualFolderListDialog.dtd (@AB_CD@/chrome/messenger/virtualFolderListDialog.dtd)
|
||||
locale/@AB_CD@/messenger/virtualFolderProperties.dtd (@AB_CD@/chrome/messenger/virtualFolderProperties.dtd)
|
||||
locale/@AB_CD@/messenger/virtualFolderListDialog.dtd (@AB_CD@/chrome/messenger/virtualFolderListDialog.dtd)
|
||||
+ locale/@AB_CD@/messenger/subscribe.properties (@AB_CD@/chrome/messenger/subscribe.properties)
|
||||
+ locale/@AB_CD@/messenger/junkMail.dtd (@AB_CD@/chrome/messenger/junkMail.dtd)
|
||||
+ locale/@AB_CD@/messenger/junkMailInfo.dtd (@AB_CD@/chrome/messenger/junkMailInfo.dtd)
|
||||
+ locale/@AB_CD@/messenger/mailOverlay.dtd (@AB_CD@/chrome/messenger/mailOverlay.dtd)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user