1
1
import * as React from '@theia/core/shared/react' ;
2
2
import { injectable , inject } from '@theia/core/shared/inversify' ;
3
- import { AbstractViewContribution , codicon } from '@theia/core/lib/browser' ;
3
+ import {
4
+ AbstractViewContribution ,
5
+ codicon ,
6
+ CommonCommands ,
7
+ Widget ,
8
+ } from '@theia/core/lib/browser' ;
4
9
import { MonitorWidget } from './monitor-widget' ;
5
10
import { MenuModelRegistry , Command , CommandRegistry } from '@theia/core' ;
6
11
import {
@@ -13,6 +18,8 @@ import { nls } from '@theia/core/lib/common';
13
18
import { Event } from '@theia/core/lib/common/event' ;
14
19
import { MonitorModel } from '../../monitor-model' ;
15
20
import { MonitorManagerProxyClient } from '../../../common/protocol' ;
21
+ import { MonitorContextMenu } from './monitor-context-menu-service' ;
22
+ import { ClipboardService } from '@theia/core/lib/browser/clipboard-service' ;
16
23
17
24
export namespace SerialMonitor {
18
25
export namespace Commands {
@@ -37,7 +44,10 @@ export namespace SerialMonitor {
37
44
iconClass : codicon ( 'clear-all' ) ,
38
45
} ,
39
46
'vscode/output.contribution/clearOutput.label'
40
- ) ;
47
+ ) as Command & { label : string } ;
48
+ export const COPY_ALL : Command = {
49
+ id : 'serial-monitor-copy-all' ,
50
+ } ;
41
51
}
42
52
}
43
53
@@ -51,6 +61,9 @@ export class MonitorViewContribution
51
61
MonitorWidget . ID + ':toggle-toolbar' ;
52
62
static readonly RESET_SERIAL_MONITOR = MonitorWidget . ID + ':reset' ;
53
63
64
+ @inject ( ClipboardService )
65
+ private readonly clipboardService : ClipboardService ;
66
+
54
67
constructor (
55
68
@inject ( MonitorModel )
56
69
protected readonly model : MonitorModel ,
@@ -78,6 +91,17 @@ export class MonitorViewContribution
78
91
order : '5' ,
79
92
} ) ;
80
93
}
94
+ menus . registerMenuAction ( MonitorContextMenu . TEXT_EDIT_GROUP , {
95
+ commandId : CommonCommands . COPY . id ,
96
+ } ) ;
97
+ menus . registerMenuAction ( MonitorContextMenu . TEXT_EDIT_GROUP , {
98
+ commandId : SerialMonitor . Commands . COPY_ALL . id ,
99
+ label : nls . localizeByDefault ( 'Copy All' ) ,
100
+ } ) ;
101
+ menus . registerMenuAction ( MonitorContextMenu . WIDGET_GROUP , {
102
+ commandId : SerialMonitor . Commands . CLEAR_OUTPUT . id ,
103
+ label : nls . localizeByDefault ( 'Clear Output' ) ,
104
+ } ) ;
81
105
}
82
106
83
107
registerToolbarItems ( registry : TabBarToolbarRegistry ) : void {
@@ -105,12 +129,25 @@ export class MonitorViewContribution
105
129
106
130
override registerCommands ( commands : CommandRegistry ) : void {
107
131
commands . registerCommand ( SerialMonitor . Commands . CLEAR_OUTPUT , {
108
- isEnabled : ( widget ) => widget instanceof MonitorWidget ,
109
- isVisible : ( widget ) => widget instanceof MonitorWidget ,
110
- execute : ( widget ) => {
111
- if ( widget instanceof MonitorWidget ) {
112
- widget . clearConsole ( ) ;
132
+ isEnabled : ( arg ) => {
133
+ if ( arg instanceof Widget ) {
134
+ return arg instanceof MonitorWidget ;
113
135
}
136
+ return this . shell . currentWidget instanceof MonitorWidget ;
137
+ } ,
138
+ isVisible : ( arg ) => {
139
+ if ( arg instanceof Widget ) {
140
+ return arg instanceof MonitorWidget ;
141
+ }
142
+ return this . shell . currentWidget instanceof MonitorWidget ;
143
+ } ,
144
+ execute : ( ) => {
145
+ this . widget . then ( ( widget ) => {
146
+ this . withWidget ( widget , ( output ) => {
147
+ output . clearConsole ( ) ;
148
+ return true ;
149
+ } ) ;
150
+ } ) ;
114
151
} ,
115
152
} ) ;
116
153
if ( this . toggleCommand ) {
@@ -130,6 +167,14 @@ export class MonitorViewContribution
130
167
{ id : MonitorViewContribution . RESET_SERIAL_MONITOR } ,
131
168
{ execute : ( ) => this . reset ( ) }
132
169
) ;
170
+ commands . registerCommand ( SerialMonitor . Commands . COPY_ALL , {
171
+ execute : ( ) => {
172
+ const text = this . tryGetWidget ( ) ?. text ;
173
+ if ( text ) {
174
+ this . clipboardService . writeText ( text ) ;
175
+ }
176
+ } ,
177
+ } ) ;
133
178
}
134
179
135
180
protected async toggle ( ) : Promise < void > {
@@ -191,4 +236,11 @@ export class MonitorViewContribution
191
236
protected async doToggleTimestamp ( ) : Promise < void > {
192
237
this . model . toggleTimestamp ( ) ;
193
238
}
239
+
240
+ private withWidget (
241
+ widget : Widget | undefined = this . tryGetWidget ( ) ,
242
+ predicate : ( monitorWidget : MonitorWidget ) => boolean = ( ) => true
243
+ ) : boolean | false {
244
+ return widget instanceof MonitorWidget ? predicate ( widget ) : false ;
245
+ }
194
246
}
0 commit comments