зеркало из https://github.com/mozilla/snowl.git
store/persist multiselection on tree document, bug 474239.
This commit is contained in:
Родитель
2030d55baf
Коммит
a7924d64e9
|
@ -369,9 +369,8 @@ let Snowl = {
|
|||
sidebarDoc.CollectionsView._tree.place = val ?
|
||||
SnowlPlaces.queryFlat : SnowlPlaces.queryGrouped;
|
||||
// Ensure collection selection maintained, if in List sidebar
|
||||
if (document.getElementById("snowlSidebar") && SnowlUtils.gListViewCollectionItemIds) {
|
||||
sidebarDoc.CollectionsView._tree.
|
||||
selectItems(SnowlUtils.gListViewCollectionItemIds);
|
||||
if (document.getElementById("snowlSidebar")) {
|
||||
sidebarDoc.CollectionsView._tree.selectItems(CollectionsView.itemIds);
|
||||
sidebarDoc.CollectionsView._tree.boxObject.
|
||||
ensureRowIsVisible(sidebarDoc.CollectionsView._tree.currentIndex);
|
||||
}
|
||||
|
|
|
@ -63,6 +63,21 @@ let CollectionsView = {
|
|||
return this._children = document.getElementById("sourcesViewChildren");
|
||||
},
|
||||
|
||||
get itemIds() {
|
||||
let intArray = [];
|
||||
let strArray = this._tree.getAttribute("itemids").split(",");
|
||||
for each (let intg in strArray)
|
||||
intArray.push(parseInt(intg));
|
||||
delete this._itemIds;
|
||||
return this._itemIds = intArray;
|
||||
},
|
||||
|
||||
set itemIds(ids) {
|
||||
this._tree.setAttribute("itemids", ids);
|
||||
delete this._itemIds;
|
||||
return this._itemIds = ids;
|
||||
},
|
||||
|
||||
|
||||
//**************************************************************************//
|
||||
// Initialization & Destruction
|
||||
|
@ -73,7 +88,7 @@ let CollectionsView = {
|
|||
Observers.add("snowl:message:added", this.onMessageAdded, this);
|
||||
Observers.add("snowl:messages:changed", this.onMessagesComplete, this);
|
||||
|
||||
// Intialize places
|
||||
// Intialize places
|
||||
SnowlPlaces.init();
|
||||
if (!this._tree.hasAttribute("flat"))
|
||||
this._tree.setAttribute("flat", true);
|
||||
|
@ -88,26 +103,27 @@ let CollectionsView = {
|
|||
SnowlPlaces.queryFlat : SnowlPlaces.queryGrouped;
|
||||
this._tree.place = query;
|
||||
|
||||
// Ensure collection selection maintained, if in List sidebar
|
||||
if (document.getElementById("snowlSidebar") && SnowlUtils.gListViewCollectionItemIds)
|
||||
this._tree.selectItems(SnowlUtils.gListViewCollectionItemIds);
|
||||
// Ensure collection tree selection maintained
|
||||
// if (document.getElementById("snowlSidebar"))
|
||||
this._tree.selectItems(this.itemIds);
|
||||
this._log.info("init: itemIds = "+this.itemIds);
|
||||
},
|
||||
|
||||
|
||||
//**************************************************************************//
|
||||
// Event & Notification Handlers
|
||||
|
||||
onSourceAdded: function() {
|
||||
onSourceAdded: function(aPlaceID) {
|
||||
// Newly subscribed source has been added to places, select the inserted row.
|
||||
// The tree may not be ready, so use a timeout. The effect of selecting here
|
||||
// is that onMessageAdded will trigger a list view refresh for each message,
|
||||
// so messages pop into the list as added.
|
||||
this._tree.view.selection.select(-1);
|
||||
this._tree.currentSelectedIndex = this._tree.currentIndex;
|
||||
this.itemIds = [aPlaceID];
|
||||
setTimeout(function() {
|
||||
SnowlUtils.gListViewDeleteMoveInsert = true;
|
||||
SnowlUtils.RestoreSelection(CollectionsView._tree,
|
||||
SnowlUtils.gListViewCollectionItemIds);
|
||||
SnowlUtils.RestoreSelection(CollectionsView._tree, CollectionsView.itemIds);
|
||||
}, 300)
|
||||
},
|
||||
|
||||
|
@ -133,6 +149,7 @@ let CollectionsView = {
|
|||
}
|
||||
|
||||
if (refreshFlag) {
|
||||
CollectionsView._log.info("onMessageAdded: REFRESH LIST");
|
||||
gMessageViewWindow.SnowlMessageView._collection.invalidate();
|
||||
gMessageViewWindow.SnowlMessageView._rebuildView();
|
||||
}
|
||||
|
@ -146,6 +163,7 @@ let CollectionsView = {
|
|||
},
|
||||
|
||||
onSelect: function(aEvent) {
|
||||
this._log.info("onSelect start: aEvent = "+aEvent.toSource());
|
||||
// We want to only select onClick (more precisely, mouseup) for mouse events
|
||||
// but need onSelect for key events (arrow keys). Since onSelect events do
|
||||
// not have info on whether mouse or key, we track it ourselves.
|
||||
|
@ -157,19 +175,16 @@ let CollectionsView = {
|
|||
|
||||
onClick: function(aEvent) {
|
||||
let row = { }, col = { }, obj = { };
|
||||
let constraints = [];
|
||||
let constraints = [], selectedItemIds = [];
|
||||
let itemId, uri, rangeFirst = { }, rangeLast = { }, stop = false;
|
||||
let modKey = aEvent.metaKey || aEvent.ctrlKey || aEvent.shiftKey;
|
||||
|
||||
this._log.info("onClick start: curIndex:curSelectedIndex = "+
|
||||
this._tree.currentIndex+" : "+this._tree.currentSelectedIndex);
|
||||
this._log.info("onClick start: selNodeViewIndex:viewSelcurIndex = "+
|
||||
(this._tree.selectedNode ?
|
||||
this._tree.selectedNode.viewIndex+" : "+this._tree.view.selection.currentIndex :
|
||||
"NULL selectedNode"));
|
||||
this._log.info("onClick start - gMouseEvent:gRtbutton:modKey = "+
|
||||
SnowlUtils.gMouseEvent+" : "+SnowlUtils.gRightMouseButtonDown+" : "+modKey);
|
||||
this._log.info("onClick: selectionCount = "+this._tree.view.selection.count);
|
||||
this._log.info("onClick: START itemIds - " +this.itemIds.toSource());
|
||||
|
||||
// Don't run query on right click, or already selected row (unless deselecting).
|
||||
if (SnowlUtils.gRightMouseButtonDown || this._tree.currentIndex == -1 ||
|
||||
|
@ -190,6 +205,7 @@ this._log.info("onClick: selectionCount = "+this._tree.view.selection.count);
|
|||
gMessageViewWindow.SnowlMessageView._collection.clear();
|
||||
gMessageViewWindow.SnowlMessageView._rebuildView();
|
||||
this._tree.currentSelectedIndex = -1;
|
||||
this.itemIds = "";
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -202,14 +218,12 @@ this._log.info("onClick: selectionCount = "+this._tree.view.selection.count);
|
|||
return;
|
||||
}
|
||||
|
||||
// Reset stored selection array.
|
||||
SnowlUtils.gListViewCollectionItemIds = [];
|
||||
// Get selected row(s) and construct a query.
|
||||
for (let i = 0; i < numRanges && !stop; i++) {
|
||||
this._tree.view.selection.getRangeAt(i, rangeFirst, rangeLast);
|
||||
for (let index = rangeFirst.value; index <= rangeLast.value; index++) {
|
||||
itemId = this._tree.view.nodeForTreeIndex(index).itemId;
|
||||
SnowlUtils.gListViewCollectionItemIds.push(itemId);
|
||||
selectedItemIds.push(itemId);
|
||||
uri = this._tree.view.nodeForTreeIndex(index).uri;
|
||||
let query = new SnowlQuery(uri);
|
||||
if (query.queryProtocol == "place:") {
|
||||
|
@ -238,6 +252,7 @@ this._log.info("onClick: constraints = " + constraints.toSource());
|
|||
|
||||
let collection = new SnowlCollection(null, name, null, constraints, null);
|
||||
gMessageViewWindow.SnowlMessageView.setCollection(collection);
|
||||
this.itemIds = selectedItemIds;
|
||||
|
||||
this._tree.currentSelectedIndex = this._tree.currentIndex;
|
||||
SnowlUtils.gMouseEvent = null;
|
||||
|
@ -248,7 +263,7 @@ this._log.info("onClick: constraints = " + constraints.toSource());
|
|||
},
|
||||
|
||||
onTreeContextPopupHidden: function() {
|
||||
SnowlUtils.RestoreSelection(this._tree, SnowlUtils.gListViewCollectionItemIds);
|
||||
SnowlUtils.RestoreSelection(this._tree, this.itemIds);
|
||||
},
|
||||
|
||||
onSubscribe: function() {
|
||||
|
@ -483,8 +498,7 @@ function SnowlTreeViewDrop(aRow, aOrientation) {
|
|||
this._drop(aRow, aOrientation);
|
||||
|
||||
SnowlUtils.gListViewDeleteMoveInsert = true;
|
||||
SnowlUtils.RestoreSelection(CollectionsView._tree,
|
||||
SnowlUtils.gListViewCollectionItemIds);
|
||||
SnowlUtils.RestoreSelection(CollectionsView._tree, CollectionsView.itemIds);
|
||||
};
|
||||
|
||||
// Not using this yet..
|
||||
|
|
|
@ -87,7 +87,8 @@
|
|||
editable="true"
|
||||
class="sidebar-placesTree"
|
||||
type="places"
|
||||
persist="flat"
|
||||
persist="flat itemids"
|
||||
itemids=""
|
||||
hidecolumnpicker="true"
|
||||
onkeypress="SidebarUtils.handleTreeKeyPress(event);"
|
||||
onmousemove="SidebarUtils.handleTreeMouseMove(event);"
|
||||
|
|
|
@ -100,12 +100,6 @@ let SnowlPreferences = {
|
|||
},
|
||||
|
||||
onPaneLoad: function() {
|
||||
// Select passed tab
|
||||
let snowlPrefs = document.getElementById("snowlPrefs");
|
||||
let extraArgs = window.arguments[1];
|
||||
if (extraArgs && extraArgs["snowlTab"])
|
||||
snowlPrefs.selectedTab = document.getElementById(extraArgs["snowlTab"]);
|
||||
|
||||
Subscriber.addObservers();
|
||||
window.addEventListener("unload", function() { Subscriber.removeObservers(); }, false);
|
||||
},
|
||||
|
|
|
@ -139,6 +139,9 @@ let SnowlMessageView = {
|
|||
// in the view when you first open it, which is confusing and unexpected.
|
||||
this._collection.limit = 250;
|
||||
|
||||
// Set messages to null, to trigger collection build (unlike List view).
|
||||
this._collection.invalidate();
|
||||
|
||||
this._rebuildView();
|
||||
|
||||
this._initWriteForm();
|
||||
|
|
|
@ -306,11 +306,10 @@ let SnowlSource = {
|
|||
"UPDATE sources " +
|
||||
"SET placeID = " + placeID +
|
||||
" WHERE id = " + this.id);
|
||||
SnowlUtils.gListViewCollectionItemIds = [placeID];
|
||||
this._log.info("persist placeID:sources.id - " + placeID + " : " + this.id);
|
||||
|
||||
// Use 'added' here for collections observer for more specificity
|
||||
Observers.notify("snowl:source:added");
|
||||
Observers.notify("snowl:source:added", placeID);
|
||||
}
|
||||
|
||||
SnowlDatastore.dbConnection.commitTransaction();
|
||||
|
|
|
@ -309,14 +309,9 @@ let SnowlUtils = {
|
|||
|
||||
//**************************************************************************//
|
||||
// Utilities to track tree selections within a session
|
||||
// XXX store on document for restore on restart??
|
||||
|
||||
gListViewDeleteMoveInsert: false,
|
||||
|
||||
// Current collections tree selected row(s) itemId(s)
|
||||
// FIXME: store the list per tree view across list/river loads, multiple windows.
|
||||
gListViewCollectionItemIds: [],
|
||||
|
||||
// Position of current page in tabs and history
|
||||
gMessagePosition: {tabIndex: null, pageIndex: null},
|
||||
|
||||
|
@ -363,10 +358,10 @@ let SnowlUtils = {
|
|||
treeSelection.currentIndex = saveCurrentIndex;
|
||||
treeBoxObj.ensureRowIsVisible(row.value);
|
||||
treeSelection.selectEventsSuppressed = false;
|
||||
// Keep track of which row in the tree is currently selected via rt click,
|
||||
// onClick handler will update currentSelectedIndex for left click.
|
||||
if (this.gRightMouseButtonDown)
|
||||
tree.currentSelectedIndex = row.value;
|
||||
// Keep track of which row in the tree is currently selected via rt click,
|
||||
// onClick handler will update currentSelectedIndex for left click.
|
||||
if (this.gRightMouseButtonDown)
|
||||
tree.currentSelectedIndex = row.value;
|
||||
}
|
||||
}
|
||||
// This will not stop the onSelect event, need to test in the handler..
|
||||
|
|
Загрузка…
Ссылка в новой задаче