Editor에서 하위 Widget에 대한 키 바인딩 또는 액션 처리
Text Editor가 아니라 Structured Data를 다루는 Editor인 경우, 일반적으로 여러개의 하위 위젯을 가지게 됩니다. 대표적인 예로 Plug-in Manifest Editor를 들 수 있습니다.
요즘 EMF Generated Editor를 확장하는 Editor를 하나 만들어보고 있는데 커스터마이징하면서 에디터에 Text 위젯을 몇 개 추가하였습니다. 문제는 Text 위젯에서 Copy를 하려고 Command+C(Ctrl+C)를 누르면 원래 에디터에 이미 생성되어 있는 Copy 액션이 연동되어 버려서 Text 위젯에 아예 관련 이벤트가 가질 않습니다. EMF를 조금 해본 분이라면 아시겠지만 생성해주는 거말고 따로 더 붙이려면 여간 귀찮은게 아닙니다. ^^ (물론 제대로 한다면 금방 뚝딱뚝딱하기 좋은 구조입니다만)
텍스트 위젯이라면 어디서나 기본으로 동작하는 Copy,Cut,Paste 때문에 EMF 생성 액션을 고치기는 귀찮아서 이래저래 꼼수를 생각해보았으나 제 결론은 다음과 같습니다.
- 원론적으로 에디터라면 키 바인딩은 액션을 통해서 처리하는 게 맞다.
- 이를 강제하듯 Text 위젯 내에서 이벤트를 처리할 때 Display에 설정된 global Event Table이 우선 동작하도록 구현되어 있기 때문에 아무리 용써봐야 액션을 통해서 실행하거나 최소한 텍스트 위젯에 포커스가 갈 때 액션을 죽이는 처리 정도는 해야 한다.
- 이래저래 편법 쓰느니 액션과 위젯 연동을 추상화해서 일반화된 방법으로 액션에서 제어하도록 하는 게 제일 낫다.
결론은 저렇습니다만 키바인딩 문제로 시작해서 UI에 대해 다시 고민을 하다보니 Text 위젯을 별도의 뷰로 빼버리는 것으로 구현하기로 했습니다. CopyAction 고치기가 너무 싫어서일까요~
위와 관련하여 PDE Manifest Editor를 참고한 추천 프랙티스는 다음과 같습니다.
- 각 위젯에 대해 필요한 정보 : canCopy, canPasteFromClipboard, isEditable
- canCut = isEditable && canCopy
- 각 위젯에 대해 구현할 동작 : selection provider, copy, delete, paste
- cut = copy + delete
- canCopy와 copy 구현은 특별한 위젯을 제외하고는 ISelection의 유형에 따라 동작을 구현 가능
- ITextSelection : 클립보드에 String 복사
- IStructuredSelection : 클립보드에 Object 복사
- 위젯 유형 별로 위와 같은 정보와 동작을 제공하는 Helper 클래스를 작성해서 재활용한다.
- canPaste와 paste 구현은 위젯과 클립보드 데이터에 의존하므로 현재 포커스를 가진 위젯을 기준으로 판단하고 동작하도록 구현
위와 같은 내용은 JFace TableViewer와 CellEditor의 관계와 거의 비슷합니다. CellEditor가 TableViewer에 출력중인 데이터에서 셀 하나에 해당하는 부분을 편집하듯, Editor의 데이터 일부를 개별 위젯에서 편집하기 때문입니다. 다만 Editor의 데이터와 UI는 TableViewer의 contents에 비해 훨씬 자유롭게 구성된다는 차이일 뿐입니다. 기본 프레임워크에서 이와 같은 사항을 지원하는 부분은 아직 찾지 못했습니다. Forms UI도 PDE로부터 분리된 프로젝트니 하위 위젯에 대응하는 액션 관련 부분도 PDE에서 분리되길 기대해보죠. 그전에는 PDE의 소스를 참고해보세요.
