SWT에서 IME의 상태는 같은 Shell안에 있을 경우 보장 받습니다. 대부분의 셀 편집이나, 텍스트 필드들은 워크벤치 윈도우의 액티브 셸안에 있기 때문에, 한영상태를 유지하는데 문제가 없습니다. 그러나 입력 다이얼로그등이 열리는 순간 한영 상태를 잃게 되어 사용자의 시간을 많이 빼았게 됩니다. 이 문제를 해결 해 봅시다.

이 테크닉은 한글IME가 있는 윈도우즈 제품군에서만 확인되었습니다. 이 코드는 반드시 운영체제가 윈도우인지 체크하고 사용하세요. 다른 운영체제에서 실험 해 보신 분은 결과를 알려주시면 고맙겠습니다.

영문인지 확인하는 방법

Shell s = ...

boolean inEngilsh = s.getImeInputMode() == SWT.NONE;

영문으로 지정하는 방법

Shell s = ...

s.setImeInputMode(SWT.NONE);

한글인지 확인하는 방법

Shell s = ...

boolean inKorean = s.getImeInputMode() == SWT.Native;

한글로 지정하는 방법

Shell s = ...

s.setImeInputMode(SWT.ALPHA | SWT.PHONETIC);

그렇습니다. 이상합니다. 상식적으로는 setImeInputMode에서 SWT.NATIVE로 지정해야 할 것 같지만, 그렇게 해 보면 부작용으로 영어및 숫자가 전각으로 입력됩니다. 물론 이상하긴 합니다만, 우리 개발자들은 한글을 쓰는 서러움이 익숙하리라 믿습니다.

Posted by 지이이이율
,

How to Customize EMF Loading

EMF 2010. 9. 27. 15:02
EMF문서는 일반적으로 굉장히 복잡한 과정을 거쳐 파일로 부터 EObject 문서를 만들어 내기 때문에 어느지점을 수정해야할지 막막하기 그지없습니다. 주요역할을 하는 개체로는 리소스, Load, 로드 핸들러, 헬퍼가 있으며, 그 흐름은 다음과 같습니다.

EMF 문서의 읽기의 개요

ResourceImpl -> LoadImpl: doLoad
LoadImpl -> LoadHandler: SAX Events
LoadHandler -> XMLHelper: Deligates
XMLHelper -> XMLHelper : Build EObject DOM
XMLHelper -> ResourceImpl: 

ResourceImpl

리소스 객체는 기본적으로 EObject 문서를 시리얼라이즈 디시리얼라이즈 하는 진입점이 됩니다. 또한 리소스셋과 함께 멀티플 리소스의 관리도 이루어집니다.

  • createXMLLoad() / createXMLSave() : XMLLoad및 XMLSave를 만듭니다.
  • createXMLHelper() : XMLLoad및 XMLSave를 도와줄 XMLHelper를 만듭니다.

XMLLoadImpl

입력스트림을 SAX 처리하여, 문서를 구성하고 노드들을 탐색하며 에러등을 처리합니다. 대부분의 작업은 LoadHandler에 위임됩니다.

  • makeDefaultHandler() : SAX이벤트에 대응하여 문서를 작성하는 핸들러를 생성합니다.
  • handleErrors() : 문서의 진단 정보를 어떻게 처리할 것인지를 오버라이드 할 수 있습니다.

LoadHandler

SAXParser 이벤트 리스너와 유사합니다. 파일을 읽는 동안 진행상태등을 표시하려면 이것을 오버라이드 해야 합니다. save, load 시에 전달되는 Map에 IProgressMonitor등을 넣어두는 테크닉을 이용합니다.

  • sax이벤트 메소드들
  • 레퍼런스 업데이트

XMLHelper

XML과 EObject DOM사이의 최후의 중재자입니다. 로드 핸들러로부터 요청받아 DOM을 만들고, 속성을 지정하는 등의 작업을 수행합니다.

질문은 메일로만 받고 있습니다. jeeeyul@지메일.com

'EMF' 카테고리의 다른 글

EMF, XML 1.1 읽어들이기 문제  (0) 2011.04.18
EMF 트랜잭션 관리  (0) 2009.06.08
Posted by 지이이이율
,

커스텀 컨트롤을 만들 때 주로, Canvas를 상속받게 되는 데, 이 컨트롤이 애니메이션 요소를 갖고 있다면, 화면이 심하게 깜박거리는 것을 볼 수 있습니다. 이와 관련한 질문에는 더블 버퍼링을 쓰라는 답변이 많고, 코드까지 딸려있는데, 그래도 플리커링은 멈추지 않습니다. Canvas는 paint이벤트를 받으면, 스타일 플래그를 대조하여 SWT.DOUBLE_BUFFERED 값이 0이면 무조건 화면을 지우고 다시 그리기 때문에, 버퍼에 랜더링된 이미지를 한번에 찍는다 해도, 그 전에 지우는 과정이 눈에 보이기 때문입니다.

아래와 같이 생성자를 변경하면, 그리기 코드에 수동 버퍼나, 오프 이미지등과 같은 테크닉을 사용하지 않더라도 자동으로 더블 버퍼됩니다.

Canvas c = new Canvas(parent, SWT.DOUBLE_BUFFERED);
Posted by 지이이이율
,