update: function() { this.isUpdating = true; var input = { typed: this.element.value, cursor: { start: dom.getSelectionStart(this.element), end: dom.getSelectionEnd(this.element.selectionEnd) } }; this.cli.update(input); var display = this.cli.getAssignmentAt(input.cursor.start).getHint(); // 1. Update the completer with prompt/error marker/TAB info dom.removeCssClass(this.completer, Status.VALID.toString()); dom.removeCssClass(this.completer, Status.INCOMPLETE.toString()); dom.removeCssClass(this.completer, Status.INVALID.toString()); var completion = '<span class="cptPrompt">></span> '; if (this.element.value.length > 0) { var scores = this.cli.getInputStatusMarkup(); completion += this.markupStatusScore(scores); } // Display the "-> prediction" at the end of the completer if (this.element.value.length > 0 && display.predictions && display.predictions.length > 0) { var tab = display.predictions[0]; completion += ' ⇥ ' + (tab.name ? tab.name : tab); } this.completer.innerHTML = completion; dom.addCssClass(this.completer, this.cli.getWorstHint().status.toString()); // 2. Update the hint element var hint = ''; if (this.element.value.length !== 0) { hint += display.message; if (display.predictions && display.predictions.length > 0) { hint += ': [ '; display.predictions.forEach(function(prediction) { hint += (prediction.name ? prediction.name : prediction); hint += ' | '; }, this); hint = hint.replace(/\| $/, ']'); } } this.hinter.innerHTML = hint; if (hint.length === 0) { dom.addCssClass(this.hinter, 'cptNoPopup'); } else { dom.removeCssClass(this.hinter, 'cptNoPopup'); } this.isUpdating = false; },
onKeyUp: function(ev) { var handled; /* var handled = keyboardManager.processKeyEvent(ev, this, { isCommandLine: true, isKeyUp: true }); */ // RETURN does a special exec/highlight thing if (ev.keyCode === keys.RETURN) { var worst = this.cli.getWorstHint(); // Deny RETURN unless the command might work if (worst.status === Status.VALID) { this.cli.exec(); this.element.value = ''; } else { // If we've denied RETURN because the command was not VALID, // select the part of the command line that is causing problems // TODO: if there are 2 errors are we picking the right one? dom.setSelectionStart(this.element, worst.start); dom.setSelectionEnd(this.element, worst.end); } } this.update(); // Special actions which delegate to the assignment var current = this.cli.getAssignmentAt(dom.getSelectionStart(this.element)); if (current) { // TAB does a special complete thing if (ev.keyCode === keys.TAB) { current.complete(); this.update(); } // UP/DOWN look for some history if (ev.keyCode === keys.UP) { current.increment(); this.update(); } if (ev.keyCode === keys.DOWN) { current.decrement(); this.update(); } } return handled; },