www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

commit cc195532c068222710b9dd1396993e0caba681d9
parent 6918757b8b8d98c9752ce6052928239c832c485c
Author: David Norton <david@nortoncrew.com>
Date:   Tue, 23 May 2006 21:59:31 +0000

Took out singular ('item' and 'folder') from getTreeRows().

Basic tree traversal in single-window mode.



Diffstat:
Mchrome/chromeFiles/content/scholar/data_access.js | 2--
Mchrome/chromeFiles/content/scholar/scholar.js | 47++++++++++++++++++++++++++++++++++++++++++++++-
Mchrome/chromeFiles/content/scholar/scholar.xul | 29+++++++++++++++++++++--------
Mchrome/chromeFiles/content/scholar/treeView.js | 187+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 254 insertions(+), 11 deletions(-)

diff --git a/chrome/chromeFiles/content/scholar/data_access.js b/chrome/chromeFiles/content/scholar/data_access.js @@ -920,11 +920,9 @@ Scholar.Items = new function(){ + 'WHERE parentFolderID=' + parent; switch (type){ - case 'folder': case 'folders': sql += ' AND isFolder=1'; break; - case 'item': case 'items': sql += ' AND isFolder=0'; break; diff --git a/chrome/chromeFiles/content/scholar/scholar.js b/chrome/chromeFiles/content/scholar/scholar.js @@ -1,4 +1,49 @@ +var foldersView; +var itemsView; + function init() { - // + foldersView = new Scholar.TreeView(0); //pass params here? + document.getElementById('folders-tree').view = foldersView; + itemsView = new Scholar.TreeView(0); + document.getElementById('items-tree').view = itemsView; + + var addMenu = document.getElementById('tb-add').firstChild; + var itemTypes = Scholar.ItemTypes.getTypes(); + for(var i = 0; i<itemTypes.length; i++) + { + var menuitem = document.createElement("menuitem"); + menuitem.setAttribute("label",Scholar.LocalizedStrings.getString("itemTypes."+itemTypes[i]['name'])); + menuitem.setAttribute("oncommand","newItem("+itemTypes[i]['id']+")"); + addMenu.appendChild(menuitem); + } +} + +function newItem(typeID) +{ + +} + +function newFolder() +{ + +} + +function folderSelected() +{ + if(foldersView.selection.count == 1 && foldersView.selection.currentIndex != -1) + { + itemsView = new Scholar.TreeView(foldersView._getItemAtRow(foldersView.selection.currentIndex).getID()); + document.getElementById('items-tree').view = itemsView; + } + else if(foldersView.selection.count == 0) + { + itemsView = new Scholar.TreeView(0); + document.getElementById('items-tree').view = itemsView; + } + else + { + document.getElementById('items-tree').view = null; + } + } \ No newline at end of file diff --git a/chrome/chromeFiles/content/scholar/scholar.xul b/chrome/chromeFiles/content/scholar/scholar.xul @@ -8,30 +8,42 @@ orient="vertical" width="800" height="600" - onload="init()" + onload="Scholar.init(); init();" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> - + + <!-- Include these until we get a global XPCOM object: --> + <script src="overlay.js"/> + <script src="db.js"/> + <script src="data_access.js"/> + <script src="scholar.js"/> <script src="treeView.js"/> + <stringbundle id="scholar-strings" src="chrome://scholar/locale/scholar.properties"/> + <toolbar> - <toolbarbutton label="Add Folder..."/> + <toolbarbutton label="New Folder..." oncommand="newFolder();"/> <spacer flex="1"/> - <toolbarbutton label="New Item..." type="menu"> + <toolbarbutton id="tb-add" label="New Item..." type="menu"> <menupopup> - <menuitem label="Book"/> - <menuitem label="Journal Article"/> </menupopup> </toolbarbutton> + <spacer flex="1"/> + <label control="tb-search" value="Search:"/><textbox id="tb-search" value=""/> </toolbar> <hbox flex="1"> <vbox id="folders-pane" flex="1"> - <tree id="folders-tree" flex="1"> + <tree + id="folders-tree" + treeviewtype="folders" + onselect="folderSelected();" + flex="1"> <treecols> <treecol id="name_column" label="Name" - flex="1"/> + flex="1" + primary="true"/> </treecols> <treechildren/> </tree> @@ -43,6 +55,7 @@ <tree id="items-tree" enablecolumndrag="true" + treeviewtype="items" flex="1"> <treecols> diff --git a/chrome/chromeFiles/content/scholar/treeView.js b/chrome/chromeFiles/content/scholar/treeView.js @@ -0,0 +1,186 @@ +Scholar.TreeView = function(root) +{ + this._treebox = null; + this._dataItems = new Array(); + this.rowCount = 0; + this._treeType; + this._rootFolder = root; +} + +Scholar.TreeView.prototype.setTree = function(treebox) +{ + if(this._treebox) + return; + this._treebox = treebox; + this._treeType = treebox.element.getAttribute("treeviewtype"); + + var newRows = Scholar.Items.getTreeRows(this._rootFolder,this._treeType); + for(var i = 0; i < newRows.length; i++) + this._showItem(newRows[i], 0, i+1); //item ref, isContainerOpen, level + + this._refreshHashMap(); +} + +Scholar.TreeView.prototype.getCellText = function(row, column) +{ + var obj = this._getItemAtRow(row); + + if(obj.isFolder()) + { + if(column.id == "name_column") + return obj.getName(); + else + return ""; + } + else + { + if(column.id == "title_column") + return obj.getField("title"); + else if(column.id == "creator_column") + return obj.getField("firstCreator"); + else if(column.id == "source_column") + return obj.getField("source"); + else + return ""; + } +} + +Scholar.TreeView.prototype.isContainer = function(row) { return this._getItemAtRow(row).isFolder(); } +Scholar.TreeView.prototype.isContainerOpen = function(row) { return this._dataItems[row][1]; } +Scholar.TreeView.prototype.isContainerEmpty = function(row) +{ + if(this._treeType == 'folders') + return !this._getItemAtRow(row).hasChildFolders(); + else + return (this.isContainer(row) && this._getItemAtRow(row).isEmpty()); +} + +Scholar.TreeView.prototype.getLevel = function(row) { return this._dataItems[row][2]; } + +Scholar.TreeView.prototype.getParentIndex = function(row) +{ + var thisLevel = this.getLevel(row); + if(thisLevel == 0) return -1; + for(var i = row - 1; i >= 0; i--) + if(this.getLevel(i) < thisLevel) + return i; + return -1; +} + +Scholar.TreeView.prototype.hasNextSibling = function(row, afterIndex) +{ + var thisLevel = this.getLevel(row); + for(var i = afterIndex + 1; i < this.rowCount; i++) + { + var nextLevel = this.getLevel(i); + if(nextLevel == thisLevel) return true; + else if(nextLevel < thisLevel) return false; + } +} + +Scholar.TreeView.prototype.toggleOpenState = function(row) +{ + var count = 0; //used to tell the tree how many rows were added/removed + var thisLevel = this.getLevel(row); + + this._treebox.beginUpdateBatch(); + if(this.isContainerOpen(row)) + { + while((row + 1 < this._dataItems.length) && (this.getLevel(row + 1) > thisLevel)) + { + this._hideItem(row+1); + count--; //count is negative when closing a container because we are removing rows + } + } + else + { + var newRows = Scholar.Items.getTreeRows(this._getItemAtRow(row).getID(),this._treeType); //Get children + + for(var i = 0; i < newRows.length; i++) + { + count++; + this._showItem(newRows[i], thisLevel+1, row+i+1); //insert new row + } + } + this._dataItems[row][1] = !this._dataItems[row][1]; //toggle container open value + + this._treebox.rowCountChanged(row+1, count); //tell treebox to repaint these + this._treebox.invalidateRow(row); + this._treebox.endUpdateBatch(); + this._refreshHashMap(); +} + +Scholar.TreeView.prototype._showItem = function(item, level, beforeRow) { this._dataItems.splice(beforeRow, 0, [item, false, level]); this.rowCount++; } + +Scholar.TreeView.prototype._hideItem = function(row) { this._dataItems.splice(row,1); this.rowCount--; } + +Scholar.TreeView.prototype._getItemAtRow = function(row) { return this._dataItems[row][0]; } +Scholar.TreeView.prototype.isSorted = function() { return false; } +Scholar.TreeView.prototype.isSeparator = function(row) { return false; } +Scholar.TreeView.prototype.isEditable = function(row, idx) { return false; } +Scholar.TreeView.prototype.getRowProperties = function(row, prop) { } +Scholar.TreeView.prototype.getColumnProperties = function(col, prop) { } +Scholar.TreeView.prototype.getCellProperties = function(row, col, prop) { } +Scholar.TreeView.prototype.getImageSrc = function(row, col) { } +Scholar.TreeView.prototype.performAction = function(action) { } +Scholar.TreeView.prototype.performActionOnCell = function(action, row, col) { } +Scholar.TreeView.prototype.getProgressMode = function(row, col) { } + +Scholar.TreeView.prototype.deleteSelection = function() +{ + if(this.selection.count == 0) + return; + + if(!confirm("Are you sure you want to delete the selected item"+(this.selection.count > 1 ? "s" : "")+"?")) + return; + + //collapse open folders + for(var i=0; i<this.rowCount; i++) + if(this.selection.isSelected(i) && this.isContainer(i) && this.isContainerOpen(i)) + this.toggleOpenState(i); + + //create an array of selected items/folders + var rows = new Array(); + var start = new Object(); + var end = new Object(); + for (var i=0, len=this.selection.getRangeCount(); i<len; i++) + { + this.selection.getRangeAt(i,start,end); + for (var j=start.value; j<=end.value; j++) + rows.push(j); + } + + //iterate and erase... + this._treebox.beginUpdateBatch(); + for (var i=0; i<rows.length; i++) + { + //erase item/folder from DB: + this._getItemAtRow(rows[i]-i).erase(); + + //remove row from tree: + this._hideItem(rows[i]-i); + this._treebox.rowCountChanged(rows[i]-i, -1); + } + this._treebox.endUpdateBatch(); + + this._refreshHashMap(); +} + +Scholar.TreeView.prototype._refreshHashMap = function() +{ + // Create hash map of folder and object ids to row indexes + + this._itemRowMap = new Array(); + this._folderRowMap = new Array(); + for(var i=0; i < this.rowCount; i++){ + if (this.isContainer(i)){ + this._folderRowMap[this._getItemAtRow(i).getID()] = i; + } + else { + this._itemRowMap[this._getItemAtRow(i).getID()] = i; + } + } + //Scholar.debug(Scholar.varDump(this.folderRowMap)); + //Scholar.debug(Scholar.varDump(this.objectRowMap)); + +} +\ No newline at end of file