import * as React from "react"; import { DockLocation } from "../DockLocation"; import { BorderNode } from "../model/BorderNode"; import { TabNode } from "../model/TabNode"; import { BorderButton } from "./BorderButton"; import { IIcons, ILayoutCallbacks, ITabSetRenderValues, ITitleObject } from "./Layout"; import { showPopup } from "../PopupMenu"; import { Actions } from "../model/Actions"; import { I18nLabel } from "../I18nLabel"; import { useTabOverflow } from "./TabOverflowHook"; import { Orientation } from "../Orientation"; import { CLASSES } from "../Types"; import { isAuxMouseEvent } from "./Utils"; /** @internal */ export interface IBorderTabSetProps { border: BorderNode; layout: ILayoutCallbacks; iconFactory?: (node: TabNode) => (React.ReactNode | undefined); titleFactory?: (node: TabNode) => (ITitleObject | React.ReactNode | undefined); icons: IIcons; path: string; } /** @internal */ export const BorderTabSet = (props: IBorderTabSetProps) => { const { border, layout, iconFactory, titleFactory, icons, path } = props; const toolbarRef = React.useRef(null); const overflowbuttonRef = React.useRef(null); const stickyButtonsRef = React.useRef(null); const { selfRef, position, userControlledLeft, hiddenTabs, onMouseWheel, tabsTruncated } = useTabOverflow(border, Orientation.flip(border.getOrientation()), toolbarRef, stickyButtonsRef); const onAuxMouseClick = (event: React.MouseEvent) => { if (isAuxMouseEvent(event)) { layout.auxMouseClick(border, event); } }; const onContextMenu = (event: React.MouseEvent) => { layout.showContextMenu(border, event); }; const onInterceptMouseDown = (event: React.MouseEvent | React.TouchEvent) => { event.stopPropagation(); }; const onOverflowClick = (event: React.MouseEvent) => { const callback = layout.getShowOverflowMenu(); if (callback !== undefined) { callback(border, event, hiddenTabs, onOverflowItemSelect); } else { const element = overflowbuttonRef.current!; showPopup(element, hiddenTabs, onOverflowItemSelect, layout, iconFactory, titleFactory); } event.stopPropagation(); }; const onOverflowItemSelect = (item: { node: TabNode; index: number }) => { layout.doAction(Actions.selectTab(item.node.getId())); userControlledLeft.current = false; }; const onFloatTab = (event: React.MouseEvent) => { const selectedTabNode = border.getChildren()[border.getSelected()] as TabNode; if (selectedTabNode !== undefined) { layout.doAction(Actions.floatTab(selectedTabNode.getId())); } event.stopPropagation(); }; const cm = layout.getClassName; let style = border.getTabHeaderRect()!.styleWithPosition({}); const tabs: any = []; const layoutTab = (i: number) => { let isSelected = border.getSelected() === i; let child = border.getChildren()[i] as TabNode; tabs.push( ); if (i < border.getChildren().length-1) { tabs.push(
); } }; for (let i = 0; i < border.getChildren().length; i++) { layoutTab(i); } let borderClasses = cm(CLASSES.FLEXLAYOUT__BORDER) + " " + cm(CLASSES.FLEXLAYOUT__BORDER_ + border.getLocation().getName()); if (border.getClassName() !== undefined) { borderClasses += " " + border.getClassName(); } // allow customization of tabset right/bottom buttons let buttons: any[] = []; let stickyButtons: any[] = []; const renderState : ITabSetRenderValues= { headerContent: undefined, buttons, stickyButtons: stickyButtons, headerButtons: [], overflowPosition: undefined }; layout.customizeTabSet(border, renderState); buttons = renderState.buttons; if (renderState.overflowPosition === undefined) { renderState.overflowPosition = stickyButtons.length; } if (stickyButtons.length > 0) { if (tabsTruncated) { buttons = [...stickyButtons, ...buttons]; } else { tabs.push(
{ e.preventDefault() }} className={cm(CLASSES.FLEXLAYOUT__TAB_TOOLBAR_STICKY_BUTTONS_CONTAINER)} > {stickyButtons}
); } } if (hiddenTabs.length > 0) { const overflowTitle = layout.i18nName(I18nLabel.Overflow_Menu_Tooltip); let overflowContent; if (typeof icons.more === "function") { overflowContent = icons.more(border, hiddenTabs); } else { overflowContent = (<> {icons.more}
{hiddenTabs.length}
); } buttons.splice(Math.min(renderState.overflowPosition, buttons.length), 0, ); } const selectedIndex = border.getSelected(); if (selectedIndex !== -1) { const selectedTabNode = border.getChildren()[selectedIndex] as TabNode; if (selectedTabNode !== undefined && layout.isSupportsPopout() && selectedTabNode.isEnableFloat() && !selectedTabNode.isFloating()) { const floatTitle = layout.i18nName(I18nLabel.Float_Tab); buttons.push( ); } } const toolbar = (
{buttons}
); style = layout.styleFont(style); let innerStyle = {}; const borderHeight = border.getBorderBarSize() - 1; if (border.getLocation() === DockLocation.LEFT) { innerStyle = { right: borderHeight, height: borderHeight, top: position }; } else if (border.getLocation() === DockLocation.RIGHT) { innerStyle = { left: borderHeight, height: borderHeight, top: position }; } else { innerStyle = { height: borderHeight, left: position }; } return (
{tabs}
{toolbar}
); };