OLD | NEW |
---|---|
(Empty) | |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 /** | |
6 * @constructor | |
7 * @implements {WebInspector.TabbedEditorContainerDelegate} | |
8 * @implements {WebInspector.Searchable} | |
9 * @implements {WebInspector.Replaceable} | |
10 * @extends {WebInspector.Object} | |
11 * @param {!WebInspector.Workspace} workspace | |
12 * @param {!WebInspector.SourcesPanel} sourcesPanel | |
13 */ | |
14 WebInspector.SourcesEditor = function(workspace, sourcesPanel) | |
lushnikov
2014/03/20 13:13:43
it would be great to remove this sourcesPanel depe
| |
15 { | |
16 this._workspace = workspace; | |
17 this._sourcesPanel = sourcesPanel; | |
18 | |
19 this._sourcesView = new WebInspector.SourcesView(); | |
20 | |
21 this._searchableView = new WebInspector.SearchableView(this); | |
22 this._searchableView.setMinimalSearchQuerySize(0); | |
23 this._searchableView.show(this._sourcesView.element); | |
24 | |
25 /** @type {!Map.<!WebInspector.UISourceCode, !WebInspector.SourceFrame>} */ | |
26 this._sourceFramesByUISourceCode = new Map(); | |
27 | |
28 var tabbedEditorPlaceholderText = WebInspector.isMac() ? WebInspector.UIStri ng("Hit Cmd+O to open a file") : WebInspector.UIString("Hit Ctrl+O to open a fil e"); | |
29 this._editorContainer = new WebInspector.TabbedEditorContainer(this, "previo uslyViewedFiles", tabbedEditorPlaceholderText); | |
30 this._editorContainer.show(this._searchableView.element); | |
31 this._editorContainer.addEventListener(WebInspector.TabbedEditorContainer.Ev ents.EditorSelected, this._editorSelected, this); | |
32 this._editorContainer.addEventListener(WebInspector.TabbedEditorContainer.Ev ents.EditorClosed, this._editorClosed, this); | |
33 | |
34 this._historyManager = new WebInspector.EditingLocationHistoryManager(this, this.currentSourceFrame.bind(this)); | |
35 | |
36 this._scriptViewStatusBarItemsContainer = document.createElement("div"); | |
37 this._scriptViewStatusBarItemsContainer.className = "inline-block"; | |
38 | |
39 this._scriptViewStatusBarTextContainer = document.createElement("div"); | |
40 this._scriptViewStatusBarTextContainer.className = "hbox"; | |
41 | |
42 this._statusBarContainerElement = this._sourcesView.element.createChild("div ", "sources-status-bar"); | |
43 | |
44 /** | |
45 * @this {WebInspector.SourcesEditor} | |
46 * @param {!WebInspector.SourcesEditor.EditorAction} EditorAction | |
47 */ | |
48 function appendButtonForExtension(EditorAction) | |
49 { | |
50 this._statusBarContainerElement.appendChild(EditorAction.button(this)); | |
51 } | |
52 var editorActions = /** @type {!Array.<!WebInspector.SourcesEditor.EditorAct ion>} */ (WebInspector.moduleManager.instances(WebInspector.SourcesEditor.Editor Action)); | |
53 editorActions.forEach(appendButtonForExtension.bind(this)); | |
54 | |
55 this._statusBarContainerElement.appendChild(this._scriptViewStatusBarItemsCo ntainer); | |
56 this._statusBarContainerElement.appendChild(this._scriptViewStatusBarTextCon tainer); | |
57 | |
58 WebInspector.startBatchUpdate(); | |
59 this._workspace.uiSourceCodes().forEach(this._addUISourceCode.bind(this)); | |
60 WebInspector.endBatchUpdate(); | |
61 | |
62 this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeA dded, this._uiSourceCodeAdded, this); | |
63 this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeR emoved, this._uiSourceCodeRemoved, this); | |
64 this._workspace.addEventListener(WebInspector.Workspace.Events.ProjectWillRe set, this._projectWillReset.bind(this), this); | |
65 | |
66 function handleBeforeUnload(event) | |
67 { | |
68 if (event.returnValue) | |
69 return; | |
70 var unsavedSourceCodes = WebInspector.workspace.unsavedSourceCodes(); | |
71 if (!unsavedSourceCodes.length) | |
72 return; | |
73 | |
74 event.returnValue = WebInspector.UIString("DevTools have unsaved changes that will be permanently lost."); | |
75 WebInspector.inspectorView.showPanel("sources"); | |
76 for (var i = 0; i < unsavedSourceCodes.length; ++i) | |
77 WebInspector.panels.sources.showUISourceCode(unsavedSourceCodes[i]); | |
78 } | |
79 window.addEventListener("beforeunload", handleBeforeUnload, true); | |
80 } | |
81 | |
82 WebInspector.SourcesEditor.Events = { | |
83 EditorClosed: "EditorClosed", | |
84 EditorSelected: "EditorSelected", | |
85 } | |
86 | |
87 WebInspector.SourcesEditor.prototype = { | |
88 /** | |
89 * @param {function(!Array.<!WebInspector.KeyboardShortcut.Descriptor>, func tion(?Event=):boolean)} registerShortcutDelegate | |
90 */ | |
91 registerShortcuts: function(registerShortcutDelegate) | |
92 { | |
93 registerShortcutDelegate(WebInspector.ShortcutsScreen.SourcesPanelShortc uts.JumpToPreviousLocation, this._onJumpToPreviousLocation.bind(this)); | |
94 registerShortcutDelegate(WebInspector.ShortcutsScreen.SourcesPanelShortc uts.JumpToNextLocation, this._onJumpToNextLocation.bind(this)); | |
95 registerShortcutDelegate(WebInspector.ShortcutsScreen.SourcesPanelShortc uts.CloseEditorTab, this._onCloseEditorTab.bind(this)); | |
96 registerShortcutDelegate(WebInspector.ShortcutsScreen.SourcesPanelShortc uts.GoToLine, this._showGoToLineDialog.bind(this)); | |
97 registerShortcutDelegate(WebInspector.ShortcutsScreen.SourcesPanelShortc uts.GoToMember, this._showOutlineDialog.bind(this)); | |
98 registerShortcutDelegate(WebInspector.ShortcutsScreen.SourcesPanelShortc uts.ToggleBreakpoint, this._toggleBreakpoint.bind(this)); | |
99 }, | |
100 | |
101 /** | |
102 * @return {!Element} | |
103 */ | |
104 statusBarContainerElement: function() | |
105 { | |
106 return this._statusBarContainerElement; | |
107 }, | |
108 | |
109 /** | |
110 * @return {!Element} | |
111 */ | |
112 defaultFocusedElement: function() | |
113 { | |
114 return this._editorContainer.view.defaultFocusedElement(); | |
115 }, | |
116 | |
117 /** | |
118 * @return {!WebInspector.SearchableView} | |
119 */ | |
120 searchableView: function() | |
121 { | |
122 return this._searchableView; | |
123 }, | |
124 | |
125 /** | |
126 * @return {!WebInspector.SourcesView} | |
127 */ | |
128 sourcesView: function() | |
129 { | |
130 return this._sourcesView; | |
131 }, | |
132 | |
133 /** | |
134 * @return {!WebInspector.View} | |
135 */ | |
136 visibleView: function() | |
137 { | |
138 return this._editorContainer.visibleView; | |
139 }, | |
140 | |
141 /** | |
142 * @return {?WebInspector.SourceFrame} | |
143 */ | |
144 currentSourceFrame: function() | |
145 { | |
146 var view = this.visibleView(); | |
147 if (!(view instanceof WebInspector.SourceFrame)) | |
148 return null; | |
149 return /** @type {!WebInspector.SourceFrame} */ (view); | |
150 }, | |
151 | |
152 /** | |
153 * @return {?WebInspector.UISourceCode} | |
154 */ | |
155 currentUISourceCode: function() | |
156 { | |
157 return this._currentUISourceCode; | |
158 }, | |
159 | |
160 /** | |
161 * @param {?Event=} event | |
162 */ | |
163 _onCloseEditorTab: function(event) | |
164 { | |
165 var uiSourceCode = this.currentUISourceCode(); | |
166 if (!uiSourceCode) | |
167 return false; | |
168 this._editorContainer.closeFile(uiSourceCode); | |
169 return true; | |
170 }, | |
171 | |
172 /** | |
173 * @param {?Event=} event | |
174 */ | |
175 _onJumpToPreviousLocation: function(event) | |
176 { | |
177 this._historyManager.rollback(); | |
178 return true; | |
179 }, | |
180 | |
181 /** | |
182 * @param {?Event=} event | |
183 */ | |
184 _onJumpToNextLocation: function(event) | |
185 { | |
186 this._historyManager.rollover(); | |
187 return true; | |
188 }, | |
189 | |
190 /** | |
191 * @param {!WebInspector.Event} event | |
192 */ | |
193 _uiSourceCodeAdded: function(event) | |
194 { | |
195 var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (event.data ); | |
196 this._addUISourceCode(uiSourceCode); | |
197 }, | |
198 | |
199 /** | |
200 * @param {!WebInspector.UISourceCode} uiSourceCode | |
201 */ | |
202 _addUISourceCode: function(uiSourceCode) | |
203 { | |
204 if (uiSourceCode.project().isServiceProject()) | |
205 return; | |
206 this._editorContainer.addUISourceCode(uiSourceCode); | |
207 // Replace debugger script-based uiSourceCode with a network-based one. | |
208 var currentUISourceCode = this._currentUISourceCode; | |
209 if (currentUISourceCode && currentUISourceCode.project().isServiceProjec t() && currentUISourceCode !== uiSourceCode && currentUISourceCode.url === uiSou rceCode.url) { | |
210 this._showFile(uiSourceCode); | |
211 this._editorContainer.removeUISourceCode(currentUISourceCode); | |
212 } | |
213 }, | |
214 | |
215 _uiSourceCodeRemoved: function(event) | |
216 { | |
217 var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (event.data ); | |
218 this._removeUISourceCodes([uiSourceCode]); | |
219 }, | |
220 | |
221 /** | |
222 * @param {!Array.<!WebInspector.UISourceCode>} uiSourceCodes | |
223 */ | |
224 _removeUISourceCodes: function(uiSourceCodes) | |
225 { | |
226 for (var i = 0; i < uiSourceCodes.length; ++i) { | |
227 this._removeSourceFrame(uiSourceCodes[i]); | |
228 this._historyManager.removeHistoryForSourceCode(uiSourceCodes[i]); | |
229 } | |
230 this._editorContainer.removeUISourceCodes(uiSourceCodes); | |
231 }, | |
232 | |
233 _projectWillReset: function(event) | |
234 { | |
235 var project = event.data; | |
236 var uiSourceCodes = project.uiSourceCodes(); | |
237 this._removeUISourceCodes(uiSourceCodes); | |
238 if (project.type() === WebInspector.projectTypes.Network) | |
239 this._editorContainer.reset(); | |
240 }, | |
241 | |
242 _updateScriptViewStatusBarItems: function() | |
243 { | |
244 this._scriptViewStatusBarItemsContainer.removeChildren(); | |
245 this._scriptViewStatusBarTextContainer.removeChildren(); | |
246 var sourceFrame = this.currentSourceFrame(); | |
247 if (!sourceFrame) | |
248 return; | |
249 | |
250 var statusBarItems = sourceFrame.statusBarItems() || []; | |
251 for (var i = 0; i < statusBarItems.length; ++i) | |
252 this._scriptViewStatusBarItemsContainer.appendChild(statusBarItems[i ]); | |
253 var statusBarText = sourceFrame.statusBarText(); | |
254 if (statusBarText) | |
255 this._scriptViewStatusBarTextContainer.appendChild(statusBarText); | |
256 }, | |
257 | |
258 /** | |
259 * @param {!WebInspector.UISourceCode} uiSourceCode | |
260 * @param {number=} lineNumber | |
261 * @param {number=} columnNumber | |
262 * @param {boolean=} omitFocus | |
263 * @param {boolean=} omitHighlight | |
264 */ | |
265 showSourceLocation: function(uiSourceCode, lineNumber, columnNumber, omitFoc us, omitHighlight) | |
266 { | |
267 this._historyManager.updateCurrentState(); | |
268 var sourceFrame = this._showFile(uiSourceCode); | |
269 if (typeof lineNumber === "number") | |
270 sourceFrame.revealPosition(lineNumber, columnNumber, !omitHighlight) ; | |
271 this._historyManager.pushNewState(); | |
272 if (!omitFocus) | |
273 sourceFrame.focus(); | |
274 WebInspector.notifications.dispatchEventToListeners(WebInspector.UserMet rics.UserAction, { | |
275 action: WebInspector.UserMetrics.UserActionNames.OpenSourceLink, | |
276 url: uiSourceCode.originURL(), | |
277 lineNumber: lineNumber | |
278 }); | |
279 }, | |
280 | |
281 /** | |
282 * @param {!WebInspector.UISourceCode} uiSourceCode | |
283 * @return {!WebInspector.SourceFrame} | |
284 */ | |
285 _showFile: function(uiSourceCode) | |
286 { | |
287 var sourceFrame = this._getOrCreateSourceFrame(uiSourceCode); | |
288 if (this._currentUISourceCode === uiSourceCode) | |
289 return sourceFrame; | |
290 | |
291 this._currentUISourceCode = uiSourceCode; | |
292 this._editorContainer.showFile(uiSourceCode); | |
293 this._updateScriptViewStatusBarItems(); | |
294 return sourceFrame; | |
295 }, | |
296 | |
297 /** | |
298 * @param {!WebInspector.UISourceCode} uiSourceCode | |
299 * @return {!WebInspector.SourceFrame} | |
300 */ | |
301 _createSourceFrame: function(uiSourceCode) | |
302 { | |
303 var sourceFrame; | |
304 switch (uiSourceCode.contentType()) { | |
305 case WebInspector.resourceTypes.Script: | |
306 sourceFrame = new WebInspector.JavaScriptSourceFrame(this._sourcesPa nel, uiSourceCode); | |
307 break; | |
308 case WebInspector.resourceTypes.Document: | |
309 sourceFrame = new WebInspector.JavaScriptSourceFrame(this._sourcesPa nel, uiSourceCode); | |
310 break; | |
311 case WebInspector.resourceTypes.Stylesheet: | |
312 sourceFrame = new WebInspector.CSSSourceFrame(uiSourceCode); | |
313 break; | |
314 default: | |
315 sourceFrame = new WebInspector.UISourceCodeFrame(uiSourceCode); | |
316 break; | |
317 } | |
318 sourceFrame.setHighlighterType(uiSourceCode.highlighterType()); | |
319 this._sourceFramesByUISourceCode.put(uiSourceCode, sourceFrame); | |
320 this._historyManager.trackSourceFrameCursorJumps(sourceFrame); | |
321 return sourceFrame; | |
322 }, | |
323 | |
324 /** | |
325 * @param {!WebInspector.UISourceCode} uiSourceCode | |
326 * @return {!WebInspector.SourceFrame} | |
327 */ | |
328 _getOrCreateSourceFrame: function(uiSourceCode) | |
329 { | |
330 return this._sourceFramesByUISourceCode.get(uiSourceCode) || this._creat eSourceFrame(uiSourceCode); | |
331 }, | |
332 | |
333 /** | |
334 * @param {!WebInspector.SourceFrame} sourceFrame | |
335 * @param {!WebInspector.UISourceCode} uiSourceCode | |
336 * @return {boolean} | |
337 */ | |
338 _sourceFrameMatchesUISourceCode: function(sourceFrame, uiSourceCode) | |
339 { | |
340 switch (uiSourceCode.contentType()) { | |
341 case WebInspector.resourceTypes.Script: | |
342 case WebInspector.resourceTypes.Document: | |
343 return sourceFrame instanceof WebInspector.JavaScriptSourceFrame; | |
344 case WebInspector.resourceTypes.Stylesheet: | |
345 return sourceFrame instanceof WebInspector.CSSSourceFrame; | |
346 default: | |
347 return !(sourceFrame instanceof WebInspector.JavaScriptSourceFrame); | |
348 } | |
349 }, | |
350 | |
351 /** | |
352 * @param {!WebInspector.UISourceCode} uiSourceCode | |
353 */ | |
354 _recreateSourceFrameIfNeeded: function(uiSourceCode) | |
355 { | |
356 var oldSourceFrame = this._sourceFramesByUISourceCode.get(uiSourceCode); | |
357 if (!oldSourceFrame) | |
358 return; | |
359 if (this._sourceFrameMatchesUISourceCode(oldSourceFrame, uiSourceCode)) { | |
360 oldSourceFrame.setHighlighterType(uiSourceCode.highlighterType()); | |
361 } else { | |
362 this._editorContainer.removeUISourceCode(uiSourceCode); | |
363 this._removeSourceFrame(uiSourceCode); | |
364 } | |
365 }, | |
366 | |
367 /** | |
368 * @param {!WebInspector.UISourceCode} uiSourceCode | |
369 * @return {!WebInspector.SourceFrame} | |
370 */ | |
371 viewForFile: function(uiSourceCode) | |
372 { | |
373 return this._getOrCreateSourceFrame(uiSourceCode); | |
374 }, | |
375 | |
376 /** | |
377 * @param {!WebInspector.UISourceCode} uiSourceCode | |
378 */ | |
379 _removeSourceFrame: function(uiSourceCode) | |
380 { | |
381 var sourceFrame = this._sourceFramesByUISourceCode.get(uiSourceCode); | |
382 if (!sourceFrame) | |
383 return; | |
384 this._sourceFramesByUISourceCode.remove(uiSourceCode); | |
385 sourceFrame.dispose(); | |
386 }, | |
387 | |
388 clearCurrentExecutionLine: function() | |
389 { | |
390 if (this._executionSourceFrame) | |
391 this._executionSourceFrame.clearExecutionLine(); | |
392 delete this._executionSourceFrame; | |
393 }, | |
394 | |
395 setExecutionLine: function(uiLocation) | |
396 { | |
397 var sourceFrame = this._getOrCreateSourceFrame(uiLocation.uiSourceCode); | |
398 sourceFrame.setExecutionLine(uiLocation.lineNumber); | |
399 this._executionSourceFrame = sourceFrame; | |
400 }, | |
401 | |
402 _editorClosed: function(event) | |
403 { | |
404 var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (event.data ); | |
405 this._historyManager.removeHistoryForSourceCode(uiSourceCode); | |
406 | |
407 var wasSelected = false; | |
408 if (this._currentUISourceCode === uiSourceCode) { | |
409 delete this._currentUISourceCode; | |
410 wasSelected = true; | |
411 } | |
412 | |
413 // SourcesNavigator does not need to update on EditorClosed. | |
414 this._updateScriptViewStatusBarItems(); | |
415 this._searchableView.resetSearch(); | |
416 | |
417 var data = {}; | |
418 data.uiSourceCode = uiSourceCode; | |
419 data.wasSelected = wasSelected; | |
420 this.dispatchEventToListeners(WebInspector.SourcesEditor.Events.EditorCl osed, data); | |
421 }, | |
422 | |
423 _editorSelected: function(event) | |
424 { | |
425 var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (event.data .currentFile); | |
426 var shouldUseHistoryManager = uiSourceCode !== this._currentUISourceCode && event.data.userGesture; | |
427 if (shouldUseHistoryManager) | |
428 this._historyManager.updateCurrentState(); | |
429 var sourceFrame = this._showFile(uiSourceCode); | |
430 if (shouldUseHistoryManager) | |
431 this._historyManager.pushNewState(); | |
432 | |
433 this._searchableView.setReplaceable(!!sourceFrame && sourceFrame.canEdit Source()); | |
434 this._searchableView.resetSearch(); | |
435 | |
436 this.dispatchEventToListeners(WebInspector.SourcesEditor.Events.EditorSe lected, uiSourceCode); | |
437 }, | |
438 | |
439 /** | |
440 * @param {!WebInspector.UISourceCode} uiSourceCode | |
441 */ | |
442 sourceRenamed: function(uiSourceCode) | |
443 { | |
444 this._recreateSourceFrameIfNeeded(uiSourceCode); | |
445 }, | |
446 | |
447 searchCanceled: function() | |
448 { | |
449 if (this._searchView) | |
450 this._searchView.searchCanceled(); | |
451 | |
452 delete this._searchView; | |
453 delete this._searchQuery; | |
454 }, | |
455 | |
456 /** | |
457 * @param {string} query | |
458 * @param {boolean} shouldJump | |
459 */ | |
460 performSearch: function(query, shouldJump) | |
461 { | |
462 this._searchableView.updateSearchMatchesCount(0); | |
463 | |
464 var sourceFrame = this.currentSourceFrame(); | |
465 if (!sourceFrame) | |
466 return; | |
467 | |
468 this._searchView = sourceFrame; | |
469 this._searchQuery = query; | |
470 | |
471 /** | |
472 * @param {!WebInspector.View} view | |
473 * @param {number} searchMatches | |
474 * @this {WebInspector.SourcesEditor} | |
475 */ | |
476 function finishedCallback(view, searchMatches) | |
477 { | |
478 if (!searchMatches) | |
479 return; | |
480 | |
481 this._searchableView.updateSearchMatchesCount(searchMatches); | |
482 } | |
483 | |
484 /** | |
485 * @param {number} currentMatchIndex | |
486 * @this {WebInspector.SourcesEditor} | |
487 */ | |
488 function currentMatchChanged(currentMatchIndex) | |
489 { | |
490 this._searchableView.updateCurrentMatchIndex(currentMatchIndex); | |
491 } | |
492 | |
493 /** | |
494 * @this {WebInspector.SourcesEditor} | |
495 */ | |
496 function searchResultsChanged() | |
497 { | |
498 this._searchableView.cancelSearch(); | |
499 } | |
500 | |
501 this._searchView.performSearch(query, shouldJump, finishedCallback.bind( this), currentMatchChanged.bind(this), searchResultsChanged.bind(this)); | |
502 }, | |
503 | |
504 jumpToNextSearchResult: function() | |
505 { | |
506 if (!this._searchView) | |
507 return; | |
508 | |
509 if (this._searchView !== this.currentSourceFrame()) { | |
510 this.performSearch(this._searchQuery, true); | |
511 return; | |
512 } | |
513 | |
514 this._searchView.jumpToNextSearchResult(); | |
515 }, | |
516 | |
517 jumpToPreviousSearchResult: function() | |
518 { | |
519 if (!this._searchView) | |
520 return; | |
521 | |
522 if (this._searchView !== this.currentSourceFrame()) { | |
523 this.performSearch(this._searchQuery, true); | |
524 if (this._searchView) | |
525 this._searchView.jumpToLastSearchResult(); | |
526 return; | |
527 } | |
528 | |
529 this._searchView.jumpToPreviousSearchResult(); | |
530 }, | |
531 | |
532 /** | |
533 * @param {string} text | |
534 */ | |
535 replaceSelectionWith: function(text) | |
536 { | |
537 var sourceFrame = this.currentSourceFrame(); | |
538 if (!sourceFrame) { | |
539 console.assert(sourceFrame); | |
540 return; | |
541 } | |
542 sourceFrame.replaceSelectionWith(text); | |
543 }, | |
544 | |
545 /** | |
546 * @param {string} query | |
547 * @param {string} text | |
548 */ | |
549 replaceAllWith: function(query, text) | |
550 { | |
551 var sourceFrame = this.currentSourceFrame(); | |
552 if (!sourceFrame) { | |
553 console.assert(sourceFrame); | |
554 return; | |
555 } | |
556 sourceFrame.replaceAllWith(query, text); | |
557 }, | |
558 | |
559 /** | |
560 * @param {?Event=} event | |
561 * @return {boolean} | |
562 */ | |
563 _showOutlineDialog: function(event) | |
564 { | |
565 var uiSourceCode = this._editorContainer.currentFile(); | |
566 if (!uiSourceCode) | |
567 return false; | |
568 | |
569 switch (uiSourceCode.contentType()) { | |
570 case WebInspector.resourceTypes.Document: | |
571 case WebInspector.resourceTypes.Script: | |
572 WebInspector.JavaScriptOutlineDialog.show(this._sourcesView, uiSourc eCode, this.showSourceLocation.bind(this, uiSourceCode)); | |
573 return true; | |
574 case WebInspector.resourceTypes.Stylesheet: | |
575 WebInspector.StyleSheetOutlineDialog.show(this._sourcesView, uiSourc eCode, this.showSourceLocation.bind(this, uiSourceCode)); | |
576 return true; | |
577 } | |
578 return false; | |
579 }, | |
580 | |
581 /** | |
582 * @param {string=} query | |
583 */ | |
584 showOpenResourceDialog: function(query) | |
585 { | |
586 var uiSourceCodes = this._editorContainer.historyUISourceCodes(); | |
587 /** @type {!Map.<!WebInspector.UISourceCode, number>} */ | |
588 var defaultScores = new Map(); | |
589 for (var i = 1; i < uiSourceCodes.length; ++i) // Skip current element | |
590 defaultScores.put(uiSourceCodes[i], uiSourceCodes.length - i); | |
591 WebInspector.OpenResourceDialog.show(this, this._sourcesView.element, qu ery, defaultScores); | |
592 }, | |
593 | |
594 /** | |
595 * @param {?Event=} event | |
596 * @return {boolean} | |
597 */ | |
598 _showGoToLineDialog: function(event) | |
599 { | |
600 this.showOpenResourceDialog(":"); | |
601 return true; | |
602 }, | |
603 | |
604 /** | |
605 * @return {boolean} | |
606 */ | |
607 _toggleBreakpoint: function() | |
608 { | |
609 var sourceFrame = this.currentSourceFrame(); | |
610 if (!sourceFrame) | |
611 return false; | |
612 | |
613 if (sourceFrame instanceof WebInspector.JavaScriptSourceFrame) { | |
614 var javaScriptSourceFrame = /** @type {!WebInspector.JavaScriptSourc eFrame} */ (sourceFrame); | |
615 javaScriptSourceFrame.toggleBreakpointOnCurrentLine(); | |
616 return true; | |
617 } | |
618 return false; | |
619 }, | |
620 | |
621 /** | |
622 * @param {boolean} active | |
623 */ | |
624 toggleBreakpointsActiveState: function(active) | |
625 { | |
626 this._editorContainer.view.element.classList.toggle("breakpoints-deactiv ated", !active); | |
627 }, | |
628 | |
629 __proto__: WebInspector.Object.prototype | |
630 } | |
631 | |
632 /** | |
633 * @constructor | |
634 * @extends {WebInspector.VBox} | |
635 */ | |
636 WebInspector.SourcesView = function() | |
637 { | |
638 WebInspector.VBox.call(this); | |
639 this.registerRequiredCSS("sourcesView.css"); | |
640 this.element.id = "sources-panel-sources-view"; | |
641 this.element.addEventListener("dragenter", this._onDragEnter.bind(this), tru e); | |
642 this.element.addEventListener("dragover", this._onDragOver.bind(this), true) ; | |
643 } | |
644 | |
645 WebInspector.SourcesView.dragAndDropFilesType = "Files"; | |
646 | |
647 WebInspector.SourcesView.prototype = { | |
648 _onDragEnter: function (event) | |
649 { | |
650 if (event.dataTransfer.types.indexOf(WebInspector.SourcesView.dragAndDro pFilesType) === -1) | |
651 return; | |
652 event.consume(true); | |
653 }, | |
654 | |
655 _onDragOver: function (event) | |
656 { | |
657 if (event.dataTransfer.types.indexOf(WebInspector.SourcesView.dragAndDro pFilesType) === -1) | |
658 return; | |
659 event.consume(true); | |
660 if (this._dragMaskElement) | |
661 return; | |
662 this._dragMaskElement = this.element.createChild("div", "fill drag-mask" ); | |
663 this._dragMaskElement.addEventListener("drop", this._onDrop.bind(this), true); | |
664 this._dragMaskElement.addEventListener("dragleave", this._onDragLeave.bi nd(this), true); | |
665 }, | |
666 | |
667 _onDrop: function (event) | |
668 { | |
669 event.consume(true); | |
670 this._removeMask(); | |
671 var items = /** @type {!Array.<!DataTransferItem>} */ (event.dataTransfe r.items); | |
672 if (!items.length) | |
673 return; | |
674 var entry = items[0].webkitGetAsEntry(); | |
675 if (!entry.isDirectory) | |
676 return; | |
677 InspectorFrontendHost.upgradeDraggedFileSystemPermissions(entry.filesyst em); | |
678 }, | |
679 | |
680 _onDragLeave: function (event) | |
681 { | |
682 event.consume(true); | |
683 this._removeMask(); | |
684 }, | |
685 | |
686 _removeMask: function () | |
687 { | |
688 this._dragMaskElement.remove(); | |
689 delete this._dragMaskElement; | |
690 }, | |
691 | |
692 __proto__: WebInspector.VBox.prototype | |
693 } | |
694 | |
695 /** | |
696 * @interface | |
697 */ | |
698 WebInspector.SourcesEditor.EditorAction = function() | |
699 { | |
700 } | |
701 | |
702 WebInspector.SourcesEditor.EditorAction.prototype = { | |
703 /** | |
704 * @param {!WebInspector.SourcesEditor} sourcesEditor | |
705 * @return {!Element} | |
706 */ | |
707 button: function(sourcesEditor) { } | |
708 } | |
OLD | NEW |