1/* 2 * Copyright (C) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16import { SpSystemTrace } from './SpSystemTrace'; 17import { ThreadStruct, ThreadStructOnClick } from '../database/ui-worker/ProcedureWorkerThread'; 18import { TraceRow } from './trace/base/TraceRow'; 19import { JankStruct, JankStructOnClick } from '../database/ui-worker/ProcedureWorkerJank'; 20import { HeapSnapshotStruct, HeapSnapshotStructOnClick } from '../database/ui-worker/ProcedureWorkerHeapSnapshot'; 21import { FuncStruct, funcStructOnClick } from '../database/ui-worker/ProcedureWorkerFunc'; 22import { CpuFreqStruct, CpuFreqStructOnClick } from '../database/ui-worker/ProcedureWorkerFreq'; 23import { ClockStruct, ClockStructOnClick } from '../database/ui-worker/ProcedureWorkerClock'; 24import { DmaFenceStruct, DmaFenceStructOnClick } from '../database/ui-worker/ProcedureWorkerDmaFence'; 25import { SnapshotStruct, SnapshotStructOnClick } from '../database/ui-worker/ProcedureWorkerSnapshot'; 26import { IrqStruct, IrqStructOnClick } from '../database/ui-worker/ProcedureWorkerIrq'; 27import { HeapStruct, HeapStructOnClick } from '../database/ui-worker/ProcedureWorkerHeap'; 28import { JsCpuProfilerStruct, JsCpuProfilerStructOnClick } from '../database/ui-worker/ProcedureWorkerCpuProfiler'; 29import { AppStartupStruct, AppStartupStructOnClick } from '../database/ui-worker/ProcedureWorkerAppStartup'; 30import { AllAppStartupStruct, allAppStartupStructOnClick } from '../database/ui-worker/ProcedureWorkerAllAppStartup'; 31import { SoStruct, SoStructOnClick } from '../database/ui-worker/ProcedureWorkerSoInit'; 32import { FrameAnimationStruct, FrameAnimationStructOnClick } from '../database/ui-worker/ProcedureWorkerFrameAnimation'; 33import { FrameDynamicStruct, FrameDynamicStructOnClick } from '../database/ui-worker/ProcedureWorkerFrameDynamic'; 34import { FrameSpacingStruct, FrameSpacingStructOnClick } from '../database/ui-worker/ProcedureWorkerFrameSpacing'; 35import { SampleStruct, sampleStructOnClick } from '../database/ui-worker/ProcedureWorkerBpftrace'; 36import { SportRuler } from './trace/timer-shaft/SportRuler'; 37import { SpStatisticsHttpUtil } from '../../statistics/util/SpStatisticsHttpUtil'; 38import { LitSearch } from './trace/search/Search'; 39import { TabPaneCurrent } from './trace/sheet/TabPaneCurrent'; 40import type { SpKeyboard } from './SpKeyboard'; 41import { enableVSync } from './chart/VSync'; 42import { CpuStruct, CpuStructOnClick } from '../database/ui-worker/cpu/ProcedureWorkerCPU'; 43import { ProcessMemStruct } from '../database/ui-worker/ProcedureWorkerMem'; 44import { CpuStateStruct, CpuStateStructOnClick } from '../database/ui-worker/cpu/ProcedureWorkerCpuState'; 45import { 46 CpuFreqLimitsStruct, 47 CpuFreqLimitsStructOnClick 48} from '../database/ui-worker/cpu/ProcedureWorkerCpuFreqLimits'; 49import { FlagsConfig } from './SpFlags'; 50import { LitMainMenu } from '../../base-ui/menu/LitMainMenu'; 51import { PerfToolsStructOnClick, PerfToolStruct } from '../database/ui-worker/ProcedureWorkerPerfTool'; 52import { Utils } from './trace/base/Utils'; 53import { BaseStruct } from '../bean/BaseStruct'; 54import { GpuCounterStruct, gpuCounterStructOnClick } from '../database/ui-worker/ProcedureWorkerGpuCounter'; 55import { HangStructOnClick } from '../database/ui-worker/ProcedureWorkerHang'; 56import { XpowerStruct, XpowerStructOnClick } from '../database/ui-worker/ProcedureWorkerXpower'; 57import { XpowerStatisticStruct, XpowerStatisticStructOnClick } from '../database/ui-worker/ProcedureWorkerXpowerStatistic'; 58import { SpAiAnalysisPage } from './SpAiAnalysisPage'; 59import { XpowerAppDetailStruct, XpowerAppDetailStructOnClick } from '../database/ui-worker/ProcedureWorkerXpowerAppDetail'; 60import { XpowerWifiBytesStructOnClick, XpowerWifiPacketsStructOnClick, XpowerWifiStruct } from '../database/ui-worker/ProcedureWorkerXpowerWifi'; 61import { XpowerThreadInfoStruct, XpowerThreadInfoStructOnClick } from '../database/ui-worker/ProcedureWorkerXpowerThreadInfo'; 62import { XpowerGpuFreqStruct, XpowerGpuFreqStructOnClick } from '../database/ui-worker/ProcedureWorkerXpowerGpuFreq'; 63import { XpowerThreadCountStruct, XpowerThreadCountStructOnClick } from '../database/ui-worker/ProcedureWorkerXpowerThreadCount'; 64import { XpowerGpuFreqCountStruct, XpowerGpuFreqCountStructOnClick } from '../database/ui-worker/ProcedureWorkerXpowerGpuFreqCount'; 65import { SnapShotOnClick, SnapShotStruct } from '../database/ui-worker/ProcedureWorkerSnaps'; 66import { ThreadSysCallStruct, ThreadSysCallStructOnClick } from '../database/ui-worker/ProcedureWorkerThreadSysCall'; 67 68function timeoutJudge(sp: SpSystemTrace): number { 69 let timeoutJudge = window.setTimeout((): void => { 70 if (SpSystemTrace.wakeupList.length && CpuStruct.selectCpuStruct) { 71 let checkHandlerKey: boolean = true; 72 let saveSelectCpuStruct: unknown = JSON.parse(sessionStorage.getItem('saveselectcpustruct')!); 73 for (const item of SpSystemTrace.wakeupList) { 74 if (item.ts === CpuStruct.selectCpuStruct.startTime && item.dur === CpuStruct.selectCpuStruct.dur) { 75 checkHandlerKey = false; 76 if (SpSystemTrace.wakeupList[0].schedulingDesc) { 77 //@ts-ignore 78 SpSystemTrace.wakeupList.unshift(saveSelectCpuStruct); 79 } 80 sp.refreshCanvas(true); 81 break; 82 } else if ( 83 //@ts-ignore 84 saveSelectCpuStruct.startTime === CpuStruct.selectCpuStruct.startTime && 85 //@ts-ignore 86 saveSelectCpuStruct.dur === CpuStruct.selectCpuStruct.dur 87 ) { 88 // 如果点击的是第一层,保持唤醒树不变 89 checkHandlerKey = false; 90 sp.refreshCanvas(true); 91 break; 92 } 93 } 94 // 点击线程在唤醒树内 95 if (!checkHandlerKey) { 96 // 查询获取tab表格数据 97 window.publish(window.SmartEvent.UI.WakeupList, SpSystemTrace.wakeupList); 98 } else { 99 // 不在唤醒树内,清空数组 100 sp.wakeupListNull(); 101 sp.refreshCanvas(true); 102 } 103 } else { 104 sp.wakeupListNull(); 105 sp.refreshCanvas(true); 106 } 107 clearTimeout(timeoutJudge); 108 }, 10); 109 return timeoutJudge; 110} 111 112function threadClickHandlerFunc(sp: SpSystemTrace): (e: ThreadStruct) => void { 113 let threadClickHandler = (d: ThreadStruct): void => { 114 sp.observerScrollHeightEnable = false; 115 sp.scrollToProcess(`${d.cpu}`, '', 'cpu-data', true); 116 let cpuRow = sp.queryAllTraceRow<TraceRow<CpuStruct>>( 117 `trace-row[row-id='${Utils.getDistributedRowId(d.cpu)}'][row-type='cpu-data']`, 118 (row) => row.rowId === `${Utils.getDistributedRowId(d.cpu)}` && row.rowType === 'cpu-data' 119 )[0]; 120 if (cpuRow) { 121 sp.currentRow = cpuRow; 122 cpuRow.fixedList = [ 123 { 124 startTime: d.startTime, 125 dur: d.dur, 126 tid: d.tid, 127 id: d.id, 128 processId: d.pid, 129 cpu: d.cpu, 130 argSetID: d.argSetID, 131 }, 132 ]; 133 let findEntry = cpuRow!.fixedList[0]; 134 sp.rechargeCpuData( 135 // @ts-ignore 136 findEntry, // @ts-ignore 137 cpuRow.dataListCache.find((it) => it.startTime > findEntry.startTime) 138 ); 139 if ( 140 // @ts-ignore 141 findEntry!.startTime! + findEntry!.dur! < TraceRow.range!.startNS || // @ts-ignore 142 findEntry!.startTime! > TraceRow.range!.endNS 143 ) { 144 sp.timerShaftEL?.setRangeNS( 145 // @ts-ignore 146 findEntry!.startTime! - findEntry!.dur! * 2, // @ts-ignore 147 findEntry!.startTime! + findEntry!.dur! + findEntry!.dur! * 2 148 ); 149 } 150 sp.hoverStructNull().selectStructNull().wakeupListNull(); // @ts-ignore 151 CpuStruct.hoverCpuStruct = findEntry; // @ts-ignore 152 CpuStruct.selectCpuStruct = findEntry; // @ts-ignore 153 sp.timerShaftEL?.drawTriangle(findEntry!.startTime || 0, 'inverted'); 154 sp.traceSheetEL?.displayCpuData( 155 CpuStruct.selectCpuStruct!, 156 (wakeUpBean) => { 157 sp.removeLinkLinesByBusinessType('thread'); 158 CpuStruct.wakeupBean = wakeUpBean; 159 sp.refreshCanvas(true); 160 }, 161 cpuClickHandlerFunc(sp) 162 ); 163 } 164 }; 165 return threadClickHandler; 166} 167 168//点击prio箭头刷新canvas 169function prioClickHandlerFunc(sp: SpSystemTrace): (d: unknown) => void { 170 return function (d: unknown): void { 171 // @ts-ignore 172 ThreadStruct.prioCount = d; 173 ThreadStruct.isClickPrio = true; 174 sp.refreshCanvas(true); 175 }; 176} 177 178function scrollToFuncHandlerFunc(sp: SpSystemTrace): Function { 179 let funClickHandle = (funcStruct: unknown): void => { 180 // @ts-ignore 181 if (funcStruct.chainId) { 182 } 183 sp.observerScrollHeightEnable = true; 184 // @ts-ignore 185 sp.moveRangeToCenter(funcStruct.startTs!, funcStruct.dur!); 186 sp.scrollToActFunc(funcStruct, false); 187 }; 188 return funClickHandle; 189} 190 191function scrollToFunc(sp: SpSystemTrace): Function { 192 let funClickHandle = (funcStruct: unknown): void => { 193 // @ts-ignore 194 if (funcStruct.chainId) { 195 } 196 sp.observerScrollHeightEnable = true; 197 // @ts-ignore 198 sp.scrollToActFunc(funcStruct, false); 199 }; 200 return funClickHandle; 201} 202 203function jankClickHandlerFunc(sp: SpSystemTrace): Function { 204 let jankClickHandler = (d: unknown): void => { 205 sp.observerScrollHeightEnable = true; 206 let jankRowParent: unknown; 207 //@ts-ignore 208 if (d.rowId === 'actual frameTime') { 209 jankRowParent = sp.shadowRoot?.querySelector<TraceRow<JankStruct>>("trace-row[row-id='frameTime']"); 210 } else { 211 jankRowParent = sp.shadowRoot?.querySelector<TraceRow<JankStruct>>( 212 //@ts-ignore 213 `trace-row[row-type='process'][row-id='${d.pid}']` 214 ); 215 } 216 //@ts-ignore 217 jankRowParent!.expansion = true; 218 let jankRow: unknown; 219 //@ts-ignore 220 jankRowParent.childrenList.forEach((item: TraceRow<JankStruct>) => { 221 //@ts-ignore 222 if (`${item.rowId}` === `${d.rowId}` && `${item.rowType}` === 'janks') { 223 jankRow = item; 224 } 225 }); 226 //@ts-ignore 227 sp.currentRow = jankRow; 228 if (jankRow) { 229 JankStruct.selectJankStructList.length = 0; 230 //@ts-ignore 231 let findJankEntry = jankRow!.dataListCache!.find( 232 //@ts-ignore 233 (dat: unknown) => `${dat.name}` === `${d.name}` && `${dat.pid}` === `${d.pid}` 234 ); 235 if (findJankEntry) { 236 if ( 237 findJankEntry!.ts! + findJankEntry!.dur! < TraceRow.range!.startNS || 238 findJankEntry!.ts! > TraceRow.range!.endNS 239 ) { 240 sp.timerShaftEL?.setRangeNS( 241 findJankEntry!.ts! - findJankEntry!.dur! * 2, 242 findJankEntry!.ts! + findJankEntry!.dur! + findJankEntry!.dur! * 2 243 ); 244 } 245 sp.hoverStructNull().selectStructNull().wakeupListNull(); 246 JankStruct.hoverJankStruct = findJankEntry; 247 JankStruct.selectJankStruct = findJankEntry; 248 sp.timerShaftEL?.drawTriangle(findJankEntry!.ts || 0, 'inverted'); 249 sp.traceSheetEL?.displayJankData( 250 JankStruct.selectJankStruct!, 251 (datas) => { 252 sp.removeLinkLinesByBusinessType('janks'); 253 // 绘制跟自己关联的线 254 datas.forEach((data) => { 255 //@ts-ignore 256 let endParentRow = sp.shadowRoot?.querySelector<TraceRow<BaseStruct>>( // @ts-ignore 257 `trace-row[row-type='process'][row-id='${data.pid}'][folder]` 258 ); 259 sp.drawJankLine(endParentRow, JankStruct.selectJankStruct!, data, true); 260 }); 261 }, 262 jankClickHandler 263 ); 264 } 265 //@ts-ignore 266 sp.scrollToProcess(jankRow.rowId!, jankRow.rowParentId!, jankRow.rowType!, true); 267 } 268 }; 269 return jankClickHandler; 270} 271 272function snapshotClickHandlerFunc(sp: SpSystemTrace): Function { 273 let snapshotClickHandler = (d: HeapSnapshotStruct): void => { 274 sp.observerScrollHeightEnable = true; 275 let snapshotRow = sp.shadowRoot?.querySelector<TraceRow<HeapSnapshotStruct>>(`trace-row[row-id='heapsnapshot']`); 276 let task = (): void => { 277 if (snapshotRow) { 278 let findEntry = snapshotRow!.dataListCache!.find((dat) => dat.startTs === d.startTs); 279 sp.hoverStructNull(); 280 sp.selectStructNull(); 281 sp.wakeupListNull(); 282 HeapSnapshotStruct.hoverSnapshotStruct = findEntry; 283 HeapSnapshotStruct.selectSnapshotStruct = findEntry; 284 } 285 }; 286 if (snapshotRow) { 287 if (snapshotRow!.isComplete) { 288 task(); 289 } else { 290 snapshotRow!.onComplete = task; 291 } 292 } 293 }; 294 return snapshotClickHandler; 295} 296 297//@ts-ignore 298function cpuClickHandlerTask(threadRow: TraceRow<unknown>, sp: SpSystemTrace, d: CpuStruct): void { 299 if (threadRow) { 300 let findEntry = threadRow!.fixedList[0]; 301 if ( 302 //@ts-ignore 303 findEntry!.startTime! + findEntry!.dur! < TraceRow.range!.startNS || 304 //@ts-ignore 305 findEntry!.startTime! > TraceRow.range!.endNS 306 ) { 307 sp.timerShaftEL?.setRangeNS( 308 //@ts-ignore 309 findEntry!.startTime! - findEntry!.dur! * 2, 310 //@ts-ignore 311 findEntry!.startTime! + findEntry!.dur! + findEntry!.dur! * 2 312 ); 313 } 314 ThreadStruct.firstselectThreadStruct = ThreadStruct.selectThreadStruct; 315 sp.hoverStructNull().selectStructNull().wakeupListNull(); 316 //@ts-ignore 317 ThreadStruct.hoverThreadStruct = findEntry; 318 //@ts-ignore 319 ThreadStruct.selectThreadStruct = findEntry; 320 //@ts-ignore 321 sp.timerShaftEL?.drawTriangle(findEntry!.startTime || 0, 'inverted'); 322 sp.traceSheetEL?.displayThreadData( 323 ThreadStruct.selectThreadStruct!, 324 threadClickHandlerFunc(sp), // @ts-ignore 325 cpuClickHandlerFunc(sp), 326 prioClickHandlerFunc(sp), 327 (datas, str): void => { 328 sp.removeLinkLinesByBusinessType('thread'); 329 if (str === 'wakeup tid') { 330 datas.forEach((data) => { 331 //@ts-ignore 332 let endParentRow = sp.shadowRoot?.querySelector<TraceRow<unknown>>( //@ts-ignore 333 `trace-row[row-id='${data.pid}'][folder]` 334 ); 335 sp.drawThreadLine(endParentRow, ThreadStruct.firstselectThreadStruct, data); 336 }); 337 } 338 sp.refreshCanvas(true); 339 } 340 ); 341 sp.scrollToProcess(`${d.tid}`, `${d.processId}`, 'thread', true); 342 } 343} 344 345function cpuClickHandlerFunc(sp: SpSystemTrace) { 346 return function (d: CpuStruct): void { 347 //@ts-ignore 348 let traceRow = sp.shadowRoot?.querySelector<TraceRow<unknown>>( 349 `trace-row[row-id='${Utils.getDistributedRowId(d.processId)}'][row-type='process']` 350 ); 351 if (traceRow) { 352 traceRow.expansion = true; 353 } 354 sp.observerScrollHeightEnable = true; 355 let threadRow = sp.queryAllTraceRow<TraceRow<ThreadStruct>>( 356 `trace-row[row-id='${Utils.getDistributedRowId(d.tid)}'][row-type='thread'][row-parent-id='${traceRow?.rowId}']`, 357 (row) => row.rowId === `${d.tid}` && row.rowType === 'thread' && row.rowParentId === traceRow?.rowId 358 )[0]; 359 sp.currentRow = threadRow; 360 if (threadRow) { 361 threadRow.fixedList = [ 362 { 363 startTime: d.startTime, 364 dur: d.dur, 365 cpu: d.cpu, 366 id: d.id, 367 tid: d.tid, 368 state: d.state, 369 pid: d.processId, 370 argSetID: d.argSetID, 371 }, 372 ]; 373 if (threadRow!.isComplete) { 374 cpuClickHandlerTask(threadRow, sp, d); 375 } else { 376 sp.scrollToProcess(`${d.tid}`, `${d.processId}`, 'process', false); 377 sp.scrollToProcess(`${d.tid}`, `${d.processId}`, 'thread', true); 378 threadRow!.onComplete = (): void => cpuClickHandlerTask(threadRow, sp, d); 379 } 380 } 381 }; 382} 383 384 385function allStructOnClick(clickRowType: string, sp: SpSystemTrace, row?: TraceRow<BaseStruct>, entry?: unknown): void { 386 CpuStructOnClick(clickRowType, sp, cpuClickHandlerFunc(sp), entry as CpuStruct) 387 .then(() => ThreadStructOnClick(clickRowType, sp, threadClickHandlerFunc(sp), cpuClickHandlerFunc(sp), 388 prioClickHandlerFunc(sp), entry as ThreadStruct)) 389 .then(() => funcStructOnClick(clickRowType, sp, row as TraceRow<FuncStruct>, 390 scrollToFuncHandlerFunc(sp), entry as FuncStruct)) 391 .then(() => CpuFreqStructOnClick(clickRowType, sp, entry as CpuFreqStruct)) 392 .then(() => CpuStateStructOnClick(clickRowType, sp, entry as CpuStateStruct)) 393 .then(() => CpuFreqLimitsStructOnClick(clickRowType, sp, entry as CpuFreqLimitsStruct)) 394 .then(() => ClockStructOnClick(clickRowType, sp, entry as ClockStruct)) 395 .then(() => XpowerStructOnClick(clickRowType, sp, entry as XpowerStruct)) 396 .then(() => XpowerStatisticStructOnClick(clickRowType, sp, row as TraceRow<XpowerStatisticStruct>, entry as XpowerStatisticStruct)) 397 .then(() => XpowerAppDetailStructOnClick(clickRowType, sp, entry as XpowerAppDetailStruct)) 398 .then(() => XpowerWifiBytesStructOnClick(clickRowType, sp, entry as XpowerWifiStruct)) 399 .then(() => XpowerWifiPacketsStructOnClick(clickRowType, sp, entry as XpowerWifiStruct)) 400 .then(() => XpowerThreadInfoStructOnClick(clickRowType, sp, entry as XpowerThreadInfoStruct)) 401 .then(() => XpowerGpuFreqStructOnClick(clickRowType, sp, entry as XpowerGpuFreqStruct)) 402 .then(() => XpowerThreadCountStructOnClick(clickRowType, sp, entry as XpowerThreadCountStruct)) 403 .then(() => XpowerGpuFreqCountStructOnClick(clickRowType, sp, entry as XpowerGpuFreqCountStruct)) 404 .then(() => HangStructOnClick(clickRowType, sp, scrollToFunc(sp))) 405 .then(() => DmaFenceStructOnClick(clickRowType, sp, entry as DmaFenceStruct)) 406 .then(() => SnapshotStructOnClick(clickRowType, sp, row as TraceRow<SnapshotStruct>, entry as SnapshotStruct)) 407 .then(() => IrqStructOnClick(clickRowType, sp, entry as IrqStruct)) 408 .then(() => HeapStructOnClick(clickRowType, sp, row as TraceRow<HeapStruct>, entry as HeapStruct)) 409 .then(() => JankStructOnClick(clickRowType, sp, row as TraceRow<JankStruct>, 410 jankClickHandlerFunc(sp), entry as JankStruct)) 411 .then(() => HeapSnapshotStructOnClick(clickRowType, sp, row as TraceRow<HeapSnapshotStruct>, 412 snapshotClickHandlerFunc(sp), entry as HeapSnapshotStruct)) 413 .then(() => JsCpuProfilerStructOnClick(clickRowType, sp, row as TraceRow<JsCpuProfilerStruct>, 414 entry as JsCpuProfilerStruct)) 415 .then(() => AppStartupStructOnClick(clickRowType, sp, scrollToFuncHandlerFunc(sp), entry as AppStartupStruct)) 416 .then(() => allAppStartupStructOnClick(clickRowType, sp, scrollToFuncHandlerFunc(sp), entry as AllAppStartupStruct)) 417 .then(() => SoStructOnClick(clickRowType, sp, scrollToFuncHandlerFunc(sp), entry as SoStruct)) 418 .then(() => FrameAnimationStructOnClick(clickRowType, sp, 419 scrollToFuncHandlerFunc(sp), row as TraceRow<FrameAnimationStruct>, entry as FrameAnimationStruct)) 420 .then(() => FrameDynamicStructOnClick(clickRowType, sp, row, entry as FrameDynamicStruct)) 421 .then(() => FrameSpacingStructOnClick(clickRowType, sp, row!, entry as FrameSpacingStruct)) 422 .then(() => sampleStructOnClick(clickRowType, sp, row as TraceRow<SampleStruct>, entry as SampleStruct)) 423 .then(() => gpuCounterStructOnClick(clickRowType, sp, entry as GpuCounterStruct)) 424 .then(() => PerfToolsStructOnClick(clickRowType, sp, entry as PerfToolStruct)) 425 .then(() => ThreadSysCallStructOnClick(clickRowType, sp, entry as ThreadSysCallStruct)) 426 .then(() => SnapShotOnClick(clickRowType, sp, entry as SnapShotStruct)) 427 .then(() => { 428 if (!JankStruct.hoverJankStruct && JankStruct.delJankLineFlag) { 429 sp.removeLinkLinesByBusinessType('janks'); 430 } 431 sp.observerScrollHeightEnable = false; 432 sp.selectFlag = null; 433 sp.timerShaftEL?.removeTriangle('inverted'); 434 if (!SportRuler.isMouseInSportRuler) { 435 sp.traceSheetEL?.setMode('hidden'); 436 sp.refreshCanvas(true, 'click'); 437 } 438 }) 439 .catch((e): void => { }); 440 SpAiAnalysisPage.selectChangeListener(TraceRow.range?.startNS!, TraceRow.range?.endNS!); 441} 442export default function spSystemTraceOnClickHandler( 443 sp: SpSystemTrace, 444 clickRowType: string, 445 row?: TraceRow<BaseStruct>, 446 entry?: unknown 447): void { 448 if (row) { 449 sp.currentRow = row; 450 sp.setAttribute('clickRow', clickRowType); 451 sp.setAttribute('rowName', row.name!); 452 sp.setAttribute('rowId', row.rowId!); 453 } 454 if (!sp.loadTraceCompleted) { 455 return; 456 } 457 sp.queryAllTraceRow().forEach(it => { 458 it.checkType = '-1'; 459 it.rangeSelect = false; 460 }); 461 sp.selectStructNull(); 462 sp._slicesList.forEach((slice: { selected: boolean }): void => { 463 slice.selected = false; 464 }); 465 // 判断点击的线程是否在唤醒树内 466 timeoutJudge(sp); 467 allStructOnClick(clickRowType, sp, row, entry); 468 if (!JankStruct.selectJankStruct) { 469 sp.removeLinkLinesByBusinessType('janks'); 470 } 471 if (!ThreadStruct.selectThreadStruct) { 472 sp.removeLinkLinesByBusinessType('thread'); 473 } 474 if (!FuncStruct.selectFuncStruct) { 475 sp.removeLinkLinesByBusinessType('distributed', 'func'); 476 } 477 if (row) { 478 let pointEvent = sp.createPointEvent(row); 479 SpStatisticsHttpUtil.addOrdinaryVisitAction({ 480 action: 'trace_row', // @ts-ignore 481 event: pointEvent, 482 }); 483 } 484} 485 486//@ts-ignore 487function handleActions(sp: SpSystemTrace, rows: Array<TraceRow<unknown>>, ev: MouseEvent): void { 488 if (sp.rangeSelect.isMouseDown && sp.rangeSelect.drag) { 489 let downRow = sp.visibleRows.find((row) => row.containPoint(ev)); 490 if (downRow && downRow.traceId !== Utils.currentSelectTrace) { 491 spSystemTraceDocumentOnMouseMoveMouseUp(sp, rows, ev); 492 return; 493 } 494 } 495 sp.rangeSelect.mouseMove(rows, ev); 496 if (sp.rangeSelect.rangeTraceRow!.length > 0) { 497 sp.tabCpuFreq!.rangeTraceRow = sp.rangeSelect.rangeTraceRow; 498 sp.tabCpuState!.rangeTraceRow = sp.rangeSelect.rangeTraceRow; 499 } 500 let search = document.querySelector('body > sp-application')!.shadowRoot!.querySelector<LitSearch>('#lit-search'); 501 if (sp.rangeSelect.isMouseDown && search?.isClearValue) { 502 spSystemTraceDocumentOnMouseMoveMouseDown(sp, search); 503 } else { 504 spSystemTraceDocumentOnMouseMoveMouseUp(sp, rows, ev); 505 } 506} 507 508function handleMouseInTimeShaft(sp: SpSystemTrace, ev: MouseEvent): boolean | undefined { 509 let isMouseInTimeShaft = sp.timerShaftEL?.containPoint(ev); 510 if (isMouseInTimeShaft) { 511 sp.tipEL!.style.display = 'none'; 512 sp.hoverStructNull(); 513 } 514 return isMouseInTimeShaft; 515} 516 517export function spSystemTraceDocumentOnMouseMove(sp: SpSystemTrace, ev: MouseEvent): void { 518 //@ts-ignore 519 if (!sp.loadTraceCompleted || !sp.mouseEventEnable) { 520 return; 521 } 522 //@ts-ignore 523 if ((window as unknown).collectResize) { 524 sp.style.cursor = 'row-resize'; 525 sp.cancelDrag(); 526 return; 527 } 528 if (sp.isWASDKeyPress()) { 529 sp.hoverFlag = null; 530 ev.preventDefault(); 531 return; 532 } 533 if (ev.ctrlKey && ev.button === 0 && SpSystemTrace.isMouseLeftDown) { 534 // 计算当前tab组件的高度 535 let tabHeight: number = 536 sp.shadowRoot?.querySelector('trace-sheet')!.shadowRoot?.querySelector('lit-tabs')!.clientHeight! + 1; 537 // 计算当前屏幕内高与鼠标位置坐标高度的差值 538 let diffHeight: number = window.innerHeight - ev.clientY; 539 // 如果差值大于面板高度,意味着鼠标位于泳道区域,可以通过ctrl+鼠标左键移动。否则不予生效 540 if (diffHeight > tabHeight) { 541 sp.translateByMouseMove(ev); 542 } else { 543 // 若鼠标位于tab面板区,则将其中标志位置成false 544 SpSystemTrace.isMouseLeftDown = false; 545 } 546 } 547 sp.inFavoriteArea = sp.favoriteChartListEL?.containPoint(ev); 548 //@ts-ignore 549 if ((window as unknown).isSheetMove || sp.isMouseInSheet(ev)) { 550 sp.hoverStructNull(); 551 sp.tipEL!.style.display = 'none'; 552 return; 553 } 554 let isMouseInTimeShaft = handleMouseInTimeShaft(sp, ev); 555 let rows = sp.visibleRows; 556 sp.timerShaftEL?.documentOnMouseMove(ev, sp); 557 558 if (isMouseInTimeShaft) { 559 return; 560 } 561 handleActions(sp, rows, ev); 562} 563 564export function spSystemTraceDocumentOnMouseMoveMouseDown(sp: SpSystemTrace, search: LitSearch): void { 565 sp.refreshCanvas(true, 'sp move down'); 566 if (TraceRow.rangeSelectObject) { 567 if (search && search.searchValue !== '') { 568 search.clear(); 569 search.valueChangeHandler?.(''); 570 } 571 } 572} 573 574function spSystemTraceDocumentOnMouseMoveMouseUp( 575 sp: SpSystemTrace, //@ts-ignore 576 rows: Array<TraceRow<unknown>>, 577 ev: MouseEvent 578): void { 579 if (!sp.rowsPaneEL!.containPoint(ev, { left: 248 })) { 580 sp.hoverStructNull(); 581 } 582 const transformYMatch = sp.canvasPanel?.style.transform.match(/\((\d+)[^\)]+\)/); 583 if (transformYMatch && transformYMatch![1]) { 584 const transformY = transformYMatch![1]; 585 let favoriteHeight = sp.favoriteChartListEL!.getBoundingClientRect().height; 586 // @ts-ignore 587 let memTr = rows.filter((item: unknown) => item.rowType === TraceRow.ROW_TYPE_MEM); 588 rows 589 .filter((it) => it.focusContain(ev, sp.inFavoriteArea!, Number(transformY), favoriteHeight) && it.collect === sp.inFavoriteArea) 590 .filter((it) => { 591 if (it.collect) { 592 return true; 593 } else { 594 return ( 595 it.getBoundingClientRect().bottom + it.getBoundingClientRect().height > 596 sp.favoriteChartListEL!.getBoundingClientRect().bottom 597 ); 598 } 599 }) 600 .forEach((tr): void => { 601 if (tr.rowType !== TraceRow.ROW_TYPE_CPU) { 602 CpuStruct.hoverCpuStruct = undefined; 603 } 604 if (tr.rowType !== TraceRow.ROW_TYPE_MEM) { 605 ProcessMemStruct.hoverProcessMemStruct = undefined; 606 memTr.forEach((i: unknown) => { 607 // @ts-ignore 608 i.focusHandler(ev); 609 }); 610 } 611 if (sp.currentRowType !== tr.rowType) { 612 sp.currentRowType = tr.rowType || ''; 613 } 614 tr.findHoverStruct?.(); 615 tr.focusHandler?.(ev); 616 }); 617 } 618 requestAnimationFrame(() => sp.refreshCanvas(true, 'sp move up')); 619} 620 621export function spSystemTraceDocumentOnMouseOut(sp: SpSystemTrace, ev: MouseEvent): void { 622 if (!sp.loadTraceCompleted) { 623 return; 624 } 625 CpuStruct.hoverCpuStruct = undefined; 626 TraceRow.isUserInteraction = false; 627 SpSystemTrace.isMouseLeftDown = false; 628 if (!sp.keyboardEnable) { 629 return; 630 } 631 if (sp.isMouseInSheet(ev)) { 632 return; 633 } 634 if (ev.offsetX > sp.timerShaftEL!.canvas!.offsetLeft) { 635 sp.rangeSelect.mouseOut(ev); 636 sp.timerShaftEL?.documentOnMouseOut(ev); 637 } 638} 639 640export function spSystemTraceDocumentOnKeyPress(this: unknown, sp: SpSystemTrace, ev: KeyboardEvent): void { 641 if (!sp.loadTraceCompleted || SpSystemTrace.isAiAsk) { 642 return; 643 } 644 let keyPress = ev.key.toLocaleLowerCase(); 645 TraceRow.isUserInteraction = true; 646 if (sp.isMousePointInSheet) { 647 return; 648 } 649 sp.observerScrollHeightEnable = false; 650 if (sp.keyboardEnable) { 651 if (keyPress === 'm') { 652 if (sp.selectFlag) { 653 sp.selectFlag!.selected = false; 654 } 655 sp.slicestime = sp.setSLiceMark(ev.shiftKey); 656 if (sp.slicestime) { 657 if (TraceRow.rangeSelectObject) { 658 let showTab = sp.getShowTab(); 659 sp.traceSheetEL 660 ?.displayTab<TabPaneCurrent>('tabpane-current', ...showTab) 661 .setCurrentSlicesTime(sp.slicestime); 662 } else { 663 sp.traceSheetEL?.displayTab<TabPaneCurrent>('tabpane-current').setCurrentSlicesTime(sp.slicestime); 664 } 665 } 666 } 667 if (keyPress === 'f') { 668 let search = document.querySelector('body > sp-application')!.shadowRoot!.querySelector<LitSearch>('#lit-search'); 669 if (search && search.searchValue !== '' && sp.currentRow !== undefined) { 670 sp.copyCurrentRow = sp.currentRow; 671 sp.currentRow = undefined; 672 } 673 let isSelectSliceOrFlag = false; 674 // 设置当前选中的slicetime 675 let selectSlice: unknown = undefined; 676 sp._slicesList.forEach((slice: { selected: boolean }): void => { 677 if (slice.selected) { 678 selectSlice = slice; 679 } 680 }); 681 if (!!selectSlice) { 682 //@ts-ignore 683 sp.currentSlicesTime.startTime = selectSlice.startTime; 684 //@ts-ignore 685 sp.currentSlicesTime.endTime = selectSlice.endTime; 686 isSelectSliceOrFlag = true; 687 } 688 689 if (sp.selectFlag && sp.selectFlag.selected) { 690 sp.currentSlicesTime.startTime = sp.selectFlag?.time; 691 sp.currentSlicesTime.endTime = sp.selectFlag?.time; 692 isSelectSliceOrFlag = true; 693 } 694 // 设置当前的slicesTime 695 !isSelectSliceOrFlag && sp.setCurrentSlicesTime(); 696 } 697 let keyPressWASD = keyPress === 'w' || keyPress === 'a' || keyPress === 's' || keyPress === 'd'; 698 if (keyPressWASD) { 699 sp.keyPressMap.set(keyPress, true); 700 if (sp.rangeSelect.isMouseDown && sp.rangeSelect.drag) { 701 sp.rangeSelect.mouseUp(); 702 } 703 sp.hoverFlag = null; 704 } 705 sp.timerShaftEL!.documentOnKeyPress(ev, sp.currentSlicesTime); 706 if (keyPress === 'f') { 707 sp.verticalScrollToRow(); 708 } 709 } else { 710 sp.stopWASD(); 711 } 712} 713 714export function spSystemTraceDocumentOnMouseDown(sp: SpSystemTrace, ev: MouseEvent): void { 715 if (!sp.loadTraceCompleted || !sp.mouseEventEnable) { 716 return; 717 } 718 if (sp.isWASDKeyPress()) { 719 ev.preventDefault(); 720 ev.stopPropagation(); 721 return; 722 } 723 if (ev.button === 0) { 724 SpSystemTrace.isMouseLeftDown = true; 725 if (ev.ctrlKey) { 726 ev.preventDefault(); 727 sp.style.cursor = 'move'; 728 sp.mouseCurrentPosition = ev.clientX; 729 return; 730 } 731 } 732 733 TraceRow.isUserInteraction = true; 734 if (sp.isMouseInSheet(ev)) { 735 sp.isInSheet = true; 736 return; 737 } else { 738 sp.isInSheet = false; 739 } 740 sp.observerScrollHeightEnable = false; 741 if (ev.offsetX > sp.timerShaftEL!.canvas!.offsetLeft) { 742 let x = ev.offsetX - sp.timerShaftEL!.canvas!.offsetLeft; 743 let y = ev.offsetY; 744 sp.timerShaftEL?.documentOnMouseDown(ev); 745 if (y > sp.timerShaftEL!.offsetHeight) { 746 sp.rangeSelect.mouseDown(ev); 747 sp.rangeSelect.drag = true; 748 let downRow = sp.visibleRows.find((row) => row.containPoint(ev)); 749 Utils.currentSelectTrace = downRow?.traceId; 750 } 751 // 如果鼠标摁下事件发生在traceRow范围或时间轴(sportRuler除外)范围内,清除上次点击调用栈产生的所有的三角旗子 752 // ev.offsetY:鼠标在SpSystemTrace元素的y轴偏移量 753 if ( 754 ev.offsetY > sp.timerShaftEL!.clientHeight || 755 ev.offsetY < sp.timerShaftEL!.clientHeight - sp.timerShaftEL!.sportRuler!.frame.height 756 ) { 757 sp.clearTriangle(sp.timerShaftEL!.sportRuler!.flagList); 758 } 759 } else { 760 sp.rangeSelect.drag = false; 761 } 762} 763 764function handleTimerShaftActions(ev: MouseEvent, sp: SpSystemTrace): void { 765 if (ev.offsetX > sp.timerShaftEL!.canvas!.offsetLeft) { 766 let x = ev.offsetX - sp.timerShaftEL!.canvas!.offsetLeft; 767 let y = ev.offsetY; 768 if ( 769 sp.timerShaftEL!.sportRuler!.frame.contains(x, y) && 770 x > (TraceRow.rangeSelectObject?.startX || 0) && 771 x < (TraceRow.rangeSelectObject?.endX || 0) 772 ) { 773 let findSlicestime = sp.timerShaftEL!.sportRuler?.findSlicesTime(x, y); // 查找帽子 774 if (!findSlicestime) { 775 // 如果没有找到帽子,则绘制一个旗子 776 let time = Math.round( 777 (x * (TraceRow.range?.endNS! - TraceRow.range?.startNS!)) / sp.timerShaftEL!.canvas!.offsetWidth + 778 TraceRow.range?.startNS! 779 ); 780 sp.timerShaftEL!.sportRuler!.drawTriangle(time, 'squre'); 781 } 782 } 783 } 784} 785 786export function spSystemTraceDocumentOnMouseUp(sp: SpSystemTrace, ev: MouseEvent): void { 787 //@ts-ignore 788 if ((window as unknown).collectResize) { 789 return; 790 } 791 if (!sp.loadTraceCompleted || !sp.mouseEventEnable) { 792 return; 793 } 794 //@ts-ignore 795 if ((window as unknown).isSheetMove) { 796 return; 797 } 798 if (sp.isWASDKeyPress()) { 799 ev.preventDefault(); 800 ev.stopPropagation(); 801 return; 802 } 803 SpSystemTrace.isMouseLeftDown = false; 804 if (ev.ctrlKey) { 805 ev.preventDefault(); 806 sp.offsetMouse = 0; 807 sp.mouseCurrentPosition = 0; 808 sp.style.cursor = 'default'; 809 return; 810 } 811 TraceRow.isUserInteraction = false; 812 sp.rangeSelect.isMouseDown = false; 813 if (sp.isMouseInSheet(ev)) { 814 return; 815 } 816 handleTimerShaftActions(ev, sp); 817 if (!SportRuler.isMouseInSportRuler) { 818 sp.rangeSelect.mouseUp(ev); 819 } 820 sp.timerShaftEL?.documentOnMouseUp(ev); 821} 822 823export function spSystemTraceDocumentOnKeyUp(sp: SpSystemTrace, ev: KeyboardEvent): void { 824 if (SpSystemTrace.isAiAsk) { 825 return; 826 } 827 if (sp.times.size > 0) { 828 for (let timerId of sp.times) { 829 clearTimeout(timerId); 830 } 831 } 832 if (!sp.keyboardEnable) { 833 return; 834 } 835 let recordTraceElement = sp.parentElement?.querySelector('sp-record-trace'); 836 let menuItemElement = recordTraceElement?.shadowRoot?.querySelector('lit-main-menu-item[icon="file-config"]'); 837 let flag: boolean = menuItemElement ? menuItemElement.hasAttribute('back') : false; 838 if (ev.key.toLocaleLowerCase() === String.fromCharCode(47) && !flag && !SpSystemTrace.isAiAsk) { 839 if (SpSystemTrace.keyboardFlar) { 840 document 841 .querySelector('body > sp-application')! 842 .shadowRoot!.querySelector<SpKeyboard>('#sp-keyboard')!.style.visibility = 'visible'; 843 SpSystemTrace.keyboardFlar = false; 844 } else { 845 document 846 .querySelector('body > sp-application')! 847 .shadowRoot!.querySelector<SpKeyboard>('#sp-keyboard')!.style.visibility = 'hidden'; 848 SpSystemTrace.keyboardFlar = true; 849 } 850 } 851 if (!sp.loadTraceCompleted) { 852 return; 853 } 854 let flagsItem = window.localStorage.getItem(FlagsConfig.FLAGS_CONFIG_KEY); 855 let flagsItemJson = JSON.parse(flagsItem!); 856 if (flagsItemJson.VSync === 'Enabled') { 857 enableVSync(false, ev, () => sp.refreshCanvas(true, 'sp key up')); 858 } 859 let keyPress = ev.key.toLocaleLowerCase(); 860 if (keyPress === 'w' || keyPress === 'a' || keyPress === 's' || keyPress === 'd') { 861 sp.keyPressMap.set(keyPress, false); 862 } 863 if (keyPress === 'f' && sp.copyCurrentRow) { 864 sp.currentRow = sp.copyCurrentRow; 865 } 866 TraceRow.isUserInteraction = false; 867 sp.observerScrollHeightEnable = false; 868 sp.keyboardEnable && sp.timerShaftEL!.documentOnKeyUp(ev); 869 if (ev.code === 'Enter' || ev.code === 'NumpadEnter') { 870 document.removeEventListener('keydown', sp.documentOnKeyDown); 871 if (ev.shiftKey) { 872 sp.dispatchEvent( 873 new CustomEvent('trace-previous-data', { 874 detail: {}, 875 composed: false, 876 }) 877 ); 878 } else { 879 sp.dispatchEvent( 880 new CustomEvent('trace-next-data', { 881 detail: {}, 882 composed: false, 883 }) 884 ); 885 } 886 document.addEventListener('keydown', sp.documentOnKeyDown); 887 } 888 889 if (ev.ctrlKey) { 890 spSystemTraceDocumentOnKeyUpCtrlKey(keyPress, sp, ev); 891 } 892} 893 894function spSystemTraceDocumentOnKeyUpCtrlKey(keyPress: string, sp: SpSystemTrace, ev: KeyboardEvent): void { 895 if (keyPress === 'b') { 896 let menuBox = document 897 .querySelector('body > sp-application')! 898 .shadowRoot?.querySelector('#main-menu') as LitMainMenu; 899 let searchBox = document 900 .querySelector('body > sp-application') 901 ?.shadowRoot?.querySelector('div > div.search-vessel') as HTMLDivElement; 902 let appContent = document 903 .querySelector('body > sp-application') 904 ?.shadowRoot?.querySelector('div > #app-content') as HTMLDivElement; 905 let rowPane = appContent 906 ?.querySelector('#sp-system-trace') 907 ?.shadowRoot?.querySelector('div > div.rows-pane') as HTMLDivElement; 908 let timerShaft = appContent 909 ?.querySelector('#sp-system-trace') 910 ?.shadowRoot?.querySelector('div > timer-shaft-element') as HTMLDivElement; 911 let spChartList = appContent 912 ?.querySelector('#sp-system-trace') 913 ?.shadowRoot?.querySelector('div > sp-chart-list') as HTMLDivElement; 914 let canvasEle = spChartList.shadowRoot?.querySelector('canvas') as unknown as HTMLDivElement; 915 let sidebarButton = searchBox!.querySelector('div > div.sidebar-button') as HTMLDivElement; 916 let importConfigDiv = searchBox!.querySelector('div > #import-key-path') as HTMLDivElement; 917 if (menuBox.style.zIndex! === '2000' || searchBox!.style.display !== 'none') { 918 SpSystemTrace.isHiddenMenu = true; 919 menuBox.style.width = '0px'; 920 menuBox.style.display = 'flex'; 921 menuBox.style.zIndex = '0'; 922 sidebarButton.style.width = '48px'; 923 importConfigDiv!.style.left = '45px'; 924 searchBox!.style.display = 'none'; 925 rowPane.style.maxHeight = '100%'; 926 } else { 927 SpSystemTrace.isHiddenMenu = false; 928 menuBox.style.width = '248px'; 929 menuBox.style.zIndex = '2000'; 930 menuBox.style.display = 'flex'; 931 sidebarButton.style.width = '0px'; 932 importConfigDiv!.style.left = '5px'; 933 searchBox!.style.display = ''; 934 rowPane.style.maxHeight = '100%'; 935 } 936 } 937 if (keyPress === '[' && sp._slicesList.length > 1) { 938 sp.selectFlag = undefined; 939 sp.MarkJump(sp._slicesList, 'slice', 'previous', ev); 940 } else if (keyPress === ',' && sp._flagList.length > 1) { 941 sp.MarkJump(sp._flagList, 'flag', 'previous', ev); 942 } else if (keyPress === ']' && sp._slicesList.length > 1) { 943 sp.selectFlag = undefined; 944 sp.MarkJump(sp._slicesList, 'slice', 'next', ev); 945 } else if (keyPress === '.' && sp._flagList.length > 1) { 946 sp.MarkJump(sp._flagList, 'flag', 'next', ev); 947 } else { 948 return; 949 } 950} 951 952function handleClickActions(sp: SpSystemTrace, x: number, y: number, ev: MouseEvent): void { 953 if ( 954 !( 955 sp.timerShaftEL!.sportRuler!.frame.contains(x, y) && 956 x > (TraceRow.rangeSelectObject?.startX || 0) && 957 x < (TraceRow.rangeSelectObject?.endX || 0) 958 ) 959 ) { 960 const transformYMatch = sp.canvasPanel?.style.transform.match(/\((\d+)[^\)]+\)/); 961 const transformY = transformYMatch![1]; 962 let inFavoriteArea = sp.favoriteChartListEL?.containPoint(ev); 963 let favoriteHeight = sp.favoriteChartListEL!.getBoundingClientRect().height; 964 let rows = sp.visibleRows.filter((it) => 965 it.focusContain(ev, inFavoriteArea!, Number(transformY), favoriteHeight) && it.collect === inFavoriteArea); 966 if (JankStruct.delJankLineFlag) { 967 sp.removeLinkLinesByBusinessType('janks'); 968 } 969 let strict = true; 970 let offset = false; 971 if ( 972 rows[0] && 973 (rows[0].rowType === TraceRow.ROW_TYPE_FRAME_DYNAMIC || rows[0].rowType === TraceRow.ROW_TYPE_FRAME_SPACING) 974 ) { 975 strict = false; 976 offset = true; 977 } 978 let skip = false; 979 if ( 980 rows[0] && 981 (rows[0].rowType === TraceRow.ROW_TYPE_XPOWER_WIFI_BYTES || 982 rows[0].rowType === TraceRow.ROW_TYPE_XPOWER_WIFI_PACKETS || 983 rows[0].rowType === TraceRow.ROW_TYPE_XPOWER_APP_DETAIL_DISPLAY || 984 rows[0].rowType === TraceRow.ROW_TYPE_XPOWER_STATISTIC) 985 ) { 986 skip = true; 987 } 988 if (rows && rows[0] && (rows[0].getHoverStruct(strict, offset) || 989 (rows[0].rowType === TraceRow.ROW_TYPE_GPU_COUNTER && rows[0].getHoverStruct(false) || skip)) 990 ) { 991 sp.onClickHandler(rows[0]!.rowType!, rows[0], rows[0].getHoverStruct(strict, offset)); 992 sp.documentOnMouseMove(ev); 993 } else { 994 sp.clickEmptyArea(); 995 } 996 } 997} 998 999export function spSystemTraceDocumentOnClick(sp: SpSystemTrace, ev: MouseEvent): void { 1000 if (!sp.loadTraceCompleted) { 1001 return; 1002 } 1003 if (sp.isWASDKeyPress()) { 1004 sp.hoverFlag = null; 1005 ev.preventDefault(); 1006 ev.stopPropagation(); 1007 return; 1008 } 1009 //@ts-ignore 1010 if ((window as unknown).isSheetMove) { 1011 return; 1012 } 1013 if (sp.isMouseInSheet(ev)) { 1014 return; 1015 } 1016 //@ts-ignore 1017 if ((window as unknown).isPackUpTable) { 1018 //@ts-ignore 1019 (window as unknown).isPackUpTable = false; 1020 return; 1021 } 1022 let x = ev.offsetX - sp.timerShaftEL!.canvas!.offsetLeft; 1023 let y = ev.offsetY; 1024 if (sp.timerShaftEL?.getRangeRuler()?.frame.contains(x, y)) { 1025 sp.clickEmptyArea(); 1026 return; 1027 } 1028 if (sp.rangeSelect.isDrag()) { 1029 return; 1030 } 1031 handleClickActions(sp, x, y, ev); 1032 ev.preventDefault(); 1033} 1034 1035export function spSystemTraceDocumentOnKeyDown(sp: SpSystemTrace, ev: KeyboardEvent): void { 1036 document.removeEventListener('keyup', sp.documentOnKeyUp); 1037 sp.debounce(sp.continueSearch, 250, ev)(); 1038 document.addEventListener('keyup', sp.documentOnKeyUp); 1039} 1040