www

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

commit b65a56b4d9d980a414bf90df70a1804a6d23f695
parent 3aae8d3f897e1876e6274859074f43e9892ef4aa
Author: David Norton <david@nortoncrew.com>
Date:   Tue,  6 Jun 2006 19:53:27 +0000

Fairly major metadatapane reworking. It is now nextdoor to the items list.
   -  Lots of work to be done. For example, the present way of showing a textbox is sort of a hack - taking a label, assigning certain properties to a textbox, then removing the label and placing the textbox in its place. I will be looking into our options.
   -  Also, I need to figure out adding/editing/deleting creators.
   -  When the textbox loses focus, it updates and saves the item (like iCal).

Date: removed Scholare.Date functions, as they are overkill. We can use the built-in Date.toLocaleString()

Diffstat:
Mchrome/chromeFiles/content/scholar/itemTreeView.js | 6+-----
Mchrome/chromeFiles/content/scholar/metadataPane.js | 143+++++++++++++++++++++++++++++++++++++++----------------------------------------
Mchrome/chromeFiles/content/scholar/metadataPane.xul | 26--------------------------
Mchrome/chromeFiles/content/scholar/overlay.js | 37+++++--------------------------------
Mchrome/chromeFiles/content/scholar/overlay.xul | 38++++++++++++++------------------------
Mchrome/chromeFiles/content/scholar/xpcom/scholar.js | 23++---------------------
Mchrome/chromeFiles/skin/default/scholar/overlay.css | 61+------------------------------------------------------------
7 files changed, 93 insertions(+), 241 deletions(-)

