|
| 1 | +# Task M100 #717 수행 계획서 |
| 2 | + |
| 3 | +## 작업 개요 |
| 4 | + |
| 5 | +- 이슈: #717 `rhwp-studio: 표 셀 빈 영역 클릭 시 커서가 다른 위치로 이동` |
| 6 | +- 브랜치: `local/task717` |
| 7 | +- 대상 문서: `samples/exam_social.hwp` |
| 8 | +- 대상 화면: `rhwp-studio` web, 1/4쪽 왼쪽 첫 번째 자료 표 |
| 9 | + |
| 10 | +## 현상 요약 |
| 11 | + |
| 12 | +`samples/exam_social.hwp` 1/4쪽에서 왼쪽 첫 번째 자료 표의 제목 행 빈 영역을 클릭하면, 클릭한 표/셀 내부가 아니라 페이지 하단의 작은 번호 표(`32`) 쪽으로 커서가 이동한다. |
| 13 | + |
| 14 | +이슈 기준 클릭 좌표는 `x≈191, y≈356`이며, SVG 디버그 오버레이 기준 대상 표는 `s0:pi=1 ci=0 1x1`이다. |
| 15 | + |
| 16 | +## 사전 분석 |
| 17 | + |
| 18 | +확인한 경로: |
| 19 | + |
| 20 | +- `src/document_core/queries/cursor_rect.rs::hit_test_native` |
| 21 | +- `rhwp-studio/src/engine/input-handler-mouse.ts` |
| 22 | +- `tests/issue_658_text_selection_rects.rs` |
| 23 | +- `tests/issue_595.rs` |
| 24 | + |
| 25 | +현재 `input-handler-mouse.ts`의 일반 클릭 경로는 WASM `hitTest(pageIdx, pageX, pageY)` 결과를 그대로 `cursor.moveTo(hit)`에 전달한다. 따라서 본질 정정 위치는 Rust/WASM의 `hit_test_native()` 쪽이 우선이다. |
| 26 | + |
| 27 | +의심되는 본질 원인: |
| 28 | + |
| 29 | +1. `hit_test_native()`가 `cell_bboxes` 메타를 보완할 때 `ctx.path[0].cell_index == cb.cell_index`만으로 TextRun을 찾는다. |
| 30 | +2. 문서 내 여러 표와 바탕쪽 표는 모두 `cell_index=0`, `cell_index=1` 같은 낮은 인덱스를 반복 사용한다. |
| 31 | +3. 이 때문에 클릭한 셀 bbox의 좌표는 맞더라도, 메타 보완 단계에서 다른 표나 바탕쪽 표의 `parent_para_index/control_index`로 덮일 수 있다. |
| 32 | +4. 특히 대상 자료 표 내부에는 중첩 표가 있고, `CellBboxInfo`는 현재 전체 `cellPath`를 보존하지 않으므로 중첩 셀의 빈 영역 클릭을 안정적으로 해당 셀 컨텍스트에 고정하지 못한다. |
| 33 | +5. 셀 내부 클릭으로 판정된 뒤에도 해당 셀 run을 찾지 못하면 전역 본문 fallback으로 진행할 수 있어, 클릭한 표와 무관한 위치로 커서가 이동할 위험이 있다. |
| 34 | + |
| 35 | +## 작업 범위 |
| 36 | + |
| 37 | +- `hit_test_native()`의 셀 bbox 기반 hitTest를 표/셀 컨텍스트 기준으로 안정화한다. |
| 38 | +- 표 셀 내부 클릭은 해당 셀 또는 해당 셀의 가장 가까운 TextRun/문단 위치로 귀속한다. |
| 39 | +- 셀 내부 클릭으로 판정된 뒤에는 본문 전체, 바탕쪽 표, 다른 표의 fallback으로 빠지지 않도록 한다. |
| 40 | +- 필요한 경우 `CellBboxInfo`에 클릭 bbox와 연결된 셀 경로 정보를 보강한다. |
| 41 | +- `samples/exam_social.hwp` 기반 회귀 테스트를 추가한다. |
| 42 | + |
| 43 | +## 범위 제외 |
| 44 | + |
| 45 | +- 표 객체 선택/경계선 클릭 UX 변경 |
| 46 | +- 헤더/푸터 hitTest 정책 변경 |
| 47 | +- 글상자/수식 더블클릭 정책 변경 |
| 48 | +- 렌더링 배치, 표 레이아웃, 페이지네이션 변경 |
| 49 | + |
| 50 | +## 검증 기준 |
| 51 | + |
| 52 | +- `samples/exam_social.hwp` 1/4쪽 `s0:pi=1 ci=0` 자료 표 제목 행 빈 영역 클릭 좌표가 같은 표/셀 컨텍스트로 귀속되어야 한다. |
| 53 | +- 왼쪽 `<보기>` 표(`s0:pi=6 ci=0 3x3`) 등 다른 표의 빈 영역 클릭도 해당 표/셀 내부로 귀속되어야 한다. |
| 54 | +- 페이지 하단 번호 표 또는 바탕쪽 영역으로 커서가 이동하지 않아야 한다. |
| 55 | +- 기존 회귀 영역을 유지한다. |
| 56 | + - #661/#658 드래그 선택 관련 selection rect |
| 57 | + - #595 수식 더블클릭/header-footer hitTest |
| 58 | + - #686 master page 글상자 관련 영역은 별도 이슈 범위로 보존 |
| 59 | + - 표 객체 선택/경계선 클릭 |
| 60 | + |
| 61 | +## 승인 요청 |
| 62 | + |
| 63 | +본 수행 계획서 승인 후 다음 단계로 구현 계획서(`mydocs/plans/task_m100_717_impl.md`)를 작성한다. 구현 계획서는 최소 3단계, 최대 6단계로 나누고, 구현 계획서 승인 전에는 소스 코드를 수정하지 않는다. |
0 commit comments