| // Copyright 2016 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| Sources.GoToLineQuickOpen = class extends QuickOpen.FilteredListWidget.Provider { | |
| /** | |
| * @override | |
| * @param {?number} itemIndex | |
| * @param {string} promptValue | |
| */ | |
| selectItem(itemIndex, promptValue) { | |
| const uiSourceCode = this._currentUISourceCode(); | |
| if (!uiSourceCode) { | |
| return; | |
| } | |
| const position = this._parsePosition(promptValue); | |
| if (!position) { | |
| return; | |
| } | |
| Common.Revealer.reveal(uiSourceCode.uiLocation(position.line - 1, position.column - 1)); | |
| } | |
| /** | |
| * @override | |
| * @param {string} query | |
| * @return {string} | |
| */ | |
| notFoundText(query) { | |
| if (!this._currentUISourceCode()) { | |
| return Common.UIString('No file selected.'); | |
| } | |
| const position = this._parsePosition(query); | |
| if (!position) { | |
| const sourceFrame = this._currentSourceFrame(); | |
| if (!sourceFrame) { | |
| return ls`Type a number to go to that line.`; | |
| } | |
| const currentLineNumber = sourceFrame.textEditor.currentLineNumber() + 1; | |
| const linesCount = sourceFrame.textEditor.linesCount; | |
| return ls`Current line: ${currentLineNumber}. Type a line number between 1 and ${linesCount} to navigate to.`; | |
| } | |
| if (position.column && position.column > 1) { | |
| return ls`Go to line ${position.line} and column ${position.column}.`; | |
| } | |
| return ls`Go to line ${position.line}.`; | |
| } | |
| /** | |
| * @param {string} query | |
| * @return {?{line: number, column: number}} | |
| */ | |
| _parsePosition(query) { | |
| const parts = query.match(/([0-9]+)(\:[0-9]*)?/); | |
| if (!parts || !parts[0] || parts[0].length !== query.length) { | |
| return null; | |
| } | |
| const line = parseInt(parts[1], 10); | |
| let column; | |
| if (parts[2]) { | |
| column = parseInt(parts[2].substring(1), 10); | |
| } | |
| return {line: Math.max(line | 0, 1), column: Math.max(column | 0, 1)}; | |
| } | |
| /** | |
| * @return {?Workspace.UISourceCode} | |
| */ | |
| _currentUISourceCode() { | |
| const sourcesView = UI.context.flavor(Sources.SourcesView); | |
| if (!sourcesView) { | |
| return null; | |
| } | |
| return sourcesView.currentUISourceCode(); | |
| } | |
| /** | |
| * @return {?Sources.UISourceCodeFrame} | |
| */ | |
| _currentSourceFrame() { | |
| const sourcesView = UI.context.flavor(Sources.SourcesView); | |
| if (!sourcesView) { | |
| return null; | |
| } | |
| return sourcesView.currentSourceFrame(); | |
| } | |
| }; |