국제 언어 환경 설명서

CTL 응용프로그램 개발하기

다음 절에서는 CTL 응용프로그램 개발법을 설명합니다.

레이아웃 방향 제어

복합 문자열의 방향은 영어, 스페인어, 프랑스어 및 독일어와 같이 왼쪽에서 오른쪽으로 쓰는 언어나 히브리어 및 아랍어와 같은 오른쪽에서 왼쪽으로 쓰는 언어의 텍스트 모두에 데이터 구조가 유용하도록 저장됩니다. Motif 응용프로그램에서는 VendorShell 또는 MenuShell에서 XmNlayoutDirection 자원을 사용해 레이아웃 방향을 설정할 수 있습니다. 관리자 및 프리미티브 위짓트(Gadgets 포함) 역시 XmNlayoutDirection 자원을 갖고 있습니다. 기본 값은 동일한 자원을 갖고 있는 가장 가까운 상위로부터 상속됩니다.

XmText 위짓트의 경우 가로 방향은 물론 세로 방향을 지정해야 합니다. layoutDirection XmRIGHT_TO_LEFT로 설정하면 문자열 방향은 오른쪽에서 왼쪽으로 설정되지만 커서는 세로 방향으로 움직입니다. 세로 방향이 중요하고 위에서 아래 방향 할당이 필요할 경우 XmRIGHT_TO_LEFT_TOP_TO_BOTTOM을 지정하도록 하십시오. 이 설정은 구성 요소가 먼저 오른쪽에서 왼쪽으로 배치된 다음 위에서 아래로 배치되도록 지정하여 원하는 동작을 얻습니다.

XmTextTextField 위짓트의 동작은 XmRenditionXmNalignmentXmNlayoutModifier 자원의 영향도 받습니다. 이 자원들은 XmNlayoutDirection과 함께 텍스트 위짓트의 레이아웃 동작을 제어합니다. 이 동작은 그림 6–2에 표시되어 있습니다.

그림에서 사용된 입력 문자열:

이 그림은 동일한 행의 영어 및 아랍어 문자의 양방향 텍스트 레이아웃을 보여줍니다.

다음 그림을 위한 XmNlayoutModifier 문자열 @ls orientation= 설정 값은 왼쪽 열에 표시되어 있습니다.

그림 6–2 레이아웃 방향

그림은 왼쪽에서 오른쪽과 오른쪽에서 왼쪽 텍스트에 대한 시작 및 코드화 할당을 보여줍니다.

그림에서 보이는 바와 같이, XmNalignment는 레이아웃 방향에 따라 텍스트 오른쪽을 비울 것인지, 아니면 왼쪽을 비울 것인지를 지정합니다. XmNlayoutModifier는 텍스트를 세그먼트로 나눈 뒤 방향 값에 따라 왼쪽에서 오른쪽 또는 오른쪽에서 왼쪽으로 배열합니다. 다시 말해 XmNlayoutDirectionXmRIGHT_TO_LEFT 이고 XmNAlignment 값이 XmALIGNMENT_BEGINNING 이면 문자열 오른쪽이 비워집니다.


예 6–1 Rendition 만들기

다음 코드 는 태그가 “ArabicShaped”인 렌더링을 사용하여 XmNlabelString이 유형 XmCHARSET_TEXTXmLabel을 만듭니다. Rendition은 “ar”(아랍어 로켈의 로켈 이름)의 XmNlayoutAttrObject와 출력 버퍼에 대하여 “iso8859–6”의 NUMERALS_CONTEXTUALShapeCharset 값의 Numerals을 지정하는 레이아웃 수정자 문자열로 만듭니다.

로켈 특정 레이아웃 모듈은 16비트 유니코드 코드 세트를 사용하여 입력 텍스트를 코드화된 물리적 문자의 출력 버퍼로 변환합니다. 명시적 레이아웃 로켈은 지정되어 있기 때문에 이 텍스트는 런타임 로켈 설정에 관계 없이 올바로 렌더링됩니다. 이 예에서는 입력이 ISO 8859–6으로 코드화됩니다.

int n;
Arg args[10];
Widget w;
XmString labelString;
XmRendition rendition;
XmStringTag renditionTag;
XmRenderTable renderTable;
      /* alef lam baa noon taa - iso8859-6 */
labelString = XmStringGenerate("\307\344\310\346\312\", NULL
			                          XmCHARSET_TEXT, "ArabicShaped");
w = XtVaCreateManagedWidget("a label", xmLabelWidgetClass, parent,
                             XmNlabelString, labelString,
		                          XmNlabelType, XmSTRING,
                             NULL);
n = 0;
XtSetArg(args[n], XmNfontName, "-*-*-medium-r-normal-*-24-*-*-*-*-*-*");
      n++;
XtSetArg(args[n], XmNfontType, XmFONT_IS_XOC); n++;
XtSetArg(args[n], XmNlayoutAttrObject, "ar"); n++;
XtSetArg(args[n], XmNlayoutModifier, 
          "@ls numerals=:contextual, shapecharset=iso8859-6"); n++;
renditionTag = (XmStringTag) "ArabicShaped";
rendition = XmRenditionCreate(w, renditionTag, argcs
s, n);
renderTable = 
    XmRenderTableAddRenditions(NULL, &rendition, 1, XmREPLACE_MERGE);
XtVaSetValues(w, XmNrenderTable, renderTable, NULL);


