// *****************************************************************************
// Copyright (C) 2025 1C-Soft LLC and others.
//
// This program and the accompanying materials are made available under the
// terms of the Eclipse Public License v. 2.0 which is available at
// http://www.eclipse.org/legal/epl-2.0.
//
// This Source Code may also be made available under the following Secondary
// Licenses when the conditions for such availability set forth in the Eclipse
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
// with the GNU Classpath Exception which is available at
// https://www.gnu.org/software/classpath/license.html.
//
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
// *****************************************************************************
import { inject, injectable, postConstruct } from '@theia/core/shared/inversify';
import * as React from '@theia/core/shared/react';
import { codicon, Message, onDomEvent, ReactWidget } from '@theia/core/lib/browser';
import { LabelParser } from '@theia/core/lib/browser/label-parser';
@injectable()
export class MergeEditorPaneHeader extends ReactWidget {
@inject(LabelParser)
protected readonly labelParser: LabelParser;
private _description = '';
get description(): string {
return this._description;
}
set description(description: string) {
this._description = description;
this.update();
}
private _detail = '';
get detail(): string {
return this._detail;
}
set detail(detail: string) {
this._detail = detail;
this.update();
}
private _toolbarItems: readonly MergeEditorPaneToolbarItem[];
get toolbarItems(): readonly MergeEditorPaneToolbarItem[] {
return this._toolbarItems;
}
set toolbarItems(toolbarItems: readonly MergeEditorPaneToolbarItem[]) {
this._toolbarItems = toolbarItems;
this.update();
}
@postConstruct()
protected init(): void {
this.addClass('header');
this.scrollOptions = undefined;
this.node.tabIndex = -1;
this.toDispose.push(onDomEvent(this.node, 'click', () => this.activate()));
this.title.changed.connect(this.update, this);
}
protected override onActivateRequest(msg: Message): void {
super.onActivateRequest(msg);
this.parent?.activate();
}
protected override render(): React.ReactNode {
return (
{this.renderWithIcons(this.title.label)}
{this.renderWithIcons(this.description)}
{this.renderWithIcons(this.detail)}
{this.toolbarItems.map(toolbarItem => this.renderToolbarItem(toolbarItem))}
);
}
private readonly handleToolbarClick = (event: React.MouseEvent) => event.nativeEvent.stopImmediatePropagation();
protected renderWithIcons(text: string): React.ReactNode[] {
const result: React.ReactNode[] = [];
const labelParts = this.labelParser.parse(text);
labelParts.forEach((labelPart, index) => {
if (typeof labelPart === 'string') {
result.push(labelPart);
} else {
result.push();
}
});
return result;
}
protected renderToolbarItem({ id, label, tooltip, className, onClick }: MergeEditorPaneToolbarItem): React.ReactNode {
return {label};
}
}
export interface MergeEditorPaneToolbarItem {
readonly id: string;
readonly label?: string;
readonly tooltip?: string;
readonly className?: string;
readonly onClick?: (event: React.MouseEvent) => void;
}