зеркало из https://github.com/mozilla/gecko-dev.git
fix for #146046. fix several regressions to the subscribe dialog.
1) [search view] "Subscribe" and "Unsubscribe" buttons don't work (original bug) 2) [search and tree views] space bar doesn't do the right thing (toggle state) 3) [tree view] double click on a row that is a container should not toggle the subscribe state r=hwaara, sr=bienvenu
This commit is contained in:
Родитель
5367483734
Коммит
d1784190d5
|
@ -28,7 +28,7 @@ function goDoCommand()
|
||||||
|
|
||||||
function Stop()
|
function Stop()
|
||||||
{
|
{
|
||||||
//dump("Stop()\n")
|
//dump("Stop()\n")
|
||||||
if (gSubscribableServer) {
|
if (gSubscribableServer) {
|
||||||
gSubscribableServer.stopPopulating(msgWindow);
|
gSubscribableServer.stopPopulating(msgWindow);
|
||||||
}
|
}
|
||||||
|
@ -39,7 +39,7 @@ function SetServerTypeSpecificTextValues()
|
||||||
if (!gServerURI) return;
|
if (!gServerURI) return;
|
||||||
|
|
||||||
var serverType = GetMsgFolderFromUri(gServerURI, true).server.type;
|
var serverType = GetMsgFolderFromUri(gServerURI, true).server.type;
|
||||||
|
|
||||||
// set the server specific ui elements
|
// set the server specific ui elements
|
||||||
var stringName = "foldersheaderfor-" + serverType;
|
var stringName = "foldersheaderfor-" + serverType;
|
||||||
var stringval = gSubscribeBundle.getString(stringName);
|
var stringval = gSubscribeBundle.getString(stringName);
|
||||||
|
@ -337,12 +337,16 @@ function ReverseStateFromRow(row)
|
||||||
gSearchView.getCellProperties(row, "subscribedCol", properties);
|
gSearchView.getCellProperties(row, "subscribedCol", properties);
|
||||||
|
|
||||||
var isSubscribed = (properties.GetIndexOf(gSubscribedAtom) != -1);
|
var isSubscribed = (properties.GetIndexOf(gSubscribedAtom) != -1);
|
||||||
|
SetStateFromRow(row, !isSubscribed);
|
||||||
|
}
|
||||||
|
|
||||||
|
function SetStateFromRow(row, state)
|
||||||
|
{
|
||||||
var name = gSearchView.getCellText(row,"nameCol");
|
var name = gSearchView.getCellText(row,"nameCol");
|
||||||
// we need to escape the name because
|
// we need to escape the name because
|
||||||
// some news servers have newsgroups with non ASCII names
|
// some news servers have newsgroups with non ASCII names
|
||||||
// we need to escape those name before calling SetState()
|
// we need to escape those name before calling SetState()
|
||||||
SetState(escape(name), !isSubscribed);
|
SetState(escape(name), state);
|
||||||
}
|
}
|
||||||
|
|
||||||
function SetSubscribeState(state)
|
function SetSubscribeState(state)
|
||||||
|
@ -350,22 +354,32 @@ function SetSubscribeState(state)
|
||||||
try {
|
try {
|
||||||
// we need to iterate over the tree selection, and set the state for
|
// we need to iterate over the tree selection, and set the state for
|
||||||
// all rows in the selection
|
// all rows in the selection
|
||||||
var view = InSearchMode() ? gSearchView : gSubscribeTree.view;
|
var inSearchMode = InSearchMode();
|
||||||
var colId = InSearchMode() ? "nameCol" : "NameColumn";
|
var view = inSearchMode ? gSearchView : gSubscribeTree.view;
|
||||||
|
var colId = inSearchMode ? "nameCol" : "NameColumn";
|
||||||
|
|
||||||
var sel = view.selection;
|
var sel = view.selection;
|
||||||
for (var i = 0; i < sel.getRangeCount(); ++i) {
|
for (var i = 0; i < sel.getRangeCount(); ++i) {
|
||||||
var start = {}, end = {};
|
var start = {}, end = {};
|
||||||
sel.getRangeAt(i, start, end);
|
sel.getRangeAt(i, start, end);
|
||||||
for (var k = start.value; k <= end.value; ++k) {
|
for (var k = start.value; k <= end.value; ++k) {
|
||||||
var rowRes = gSubscribeTree.builderView.getResourceAtIndex(k);
|
if (inSearchMode)
|
||||||
var name = GetRDFProperty(rowRes, "Name");
|
SetStateFromRow(k, state);
|
||||||
SetState(name, state);
|
else {
|
||||||
|
var rowRes = gSubscribeTree.builderView.getResourceAtIndex(k);
|
||||||
|
var name = GetRDFProperty(rowRes, "Name");
|
||||||
|
SetState(name, state);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (inSearchMode) {
|
||||||
|
// force a repaint
|
||||||
|
InvalidateSearchTree();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (ex) {
|
catch (ex) {
|
||||||
//dump("SetSubscribedState failed: " + ex + "\n");
|
dump("SetSubscribedState failed: " + ex + "\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -392,32 +406,34 @@ function SubscribeOnClick(event)
|
||||||
|
|
||||||
var row = {}, col = {}, obj = {};
|
var row = {}, col = {}, obj = {};
|
||||||
gSubscribeTree.treeBoxObject.getCellAt(event.clientX, event.clientY, row, col, obj);
|
gSubscribeTree.treeBoxObject.getCellAt(event.clientX, event.clientY, row, col, obj);
|
||||||
if (row == -1 || row.value > gSubscribeTree.view.rowCount-1)
|
if (row.value == -1 || row.value > (gSubscribeTree.view.rowCount - 1))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (event.detail == 2) {
|
if (event.detail == 2) {
|
||||||
// don't subscribe when double clicking a closed container to open it
|
// only toggle subscribed state when double clicking something
|
||||||
if (gSubscribeTree.view.isContainer(row.value) && !gSubscribeTree.view.isContainerOpen(row.value))
|
// that isn't a container
|
||||||
ReverseStateFromNode(row.value);
|
if (!gSubscribeTree.view.isContainer(row.value)) {
|
||||||
} else {
|
ReverseStateFromNode(row.value);
|
||||||
if (obj.value == "twisty") {
|
}
|
||||||
if (gSubscribeTree.view.isContainerOpen(row.value)) {
|
else {
|
||||||
var uri = gSubscribeTree.builderView.getResourceAtIndex(row.value).Value;
|
if (obj.value == "twisty") {
|
||||||
|
if (gSubscribeTree.view.isContainerOpen(row.value)) {
|
||||||
gStatusFeedback.showProgress(0);
|
var uri = gSubscribeTree.builderView.getResourceAtIndex(row.value).Value;
|
||||||
gStatusFeedback.showStatusString(gSubscribeBundle.getString("pleaseWaitString"));
|
|
||||||
gStatusBar.setAttribute("mode", "undetermined");
|
|
||||||
|
|
||||||
gSubscribableServer.startPopulatingWithUri(msgWindow, true /* force to server */, uri);
|
gStatusFeedback.showProgress(0);
|
||||||
}
|
gStatusFeedback.showStatusString(gSubscribeBundle.getString("pleaseWaitString"));
|
||||||
}
|
gStatusBar.setAttribute("mode", "undetermined");
|
||||||
else {
|
|
||||||
// if the user clicks on the subscribe check box, we handle it here
|
gSubscribableServer.startPopulatingWithUri(msgWindow, true /* force to server */, uri);
|
||||||
if (col.value == "SubscribedColumn")
|
}
|
||||||
ReverseStateFromNode(row.value);
|
}
|
||||||
return;
|
}
|
||||||
}
|
}
|
||||||
}
|
else {
|
||||||
|
// if the user single clicks on the subscribe check box, we handle it here
|
||||||
|
if (col.value == "SubscribedColumn")
|
||||||
|
ReverseStateFromNode(row.value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function Refresh()
|
function Refresh()
|
||||||
|
@ -479,7 +495,7 @@ function CleanUpSearchView()
|
||||||
function onSearchTreeKeyPress(event)
|
function onSearchTreeKeyPress(event)
|
||||||
{
|
{
|
||||||
// for now, only do something on space key
|
// for now, only do something on space key
|
||||||
if (event.keyCode != KeyEvent.DOM_VK_SPACE)
|
if (event.charCode != KeyEvent.DOM_VK_SPACE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var treeSelection = gSearchView.selection;
|
var treeSelection = gSearchView.selection;
|
||||||
|
@ -497,7 +513,7 @@ function onSearchTreeKeyPress(event)
|
||||||
function onSubscribeTreeKeyPress(event)
|
function onSubscribeTreeKeyPress(event)
|
||||||
{
|
{
|
||||||
// for now, only do something on space key
|
// for now, only do something on space key
|
||||||
if (event.keyCode != KeyEvent.DOM_VK_SPACE)
|
if (event.charCode != KeyEvent.DOM_VK_SPACE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var treeSelection = gSubscribeTree.view.selection;
|
var treeSelection = gSubscribeTree.view.selection;
|
||||||
|
@ -505,7 +521,7 @@ function onSubscribeTreeKeyPress(event)
|
||||||
var start = {}, end = {};
|
var start = {}, end = {};
|
||||||
treeSelection.getRangeAt(i,start,end);
|
treeSelection.getRangeAt(i,start,end);
|
||||||
for (var k=start.value;k<=end.value;k++)
|
for (var k=start.value;k<=end.value;k++)
|
||||||
ReverseStateFromRow(k);
|
ReverseStateFromNode(k);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -94,6 +94,7 @@ Rights Reserved.
|
||||||
seltype="multiple"
|
seltype="multiple"
|
||||||
datasources="rdf:null"
|
datasources="rdf:null"
|
||||||
flags="dont-build-content"
|
flags="dont-build-content"
|
||||||
|
disableKeyNavigation="true"
|
||||||
onkeypress="onSubscribeTreeKeyPress(event);"
|
onkeypress="onSubscribeTreeKeyPress(event);"
|
||||||
onclick="SubscribeOnClick(event);">
|
onclick="SubscribeOnClick(event);">
|
||||||
<template>
|
<template>
|
||||||
|
@ -146,6 +147,7 @@ Rights Reserved.
|
||||||
</hbox>
|
</hbox>
|
||||||
<hbox id="searchview">
|
<hbox id="searchview">
|
||||||
<tree id="searchTree" flex="1"
|
<tree id="searchTree" flex="1"
|
||||||
|
disableKeyNavigation="true"
|
||||||
onkeypress="onSearchTreeKeyPress(event);"
|
onkeypress="onSearchTreeKeyPress(event);"
|
||||||
onclick="SearchOnClick(event);">
|
onclick="SearchOnClick(event);">
|
||||||
<treecols>
|
<treecols>
|
||||||
|
|
Загрузка…
Ссылка в новой задаче