package thahn.java.agui.ide.eclipse.preferences; import java.io.File; import java.nio.file.Paths; import java.util.List; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import thahn.java.agui.AguiConstants; import thahn.java.agui.ide.eclipse.wizard.AguiPlugin; import thahn.java.agui.ide.eclipse.wizard.TextUtils; import thahn.java.agui.res.ManifestParser; import thahn.java.agui.res.ManifestParser.ManifestInfo; import com.google.common.base.Strings; import com.google.common.collect.Lists; public class AguiPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { public AguiPreferencePage() { } public static final String PAGE_ID = "thahn.java.agui.ide.eclipse.preferences.AguiPreferencePage"; private Text sdkLocationText; private Table sdkJarTable; private List<AguiSdkInfo> sdkLists = Lists.newArrayList(); /** * Initialize the preference page. */ public void init(IWorkbench workbench) { // Initialize the preference page } /** * Create contents of the preference page. * @param parent */ @Override public Control createContents(Composite parent) { Composite container = new Composite(parent, SWT.NULL); container.setLayout(new GridLayout(3, false)); Label lblAguiPreferences = new Label(container, SWT.NONE); lblAguiPreferences.setText("Agui Preferences"); new Label(container, SWT.NONE); new Label(container, SWT.NONE); Label lblAguiSdkFolder = new Label(container, SWT.NONE); lblAguiSdkFolder.setAlignment(SWT.CENTER); lblAguiSdkFolder.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false, 1, 1)); lblAguiSdkFolder.setText("SDK Location"); sdkLocationText = new Text(container, SWT.BORDER); sdkLocationText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); Button btnBrowse = new Button(container, SWT.NONE); btnBrowse.setText("Browse"); Label lblSdkVersion = new Label(container, SWT.NONE); lblSdkVersion.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false, 3, 1)); lblSdkVersion.setText("Choose SDK Version"); sdkJarTable = new Table(container, SWT.BORDER | SWT.FULL_SELECTION); sdkJarTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1)); sdkJarTable.setHeaderVisible(true); sdkJarTable.setLinesVisible(true); // selection listener btnBrowse.addSelectionListener(browseSelectionListener); sdkJarTable.addSelectionListener(tableSelectionListener); sdkLocationText.addKeyListener(sdkLocationkeyListener); // set default String sdkLocation = AguiPrefs.getInstance().getSdkLocation(); if (!Strings.isNullOrEmpty(sdkLocation)) { sdkLocationText.setText(sdkLocation); } // init table initTable(); return container; } private void initTable() { // insert table item String[] columns = new String[]{"Target Name", "Version", "API Level"}; for (String columnText : columns) { TableColumn column = new TableColumn(sdkJarTable, SWT.NONE); column.setText(columnText); } // refresh table refreshTable(); // pack column for (TableColumn column : sdkJarTable.getColumns()) { column.pack(); } } private void refreshTable() { // clean all cleanTable(); // platforms path String sdkLocation = AguiPrefs.getInstance().getSdkLocation(); if (Strings.isNullOrEmpty(sdkLocation)) { return ; } // refresh table File platformsFile = Paths.get(sdkLocation, AguiConstants.PATH_PLATFORMS).toFile(); File[] lists = platformsFile.listFiles(); if (lists != null) { for (File item : lists) { AguiSdkInfo aguiSdkInfo = new AguiSdkInfo(); String name = item.getName(); File manifestBaseDir = Paths.get(platformsFile.getAbsolutePath(), name, "data").toFile(); ManifestParser manifestParser = new ManifestParser(null); manifestParser.parse(manifestBaseDir.getAbsolutePath()); ManifestInfo manifestInfo = manifestParser.getManifestInfo(); aguiSdkInfo.sdkBasePath = manifestBaseDir.getParent(); aguiSdkInfo.manifestInfo = manifestInfo; sdkLists.add(aguiSdkInfo); if (manifestInfo != null) { TableItem tableItem = new TableItem(sdkJarTable, SWT.NONE); tableItem.setText(new String[]{name, manifestInfo.versionName, manifestInfo.versionCode}); } else { AguiPlugin.displayError("Manifest Error", "manifest parsing error"); } if (!Paths.get(aguiSdkInfo.sdkBasePath, thahn.java.agui.ide.eclipse.project.AguiConstants.AGUI_SDK_JAR).toFile().exists()) { AguiPlugin.displayError("agui_sdk.jar", "agui_sdk.jar not exists in " + aguiSdkInfo.sdkBasePath); } } } else { AguiPlugin.displayError("No Sdk Lib", "the sdk lib does not exist for agui."); } if (sdkJarTable.getSelectionIndex() == -1) { String versionCode = AguiPrefs.getInstance().getSdkVersionSelection(); if (versionCode == null) { sdkJarTable.select(0); AguiPrefs.getInstance().setSdkVersionSelection(sdkLists.get(0).manifestInfo.versionCode); AguiPrefs.getInstance().setSdkJarLocation(sdkLists.get(0).sdkBasePath); } else { for (int i = 0; i < sdkLists.size(); i++) { AguiSdkInfo aguiSdkInfo = sdkLists.get(i); if (versionCode.equals(aguiSdkInfo.manifestInfo.versionCode)) { sdkJarTable.select(i); break; } } } } } private void cleanTable() { sdkLists.clear(); sdkJarTable.removeAll(); } private void setSdkLocation(String text) { AguiPrefs.getInstance().setSdkLocation(text); refreshTable(); } private SelectionListener browseSelectionListener = new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.OPEN | SWT.SHEET); if (TextUtils.isNullorEmpty(sdkLocationText.getText())) { dialog.setText(sdkLocationText.getText()); } String path = dialog.open(); if (path != null) { sdkLocationText.setText(path); if (new File(path).exists()) { setSdkLocation(path); } else { cleanTable(); AguiPlugin.displayError("Error", "Xml format is wrong"); } } else { cleanTable(); } } @Override public void widgetDefaultSelected(SelectionEvent e) { } }; private SelectionListener tableSelectionListener = new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { int index = sdkJarTable.getSelectionIndex(); if (index != -1) { for (AguiSdkInfo item : sdkLists) { AguiPrefs.getInstance().setSdkVersionSelection(item.manifestInfo.versionCode); AguiPrefs.getInstance().setSdkJarLocation(item.sdkBasePath); break; } } } @Override public void widgetDefaultSelected(SelectionEvent e) { } }; private KeyListener sdkLocationkeyListener = new KeyListener() { @Override public void keyReleased(KeyEvent e) { String text = sdkLocationText.getText(); if (!Strings.isNullOrEmpty(text) && new File(text).exists()) { setSdkLocation(text); } else { cleanTable(); AguiPlugin.displayError("Invalid", "Invalid path"); } } @Override public void keyPressed(KeyEvent e) { } }; @Override protected void performApply() { super.performApply(); } @Override public boolean performOk() { return super.performOk(); // AguiPrefs.getInstance().setSdkLocation(text); // AguiPrefs.getInstance().setSdkJarLocation(item.sdkBasePath); // AguiPrefs.getInstance().setSdkVersionSelection(item.manifestInfo.versionCode); } public class AguiSdkInfo { public String sdkBasePath; public ManifestInfo manifestInfo; } }