국제 언어 환경 설명서

레이아웃 방향 제어

복합 문자열의 방향은 영어, 스페인어, 프랑스어 및 독일어와 같이 왼쪽에서 오른쪽으로 쓰는 언어나 히브리어 및 아랍어와 같은 오른쪽에서 왼쪽으로 쓰는 언어의 텍스트 모두에 데이터 구조가 유용하도록 저장됩니다. 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);