メインクラスを探す その 2
JavaMainTab クラスで [Search...] ボタンを作っているのは createMainTypeEditor メソッドの中にあります。
fSearchButton = createPushButton(mainGroup,LauncherMessages.JavaMainTab_Searc_h_5, null); //$NON-NLS-1$ fSearchButton.addSelectionListener(fListener);
重要なのは 2 行目のリスナを登録しているところです。fListener とは何者か?
private WidgetListener fListener = new WidgetListener();
だそうです。WidgetListener クラスは内部クラスで次のように定義されています。
private class WidgetListener implements ModifyListener, SelectionListener {
public void modifyText(ModifyEvent e) {
updateLaunchConfigurationDialog();
}
public void widgetSelected(SelectionEvent e) {
Object source = e.getSource();
if (source == fProjButton) {
handleProjectButtonSelected();
} else if (source == fSearchButton) {
handleSearchButtonSelected();
} else {
updateLaunchConfigurationDialog();
}
}
public void widgetDefaultSelected(SelectionEvent e) {
}
}なんかこういうリスナはやだなぁ。なんでわざわざ if 文で選択させるようなコード書くんだろう?
それはそれとして、[Search...] ボタンの時は handleSearchButtonSelected メソッドに飛ぶようですが、そのメソッドは長い ... ^^;;;;
protected void handleSearchButtonSelected() {
IJavaProject javaProject = getJavaProject();
IJavaElement[] elements = null;
if ((javaProject == null) || !javaProject.exists()) {
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IJavaModel model = JavaCore.create(root);
if (model != null) {
try {
elements = model.getJavaProjects();
} catch (JavaModelException e) {
}
}
} else {
elements = new IJavaElement[]{javaProject};
}
if (elements == null) {
elements = new IJavaElement[]{};
}
int constraints = IJavaSearchScope.SOURCES;
if (fSearchExternalJarsCheckButton.getSelection()) {
constraints |= IJavaSearchScope.APPLICATION_LIBRARIES;
constraints |= IJavaSearchScope.SYSTEM_LIBRARIES;
}
IJavaSearchScope searchScope = SearchEngine.createJavaSearchScope(elements, constraints);
MainMethodSearchEngine engine = new MainMethodSearchEngine();
IType[] types = null;
try {
types = engine.searchMainMethods(getLaunchConfigurationDialog(), searchScope, fConsiderInheritedMainButton.getSelection());
} catch (InvocationTargetException e) {
setErrorMessage(e.getMessage());
return;
} catch (InterruptedException e) {
setErrorMessage(e.getMessage());
return;
}
Shell shell = getShell();
SelectionDialog dialog = new MainTypeSelectionDialog(shell, types);
dialog.setTitle(LauncherMessages.JavaMainTab_Choose_Main_Type_11); //$NON-NLS-1$
dialog.setMessage(LauncherMessages.JavaMainTab_Choose_a_main__type_to_launch__12); //$NON-NLS-1$
if (dialog.open() == Window.CANCEL) {
return;
}
Object[] results = dialog.getResult();
if ((results == null) || (results.length < 1)) {
return;
}
IType type = (IType)results[0];
if (type != null) {
fMainText.setText(type.getFullyQualifiedName());
javaProject = type.getJavaProject();
fProjText.setText(javaProject.getElementName());
}
}