diff --git a/chrome/chromeFiles/content/scholar/itemTreeView.js b/chrome/chromeFiles/content/scholar/itemTreeView.js @@ -41,11 +41,7 @@ Scholar.ItemTreeView.prototype.getCellText = function(row, column) if(column.id == 'dateAdded' || column.id == 'dateModified') //this is not so much that we will use this format for date, but a simple template for later revisions. { - var myDate = new Date(); - - myDate.setTime(Date.parse(val.replace("-","/").replace("-","/"))); - - val = Scholar.Date.formatDate(myDate,'M/d/y h:mma'); + val = new Date(Date.parse(val.replace(/-/g,"/"))).toLocaleString(); } return val; diff --git a/chrome/chromeFiles/content/scholar/metadataPane.js b/chrome/chromeFiles/content/scholar/metadataPane.js @@ -1,21 +1,17 @@ MetadataPane = new function() { var _dynamicFields; - var _dynamicCreators; - var _editButton; - var _cancelButton; - var _saveButton; - var _creatorsToolbar; var _itemBeingEdited; var _creatorTypes = Scholar.CreatorTypes.getTypes(); this.onLoad = onLoad; this.viewItem = viewItem; - this.toggleEdit = toggleEdit; - this.saveItem = saveItem; +/* this.saveItem = saveItem; this.addCreator = addCreator; - this.removeCreator = removeCreator; + this.removeCreator = removeCreator; */ + this.showEditor = showEditor; + this.hideEditor = hideEditor; function onLoad() { @@ -34,33 +30,27 @@ MetadataPane = new function() * Loads an item */ function viewItem(thisItem) - { - if(_editButton.hidden) - toggleEdit(confirm(Scholar.getString('metadata.savechanges').replace('%1',_itemBeingEdited.getField('title')))); - + { _itemBeingEdited = thisItem; reloadFields(); - } function reloadFields() { removeDynamicRows(_dynamicFields); - removeDynamicRows(_dynamicCreators); thisItem = _itemBeingEdited; var fieldNames = getFullFieldList(thisItem); - var editingMode = _editButton.hidden; for(var i = 0; i<fieldNames.length; i++) { - rowValue = thisItem.getField(fieldNames[i]); - if(!editingMode || !thisItem.isPrimaryField(fieldNames[i]) || thisItem.isEditableField(fieldNames[i])) - { - if(editingMode || rowValue) - addDynamicField(Scholar.getString("itemFields."+fieldNames[i])+":",rowValue,editingMode ? fieldNames[i] : null); - } + var editable = (!thisItem.isPrimaryField(fieldNames[i]) || thisItem.isEditableField(fieldNames[i])); + + var label = document.createElement("label"); + label.setAttribute("value",Scholar.getString("itemFields."+fieldNames[i])+":"); + + addDynamicRow(label,createValueElement(thisItem.getField(fieldNames[i]), editable ? fieldNames[i] : null)); } if(thisItem.numCreators() > 0) @@ -68,39 +58,15 @@ MetadataPane = new function() for(var i = 0, len=thisItem.numCreators(); i<len; i++) { var creator = thisItem.getCreator(i); - if(editingMode) - { - addCreator(creator['firstName'],creator['lastName'],creator['creatorTypeID']); - } - else - { - addDynamicField(Scholar.getString('creatorTypes.'+Scholar.CreatorTypes.getTypeName(creator['creatorTypeID']))+":", - creator['firstName']+' '+creator['lastName'], - false); - } + + var label = document.createElement("label"); + label.setAttribute("value",Scholar.getString('creatorTypes.'+Scholar.CreatorTypes.getTypeName(creator['creatorTypeID']))+":"); + + addDynamicRow(label, createValueElement(creator['firstName']+' '+creator['lastName'], null), _dynamicFields.firstChild.nextSibling); } } - else if(editingMode) - { - //display a empty creator box if editing, and if there are no creators - addCreator(); - } } - - function toggleEdit(save) - { - _cancelButton.hidden = _editButton.hidden; - _saveButton.hidden = _editButton.hidden; - _creatorsToolbar.hidden = _editButton.hidden; - - _editButton.hidden = !_editButton.hidden; - - if(!_editButton.hidden && save) - saveItem(); - - reloadFields(); - } - + /* function saveItem() { //get fields, call data access methods @@ -126,7 +92,7 @@ MetadataPane = new function() _itemBeingEdited.save(); } - + */ function getFullFieldList(item) { var fieldNames = new Array("title","dateAdded","dateModified"); @@ -142,31 +108,29 @@ MetadataPane = new function() box.removeChild(box.firstChild); } - function addDynamicField(labelText, valueText, editable) - { - var label = document.createElement("label"); - label.setAttribute("value",labelText); - - var valueElement; - if(editable) - { - valueElement = document.createElement("textbox"); - valueElement.setAttribute("value",valueText); - valueElement.setAttribute("fieldName",editable); //used for identifying the field for saving - } - else - { - valueElement = document.createElement("label"); - valueElement.appendChild(document.createTextNode(valueText)); - } - + function addDynamicRow(label, value, beforeElement) + { var row = document.createElement("row"); - row.align="center"; row.appendChild(label); - row.appendChild(valueElement); - _dynamicFields.appendChild(row); + row.appendChild(value); + if(beforeElement) + _dynamicFields.insertBefore(row, beforeElement); + else + _dynamicFields.appendChild(row); } + function createValueElement(valueText, fieldName) + { + var valueElement = document.createElement("label"); + valueElement.appendChild(document.createTextNode(valueText)); + if(fieldName) + { + valueElement.setAttribute('fieldname',fieldName); + valueElement.setAttribute('onclick', 'MetadataPane.showEditor(this);'); + } + return valueElement; + } + /* function addCreator(firstname, lastname, typeID) { if(!lastname) @@ -218,6 +182,39 @@ MetadataPane = new function() function removeCreator(row) { _dynamicCreators.removeChild(row); + }*/ + + + function showEditor(elem) + { + var t = document.createElement("textbox"); + t.setAttribute('value',_itemBeingEdited.getField(elem.getAttribute('fieldname'))); + t.setAttribute('fieldname',elem.getAttribute('fieldname')); + + var box = elem.parentNode; + box.removeChild(elem); + box.appendChild(t); + t.select(); + t.setAttribute('onblur',"MetadataPane.hideEditor(this);"); + t.setAttribute('onkeypress','if(event.keyCode == event.DOM_VK_RETURN) document.commandDispatcher.focusedElement.blur()'); //for some reason I can't just say this.blur(); + } + + function hideEditor(t) + { + var textbox = t.parentNode.parentNode; + var fieldName = textbox.getAttribute('fieldname'); + var value = t.value; + Scholar.debug(value); + + _itemBeingEdited.setField(fieldName,value); + _itemBeingEdited.save(); + + var elem = createValueElement(value,fieldName); + + var box = textbox.parentNode; + box.removeChild(textbox); + box.appendChild(elem); + } } diff --git a/chrome/chromeFiles/content/scholar/metadataPane.xul b/chrome/chromeFiles/content/scholar/metadataPane.xul @@ -5,7 +5,6 @@ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <script src="metadataPane.js"/> - <vbox id="scholar-metadata"> <grid> <columns> @@ -16,30 +15,5 @@ <rows id="editpane-dynamic-fields"> </rows> </grid> - <toolbar id="metadata-creators-toolbar" hidden="true"> - <label value="&metadata.creators.label;"/> - <spacer flex="1"/> - <toolbarbutton label="+" oncommand="MetadataPane.addCreator()" class="addremove"/> - </toolbar> - <grid> - <columns> - <column flex="1"/> - <column flex="1"/> - <column/> - <column/> - <column/> - </columns> - - <rows id="editpane-dynamic-creators"> - </rows> - </grid> - <spacer flex="1"/> - <toolbar id="metadata-toolbar"> - <toolbarbutton id="metadata-pane-edit-button" label="&metadata.edit.label;" oncommand="MetadataPane.toggleEdit()"/> - <toolbarbutton id="metadata-pane-cancel-button" label="&metadata.cancel.label;" oncommand="MetadataPane.toggleEdit()" hidden="true"/> - <toolbarbutton id="metadata-pane-save-button" label="&metadata.save.label;" oncommand="MetadataPane.toggleEdit(true)" hidden="true"/> - <spacer flex="1" /> - </toolbar> </vbox> - </overlay> \ No newline at end of file diff --git a/chrome/chromeFiles/content/scholar/overlay.js b/chrome/chromeFiles/content/scholar/overlay.js @@ -19,7 +19,6 @@ var ScholarPane = new function() this.deleteCollectionSelection = deleteCollectionSelection; this.renameSelectedCollection = renameSelectedCollection; this.search = search; - this.toggleView = toggleView; /* * Called when the window is open @@ -43,8 +42,6 @@ var ScholarPane = new function() menuitem.setAttribute("oncommand","ScholarPane.newItem("+itemTypes[i]['id']+")"); addMenu.appendChild(menuitem); } - - //Drag.init(document.getElementById('scholar-floater-handle'),document.getElementById('scholar-floater'), 0, 400, 0, 500, true, true); } /* @@ -66,7 +63,6 @@ var ScholarPane = new function() document.getElementById('scholar-pane').setAttribute('collapsed',!visible); document.getElementById('scholar-splitter').setAttribute('collapsed',!visible); - document.getElementById('scholar-floater').hidden = (!visible || itemsView.selection.count != 1); } /* @@ -74,9 +70,8 @@ var ScholarPane = new function() */ function newItem(typeID) { - document.getElementById('scholar-floater').hidden=false; MetadataPane.viewItem(new Scholar.Item(typeID)); - MetadataPane.toggleEdit(); + document.getElementById('scholar-view-item').hidden = false; } function newCollection() @@ -107,23 +102,17 @@ var ScholarPane = new function() function itemSelected() { - var editButton = document.getElementById('metadata-pane-edit-button'); - if(itemsView && itemsView.selection.count == 1 && itemsView.selection.currentIndex != -1) { var item = itemsView._getItemAtRow(itemsView.selection.currentIndex); MetadataPane.viewItem(item); - var url = item.getField('source'); - if(!validURL(url)) - url = 'http://www.google.com/search?q='+encodeURIComponent('"'+item.getField("title")+'"'); //+'&btnI' - -// document.getElementById('content').loadURI(url); - document.getElementById('scholar-floater').hidden=false; + + document.getElementById('scholar-view-item').hidden=false; } else { - document.getElementById('scholar-floater').hidden=true; + document.getElementById('scholar-view-item').hidden=true; } @@ -152,28 +141,12 @@ var ScholarPane = new function() collection.ref.rename(newName); } } + function search() { if(itemsView) itemsView.searchText(document.getElementById('tb-search').value); } - - function toggleView(id) - { - var button = document.getElementById('tb-'+id); - var elem = document.getElementById('scholar-'+id); - - button.checked = !button.checked; - elem.hidden = !elem.hidden; - } - - //Thanks: http://www.bigbold.com/snippets/posts/show/452 - //TODO: move this out of overlay.js, into Scholar.js? - function validURL(s) - { - var regexp = /(http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/ - return regexp.test(s); - } } var ScholarItemsDragObserver = diff --git a/chrome/chromeFiles/content/scholar/overlay.xul b/chrome/chromeFiles/content/scholar/overlay.xul @@ -19,26 +19,6 @@ <command id="cmd_scholar_search" oncommand="ScholarPane.search();"/> </commandset> - <window id="main-window"> - <vbox id="scholar-floater" hidden="true"> - <vbox id="scholar-metadata"> - <toolbar> - <label value="&metadata.label;"/> - <spacer flex="1"/> - <toolbarbutton class="tabs-closebutton" oncommand="ScholarPane.toggleView('metadata')"/> - </toolbar> - </vbox> - <vbox id="scholar-notes"> - <toolbar> - <label value="&notes.label;"/> - <spacer flex="1"/> - <toolbarbutton class="tabs-closebutton" oncommand="ScholarPane.toggleView('notes')"/> - </toolbar> - <textbox multiline="true" flex="1" disabled="true"/> - </vbox> - </vbox> - </window> - <vbox id="appcontent"> <hbox id="scholar-pane" position="1" persist="height collapsed"> <vbox persist="width" flex="1"> @@ -69,9 +49,6 @@ </menupopup> </toolbarbutton> <spacer flex="1"/> - <toolbarbutton class="scholar-toggler" id="tb-metadata" label="&toolbar.metadata.label;" checked="true" oncommand="ScholarPane.toggleView('metadata')"/> - <toolbarbutton class="scholar-toggler" id="tb-notes" label="&toolbar.notes.label;" checked="true" oncommand="ScholarPane.toggleView('notes')"/> - <spacer flex="1"/> <label value="&toolbar.search.label;" control="tb-search"/> <textbox id="tb-search" type="timed" timeout="500" command="cmd_scholar_search"/> <toolbarbutton class="tabs-closebutton" oncommand="ScholarPane.toggleDisplay()"/> @@ -117,7 +94,20 @@ <treechildren/> </tree> - </vbox> + </vbox> + <tabbox id="scholar-view-item" hidden="true" flex="2" style="max-width: 300px; min-width: 300px;"> + <tabs> + <tab label="Metadata"/> + <tab label="Notes"/> + </tabs> + <tabpanels flex="1"> + <vbox id="scholar-metadata"> + </vbox> + <vbox id="scholar-notes"> + <textbox multiline="true" flex="1" disabled="true"/> + </vbox> + </tabpanels> + </tabbox> </hbox> <splitter id="scholar-splitter" resizebefore="closest" resizeafter="closest" position="2" persist="collapsed"/> </vbox> diff --git a/chrome/chromeFiles/content/scholar/xpcom/scholar.js b/chrome/chromeFiles/content/scholar/xpcom/scholar.js @@ -305,24 +305,4 @@ Scholar.Hash.prototype.remove = function(in_key){ Scholar.Hash.prototype.has = function(in_key){ return typeof(this.items[in_key]) != 'undefined'; -} - -/* - * Functions for handling dates - * Author: Matt Kruse <matt@mattkruse.com> - * WWW: http://www.mattkruse.com/javascript/date/ - */ -Scholar.Date = new function(){ - this.parseDate = parseDate; - this.formatDate = formatDate; - - var MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');var DAY_NAMES=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat'); - function LZ(x){return(x<0||x>9?"":"0")+x} - function isDate(val,format){var date=getDateFromFormat(val,format);if(date==0){return false;}return true;} - function compareDates(date1,dateformat1,date2,dateformat2){var d1=getDateFromFormat(date1,dateformat1);var d2=getDateFromFormat(date2,dateformat2);if(d1==0 || d2==0){return -1;}else if(d1 > d2){return 1;}return 0;} - function formatDate(date,format){format=format+"";var result="";var i_format=0;var c="";var token="";var y=date.getYear()+"";var M=date.getMonth()+1;var d=date.getDate();var E=date.getDay();var H=date.getHours();var m=date.getMinutes();var s=date.getSeconds();var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;var value=new Object();if(y.length < 4){y=""+(y-0+1900);}value["y"]=""+y;value["yyyy"]=y;value["yy"]=y.substring(2,4);value["M"]=M;value["MM"]=LZ(M);value["MMM"]=MONTH_NAMES[M-1];value["NNN"]=MONTH_NAMES[M+11];value["d"]=d;value["dd"]=LZ(d);value["E"]=DAY_NAMES[E+7];value["EE"]=DAY_NAMES[E];value["H"]=H;value["HH"]=LZ(H);if(H==0){value["h"]=12;}else if(H>12){value["h"]=H-12;}else{value["h"]=H;}value["hh"]=LZ(value["h"]);if(H>11){value["K"]=H-12;}else{value["K"]=H;}value["k"]=H+1;value["KK"]=LZ(value["K"]);value["kk"]=LZ(value["k"]);if(H > 11){value["a"]="PM";}else{value["a"]="AM";}value["m"]=m;value["mm"]=LZ(m);value["s"]=s;value["ss"]=LZ(s);while(i_format < format.length){c=format.charAt(i_format);token="";while((format.charAt(i_format)==c) &&(i_format < format.length)){token += format.charAt(i_format++);}if(value[token] != null){result=result + value[token];}else{result=result + token;}}return result;} - function _isInteger(val){var digits="1234567890";for(var i=0;i < val.length;i++){if(digits.indexOf(val.charAt(i))==-1){return false;}}return true;} - function _getInt(str,i,minlength,maxlength){for(var x=maxlength;x>=minlength;x--){var token=str.substring(i,i+x);if(token.length < minlength){return null;}if(_isInteger(token)){return token;}}return null;} - function getDateFromFormat(val,format){val=val+"";format=format+"";var i_val=0;var i_format=0;var c="";var token="";var token2="";var x,y;var now=new Date();var year=now.getYear();var month=now.getMonth()+1;var date=1;var hh=now.getHours();var mm=now.getMinutes();var ss=now.getSeconds();var ampm="";while(i_format < format.length){c=format.charAt(i_format);token="";while((format.charAt(i_format)==c) &&(i_format < format.length)){token += format.charAt(i_format++);}if(token=="yyyy" || token=="yy" || token=="y"){if(token=="yyyy"){x=4;y=4;}if(token=="yy"){x=2;y=2;}if(token=="y"){x=2;y=4;}year=_getInt(val,i_val,x,y);if(year==null){return 0;}i_val += year.length;if(year.length==2){if(year > 70){year=1900+(year-0);}else{year=2000+(year-0);}}}else if(token=="MMM"||token=="NNN"){month=0;for(var i=0;i<MONTH_NAMES.length;i++){var month_name=MONTH_NAMES[i];if(val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase()){if(token=="MMM"||(token=="NNN"&&i>11)){month=i+1;if(month>12){month -= 12;}i_val += month_name.length;break;}}}if((month < 1)||(month>12)){return 0;}}else if(token=="EE"||token=="E"){for(var i=0;i<DAY_NAMES.length;i++){var day_name=DAY_NAMES[i];if(val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase()){i_val += day_name.length;break;}}}else if(token=="MM"||token=="M"){month=_getInt(val,i_val,token.length,2);if(month==null||(month<1)||(month>12)){return 0;}i_val+=month.length;}else if(token=="dd"||token=="d"){date=_getInt(val,i_val,token.length,2);if(date==null||(date<1)||(date>31)){return 0;}i_val+=date.length;}else if(token=="hh"||token=="h"){hh=_getInt(val,i_val,token.length,2);if(hh==null||(hh<1)||(hh>12)){return 0;}i_val+=hh.length;}else if(token=="HH"||token=="H"){hh=_getInt(val,i_val,token.length,2);if(hh==null||(hh<0)||(hh>23)){return 0;}i_val+=hh.length;}else if(token=="KK"||token=="K"){hh=_getInt(val,i_val,token.length,2);if(hh==null||(hh<0)||(hh>11)){return 0;}i_val+=hh.length;}else if(token=="kk"||token=="k"){hh=_getInt(val,i_val,token.length,2);if(hh==null||(hh<1)||(hh>24)){return 0;}i_val+=hh.length;hh--;}else if(token=="mm"||token=="m"){mm=_getInt(val,i_val,token.length,2);if(mm==null||(mm<0)||(mm>59)){return 0;}i_val+=mm.length;}else if(token=="ss"||token=="s"){ss=_getInt(val,i_val,token.length,2);if(ss==null||(ss<0)||(ss>59)){return 0;}i_val+=ss.length;}else if(token=="a"){if(val.substring(i_val,i_val+2).toLowerCase()=="am"){ampm="AM";}else if(val.substring(i_val,i_val+2).toLowerCase()=="pm"){ampm="PM";}else{return 0;}i_val+=2;}else{if(val.substring(i_val,i_val+token.length)!=token){return 0;}else{i_val+=token.length;}}}if(i_val != val.length){return 0;}if(month==2){if( ((year%4==0)&&(year%100 != 0) ) ||(year%400==0) ){if(date > 29){return 0;}}else{if(date > 28){return 0;}}}if((month==4)||(month==6)||(month==9)||(month==11)){if(date > 30){return 0;}}if(hh<12 && ampm=="PM"){hh=hh-0+12;}else if(hh>11 && ampm=="AM"){hh-=12;}var newdate=new Date(year,month-1,date,hh,mm,ss);return newdate.getTime();} - function parseDate(val){var preferEuro=(arguments.length==2)?arguments[1]:false;generalFormats=new Array('y-M-d','MMM d, y','MMM d,y','y-MMM-d','d-MMM-y','MMM d');monthFirst=new Array('M/d/y','M-d-y','M.d.y','MMM-d','M/d','M-d');dateFirst =new Array('d/M/y','d-M-y','d.M.y','d-MMM','d/M','d-M');var checkList=new Array('generalFormats',preferEuro?'dateFirst':'monthFirst',preferEuro?'monthFirst':'dateFirst');var d=null;for(var i=0;i<checkList.length;i++){var l=window[checkList[i]];for(var j=0;j<l.length;j++){d=getDateFromFormat(val,l[j]);if(d!=0){return new Date(d);}}}return null;} -} +} +\ No newline at end of file diff --git a/chrome/chromeFiles/skin/default/scholar/overlay.css b/chrome/chromeFiles/skin/default/scholar/overlay.css @@ -53,66 +53,7 @@ tree #items-tree background: #f5f5f5 !important; } -#scholar-floater -{ - position: fixed; - bottom: 0px; - right: 0px; - margin-bottom: 30px; - margin-right: 30px; - - font-size: 12px; - width: 400px; - max-width: 400px; -} - -#scholar-floater vbox -{ - border: 1px solid #a5a5a5; - background: #f5f5f5; - - width: 400px; - max-width: 400px; -} - -#scholar-floater vbox:first-child -{ - margin-bottom: 5px; -} - #scholar-metadata { - -} - -#metadata-toolbar -{ - border-bottom: none; -} - -#metadata-toolbar toolbarbutton -{ - color: blue; -} - -#metadata-toolbar toolbarbutton:hover -{ - text-decoration: underline; -} - -#scholar-metadata .addremove -{ - font-weight: bold; - color: blue; -} - -#scholar-metadata .addremove:hover -{ - text-decoration: underline; -} - - -#scholar-notes -{ - height: 100px; + overflow: auto; } \ No newline at end of file