예 6–2 Rendition 편집하기

다음 코드는 단일 Rendition을 사용하여 TextField 위짓트와 RenderTable을 만듭니다. XmNlayoutAttrObject XmNlayoutModifier 의사 자원은 지정되지 않은 채로 남았으므로 NULL로 설정됩니다. 이 값은 Rendition 명령과 관련된 레이아웃 객체가 존재하는 경우 기본 로켈에 속한다는 것을 의미합니다.

이 예제가 올바로 작동하려면 로켈을 코드 세트가 ISO 8859-6이고 로켈 지향 레이아웃 모듈이 IMPLICIT_BASIC 알고리즘을 지원할 수 있는 로켈로 설정되어야 합니다. Rendition의 LayoutObjectImplicitAlg 값은 Rendition의 XmNlayoutModifier 의사 자원에 의해 수정됩니다.

int n;
Arg args[10];
Widget w;
	XmRendition rendition;
XmStringTag renditionTag;
XmRenderTable renderTable;
w = XmCreateTextField(parent, "text field", args, 0);
n = 0;
	XtSetArg(args[n], XmNfontName, "-*-*-medium-r-normal-*-24-*-*-*-*-*-*-*");
     n++;
	XtSetArg(args[n], XmNfontType, XmFONT_IS_XOC); n++;
renditionTag = (XmStringTag) "ArabicShaped";
rendition = XmRenditionCreate(w, renditionTag, args, n);
renderTable = 
    XmRenderTableAddRenditions(NULL, &rendition, 1, XmREPLACE_MERGE);
XtVaSetValues(w, XmNrenderTable, renderTable, NULL);
	....
n = 0;
XtSetArg(args[n], XmNlayoutModifier, "@ls implicitalg=basic");
     n++;
XmRenditionUpdate(rendition, args, n);

자원 파일에서 렌더 테이블 만들기

응용프로그램의 국제화가 올바로 이루어지려면 Rendition과 렌더 테이블을 지정해야 합니다. 렌더 테이블이 파일에서 지정되면 프로그램 바이너리는 주어진 로켈의 요건에 독립적으로 만들어지므로 로컬 요건에 맞추어 쉽게 사용자 정의할 수 있습니다.

렌더 테이블은 다음 구문에 의해 리소스 파일에서 지정됩니다: resource_spec:[tag[,tag]*]

이 때 tag는 rendition의 XmNtag 자원에 적합한 일부 문자열입니다.

이 줄은 지정된 바와 같이 한 개 이상의 rendition을 포함한 최초의 렌더 테이블을 만듭니다. rendition은 지정된 태그에 부착됩니다:

resource_spec[*|.] rendition[*|.]resource_name:value

다음 예제에서는 리소스 파일을 사용해 설정할 수 있는 XmRendition과 관련된 CTL 자원들을 보여줍니다. 레이아웃 객체가 효과를 발휘하려면 fontTypeFONT_IS_XOC로 설정해야 합니다. @ls를 사용해 지정된 layoutModifier는 rendition 객체에 의해 레이아웃 객체에 전달됩니다.

layoutModifier을 사용하여 레이아웃 객체에서 설정될 수 있는 자원의 완전한 목록은 CAE Specification: Portable Layout Services: Context-dependent and Directional Text, The Open Group: Feb 1997; ISBN 1-85912-142-X; 문서 번호 C616을 참조하십시오.


예 6–3 응용프로그램에서 렌더 테이블 만들기

렌더 테이블을 만들기 전에 먼저 응용프로그램이 테이블의 일부인 rendition 중 최소 한 개를 작성해야 합니다. XmRenderTableAddRenditions() 함수는 이름이 암시하듯이 새 rendition으로 렌더 테이블을 증대시키는 데에도 사용됩니다. 새 렌더 테이블을 만들려면 기존 렌더 테이블 대신 NULL 인자로 XmRenderTableAddRenditions() 기능을 호출하십시오.

다음 코드는 XmFONT_IS_XOC에 설정된 XmNfontType으로 만든 rendition을 사용해 렌더 테이블을 만듭니다.

int n;
Arg args[10];
Widget w;
XmString labelString;
XmRendition rendition;
XmStringTag renditionTag;
XmRenderTable renderTable;
      /* alef lam baa noon taa - iso8859-6 */
labelString = XmStringGenerate("\307\344\310\346\312\", NULL
			                           XmCHARSET_TEXT, "ArabicShaped");
w = XtVaCreateManagedWidget("a label", xmLabelWidgetClass, parent,
                            XmNlabelString, labelString,
		                         XmNlabelType, XmSTRING,
                            NULL);
n = 0;
XtSetArg(args[n], XmNfontName, "-*-*-medium-r-normal-*-24-*-*-*-*-*-*-*");
     n++;
XtSetArg(args[n], XmNfontType, XmFONT_IS_XOC); n++;
XtSetArg(args[n], XmNlayoutAttrObject, "ar"); n++;
XtSetArg(args[n], XmNlayoutModifier, 
          "@ls numerals=nominal:contextual, shapecharset=iso8859-6"); n++;
renditionTag = (XmStringTag) "ArabicShaped";
rendition = XmRenditionCreate(w, renditionTag, args, n);
renderTable = 
    XmRenderTableAddRenditions(NULL, &rendition, 1, XmREPLACE);
XtVaSetValues(w, XmNrenderTable, renderTable, NULL);