Skip to content

Commit 5a262d4

Browse files
Akos Kittakittaakos
Akos Kitta
authored andcommitted
ATL-1063: Integrated search in workspace into IDE
- Reordered the sidebar views. - Increased the default sidebar width. Signed-off-by: Akos Kitta <[email protected]>
1 parent eadc993 commit 5a262d4

9 files changed

+137
-8
lines changed

Diff for: arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts

+16-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ import {
3535
CommonFrontendContribution as TheiaCommonFrontendContribution,
3636
KeybindingRegistry as TheiaKeybindingRegistry,
3737
TabBarRendererFactory,
38-
ContextMenuRenderer
38+
ContextMenuRenderer,
39+
createTreeContainer,
40+
TreeWidget
3941
} from '@theia/core/lib/browser';
4042
import { MenuContribution } from '@theia/core/lib/common/menu';
4143
import { ApplicationShell } from './theia/core/application-shell';
@@ -147,6 +149,10 @@ import { WorkspaceVariableContribution as TheiaWorkspaceVariableContribution } f
147149
import { WorkspaceVariableContribution } from './theia/workspace/workspace-variable-contribution';
148150
import { DebugConfigurationManager } from './theia/debug/debug-configuration-manager';
149151
import { DebugConfigurationManager as TheiaDebugConfigurationManager } from '@theia/debug/lib/browser/debug-configuration-manager';
152+
import { SearchInWorkspaceWidget as TheiaSearchInWorkspaceWidget } from '@theia/search-in-workspace/lib/browser/search-in-workspace-widget';
153+
import { SearchInWorkspaceWidget } from './theia/search-in-workspace/search-in-workspace-widget';
154+
import { SearchInWorkspaceResultTreeWidget as TheiaSearchInWorkspaceResultTreeWidget } from '@theia/search-in-workspace/lib/browser/search-in-workspace-result-tree-widget';
155+
import { SearchInWorkspaceResultTreeWidget } from './theia/search-in-workspace/search-in-workspace-result-tree-widget';
150156

151157
const ElementQueries = require('css-element-queries/src/ElementQueries');
152158

@@ -300,6 +306,15 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
300306
bind(MonacoTextModelService).toSelf().inSingletonScope();
301307
rebind(TheiaMonacoTextModelService).toService(MonacoTextModelService);
302308

309+
bind(SearchInWorkspaceWidget).toSelf();
310+
rebind(TheiaSearchInWorkspaceWidget).toService(SearchInWorkspaceWidget);
311+
rebind(TheiaSearchInWorkspaceResultTreeWidget).toDynamicValue(({ container }) => {
312+
const childContainer = createTreeContainer(container);
313+
childContainer.bind(SearchInWorkspaceResultTreeWidget).toSelf()
314+
childContainer.rebind(TreeWidget).toService(SearchInWorkspaceResultTreeWidget);
315+
return childContainer.get(SearchInWorkspaceResultTreeWidget);
316+
});
317+
303318
// Show a disconnected status bar, when the daemon is not available
304319
bind(ApplicationConnectionStatusContribution).toSelf().inSingletonScope();
305320
rebind(TheiaApplicationConnectionStatusContribution).toService(ApplicationConnectionStatusContribution);

Diff for: arduino-ide-extension/src/browser/boards/boards-widget-frontend-contribution.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export class BoardsListWidgetFrontendContribution extends ListWidgetFrontendCont
1212
widgetName: BoardsListWidget.WIDGET_LABEL,
1313
defaultWidgetOptions: {
1414
area: 'left',
15-
rank: 600
15+
rank: 2
1616
},
1717
toggleCommandId: `${BoardsListWidget.WIDGET_ID}:toggle`,
1818
toggleKeybinding: 'CtrlCmd+Shift+B'

Diff for: arduino-ide-extension/src/browser/library/library-widget-frontend-contribution.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export class LibraryListWidgetFrontendContribution extends AbstractViewContribut
1414
widgetName: LibraryListWidget.WIDGET_LABEL,
1515
defaultWidgetOptions: {
1616
area: 'left',
17-
rank: 700
17+
rank: 3
1818
},
1919
toggleCommandId: `${LibraryListWidget.WIDGET_ID}:toggle`,
2020
toggleKeybinding: 'CtrlCmd+Shift+I'

Diff for: arduino-ide-extension/src/browser/style/index.css

