import * as React from "react"; import DockLocation from "../DockLocation"; import Border from "../model/BorderNode"; import TabNode from "../model/TabNode"; import { BorderButton } from "./BorderButton"; import { IIcons, ILayoutCallbacks } 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 "./TabSet"; /** @hidden @internal */ export interface IBorderTabSetProps { border: Border; layout: ILayoutCallbacks; iconFactory?: (node: TabNode) => React.ReactNode | undefined; titleFactory?: (node: TabNode) => React.ReactNode | undefined; icons?: IIcons; path: string; } /** @hidden @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 } = 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.MouseEvent | React.TouchEvent) => { event.stopPropagation(); }; const onOverflowClick = (event: React.MouseEvent) => { const element = overflowbuttonRef.current!; showPopup(layout.getRootDiv(), element, hiddenTabs, onOverflowItemSelect, layout.getClassName); 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( ); }; 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[] = []; const renderState = { headerContent: {}, buttons, stickyButtons: [], headerButtons: [] }; layout.customizeTabSet(border, renderState); buttons = renderState.buttons; let toolbar; if (hiddenTabs.length > 0) { const overflowTitle = layout.i18nName(I18nLabel.Overflow_Menu_Tooltip); buttons.push( ); } 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(