Preference는 IDE에서 흔히 볼 수 있는 환경설정을 의미한다. 우리가 어떤 특정 플러그인을 개발할 때, 그 플러그인에 특화된 환경설정이 필요한 경우가 있다. 예를 들어 설명하자면, 이전에 소개한 바 있지만 Esterel 언어는 소프트웨어 언어인 C로도 컴파일이 되고 하드웨어 언어인 Verilog로도 컴파일이 가능하다.
Preferences in Eclipse
Esterel 언어를 위한 개발환경에서 위와 같은 환경설정이 존재한다면 각 항목의 체크유무에 따라 소스코드의 컴파일시에 생성되는 아웃풋 파일의 종류를 결정할 수 있다. 이와 같은 작업을 위해서 알아야 할 확장점(Extension Point)에는 두가지가 있으며 이를 포함한 plugin.xml의 일부분의 내용은 다음과 같다.
<!-- vicode preference page -->
<extension
point="org.eclipse.ui.preferencePages">
<page
class="kr.ac.kaist.vicode.preference.VicodePreferencePage"
id="kr.ac.kaist.vicode.preferencepage"
name="VICODE"/>
</extension>
<!-- vicode preference initial data -->
<extension
point="org.eclipse.core.runtime.preferences">
<initializer class="kr.ac.kaist.vicode.preference.Defaults"/>
</extension>
<extension
point="org.eclipse.ui.preferencePages">
<page
class="kr.ac.kaist.vicode.preference.VicodePreferencePage"
id="kr.ac.kaist.vicode.preferencepage"
name="VICODE"/>
</extension>
<!-- vicode preference initial data -->
<extension
point="org.eclipse.core.runtime.preferences">
<initializer class="kr.ac.kaist.vicode.preference.Defaults"/>
</extension>
첫번째 확장점인 org.eclipse.ui.preferencePages을 이용해 Preference page에 기여할 수 있으며, 두번째 확장점인 org.eclipse.core.runtime.preferences에서는 환경설정의 기본값을 지정할 수 있다.
우선 첫번째 확장점을 위한 클래스인 VicodePreferencePage를 살펴보자. 이 클래스는 PreferencePage를 상속하며 UI를 만드는 createContents() 메서드, Restore Defaults 버튼을 눌렀을 때 호출되는 performDefaults(), OK 버튼을 눌렀을 때 호출되는 performOk() 메서드등으로 구성되어 있다. 메서드 이름만으로 각 메서드의 역할을 알 수 있을 것이다.
다음 생성자(Constructor)와 performOk() 메서드를 통해서 환경설정을 어떻게 이용하는지 알아보자.
public VicodePreferencePage() {
super();
setPreferenceStore(Activator.getDefault().getPreferenceStore());
setDescription("Development environment settings for VICODE");
fCheckBoxes = new ArrayList<Button>();
}
public boolean performOk() {
IPreferenceStore store = getPreferenceStore();
for (int i = 0; i < fCheckBoxes.size(); i++) {
Button button = (Button) fCheckBoxes.get(i);
String key = (String) button.getData();
store.setValue(key, button.getSelection());
}
return super.performOk();
}
super();
setPreferenceStore(Activator.getDefault().getPreferenceStore());
setDescription("Development environment settings for VICODE");
fCheckBoxes = new ArrayList<Button>();
}
public boolean performOk() {
IPreferenceStore store = getPreferenceStore();
for (int i = 0; i < fCheckBoxes.size(); i++) {
Button button = (Button) fCheckBoxes.get(i);
String key = (String) button.getData();
store.setValue(key, button.getSelection());
}
return super.performOk();
}
생성자에서는 setPreferenceStore() 메서드를 호출하여 preference page에서 사용할 preference 저장소를 지정한다. performOk() 메서드에서는 preference 저장소를 얻어와 여기에 setValue() 메서드를 이용해 <key, value>의쌍으로 환경설정을 저장한다. 저장할 수 있는 값들은 boolean, double, float, int, String, long 등의 simple data type중에 하나이어야 한다. 위의 예제는 플러그인이 UI에 기여하는 경우(Activator 클래스가 AbstractUIPlugin를 상속하는 경우)에 해당하며 그렇지 않은 경우(Plugin 클래스를 상속하는 경우)에는 getPluginPreferences 메서드를 사용해야 한다.
정리하면 생성자에서 preference 저장소를 지정한 후, createContents() 메서드에서 preference page에 들어가는 UI를 작성한다. 그리고 각 버튼에 해당하는 코드를 작성한다. 이는 UI에 입력된 정보를 환경설정에 저장하거나 그 반대의 일이 될 것이다.
지금부터는 환경설정의 기본값(Default)를 지정하기 위한 클래스인 Defaults를 살펴보자. 여기서는 간단히 initializeDefaultPreferences() 메서드에서 setDefault() 메서드를 호출해서 각 key에 해당하는 기본값을 지정하기만 하면 된다.
public void initializeDefaultPreferences() {
// TODO Auto-generated method stub
// get preference store
IPreferenceStore store = Activator.getDefault().getPreferenceStore();
store.setDefault("CDE_ESTEREL_C", true);
store.setDefault("CDE_ESTEREL_VERILOG", true);
store.setDefault("CDE_ESTEREL_BLIF", false);
}
// TODO Auto-generated method stub
// get preference store
IPreferenceStore store = Activator.getDefault().getPreferenceStore();
store.setDefault("CDE_ESTEREL_C", true);
store.setDefault("CDE_ESTEREL_VERILOG", true);
store.setDefault("CDE_ESTEREL_BLIF", false);
}
지금까지 Eclipse plug-in 개발시에 preference를 활용하는 방법을 살펴보았다. 아래 첨부한 소스코드를 읽어보면 쉽게 이해할 수 있을 것이다. 예제코드에서 UI 부분은 JDT의 JavaBasePreferencePage 클래스의 것을 응용하였다.