+6-1
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,13 @@
3737
background-color: var(--theia-warningBackground);
3838
}
3939

40-
/* Overrule the default Theia CSS button styles. */
40+
/* Makes the sidepanel a bit wider when opening the widget */
41+
.p-DockPanel-widget {
42+
min-width: 200px;
43+
min-height: 200px;
44+
}
4145

46+
/* Overrule the default Theia CSS button styles. */
4247
button.theia-button,
4348
.theia-button {
4449
border: 1px solid var(--theia-dropdown-border);

Diff for: arduino-ide-extension/src/browser/theia/debug/debug-frontend-application-contribution.ts

+5
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ import { unregisterSubmenu } from '../../menu/arduino-menus';
66
@injectable()
77
export class DebugFrontendApplicationContribution extends TheiaDebugFrontendApplicationContribution {
88

9+
constructor() {
10+
super()
11+
this.options.defaultWidgetOptions.rank = 4;
12+
}
13+
914
registerMenus(registry: MenuModelRegistry): void {
1015
super.registerMenus(registry);
1116
unregisterSubmenu(DebugMenus.DEBUG, registry);

Diff for: arduino-ide-extension/src/browser/theia/navigator/navigator-contribution.ts

+17-1
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,28 @@
1-
import { injectable } from 'inversify';
1+
import { inject, injectable } from 'inversify';
22
import { WorkspaceCommands } from '@theia/workspace/lib/browser/workspace-commands';
33
import { KeybindingRegistry } from '@theia/core/lib/browser/keybinding';
44
import { FrontendApplication } from '@theia/core/lib/browser/frontend-application';
55
import { FileNavigatorContribution as TheiaFileNavigatorContribution } from '@theia/navigator/lib/browser/navigator-contribution';
6+
import { FileNavigatorPreferences } from '@theia/navigator/lib/browser/navigator-preferences';
7+
import { OpenerService } from '@theia/core/lib/browser/opener-service';
8+
import { WorkspaceService } from '@theia/workspace/lib/browser/workspace-service';
9+
import { FileNavigatorFilter } from '@theia/navigator/lib/browser/navigator-filter';
10+
import { WorkspacePreferences } from '@theia/workspace/lib/browser/workspace-preferences';
611

712
@injectable()
813
export class FileNavigatorContribution extends TheiaFileNavigatorContribution {
914

15+
constructor(
16+
@inject(FileNavigatorPreferences) protected readonly fileNavigatorPreferences: FileNavigatorPreferences,
17+
@inject(OpenerService) protected readonly openerService: OpenerService,
18+
@inject(FileNavigatorFilter) protected readonly fileNavigatorFilter: FileNavigatorFilter,
19+
@inject(WorkspaceService) protected readonly workspaceService: WorkspaceService,
20+
@inject(WorkspacePreferences) protected readonly workspacePreferences: WorkspacePreferences
21+
) {
22+
super(fileNavigatorPreferences, openerService, fileNavigatorFilter, workspaceService, workspacePreferences);
23+
this.options.defaultWidgetOptions.rank = 1;
24+
}
25+
1026
async initializeLayout(app: FrontendApplication): Promise<void> {
1127
// NOOP
1228
}

Diff for: arduino-ide-extension/src/browser/theia/search-in-workspace/search-in-workspace-frontend-contribution.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import { injectable } from 'inversify';
22
import { MenuModelRegistry } from '@theia/core/lib/common/menu';
33
import { KeybindingRegistry } from '@theia/core/lib/browser/keybinding';
4-
import { FrontendApplication } from '@theia/core/lib/browser/frontend-application';
54
import { SearchInWorkspaceFrontendContribution as TheiaSearchInWorkspaceFrontendContribution, SearchInWorkspaceCommands } from '@theia/search-in-workspace/lib/browser/search-in-workspace-frontend-contribution';
65

76
@injectable()
87
export class SearchInWorkspaceFrontendContribution extends TheiaSearchInWorkspaceFrontendContribution {
98

10-
async initializeLayout(app: FrontendApplication): Promise<void> {
11-
// NOOP
9+
constructor() {
10+
super();
11+
this.options.defaultWidgetOptions.rank = 5;
1212
}
1313

1414
registerMenus(registry: MenuModelRegistry): void {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { injectable } from 'inversify';
2+
import URI from '@theia/core/lib/common/uri';
3+
import { MEMORY_TEXT } from '@theia/search-in-workspace/lib/browser/in-memory-text-resource';
4+
import { SearchInWorkspaceFileNode, SearchInWorkspaceResultTreeWidget as TheiaSearchInWorkspaceResultTreeWidget } from '@theia/search-in-workspace/lib/browser/search-in-workspace-result-tree-widget';
5+
6+
/**
7+
* Workaround for https://github.com/eclipse-theia/theia/pull/9192/.
8+
*/
9+
@injectable()
10+
export class SearchInWorkspaceResultTreeWidget extends TheiaSearchInWorkspaceResultTreeWidget {
11+
12+
protected async createReplacePreview(node: SearchInWorkspaceFileNode): Promise<URI> {
13+
const fileUri = new URI(node.fileUri).withScheme('file');
14+
const openedEditor = this.editorManager.all.find(({ editor }) => editor.uri.toString() === fileUri.toString());
15+
let content: string;
16+
if (openedEditor) {
17+
content = openedEditor.editor.document.getText();
18+
} else {
19+
const resource = await this.fileResourceResolver.resolve(fileUri);
20+
content = await resource.readContents();
21+
}
22+
23+
const lines = content.split('\n');
24+
node.children.map(l => {
25+
const leftPositionedNodes = node.children.filter(rl => rl.line === l.line && rl.character < l.character);
26+
const diff = (this._replaceTerm.length - this.searchTerm.length) * leftPositionedNodes.length;
27+
const start = lines[l.line - 1].substr(0, l.character - 1 + diff);
28+
const end = lines[l.line - 1].substr(l.character - 1 + diff + l.length);
29+
lines[l.line - 1] = start + this._replaceTerm + end;
30+
});
31+
32+
return fileUri.withScheme(MEMORY_TEXT).withQuery(lines.join('\n'));
33+
}
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { injectable } from 'inversify';
2+
import * as React from 'react';
3+
import { Key, KeyCode } from '@theia/core/lib/browser';
4+
import { SearchInWorkspaceWidget as TheiaSearchInWorkspaceWidget } from '@theia/search-in-workspace/lib/browser/search-in-workspace-widget';
5+
6+
/**
7+
* Workaround for https://github.com/eclipse-theia/theia/pull/9183.
8+
*/
9+
@injectable()
10+
export class SearchInWorkspaceWidget extends TheiaSearchInWorkspaceWidget {
11+
12+
protected renderGlobField(kind: 'include' | 'exclude'): React.ReactNode {
13+
const currentValue = this.searchInWorkspaceOptions[kind];
14+
const value = currentValue && currentValue.join(', ') || '';
15+
return <div className='glob-field'>
16+
<div className='label'>{'files to ' + kind}</div>
17+
<input
18+
className='theia-input'
19+
type='text'
20+
size={1}
21+
defaultValue={value}
22+
id={kind + '-glob-field'}
23+
onKeyUp={e => {
24+
if (e.target) {
25+
const targetValue = (e.target as HTMLInputElement).value || '';
26+
let shouldSearch = Key.ENTER.keyCode === KeyCode.createKeyCode(e.nativeEvent).key?.keyCode;
27+
const currentOptions = (this.searchInWorkspaceOptions[kind] || []).slice().map(s => s.trim()).sort();
28+
const candidateOptions = this.splitOnComma(targetValue).map(s => s.trim()).sort();
29+
const sameAs = (left: string[], right: string[]) => {
30+
if (left.length !== right.length) {
31+
return false;
32+
}
33+
for (let i = 0; i < left.length; i++) {
34+
if (left[i] !== right[i]) {
35+
return false;
36+
}
37+
}
38+
return true;
39+
};
40+
if (!sameAs(currentOptions, candidateOptions)) {
41+
this.searchInWorkspaceOptions[kind] = this.splitOnComma(targetValue);
42+
shouldSearch = true;
43+
}
44+
if (shouldSearch) {
45+
this.resultTreeWidget.search(this.searchTerm, this.searchInWorkspaceOptions);
46+
}
47+
}
48+
}}
49+
onFocus={kind === 'include' ? this.handleFocusIncludesInputBox : this.handleFocusExcludesInputBox}
50+
onBlur={kind === 'include' ? this.handleBlurIncludesInputBox : this.handleBlurExcludesInputBox}></input>
51+
</div>;
52+
}
53+
54+
}

0 commit comments

Comments
 (0)