diff --git a/IPython/html/static/notebook/js/cell.js b/IPython/html/static/notebook/js/cell.js index 568eb1e..fb1e971 100644 --- a/IPython/html/static/notebook/js/cell.js +++ b/IPython/html/static/notebook/js/cell.js @@ -112,12 +112,17 @@ var IPython = (function (IPython) { that.element.click(function (event) { if (that.selected === false) { $([IPython.events]).trigger('select.Cell', {'cell':that}); - } + }; }); that.element.focusin(function (event) { if (that.selected === false) { $([IPython.events]).trigger('select.Cell', {'cell':that}); - } + }; + }); + that.element.focusout(function (event) { + if (that.mode === 'edit') { + $([IPython.events]).trigger('command_mode.Cell', {'cell':that}); + }; }); if (this.code_mirror) { this.code_mirror.on("change", function(cm, change) { @@ -148,14 +153,12 @@ var IPython = (function (IPython) { * @return is the action being taken */ Cell.prototype.select = function () { - console.log('Cell.select'); if (!this.selected) { this.element.addClass('selected'); this.element.removeClass('unselected'); this.selected = true; return true; } else { - console.log('WARNING: select'); return false; }; }; @@ -166,14 +169,12 @@ var IPython = (function (IPython) { * @return is the action being taken */ Cell.prototype.unselect = function () { - console.log('Cell.unselect'); if (this.selected) { this.element.addClass('unselected'); this.element.removeClass('selected'); this.selected = false; return true; } else { - console.log('WARNING: unselect'); return false; }; }; @@ -184,14 +185,12 @@ var IPython = (function (IPython) { * @return is the action being taken */ Cell.prototype.render = function () { - console.log('Cell.render'); if (!this.rendered) { this.element.addClass('rendered'); this.element.removeClass('unrendered'); this.rendered = true; return true; } else { - console.log('WARNING: render'); return false; }; }; @@ -202,14 +201,12 @@ var IPython = (function (IPython) { * @return is the action being taken */ Cell.prototype.unrender = function () { - console.log('Cell.unrender'); if (this.rendered) { this.element.addClass('unrendered'); this.element.removeClass('rendered'); this.rendered = false; return true; } else { - console.log('WARNING: unrender'); return false; }; }; @@ -220,14 +217,12 @@ var IPython = (function (IPython) { * @return is the action being taken */ Cell.prototype.command_mode = function () { - console.log('Cell.command_mode:', this.mode); if (this.mode !== 'command') { this.element.addClass('command_mode'); this.element.removeClass('edit_mode'); this.mode = 'command'; return true; } else { - console.log('WARNING: command_mode'); return false; }; }; @@ -238,14 +233,12 @@ var IPython = (function (IPython) { * @return is the action being taken */ Cell.prototype.edit_mode = function () { - console.log('Cell.edit_mode:', this.mode); if (this.mode !== 'edit') { this.element.addClass('edit_mode'); this.element.removeClass('command_mode'); this.mode = 'edit'; return true; } else { - console.log('WARNING: edit_mode'); return false; }; } diff --git a/IPython/html/static/notebook/js/codecell.js b/IPython/html/static/notebook/js/codecell.js index 9f20e2f..164c72d 100644 --- a/IPython/html/static/notebook/js/codecell.js +++ b/IPython/html/static/notebook/js/codecell.js @@ -157,7 +157,6 @@ var IPython = (function (IPython) { * @method handle_codemirror_keyevent */ CodeCell.prototype.handle_codemirror_keyevent = function (editor, event) { - var that = this; if (this.mode === 'command') { @@ -174,7 +173,7 @@ var IPython = (function (IPython) { this.auto_highlight(); } - if (event.keyCode === key.ENTER && (event.shiftKey || event.ctrlKey)) { + if (event.keyCode === key.ENTER && (event.shiftKey || event.ctrlKey || event.altKey)) { // Always ignore shift-enter in CodeMirror as we handle it. return true; @@ -319,7 +318,6 @@ var IPython = (function (IPython) { CodeCell.prototype.select = function () { var cont = IPython.Cell.prototype.select.apply(this); - console.log('CodeCell.select', cont); if (cont) { this.code_mirror.refresh(); this.auto_highlight(); @@ -329,7 +327,6 @@ var IPython = (function (IPython) { CodeCell.prototype.render = function () { var cont = IPython.Cell.prototype.render.apply(this); - console.log('CodeCell.render'); // Always execute, even if we are already in the rendered state return cont; }; @@ -341,7 +338,6 @@ var IPython = (function (IPython) { CodeCell.prototype.command_mode = function () { var cont = IPython.Cell.prototype.command_mode.apply(this); - console.log('CodeCell.command_mode'); if (cont) { this.focus_cell(); }; @@ -350,7 +346,6 @@ var IPython = (function (IPython) { CodeCell.prototype.edit_mode = function () { var cont = IPython.Cell.prototype.edit_mode.apply(this); - console.log('CodeCell.edit_mode'); if (cont) { this.focus_editor(); }; diff --git a/IPython/html/static/notebook/js/notebook.js b/IPython/html/static/notebook/js/notebook.js index d97a426..0905c15 100644 --- a/IPython/html/static/notebook/js/notebook.js +++ b/IPython/html/static/notebook/js/notebook.js @@ -40,7 +40,6 @@ var IPython = (function (IPython) { this.undelete_below = false; this.paste_enabled = false; this.mode = 'command'; - this.edit_index = null; this.set_dirty(false); this.metadata = {}; this._checkpoint_after_save = false; @@ -139,7 +138,11 @@ var IPython = (function (IPython) { that.select(index); that.edit_mode(); }); - + + $([IPython.events]).on('command_mode.Cell', function (event, data) { + that.command_mode(); + }); + $([IPython.events]).on('status_autorestarting.Kernel', function () { IPython.dialog.modal({ title: "Kernel Restarting", @@ -660,10 +663,10 @@ var IPython = (function (IPython) { if (this.is_valid_cell_index(index)) { var sindex = this.get_selected_index() if (sindex !== null && index !== sindex) { + this.command_mode(); this.get_cell(sindex).unselect(); }; var cell = this.get_cell(index); - console.log('Notebook.select', index); cell.select(); if (cell.cell_type === 'heading') { $([IPython.events]).trigger('selected_cell_type_changed.Notebook', @@ -705,41 +708,36 @@ var IPython = (function (IPython) { // Edit/Command mode - /** - * Enter command mode for the currently selected cell - * - * @method command_mode - */ + Notebook.prototype.get_edit_index = function () { + var result = null; + this.get_cell_elements().filter(function (index) { + if ($(this).data("cell").mode === 'edit') { + result = index; + }; + }); + return result; + }; + Notebook.prototype.command_mode = function () { - console.log('Notebook.command_mode', this.mode, this.edit_index); if (this.mode !== 'command') { - var cell = this.get_cell(this.edit_index); + var index = this.get_edit_index(); + var cell = this.get_cell(index); if (cell) { cell.command_mode(); this.mode = 'command'; - this.edit_index = null; }; }; }; - /** - * Enter edit mode for the currently selected cell - * - * @method editmode - */ Notebook.prototype.edit_mode = function () { - var index = this.get_selected_index(); - console.log('Notebook.edit_mode', this.mode, index); - if (index !== this.edit_index) { - if (this.edit_index !== null) { - var old_cell = this.get_cell(this.edit_index) - old_cell.command_mode(); - } + if (this.mode !== 'edit') { + // We are in command mode so get_edit_index() is null!!! + var index = this.get_selected_index(); + if (index === null) {return;} // No cell is selected var cell = this.get_cell(index); if (cell) { cell.edit_mode(); this.mode = 'edit'; - this.edit_index = index; }; }; }; @@ -763,6 +761,7 @@ var IPython = (function (IPython) { tomove.detach(); pivot.before(tomove); this.select(i-1); + }; this.set_dirty(true); }; @@ -779,7 +778,7 @@ var IPython = (function (IPython) { **/ Notebook.prototype.move_cell_down = function (index) { var i = this.index_or_selected(index); - if ( this.is_valid_cell_index(i) && this.is_valid_cell_index(i+1)) { + if (this.is_valid_cell_index(i) && this.is_valid_cell_index(i+1)) { var pivot = this.get_cell_element(i+1); var tomove = this.get_cell_element(i); if (pivot !== null && tomove !== null) { @@ -1000,7 +999,7 @@ var IPython = (function (IPython) { if (text === source_cell.placeholder) { text = ''; }; - // The edit must come before the set_text. + // We must show the editor before setting its contents target_cell.unrender(); target_cell.set_text(text); // make this value the starting point, so that we can only undo @@ -1032,13 +1031,15 @@ var IPython = (function (IPython) { if (text === source_cell.placeholder) { text = ''; }; - // The edit must come before the set_text. + // We must show the editor before setting its contents target_cell.unrender(); target_cell.set_text(text); // make this value the starting point, so that we can only undo // to this state, instead of a blank cell target_cell.code_mirror.clearHistory(); source_element.remove(); + this.select(i); + this.edit_mode(); this.set_dirty(true); }; }; @@ -1066,7 +1067,7 @@ var IPython = (function (IPython) { if (text === source_cell.placeholder) { text = ''; }; - // The edit must come before the set_text. + // We must show the editor before setting its contents target_cell.set_level(level); target_cell.unrender(); target_cell.set_text(text); @@ -1074,6 +1075,8 @@ var IPython = (function (IPython) { // to this state, instead of a blank cell target_cell.code_mirror.clearHistory(); source_element.remove(); + this.select(i); + this.edit_mode(); this.set_dirty(true); }; $([IPython.events]).trigger('selected_cell_type_changed.Notebook', @@ -1500,34 +1503,35 @@ var IPython = (function (IPython) { Notebook.prototype.execute_selected_cell = function (mode) { // mode = shift, ctrl, alt mode = mode || 'shift' - var that = this; - var cell = that.get_selected_cell(); - var cell_index = that.find_cell_index(cell); + var cell = this.get_selected_cell(); + var cell_index = this.find_cell_index(cell); cell.execute(); - console.log('Notebook.execute_selected_cell', mode); + + // If we are at the end always insert a new cell and return + if (cell_index === (this.ncells()-1)) { + this.insert_cell_below('code'); + this.select(cell_index+1); + this.edit_mode(); + this.scroll_to_bottom(); + this.set_dirty(true); + return; + } + if (mode === 'shift') { - if (cell_index === (that.ncells()-1)) { - that.insert_cell_below('code'); - that.select(cell_index+1); - that.edit_mode(); - that.scroll_to_bottom(); - } else { - that.command_mode(); - } + this.command_mode(); } else if (mode === 'ctrl') { - that.select(cell_index+1); - that.get_cell(cell_index+1).focus_cell(); + this.select(cell_index+1); + this.get_cell(cell_index+1).focus_cell(); } else if (mode === 'alt') { // Only insert a new cell, if we ended up in an already populated cell - if (/\S/.test(that.get_next_cell().get_text()) == true) { - that.insert_cell_below('code'); + var next_text = this.get_cell(cell_index+1).get_text(); + if (/\S/.test(next_text) === true) { + this.insert_cell_below('code'); } - var next_index = cell_index+1; - that.select(cell_index+1); - that.edit_mode(); + this.select(cell_index+1); + this.edit_mode(); } - this.set_dirty(true); }; @@ -1651,7 +1655,7 @@ var IPython = (function (IPython) { cell_data.cell_type = 'raw'; } - new_cell = this.insert_cell_at_bottom(cell_data.cell_type); + new_cell = this.insert_cell_at_index(cell_data.cell_type, i); new_cell.fromJSON(cell_data); }; }; diff --git a/IPython/html/static/notebook/js/textcell.js b/IPython/html/static/notebook/js/textcell.js index 3c50fde..5bc05f2 100644 --- a/IPython/html/static/notebook/js/textcell.js +++ b/IPython/html/static/notebook/js/textcell.js @@ -101,18 +101,11 @@ var IPython = (function (IPython) { IPython.Cell.prototype.bind_events.apply(this); var that = this; - // TODO: move this to the notebook event handler - this.element.keydown(function (event) { - if (event.which === 13 && !event.shiftKey) { - if (that.rendered) { - that.unrender(); - return false; - }; - }; - }); - this.element.dblclick(function () { - that.unrender(); + if (that.selected === false) { + $([IPython.events]).trigger('select.Cell', {'cell':that}); + }; + $([IPython.events]).trigger('edit_mode.Cell', {cell: that}); }); }; @@ -129,13 +122,32 @@ var IPython = (function (IPython) { * @return {Boolean} `true` if CodeMirror should ignore the event, `false` Otherwise */ TextCell.prototype.handle_codemirror_keyevent = function (editor, event) { + var that = this; if (this.mode === 'command') { return false } else if (this.mode === 'edit') { - if (event.keyCode === 13 && (event.shiftKey || event.ctrlKey)) { + if (event.keyCode === 13 && (event.shiftKey || event.ctrlKey || event.altKey)) { // Always ignore shift-enter in CodeMirror as we handle it. return true; - }; + } else if (event.which === key.UPARROW && event.type === 'keydown') { + // If we are not at the top, let CM handle the up arrow and + // prevent the global keydown handler from handling it. + if (!that.at_top()) { + event.stop(); + return false; + } else { + return true; + }; + } else if (event.which === key.DOWNARROW && event.type === 'keydown') { + // If we are not at the bottom, let CM handle the down arrow and + // prevent the global keydown handler from handling it. + if (!that.at_bottom()) { + event.stop(); + return false; + } else { + return true; + }; + } return false; }; return false; @@ -186,6 +198,7 @@ var IPython = (function (IPython) { TextCell.prototype.edit_mode = function () { var cont = IPython.Cell.prototype.edit_mode.apply(this); if (cont) { + this.unrender(); this.focus_editor(); }; return cont; @@ -234,6 +247,7 @@ var IPython = (function (IPython) { if (this.rendered) { return true; } else { + var cursor = this.code_mirror.getCursor(); if (cursor.line === 0 && cursor.ch === 0) { return true; } else { @@ -369,10 +383,12 @@ var IPython = (function (IPython) { * @extends IPython.TextCell */ var RawCell = function (options) { - options = this.mergeopt(RawCell, options); - - this.cell_type = 'raw'; + + options = this.mergeopt(RawCell,options) TextCell.apply(this, [options]); + this.cell_type = 'raw'; + // RawCell should always hide its rendered div + this.element.find('div.text_cell_render').hide(); }; RawCell.options_default = {