www

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

commit b7f78aa1894d4c65fbb510885948caac40f8de14
parent 1910eb32f9560e8a4f95f078c1d8db4d0457da65
Author: David Norton <david@nortoncrew.com>
Date:   Tue, 30 May 2006 19:24:57 +0000

Drag and drop column reorder on items tree.
Some basic editing capabilities. (interface needs work, fixing).

Diffstat:
Achrome/chromeFiles/content/scholar/metadataPane.js | 197+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Achrome/chromeFiles/content/scholar/metadataPane.xul | 39+++++++++++++++++++++++++++++++++++++++
Mchrome/chromeFiles/content/scholar/organizeWindow.js | 46+++++++++++++++++++++++++++++++++++++++++-----
Mchrome/chromeFiles/content/scholar/organizeWindow.xul | 22+++++++++++++++-------
4 files changed, 292 insertions(+), 12 deletions(-)

diff --git a/chrome/chromeFiles/content/scholar/metadataPane.js b/chrome/chromeFiles/content/scholar/metadataPane.js @@ -0,0 +1,197 @@ +MetadataPane = new function() +{ + var _dynamicFields; + var _dynamicCreators; + var _itemBeingEdited; + var _creatorTypes = Scholar.CreatorTypes.getTypes(); + var _editButton; + + this.init = init; + this.viewItem = viewItem; + this.toggleEdit = toggleEdit; + this.saveItem = saveItem; + this.addCreator = addCreator; + this.removeCreator = removeCreator; + + function init() + { + _metadataPane = document.getElementById('metadata-pane'); + _dynamicFields = document.getElementById('editpane-dynamic-fields'); + _dynamicCreators = document.getElementById('editpane-dynamic-creators'); + _editButton = document.getElementById('metadata-pane-edit-button'); + + return true; + } + + function viewItem(thisItem) + { + removeDynamicRows(_dynamicFields); + var fieldNames = getFullFieldList(thisItem); + + for(var i = 0; i<fieldNames.length; i++) + { + if(!thisItem.isPrimaryField(fieldNames[i]) || thisItem.isEditableField(fieldNames[i])) + { + var label = document.createElement("label"); + label.setAttribute("value",Scholar.getString("itemFields."+fieldNames[i])+":"); + label.setAttribute("control","dynamic-field-"+i); + + //create the textbox + var valueElement = document.createElement("textbox"); + valueElement.setAttribute("value",thisItem.getField(fieldNames[i])); + valueElement.setAttribute("id","dynamic-field-"+i); //just so the label can be assigned to this valueElement + valueElement.setAttribute("fieldName",fieldNames[i]); //we will use this later + valueElement.setAttribute("disabled",true); + + var row = document.createElement("row"); + row.appendChild(label); + row.appendChild(valueElement); + _dynamicFields.appendChild(row); + } + } + + removeDynamicRows(_dynamicCreators); + + for(var i = 0, len=thisItem.numCreators(); i<len; i++) + addCreator(thisItem.getCreator(i)['firstName'],thisItem.getCreator(i)['lastName'],thisItem.getCreator(i)['creatorTypeID']); + + _itemBeingEdited = thisItem; + } + + function toggleEdit() + { + if(_editButton.checked) + saveItem(); + + _editButton.checked = !_editButton.checked; + var disabledElements = []; + + for(var i = 0, row; row = _dynamicFields.childNodes[i]; i++) + { + disabledElements.push(row.lastChild); + } + + for(var i = 0, row; row = _dynamicCreators.childNodes[i]; i++) + { + for(var j = 0, col; col = row.childNodes[j]; j++) + { + disabledElements.push(col); + } + } + + disabledElements.push(document.getElementById('tb-creator-add')); + + for(var i = 0, elem; elem = disabledElements[i]; i++) + { + if(_editButton.checked) + elem.removeAttribute("disabled"); + else + elem.setAttribute("disabled",true); + } + } + + function saveItem() + { + //get fields, call data access methods + var valueElements = _dynamicFields.getElementsByTagName("textbox"); //All elements of tagname 'textbox' should be the values of edits + for(var i=0; i<valueElements.length; i++) + _itemBeingEdited.setField(valueElements[i].getAttribute("fieldName"),valueElements[i].value); + + var numCreatorsBefore = _itemBeingEdited.numCreators(); + + var creatorRows = _dynamicCreators.childNodes; + for(var i=0; i < creatorRows.length; i++) + { + var firstname = creatorRows[i].firstChild.value; + var lastname = creatorRows[i].firstChild.nextSibling.value; + var typeMenu = creatorRows[i].firstChild.nextSibling.nextSibling; + var typeID = typeMenu.firstChild.childNodes[typeMenu.selectedIndex].getAttribute('typeid'); + + _itemBeingEdited.setCreator(i, firstname, lastname, typeID); + } + + for(var i = creatorRows.length; i < numCreatorsBefore; i++) + _itemBeingEdited.setCreator(i, false); + + if(!_itemBeingEdited.getID()) //NEW ITEM + { + /* get ref to myTreeView? + myTreeView._showItem(_itemBeingEdited, 0, myTreeView.rowCount); + myTreeView._treebox.rowCountChanged(myTreeView.rowCount-1,1); + */ + } + + _itemBeingEdited.save(); + } + + function getFullFieldList(item) + { + var fields = Scholar.ItemFields.getItemTypeFields(item.getField("itemTypeID")); + var fieldNames = new Array("title","dateAdded","dateModified","source","rights"); + for(var i = 0; i<fields.length; i++) + fieldNames.push(Scholar.ItemFields.getName(fields[i])); + return fieldNames; + } + + function removeDynamicRows(box) + { + while(box.hasChildNodes()) + box.removeChild(box.firstChild); + } + + function addCreator(firstname, lastname, typeID) + { + if(!lastname) + lastname = ""; + if(!firstname) + firstname = ""; + if(!typeID) + typeID = 0; + + var first = document.createElement("textbox"); + first.setAttribute("value",firstname); + var last = document.createElement("textbox"); + last.setAttribute("value",lastname); + + var type = document.createElement("menulist"); + type.setAttribute("label","Type"); + var typeMenu = document.createElement("menupopup"); + for(var j = 0; j < _creatorTypes.length; j++) + { + var menuitem = document.createElement("menuitem"); + menuitem.setAttribute("label",Scholar.getString('creatorTypes.'+_creatorTypes[j]['name'])); + menuitem.setAttribute("typeid",_creatorTypes[j]['id']); + if(_creatorTypes[j]['id'] == typeID) + menuitem.setAttribute("selected",true); + typeMenu.appendChild(menuitem); + } + type.appendChild(typeMenu); + + var remove = document.createElement("toolbarbutton"); + remove.setAttribute("label","x"); + remove.setAttribute("oncommand","MetadataPane.removeCreator(this.parentNode);"); + + if(!_editButton.checked) + { + first.setAttribute("disabled",true); + last.setAttribute("disabled",true); + type.setAttribute("disabled",true); + remove.setAttribute("disabled",true); + } + + var row = document.createElement("row"); + row.appendChild(first); + row.appendChild(last); + row.appendChild(type); + row.appendChild(remove); + _dynamicCreators.appendChild(row); + + } + + function removeCreator(row) + { + _dynamicCreators.removeChild(row); + } +} + +window.addEventListener("load", function(e) { MetadataPane.init(e); }, false); diff --git a/chrome/chromeFiles/content/scholar/metadataPane.xul b/chrome/chromeFiles/content/scholar/metadataPane.xul @@ -0,0 +1,38 @@ +<?xml version="1.0"?> + +<overlay + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> + + <script src="metadataPane.js"/> + + <vbox id="metadata-pane"> + <grid> + <columns> + <column/> + <column flex="1"/> + </columns> + + <rows id="editpane-dynamic-fields"> + </rows> + </grid> + <grid> + <columns> + <column flex="1"/> + <column flex="1"/> + <column/> + <column/> + </columns> + + <rows id="editpane-dynamic-creators"> + </rows> + </grid> + <spacer flex="1"/> + <toolbar> + <toolbarbutton id="metadata-pane-edit-button" label="Edit" oncommand="MetadataPane.toggleEdit()"/> + <spacer flex="1" /> + <toolbarbutton id="tb-creator-add" label="Add Creator" oncommand="MetadataPane.addCreator()" disabled="true"/> + + </toolbar> + </vbox> + +</overlay> +\ No newline at end of file diff --git a/chrome/chromeFiles/content/scholar/organizeWindow.js b/chrome/chromeFiles/content/scholar/organizeWindow.js @@ -1,5 +1,6 @@ var foldersView; var itemsView; +var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService); function init() { @@ -50,19 +51,54 @@ function folderSelected() function itemSelected() { - if(itemsView.selection.count == 1) + var tabs = document.getElementById('item-tabs'); + var editButton = document.getElementById('metadata-pane-edit-button'); + + if(editButton.checked) + { + var flags=promptService.BUTTON_TITLE_SAVE * promptService.BUTTON_POS_0 + + promptService.BUTTON_TITLE_CANCEL * promptService.BUTTON_POS_1 + + promptService.BUTTON_TITLE_DONT_SAVE * promptService.BUTTON_POS_2; + + var response = promptService.confirmEx(window,"", + "Do you want to save the changes?", // to '"+_itemBeingEdited.getField("title")+"' + flags, null, null, null, null, {}); + if(response == 1) + return; + else if(response == 0) + MetadataPane.toggleEdit(); + else + editButton.checked = false; + } + + if(itemsView && itemsView.selection.count == 1) { var item = itemsView._getItemAtRow(itemsView.selection.currentIndex); - document.getElementById('view-pane').setAttribute('src','http://www.google.com/search?q='+encodeURIComponent('"'+item.getField("title")+'"')+'&btnI'); + tabs.hidden=false; + + if(tabs.firstChild.selectedIndex == 0) + { + document.getElementById('view-pane').setAttribute('src','http://www.google.com/search?q='+encodeURIComponent('"'+item.getField("title")+'"')+'&btnI'); + } + else if(tabs.firstChild.selectedIndex == 1) + { + MetadataPane.viewItem(item); + } + else + { + //do notes + } + } + else + { + tabs.hidden=true; } } function deleteSelection() { - if(itemsView && itemsView.selection.count > 0 && confirm("Are you sure you want to delete the selection????")) - { + if(itemsView && itemsView.selection.count > 0 && confirm("Are you sure you want to delete the selected items?")) itemsView.deleteSelection(); - } } function search() diff --git a/chrome/chromeFiles/content/scholar/organizeWindow.xul b/chrome/chromeFiles/content/scholar/organizeWindow.xul @@ -13,6 +13,8 @@ windowtype="scholar:window" onload="init();" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> + + <?xul-overlay href="metadataPane.xul"?> <script type="application/x-javascript" src="chrome://global/content/globalOverlay.js"/> <script type="application/x-javascript" src="chrome://global/content/nsDragAndDrop.js"/> @@ -116,7 +118,7 @@ <vbox flex="4" persist="width"> <tree id="items-tree" - enablecolumndrag="true" + enableColumnDrag="true" onselect="itemSelected();" persist="height" flex="1"> @@ -157,12 +159,18 @@ <splitter collapse="after" resizebefore="closest" resizeafter="closest" persist="state"> <grippy/> </splitter> - <vbox flex="3" persist="height"> - <toolbar> - <toolbarbutton label="hello"/> - </toolbar> - <iframe id="view-pane" src="" type="content" flex="1"/> - </vbox> + <tabbox id="item-tabs" flex="3" persist="height" hidden="true"> + <tabs onselect="itemSelected();"> + <tab label="Item"/> + <tab label="Metadata"/> + <tab label="Notes"/> + </tabs> + <tabpanels flex="1"> + <iframe id="view-pane" src="" type="content" flex="1"/> + <vbox id="metadata-pane"/> + <tabpanel/> + </tabpanels> + </tabbox> </vbox> </hbox> <statusbar id="statusbar">