/*
* Copyright (C) 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {
Component,
ElementRef,
EventEmitter,
Inject,
Input,
Output,
} from '@angular/core';
import {PersistentStore} from 'common/persistent_store';
import {Analytics} from 'logging/analytics';
import {TraceType} from 'trace/trace_type';
import {RectShowState} from 'viewers/common/rect_show_state';
import {TableProperties} from 'viewers/common/table_properties';
import {UiHierarchyTreeNode} from 'viewers/common/ui_hierarchy_tree_node';
import {UiTreeUtils} from 'viewers/common/ui_tree_utils';
import {UserOptions} from 'viewers/common/user_options';
import {ViewerEvents} from 'viewers/common/viewer_events';
import {nodeStyles} from 'viewers/components/styles/node.styles';
import {searchBoxStyle} from './styles/search_box.styles';
import {viewerCardInnerStyle} from './styles/viewer_card.styles';
@Component({
selector: 'hierarchy-view',
template: `
`,
styles: [
`
.view-header {
display: flex;
flex-direction: column;
}
.properties-table {
padding-top: 5px;
}
.hierarchy-content {
height: 100%;
overflow: auto;
padding: 0px 12px;
}
.pinned-items {
width: 100%;
box-sizing: border-box;
border: 2px solid #ffd58b;
}
tree-view {
overflow: auto;
}
`,
nodeStyles,
searchBoxStyle,
viewerCardInnerStyle,
],
})
export class HierarchyComponent {
filterString = '';
isHighlighted = UiTreeUtils.isHighlighted;
ViewerEvents = ViewerEvents;
Analytics = Analytics;
@Input() tree: UiHierarchyTreeNode | undefined;
@Input() subtrees: UiHierarchyTreeNode[] = [];
@Input() tableProperties: TableProperties | undefined;
@Input() dependencies: TraceType[] = [];
@Input() highlightedItem = '';
@Input() pinnedItems: UiHierarchyTreeNode[] = [];
@Input() store: PersistentStore | undefined;
@Input() userOptions: UserOptions = {};
@Input() rectIdToShowState?: Map;
@Output() collapseButtonClicked = new EventEmitter();
constructor(@Inject(ElementRef) private elementRef: ElementRef) {}
trackById(index: number, child: UiHierarchyTreeNode): string {
return child.id;
}
isFlattened() {
return this.userOptions['flat']?.enabled;
}
onPinnedNodeClick(event: MouseEvent, pinnedItem: UiHierarchyTreeNode) {
event.preventDefault();
if (window.getSelection()?.type === 'range') {
return;
}
this.onHighlightedItemChange(pinnedItem);
}
onFilterChange() {
const event = new CustomEvent(ViewerEvents.HierarchyFilterChange, {
bubbles: true,
detail: {filterString: this.filterString},
});
this.elementRef.nativeElement.dispatchEvent(event);
}
onHighlightedItemChange(node: UiHierarchyTreeNode) {
const event = new CustomEvent(ViewerEvents.HighlightedNodeChange, {
bubbles: true,
detail: {node},
});
this.elementRef.nativeElement.dispatchEvent(event);
}
onPinnedItemChange(item: UiHierarchyTreeNode) {
const event = new CustomEvent(ViewerEvents.HierarchyPinnedChange, {
bubbles: true,
detail: {pinnedItem: item},
});
this.elementRef.nativeElement.dispatchEvent(event);
}
}