# Formula Bar Module data flow

## What It Does
The Formula Bar module manages the name box, formula input area, and Insert Function dialog in the Spreadsheet UI. It synchronizes the active cell's display/formula with the editor, manages edit lifecycle (start/refresh/submit), and integrates function insertion and defined-name navigation with workbook operations.

Primary implementation file: `src/spreadsheet/integrations/formula-bar.ts`.

## Entry Points (UI)
**Class:** `FormulaBar`
- Listens / handles: `formulaBar`, `click`, `keyDown`, `keyUp`, `renderInsertDlg`, `selectionComplete`, `mouseUpAfterSelection`, `mouseDown`, `formulaBarOperation`, `enableFormulaInput`, `isFormulaBarEdit`.
- Key handlers:
  - `createFormulaBar()` — build name box (ComboBox), insert-function button, and formula `textarea` UI; attach event handlers.
  - `formulaBarUpdateHandler()` — update formula input when selection changes or on mousemove/mouseout; fetch cell via `getData` and compute display text.
  - `startFormulaBarEdit()` — validate protection/readonly and begin edit via `editOperation` notifications.
  - `renderInsertDlg()` / `selectFormula()` — show insert-function dialog, get `workbookFormulaOperation` data, and insert selected function into editor.
  - `keyDownHandler()` / `keyUpHandler()` — manage editor refresh, multiline entry, and live refresh notifications for edit engine.
  - Name-box handlers: `nameBoxBeforeOpen()`, `nameBoxBlur()`, `nameBoxSelect()` — manage defined-name navigation and selection.
  - `editOperationHandler()` — react to `formulaBarOperation`/`editOperation` messages to refresh the bar or return the textarea element.
  - `destroy()` / `removeEventListener()` — cleanup components and listeners.

## Entry Points (Core Interactions)
- Interacts with workbook services via notifications/events: `editOperation`, `formulaOperation`, `workbookFormulaOperation`, `formulaBarOperation`, `getData`, `selectionComplete`, `addressHandle`, `editValue`, `readonlyAlert`, `editAlert`.
- Uses `getData()` to fetch `CellModel` for current address and `getFormatFromType` / `isCustomDateTime` to format display text.
- Insert-function dialog queries formula metadata via `workbookFormulaOperation` and uses `Dialog` service for UI.

## ASCII Core Logic Flow
User changes selection or activates cell → `selectionComplete` → `formulaBarUpdateHandler()`
         ↓
If single-cell: call `getData()` → `getFormulaBarValue(cell)` → format value or show formula → update textarea and name box
         ↓
User types in formula bar → `keyDownHandler`/`keyUpHandler` → `parent.notify(editOperation, { refreshEditor/refreshEditorElem })` (live editor sync)
         ↓
User commits or inserts function → `editOperation` / `formulaBarOperation` notifications (`startEdit`/`refreshFormulabar`) → workbook applies edit (undo/redo recorded by edit pipeline)
         ↓
User opens Insert Function → `renderInsertDlg()` → query `workbookFormulaOperation` → dialog populated → `selectFormula()` inserts function via `editOperation` and closes dialog

## Operations (functions & responsibilities)
- `createFormulaBar(args)`
  - Render UI: name box (`ComboBox`), insert function button (`.e-insert-function`), expand toggle, and formula `textarea` (`id: {id}_formula_input`).
  - Apply localization for titles and ARIA labels.

- `formulaBarUpdateHandler(e)`
  - For pointermove: show range size label; for pointerup/selectionComplete: retrieve active cell value via `getData`, compute display via `getFormulaBarValue()`, and update formula input and name box.

- `getFormulaBarValue(cell)`
  - Prefer `cell.formula` if present; otherwise produce display text respecting custom date/time format, percent formatting, hyperlink, and locale-specific decimal separators.

- `startFormulaBarEdit(e)`
  - Validate sheet protection and cell locking (`isReadOnly`, `isLocked`), notify `readonlyAlert` or `editAlert` as needed, and call `editOperation` to start or refresh edit mode.

