/**
* FF Typescript Foundation Library
* Copyright 2019 Ralph Wiedemeier, Frame Factory GmbH
*
* License: MIT
*/
import "./Icon";
import "./Button";
import DockPanel from "./DockPanel";
import DockStack from "./DockStack";
import DockView from "./DockView";
import CustomElement, { customElement, html, property, PropertyValues } from "./CustomElement";
////////////////////////////////////////////////////////////////////////////////
export interface IDockPanelCloseEvent extends CustomEvent {
detail: {
panelId: string;
}
}
@customElement("ff-dock-panel-header")
export default class DockPanelHeader extends CustomElement
{
static readonly closeEvent: string = "ff-dock-panel-header-close";
@property({ type: Boolean, reflect: true })
active = false;
readonly panel: DockPanel;
constructor(panel: DockPanel)
{
super();
this.onDragStart = this.onDragStart.bind(this);
this.onDragOver = this.onDragOver.bind(this);
this.onDragLeave = this.onDragLeave.bind(this);
this.onDrop = this.onDrop.bind(this);
this.addEventListener("click", this.onClick);
this.addEventListener("dragstart", this.onDragStart);
this.addEventListener("dragover", this.onDragOver);
this.addEventListener("dragleave", this.onDragLeave);
this.addEventListener("drop", this.onDrop);
this.panel = panel;
panel.header = this;
}
protected update(changedProperties: PropertyValues)
{
super.update(changedProperties);
if (this.panel.movable) {
this.setAttribute("draggable", "true");
}
else {
this.removeAttribute("draggable");
}
if (changedProperties.has("active")) {
this.panel.active = this.active;
}
}
protected render()
{
const {
text,
closable,
movable
} = this.panel;
let icon = closable
? html``
: (movable ? html`` : null);
return html`
${icon}
`;
}
protected firstUpdated()
{
this.setStyle({
flex: "0 0 auto",
display: "block",
userSelect: "none",
cursor: "pointer"
});
}
protected onClick(event: MouseEvent)
{
this.panel.activatePanel();
this.dispatchEvent(new CustomEvent(DockView.changeEvent, { bubbles: true }));
}
protected onClickButton(event: MouseEvent)
{
this.dispatchEvent(new CustomEvent(DockPanelHeader.closeEvent, {
detail: { panelId: this.panel.id },
bubbles: true
} as IDockPanelCloseEvent));
this.panel.closePanel();
event.stopPropagation();
this.dispatchEvent(new CustomEvent(DockView.changeEvent, { bubbles: true }));
}
protected onDragStart(event: DragEvent)
{
// activate panel
const stack = this.panel.parentElement as DockStack;
stack.activatePanel(this.panel);
event.dataTransfer.setData(DockPanel.dragDropMimeType, this.panel.id);
event.dataTransfer.dropEffect = "move";
}
protected onDragOver(event: DragEvent)
{
this.panel.parentStack.onDragOver(event);
}
protected onDragLeave(event: DragEvent)
{
this.panel.parentStack.onDragLeave(event);
}
protected onDrop(event: DragEvent)
{
this.panel.parentStack.onDrop(event);
}
}