/********************************************************************** * * * **********************************************************************/ //var DEBUG = DEBUG != null ? DEBUG : true /*********************************************************************/ var BASE_URL_HISTORY = [] var BASE_URL_HISTORY_LIMIT = 50 var BASE_URL_HISTORY_DIALOG_LIMIT = 20 /********************************************************************** * URL history... */ // XXX this depends on fs.existsSync(...) function pruneBaseURLHistory(){ if(window.fs == null){ return BASE_URL_HISTORY } BASE_URL_HISTORY = BASE_URL_HISTORY.filter(function(e){ return fs.existsSync(osPath(e)) }) return BASE_URL_HISTORY } function getNonExistingBaseURLs(){ if(window.fs == null){ return BASE_URL_HISTORY } return BASE_URL_HISTORY.filter(function(e){ return !fs.existsSync(osPath(e)) }) } // Setup history event handlers... // // NOTE: this will save history state to localStorage... function setupBaseURLHistory(){ $('.viewer') .on('baseURLChanged', function(evt, old_url, new_url){ var updated = false //pruneBaseURLHistory() // store the old and new urls in history unless they already // exist... if(BASE_URL_HISTORY.indexOf(old_url) < 0){ BASE_URL_HISTORY.splice(0, 0, old_url) updated = true } if(BASE_URL_HISTORY.indexOf(new_url) < 0){ BASE_URL_HISTORY.splice(0, 0, new_url) updated = true } // truncate the history if needed... if(BASE_URL_HISTORY.length > BASE_URL_HISTORY_LIMIT){ BASE_URL_HISTORY.splice(BASE_URL_HISTORY_LIMIT, BASE_URL_HISTORY.length) updated = true } // XXX is this the right place for this??? if(updated){ saveLocalStorageBaseURLHistory() } }) } // Push a url to top of history... // // NOTE: this does not care if a url exists or not, all other instances // of the same will get removed... // NOTE: this will not do any loading... // NOTE: this will save history state to localStorage... function pushURLHistory(url){ url = url == null ? BASE_URL : url while(BASE_URL_HISTORY.indexOf(url) >= 0){ BASE_URL_HISTORY.splice(BASE_URL_HISTORY.indexOf(url), 1) } BASE_URL_HISTORY.splice(0, 0, url) // XXX is this the right place for this??? saveLocalStorageBaseURLHistory() return url } // Get current position in history... // function getURLHistoryPosition(){ return BASE_URL_HISTORY.indexOf(BASE_URL) } // Get next/prev relative position in history... // // NOTE: these will skip non-existing urls... function getURLHistoryNext(){ var non_existing = getNonExistingBaseURLs() var i = getURLHistoryPosition() + 1 var res = BASE_URL_HISTORY[i] while(non_existing.indexOf(res) >= 0){ i += 1 var res = BASE_URL_HISTORY[i] } return res == null ? BASE_URL : res } function getURLHistoryPrev(){ var non_existing = getNonExistingBaseURLs() var i = getURLHistoryPosition() - 1 var res = BASE_URL_HISTORY[i] while(non_existing.indexOf(res) >= 0){ i -= 1 var res = BASE_URL_HISTORY[i] } return res == null ? BASE_URL : res } /********************************************************************** * Actions... */ // Make a history load action... // // NOTE: this will not affect history url order... function makeURLHistoryLoader(get, end_msg){ return function(){ var url = get() if(url != BASE_URL){ statusNotify(loadDir(url)) } else { showStatusQ('History: '+ end_msg +'...') } return url } } var loadURLHistoryNext = makeURLHistoryLoader(getURLHistoryNext, 'at last URL') var loadURLHistoryPrev = makeURLHistoryLoader(getURLHistoryPrev, 'at first URL') // NOTE: this can accept either path or history index... // NOTE: this will not reload an already loaded url... // // XXX need to somehow skip unavailable urls... function loadURLHistoryAt(a){ a = a < 0 ? BASE_URL_HISTORY.length + a : a var url = typeof(a) == typeof(123) ? Math.min(a < 0 ? 0 : a, BASE_URL_HISTORY.length-1) : a if(url != BASE_URL){ statusNotify(loadDir(url)) } return url } /********************************************************************** * Dialogs... */ function recentlyOpenedDialog(){ updateStatus('Recently opened...').show() var dict = {} var title = 'Recently opened: | '+ 'Shortcuts ctrl-shift-Left and ctrl-shift-Right can be used\n'+ 'to move through this list from ribbon view.' var not_available = getNonExistingBaseURLs() var cfg = {} var c = 0 cfg[title] = $.map(BASE_URL_HISTORY, function(e){ c += 1 if(c > BASE_URL_HISTORY_DIALOG_LIMIT){ return } // cleanup the urls... var ee = e.replace('file:///', '') var disabled = not_available.indexOf(e) >= 0 // mark disabled... if(disabled){ ee = ''+ee+'' if(e == BASE_URL){ dict[ee] = e return ee + ' | disabled | Currently loaded, path not available.' } else { dict[ee] = e return ee + ' | disabled | Not available.' } // mark the current path... } else if(e == BASE_URL){ ee = ee.italics() dict[ee] = e return ee + ' | default | Currently loaded data.' } dict[ee] = e return ee }) if(not_available.length > 0){ cfg['spacer'] = '---' cfg[''] = { text: 'Clear unavailable paths', button: function(){ pruneBaseURLHistory() saveLocalStorageBaseURLHistory() $('.recentlyOpenedDialog') .find('.item.disabled') .remove() }, } } var dialog = formDialog(null, '', cfg, 'OK', 'recentlyOpenedDialog') .done(function(res){ res = dict[res[title]] loadURLHistoryAt(res) if(res == BASE_URL){ showStatusQ('Already at: '+res+'...') } else { showStatusQ('Opening: '+res+'...') } }) .fail(function(){ showStatusQ('Keeping current...') }) } /********************************************************************** * vim:set ts=4 sw=4 : */