Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(258)

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/ui/InplaceEditor.js

Issue 2372663004: DevTools: Replace multiline InplaceEditor with CodeMirrorTextEditor (Closed)
Patch Set: resize width Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698