- Insert Function dialog (`renderInsertDlg`, `dialogOpen`, `selectFormula`, `dialogClose`, `dialogBeforeClose`)
  - Build category dropdown (`DropDownList`) and `ListView` of formulas using `workbookFormulaOperation` queries; present dialog via `Dialog` service; on select, notify `editOperation` to insert function text and `formulaBarOperation` to refresh.

- Name box (defined names)
  - `nameBoxBeforeOpen` / `nameBoxBlur` / `nameBoxSelect`: manage editing state, populate defined names via `formulaOperation` notifications, and navigate to selected range using `addressHandle`/`updateSelectedRange`.

- Keyboard handlers
  - `keyDownHandler` throttles editor refresh; `keyUpHandler` supports Alt+Enter newline insertion and syncs edited value with `editOperation`.

- Lifecycle
  - `addEventListener()` / `removeEventListener()` register/unregister global notifications; `destroy()` disposes UI components (`ComboBox`, dialog) and detaches DOM.

## Validation & Safety
- Protection & readonly: `startFormulaBarEdit()` checks `sheet.isProtected`, `isLocked` and uses `readonlyAlert`/`editAlert` to block edits.
- Edit state: prevents starting a new name-box open when name editing in-progress (`e-name-editing` class).
- Localization & accessibility: titles and ARIA labels obtained from `L10n`; dialog Ok button ARIA labels set; focus management returns focus to spreadsheet after operations.
- Dialog cancel gating: `dialogBeforeOpen` allows external cancellation via `dialogBeforeOpen` event.
- Resource cleanup: `destroy()` removes listeners and destroys child components to avoid leaks.

## Desired Outputs

User-facing
- Name box (`ComboBox`) showing defined names or active cell reference; id pattern: `{id}_name_box` and class `e-name-box`.
- Insert Function button (`.e-insert-function`) and Insert Function dialog (`.e-spreadsheet-function-dlg`) with category dropdown (`.e-ss-formula-category`) and formula list (`.e-formula-list`).
- Formula `textarea` with id `{id}_formula_input`, expand toggle (`.e-drop-icon`) and submit button `.e-formula-submit` shown while editing.
- Multiline editing (Alt+Enter), live editor refresh while typing, and proper focus/keyboard behavior.

System-level
- Events & notifications used:
  - Incoming/UI: `formulaBar`, `click`, `renderInsertDlg`, `selectionComplete`, `mouseUpAfterSelection`, `mouseDown`, `keyDown`, `keyUp`, `formulaBarOperation`, `editOperation`, `formulaOperation`, `workbookFormulaOperation`.
  - Data access: `getData(sheetName!A1)` to fetch `CellModel` for display and formula extraction.
  - Actions: `editOperation` notifications (e.g., `startEdit`, `refreshEditor`) integrate with the edit action pipeline and undo/redo.

- Model artifacts & DOM hooks:
  - IDs: `{id}_formula_input`, `{id}_name_box`, `{id}_category_content`, `{id}_formula_category`, `{id}_formula_list`, `{id}_description_content`.
  - CSS/classes: `e-formula-bar-panel`, `e-formula-bar`, `e-insert-function`, `e-formula-description`, `e-formula-list`, `e-spreadsheet-function-dlg`, `e-name-box`, `e-drop-icon`, `e-formula-submit`.

- Undo/Redo: edits initiated via `editOperation` are expected to participate in the workbook action pipeline so commits can be undone/redone.

## Implementation Notes (short)
- Keep formula bar UI isolated: it should only notify `editOperation`/`formulaBarOperation` and let core handle persistence and undo/redo.
- Use `getData()` for async retrieval of `CellModel`; guard against missing `parent` during async callbacks.
- Respect sheet protection and cell-level locking before starting edits.
- Localize all user-visible strings via `L10n` and ensure ARIA labels are updated when values change.
- Ensure `destroy()` always runs on teardown to release `ComboBox`, `Dialog`, and event handlers.

---