토요일, 6월 07, 2008

eclipse에서 font 사용 및 분석기

요 몇일 폰트 문제로 머리가 좀 아팟습니다.
폰트는 다들 아시겠지만 시스템에있는 폰트를 사용해야하고, 리소스를 많이 잡아먹는 대표적인 것들이라 신중하기도 합니다.

SWT에서 폰트는 대략 이렇게 처리합니다. Display(물런 Device에서 최종적으로 가져오게 되는것이죠. 그것의 더 최종은 Font구요)에 systemFont(defaultFont)가져오는 부분이 있습니다. 그래서 eclipse나 우리가 만든 application이 동작하면, systemFont로 만들어 지게 됩니다.
label, button, text등의 각종 widget들도 사용자가 지정하지 않으면, default로 systemFont를 적용하게 됩니다.

폰트는 뭐 아래와 같이 정의 되어 있습니다.
public Font getSystemFont () {
checkDevice ();
if (systemFont != null) return systemFont;
int hFont = 0;
if (!OS.IsWinCE) {
NONCLIENTMETRICS info = OS.IsUnicode ? (NONCLIENTMETRICS) new NONCLIENTMETRICSW () : new NONCLIENTMETRICSA ();
info.cbSize = NONCLIENTMETRICS.sizeof;
if (OS.SystemParametersInfo (OS.SPI_GETNONCLIENTMETRICS, 0, info, 0)) {
LOGFONT logFont = OS.IsUnicode ? (LOGFONT) ((NONCLIENTMETRICSW)info).lfMessageFont : ((NONCLIENTMETRICSA)info).lfMessageFont;
hFont = OS.CreateFontIndirect (logFont);
lfSystemFont = hFont != 0 ? logFont : null;
}
}
if (hFont == 0) hFont = OS.GetStockObject (OS.DEFAULT_GUI_FONT);
if (hFont == 0) hFont = OS.GetStockObject (OS.SYSTEM_FONT);
return systemFont = Font.win32_new (this, hFont);
}

시스템에서 사용하는 폰트는 대략 hFont에 정의된 값이라 할수 있겠습니다.
SWT에서 화면에 출력해주는 기본 폰트라 하겠습니다.(당연히 RCP도 마찬가지겟지요)

자 일단 이걸 기본 지식으로 하겠습니다.

그럼 두번째로,
이클립스에서 Preferences -> Window -> General -> Apperence -> Colors and Font에 정의 되어 있는 폰트와 크기등이 어떻게 결정 될까요?

그것은 org.eclipse.jface 프로젝트에서 관리합니다.
주요한 클래스로는 FontRegistry, JFaceResource를 들수 있겠습니다.
관련 파일로는 jfacefonts.properties, jfacefonts_xxx.properties(대표적인 os마다 파일이 존재합니다.) 그리고 각 부분에 따른 폰트와 크기 타입이 FontDescription 형태로 정의되어 있습니다.
대표적인 jfacefonts.properties 파일을 보도록 하겠습니다.###############################################################################
# Generic NLS font file for JFace
# *.0 is Windows font
# *.1 is Unix font
#############################################################
org.eclipse.jface.bannerfont.0=MS Sans Serif-bold-10
org.eclipse.jface.bannerfont.1=b&h-lucidabright-regular-10

org.eclipse.jface.headerfont.0=MS Sans Serif-bold-12
org.eclipse.jface.headerfont.1=b&h-lucidabright-regular-12

org.eclipse.jface.textfont.0=Courier New-regular-10
org.eclipse.jface.textfont.1=Courier-regular-10
org.eclipse.jface.textfont.2=b&h-lucidabright-regular-9


이클립스처럼 환경을 정의(Colors and Font)해서 사용해야할 경우라면 FontRegistry를 이용하면 되겠습니다. 국제화에 맞게 시스템을 만들 것이라면 위의 방식을 모방하면, 멋지게 이부분은 만들 수 있겠다 생각이 들었습니다.

저기에는 font만 정의하는것이 아니라 ColorRegistry, ResourceRegistry 등도 존재하고, 이것을 유저가 사용할수 있도록 JFaceResource를 내어놓았습니다. 그리고 한번 설정되면 두번은 바뀌지 않도록 되어 있어서 public static final String DEFAULT_FONT = "org.eclipse.jface.defaultfont"; //$NON-NLS-1$ 를 사용하여 재 정의도 못하게 되어 있습니다.
그럼, 어캐 이것을 바꾸지 하시는 분들이 있을텐데요. 위에 정의한 프로퍼티 파일을 바꾸시면 되겟지요.


<이것은 rcp의 초기 폰트와 크기를 바꾸어 보았습니다.>

댓글 없음:

댓글 쓰기