| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 /** | 4 /** |
| 5 * @unrestricted | 5 * @unrestricted |
| 6 */ | 6 */ |
| 7 UI.InplaceEditor = class { | 7 UI.InplaceEditor = class { |
| 8 /** | 8 /** |
| 9 * @param {!Element} element | 9 * @param {!Element} element |
| 10 * @param {!UI.InplaceEditor.Config=} config | 10 * @param {!UI.InplaceEditor.Config=} config |
| 11 * @return {?UI.InplaceEditor.Controller} | 11 * @return {?UI.InplaceEditor.Controller} |
| 12 */ | 12 */ |
| 13 static startEditing(element, config) { | 13 static startEditing(element, config) { |
| 14 if (!UI.InplaceEditor._defaultInstance) | 14 if (!UI.InplaceEditor._defaultInstance) |
| 15 UI.InplaceEditor._defaultInstance = new UI.InplaceEditor(); | 15 UI.InplaceEditor._defaultInstance = new UI.InplaceEditor(); |
| 16 return UI.InplaceEditor._defaultInstance.startEditing(element, config); | 16 return UI.InplaceEditor._defaultInstance.startEditing(element, config); |
| 17 } | 17 } |
| 18 | 18 |
| 19 /** | 19 /** |
| 20 * @param {!Element} element | |
| 21 * @param {!UI.InplaceEditor.Config=} config | |
| 22 * @return {!Promise.<!UI.InplaceEditor.Controller>} | |
| 23 */ | |
| 24 static startMultilineEditing(element, config) { | |
| 25 return self.runtime.extension(UI.InplaceEditor).instance().then(startEditing
); | |
| 26 | |
| 27 /** | |
| 28 * @param {!Object} inplaceEditor | |
| 29 * @return {!UI.InplaceEditor.Controller|!Promise.<!UI.InplaceEditor.Control
ler>} | |
| 30 */ | |
| 31 function startEditing(inplaceEditor) { | |
| 32 var controller = /** @type {!UI.InplaceEditor} */ (inplaceEditor).startEdi
ting(element, config); | |
| 33 if (!controller) | |
| 34 return Promise.reject(new Error('Editing is already in progress')); | |
| 35 return controller; | |
| 36 } | |
| 37 } | |
| 38 | |
| 39 /** | |
| 40 * @return {string} | 20 * @return {string} |
| 41 */ | 21 */ |
| 42 editorContent(editingContext) { | 22 editorContent(editingContext) { |
| 43 var element = editingContext.element; | 23 var element = editingContext.element; |
| 44 if (element.tagName === 'INPUT' && element.type === 'text') | 24 if (element.tagName === 'INPUT' && element.type === 'text') |
| 45 return element.value; | 25 return element.value; |
| 46 | 26 |
| 47 return element.textContent; | 27 return element.textContent; |
| 48 } | 28 } |
| 49 | 29 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 startEditing(element, config) { | 69 startEditing(element, config) { |
| 90 if (!UI.markBeingEdited(element, true)) | 70 if (!UI.markBeingEdited(element, true)) |
| 91 return null; | 71 return null; |
| 92 | 72 |
| 93 config = config || new UI.InplaceEditor.Config(function() {}, function() {})
; | 73 config = config || new UI.InplaceEditor.Config(function() {}, function() {})
; |
| 94 var editingContext = {element: element, config: config}; | 74 var editingContext = {element: element, config: config}; |
| 95 var committedCallback = config.commitHandler; | 75 var committedCallback = config.commitHandler; |
| 96 var cancelledCallback = config.cancelHandler; | 76 var cancelledCallback = config.cancelHandler; |
| 97 var pasteCallback = config.pasteHandler; | 77 var pasteCallback = config.pasteHandler; |
| 98 var context = config.context; | 78 var context = config.context; |
| 99 var isMultiline = config.multiline || false; | |
| 100 var moveDirection = ''; | 79 var moveDirection = ''; |
| 101 var self = this; | 80 var self = this; |
| 102 | 81 |
| 103 this.setUpEditor(editingContext); | 82 this.setUpEditor(editingContext); |
| 104 | 83 |
| 105 editingContext.oldText = isMultiline ? config.initialValue : this.editorCont
ent(editingContext); | 84 editingContext.oldText = this.editorContent(editingContext); |
| 106 | 85 |
| 107 /** | 86 /** |
| 108 * @param {!Event=} e | 87 * @param {!Event=} e |
| 109 */ | 88 */ |
| 110 function blurEventListener(e) { | 89 function blurEventListener(e) { |
| 111 if (config.blurHandler && !config.blurHandler(element, e)) | 90 if (config.blurHandler && !config.blurHandler(element, e)) |
| 112 return; | 91 return; |
| 113 if (!isMultiline || !e || !e.relatedTarget || !e.relatedTarget.isSelfOrDes
cendant(element)) | 92 editingCommitted.call(element); |
| 114 editingCommitted.call(element); | |
| 115 } | 93 } |
| 116 | 94 |
| 117 function cleanUpAfterEditing() { | 95 function cleanUpAfterEditing() { |
| 118 UI.markBeingEdited(element, false); | 96 UI.markBeingEdited(element, false); |
| 119 | 97 |
| 120 element.removeEventListener('blur', blurEventListener, isMultiline); | 98 element.removeEventListener('blur', blurEventListener, false); |
| 121 element.removeEventListener('keydown', keyDownEventListener, true); | 99 element.removeEventListener('keydown', keyDownEventListener, true); |
| 122 if (pasteCallback) | 100 if (pasteCallback) |
| 123 element.removeEventListener('paste', pasteEventListener, true); | 101 element.removeEventListener('paste', pasteEventListener, true); |
| 124 | 102 |
| 125 if (self._focusRestorer) | 103 if (self._focusRestorer) |
| 126 self._focusRestorer.restore(); | 104 self._focusRestorer.restore(); |
| 127 self.closeEditor(editingContext); | 105 self.closeEditor(editingContext); |
| 128 } | 106 } |
| 129 | 107 |
| 130 /** @this {Element} */ | 108 /** @this {Element} */ |
| 131 function editingCancelled() { | 109 function editingCancelled() { |
| 132 self.cancelEditing(editingContext); | 110 self.cancelEditing(editingContext); |
| 133 cleanUpAfterEditing(); | 111 cleanUpAfterEditing(); |
| 134 cancelledCallback(this, context); | 112 cancelledCallback(this, context); |
| 135 } | 113 } |
| 136 | 114 |
| 137 /** @this {Element} */ | 115 /** @this {Element} */ |
| 138 function editingCommitted() { | 116 function editingCommitted() { |
| 139 cleanUpAfterEditing(); | 117 cleanUpAfterEditing(); |
| 140 | 118 |
| 141 committedCallback(this, self.editorContent(editingContext), editingContext
.oldText, context, moveDirection); | 119 committedCallback(this, self.editorContent(editingContext), editingContext
.oldText, context, moveDirection); |
| 142 } | 120 } |
| 143 | 121 |
| 144 /** | 122 /** |
| 145 * @param {!Event} event | 123 * @param {!Event} event |
| 146 * @return {string} | 124 * @return {string} |
| 147 */ | 125 */ |
| 148 function defaultFinishHandler(event) { | 126 function defaultFinishHandler(event) { |
| 149 var isMetaOrCtrl = Host.isMac() ? event.metaKey && !event.shiftKey && !eve
nt.ctrlKey && !event.altKey : | 127 if (isEnterKey(event)) |
| 150 event.ctrlKey && !event.shiftKey && !eve
nt.metaKey && !event.altKey; | |
| 151 if (isEnterKey(event) && (event.isMetaOrCtrlForTest || !isMultiline || isM
etaOrCtrl)) | |
| 152 return 'commit'; | 128 return 'commit'; |
| 153 else if (event.keyCode === UI.KeyboardShortcut.Keys.Esc.code || event.key
=== 'Escape') | 129 else if (event.keyCode === UI.KeyboardShortcut.Keys.Esc.code || event.key
=== 'Escape') |
| 154 return 'cancel'; | 130 return 'cancel'; |
| 155 else if (!isMultiline && event.key === 'Tab') | 131 else if (event.key === 'Tab') |
| 156 return 'move-' + (event.shiftKey ? 'backward' : 'forward'); | 132 return 'move-' + (event.shiftKey ? 'backward' : 'forward'); |
| 157 return ''; | 133 return ''; |
| 158 } | 134 } |
| 159 | 135 |
| 160 function handleEditingResult(result, event) { | 136 function handleEditingResult(result, event) { |
| 161 if (result === 'commit') { | 137 if (result === 'commit') { |
| 162 editingCommitted.call(element); | 138 editingCommitted.call(element); |
| 163 event.consume(true); | 139 event.consume(true); |
| 164 } else if (result === 'cancel') { | 140 } else if (result === 'cancel') { |
| 165 editingCancelled.call(element); | 141 editingCancelled.call(element); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 183 /** | 159 /** |
| 184 * @param {!Event} event | 160 * @param {!Event} event |
| 185 */ | 161 */ |
| 186 function keyDownEventListener(event) { | 162 function keyDownEventListener(event) { |
| 187 var result = defaultFinishHandler(event); | 163 var result = defaultFinishHandler(event); |
| 188 if (!result && config.postKeydownFinishHandler) | 164 if (!result && config.postKeydownFinishHandler) |
| 189 result = config.postKeydownFinishHandler(event); | 165 result = config.postKeydownFinishHandler(event); |
| 190 handleEditingResult(result, event); | 166 handleEditingResult(result, event); |
| 191 } | 167 } |
| 192 | 168 |
| 193 element.addEventListener('blur', blurEventListener, isMultiline); | 169 element.addEventListener('blur', blurEventListener, false); |
| 194 element.addEventListener('keydown', keyDownEventListener, true); | 170 element.addEventListener('keydown', keyDownEventListener, true); |
| 195 if (pasteCallback) | 171 if (pasteCallback) |
| 196 element.addEventListener('paste', pasteEventListener, true); | 172 element.addEventListener('paste', pasteEventListener, true); |
| 197 | 173 |
| 198 var handle = {cancel: editingCancelled.bind(element), commit: editingCommitt
ed.bind(element), setWidth() {}}; | 174 var handle = {cancel: editingCancelled.bind(element), commit: editingCommitt
ed.bind(element)}; |
| 199 this.augmentEditingHandle(editingContext, handle); | 175 this.augmentEditingHandle(editingContext, handle); |
| 200 return handle; | 176 return handle; |
| 201 } | 177 } |
| 202 }; | 178 }; |
| 203 | 179 |
| 204 /** | 180 /** |
| 205 * @typedef {{cancel: function(), commit: function(), setWidth: function(number)
}} | 181 * @typedef {{cancel: function(), commit: function()}} |
| 206 */ | 182 */ |
| 207 UI.InplaceEditor.Controller; | 183 UI.InplaceEditor.Controller; |
| 208 | 184 |
| 209 | 185 |
| 210 /** | 186 /** |
| 211 * @template T | 187 * @template T |
| 212 * @unrestricted | 188 * @unrestricted |
| 213 */ | 189 */ |
| 214 UI.InplaceEditor.Config = class { | 190 UI.InplaceEditor.Config = class { |
| 215 /** | 191 /** |
| 216 * @param {function(!Element,string,string,T,string)} commitHandler | 192 * @param {function(!Element,string,string,T,string)} commitHandler |
| 217 * @param {function(!Element,T)} cancelHandler | 193 * @param {function(!Element,T)} cancelHandler |
| 218 * @param {T=} context | 194 * @param {T=} context |
| 219 * @param {function(!Element,!Event):boolean=} blurHandler | 195 * @param {function(!Element,!Event):boolean=} blurHandler |
| 220 */ | 196 */ |
| 221 constructor(commitHandler, cancelHandler, context, blurHandler) { | 197 constructor(commitHandler, cancelHandler, context, blurHandler) { |
| 222 this.commitHandler = commitHandler; | 198 this.commitHandler = commitHandler; |
| 223 this.cancelHandler = cancelHandler; | 199 this.cancelHandler = cancelHandler; |
| 224 this.context = context; | 200 this.context = context; |
| 225 this.blurHandler = blurHandler; | 201 this.blurHandler = blurHandler; |
| 226 | 202 |
| 227 /** | 203 /** |
| 228 * @type {function(!Event):string|undefined} | 204 * @type {function(!Event):string|undefined} |
| 229 */ | 205 */ |
| 230 this.pasteHandler; | 206 this.pasteHandler; |
| 231 | 207 |
| 232 /** | 208 /** |
| 233 * @type {boolean|undefined} | |
| 234 */ | |
| 235 this.multiline; | |
| 236 | |
| 237 /** | |
| 238 * @type {function(!Event):string|undefined} | 209 * @type {function(!Event):string|undefined} |
| 239 */ | 210 */ |
| 240 this.postKeydownFinishHandler; | 211 this.postKeydownFinishHandler; |
| 241 } | 212 } |
| 242 | 213 |
| 243 setPasteHandler(pasteHandler) { | 214 setPasteHandler(pasteHandler) { |
| 244 this.pasteHandler = pasteHandler; | 215 this.pasteHandler = pasteHandler; |
| 245 } | 216 } |
| 246 | 217 |
| 247 /** | 218 /** |
| 248 * @param {string} initialValue | |
| 249 * @param {!Object} mode | |
| 250 * @param {string} theme | |
| 251 * @param {boolean=} lineWrapping | |
| 252 * @param {boolean=} smartIndent | |
| 253 */ | |
| 254 setMultilineOptions(initialValue, mode, theme, lineWrapping, smartIndent) { | |
| 255 this.multiline = true; | |
| 256 this.initialValue = initialValue; | |
| 257 this.mode = mode; | |
| 258 this.theme = theme; | |
| 259 this.lineWrapping = lineWrapping; | |
| 260 this.smartIndent = smartIndent; | |
| 261 } | |
| 262 | |
| 263 /** | |
| 264 * @param {function(!Event):string} postKeydownFinishHandler | 219 * @param {function(!Event):string} postKeydownFinishHandler |
| 265 */ | 220 */ |
| 266 setPostKeydownFinishHandler(postKeydownFinishHandler) { | 221 setPostKeydownFinishHandler(postKeydownFinishHandler) { |
| 267 this.postKeydownFinishHandler = postKeydownFinishHandler; | 222 this.postKeydownFinishHandler = postKeydownFinishHandler; |
| 268 } | 223 } |
| 269 }; | 224 }; |
| OLD | NEW |