/** * Paragraph panel of the Properties deck — counterpart of * svx/source/sidebar/paragraph/ParaPropertyPanel.cxx (alignment, lists, * indent, spacing and line spacing). */ import { useEffect, useState } from "react"; import { ToolBarItems, type ToolBarConfigEntry } from "../../../../framework/source/uielement/toolbarmanager"; import { useDispatcher } from "../../../../sfx2/source/control/dispatch"; import { useViewFrame } from "../../../../sfx2/source/view/viewfrm"; const item = (command: string): ToolBarConfigEntry => ({ kind: "item", command }); const sep: ToolBarConfigEntry = { kind: "separator" }; /** A metric field that commits on Enter / blur (vcl MetricField). */ function MetricField({ label, unit, value, step, onCommit, }: { label: string; unit: string; value: number; step: number; onCommit: (v: number) => void; }) { const frame = useViewFrame(); const [text, setText] = useState(String(value)); useEffect(() => setText(String(+value.toFixed(2))), [value]); const commit = () => { const v = parseFloat(text); if (Number.isFinite(v) && v >= 0 && v !== value) onCommit(v); else setText(String(+value.toFixed(2))); }; return (
setText(e.target.value)} onBlur={commit} onKeyDown={(e) => { if (e.key === "Enter") { commit(); frame.grabFocus(); } }} /> {unit}
); } const LINE_SPACINGS = [ [".uno:SpacePara1", "Single"], [".uno:SpacePara115", "1.15 Lines"], [".uno:SpacePara15", "1.5 Lines"], [".uno:SpacePara2", "Double"], ] as const; export function ParaPropertyPanel() { const dispatcher = useDispatcher(); const frame = useViewFrame(); const spacing = (dispatcher.queryState(".uno:ULSpacing").value ?? { upper: 0, lower: 0 }) as { upper: number; lower: number; }; const indent = (dispatcher.queryState(".uno:LeftRightParaMargin").value ?? 0) as number; const lineSpacing = LINE_SPACINGS.find(([cmd]) => dispatcher.queryState(cmd).checked)?.[0] ?? ""; return (
Paragraph
dispatcher.execute(".uno:ULSpacing", { Upper: v, Lower: spacing.lower })} /> dispatcher.execute(".uno:ULSpacing", { Upper: spacing.upper, Lower: v })} /> dispatcher.execute(".uno:LeftRightParaMargin", { Left: v })} />
); }