Java tutorial
/* * Copyright (C) 2006-2015 Ronald Blankendaal * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.dbgl.gui; /* * 0. title, choose A) install game, B) pre-installed game * * Install: * 1 choose install.exe, add mount c data\tmpinst to mounts, start installer, end with exit * 2 ask for patch, if available have the user copy the files into data\tmpinst and run exe * * Pre-installed: * 3 choose main+setup for just installed game using combo * 4 choose main+setup for pre-installed game using browse * 5 suggest moving game into dosroot, have the user choose the exact location * 6 choose template, machine, core, cycles, mounts */ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.core.GenericType; import javax.ws.rs.core.MediaType; import org.apache.commons.lang3.StringUtils; import org.dbgl.db.Database; import org.dbgl.gui.BrowseButton.BrowseType; import org.dbgl.gui.BrowseButton.CanonicalType; import org.dbgl.gui.LoadSharedConfDialog.SharedConfLoading; import org.dbgl.loopy.iso9660.ISO9660FileSystem; import org.dbgl.model.DosboxVersion; import org.dbgl.model.ExpProfile; import org.dbgl.model.KeyValuePair; import org.dbgl.model.Mount; import org.dbgl.model.NativeCommand; import org.dbgl.model.Profile; import org.dbgl.model.Template; import org.dbgl.model.WebProfile; import org.dbgl.model.conf.Conf; import org.dbgl.model.conf.SectionsWrapper; import org.dbgl.model.conf.Settings; import org.dbgl.model.conf.SharedConf; import org.dbgl.swtdesigner.SWTImageManager; import org.dbgl.util.FileUtils; import org.dbgl.util.StringRelatedUtils; import org.dbgl.util.searchengine.HotudSearchEngine; import org.dbgl.util.searchengine.MobyGamesSearchEngine; import org.dbgl.util.searchengine.PouetSearchEngine; import org.dbgl.util.searchengine.TheGamesDBSearchEngine; import org.dbgl.util.searchengine.WebSearchEngine; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.VerifyEvent; import org.eclipse.swt.events.VerifyListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.List; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; public class AddGameWizardDialog extends Wizard { final static java.util.List<WebSearchEngine> webSearchEngines = Arrays.asList( MobyGamesSearchEngine.getInstance(), PouetSearchEngine.getInstance(), HotudSearchEngine.getInstance(), TheGamesDBSearchEngine.getInstance()); private static final String[] CUST_STRINGS = new String[] { "", "", "", "", "", "", "", "" }; private Text title; private String developer, publisher, year, genre, notes; private String[] link = new String[] { "", "", "", "", "", "", "", "" }; private String[] linkTitle = new String[] { "", "", "", "", "", "", "", "" }; private final int[] customInts = new int[] { 0, 0 }; private Button moveImages, templateReload; private ToolItem loadSharedConfButton, engineSelector; private Button btnPreinstalledGame, btnGameNeedsToBeInstalled, btnInstallManual, btnPatchManual; private Combo main, setup; private Text mainText, setupText; private Text installExe, installParameters, patchExe, patchParameters, dstDirectory, imagesDstDirectory; private List mountingpoints; private File[] installedFiles; private java.util.List<File> orgImages; private List installedFilesList, orgImagesList; private Combo template; private Combo machine, core, cycles; private Database dbase; private java.util.List<DosboxVersion> dbversionsList; private java.util.List<Template> templatesList; private ExpProfile profile; private int templateIndex = -1; public AddGameWizardDialog(final Shell parent, final int style) { super(parent, style, Settings.getInstance().msg("dialog.addgamewizard.title"), "addgamewizard", false); } protected boolean init() { dbase = Database.getInstance(); try { dbversionsList = dbase.readDosboxVersionsList(); templatesList = dbase.readTemplatesList(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(bos); DosboxVersion dbversion = DosboxVersion.findDefault(dbversionsList); templateIndex = Template.indexOfDefault(templatesList); if (templateIndex != -1) { java.util.List<NativeCommand> nativeCommands = dbase.readNativeCommandsList(-1, templatesList.get(templateIndex).getId()); profile = new ExpProfile(new Conf((File) null, templatesList.get(templateIndex), dbversion, ps), nativeCommands); } else { java.util.List<NativeCommand> nativeCommands = dbase.readNativeCommandsList(-1, -1); profile = new ExpProfile(new Conf((File) null, (Template) null, dbversion, ps), nativeCommands); } developer = ""; publisher = ""; year = ""; genre = ""; notes = ""; return true; } catch (Exception e) { GeneralPurposeDialogs.warningMessage(getParent(), e); return false; } } protected void onExit() { try { org.apache.commons.io.FileUtils.deleteDirectory(FileUtils.getTmpInstallFile()); } catch (IOException e) { GeneralPurposeDialogs.warningMessage(shell, e); } } protected int stepSize(boolean up) { if (btnPreinstalledGame.getSelection()) { if ((up && stepNr == 0) || (!up && stepNr == 4)) return 4; // skip installing and patching and maincombo if ((up && stepNr == 4) || (!up && stepNr == 6)) return 2; // skip moving game data } else { if ((up && stepNr == 3) || (!up && stepNr == 5)) return 2; // skip maintext } return super.stepSize(up); } protected boolean isValidInput() { GeneralPurposeDialogs.initErrorDialog(); if (stepNr == 0) { return titleEntered(); } else if (stepNr == 1) { return installExeEntered(); } else if (stepNr == 2) { return true; } else if (stepNr == 3) { return mainExeEntered(); } else if (stepNr == 4) { return mainExeEntered(); } else if (stepNr == 5) { return conditionsOkForStep5(); } else if (stepNr == 6) { return true; } return true; } protected boolean actionAfterNext() { if (stepNr == 0) { return doWebSearch(); } else if (stepNr == 1) { return runInstallerAndCheckResults(); } else if (stepNr == 2) { return determineMainAndSetup(); } else if (stepNr == 3) { return setMain(); } else if (stepNr == 4) { return setMain(); } else if (stepNr == 5) { return true; } else if (stepNr == 6) { return createProfile(); } return false; } protected void doReloadTemplate(int templateIndex) { try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(bos); Conf templateConf = new Conf(templatesList.get(templateIndex), profile.getConf().getDbversion(), ps); profile.getConf().reloadTemplate(templateConf); selectSettingsByConfiguration(profile.getConf()); profile.setNativeCommandsList( dbase.readNativeCommandsList(-1, templatesList.get(templateIndex).getId())); if (bos.size() > 0) { GeneralPurposeDialogs.warningMessage(getParent(), bos.toString()); bos.reset(); } } catch (IOException | SQLException e) { GeneralPurposeDialogs.warningMessage(getParent(), e); } } protected void selectSettingsByConfiguration(Conf conf) { SectionsWrapper sections = conf.getSettings(); machine.setText(sections.getValue("dosbox", "machine")); core.setText(sections.getValue("cpu", "core")); cycles.setText(sections.getValue("cpu", "cycles")); } protected void updateConfigurationBySettings(Conf conf) { conf.updateValue("dosbox", "machine", machine.getText(), true); conf.updateValue("cpu", "core", core.getText(), true); conf.updateValue("cpu", "cycles", cycles.getText(), true); } protected void doAddMount() { final EditMountDialog addMountDialog = new EditMountDialog(shell); try { addMountDialog.setDefaultDriveletter( Mount.getFreeDriveletter(false, profile.getConf().nettoMountedDriveLetters())); } catch (Exception e) { // nothing we can do, just take default 'C' } String mount = (String) addMountDialog.open(); if (mount != null) { mountingpoints.setItems(profile.getConf().addMount(mount)); mountingpoints.select(mountingpoints.getItemCount() - 1); } } protected void doEditMount() { int mounts = mountingpoints.getItemCount(); int sel = mountingpoints.getSelectionIndex(); if (sel != -1) { final EditMountDialog editMountDialog = new EditMountDialog(shell); editMountDialog.setMount(mountingpoints.getItem(sel)); String mount = (String) editMountDialog.open(); if (mount != null) { mountingpoints.setItems(profile.getConf().editMount(sel, mount)); if (mountingpoints.getItemCount() == mounts) { mountingpoints.select(sel); } else { mountingpoints.select(mountingpoints.getItemCount() - 1); } } } } protected void doRemoveMount() { int mounts = mountingpoints.getItemCount(); int sel = mountingpoints.getSelectionIndex(); if (sel == -1 && mounts == 1) { sel = 0; mountingpoints.select(sel); } if (sel != -1) { mountingpoints.setItems(profile.getConf().removeMount(sel)); if (mountingpoints.getItemCount() == mounts) { mountingpoints.select(sel); } else { if (mountingpoints.getItemCount() > 0) { mountingpoints.select(mountingpoints.getItemCount() - 1); } } } } private boolean titleEntered() { if (title.getText().trim().length() <= 0) GeneralPurposeDialogs.addError(settings.msg("dialog.profile.required.title"), title); return !GeneralPurposeDialogs.displayErrorDialog(shell); } private boolean doWebSearch() { if ((Boolean) loadSharedConfButton.getData("selected")) { String currTitle = title.getText(); if (currTitle.length() >= 1) { try { Client client = ClientBuilder.newClient(); GenericType<java.util.List<SharedConf>> confType = new GenericType<java.util.List<SharedConf>>() { }; java.util.List<SharedConf> confs = client .target(settings.getSettings().getValue("confsharing", "endpoint")) .path("/configurations/bytitle/{i}").resolveTemplate("i", currTitle).request() .accept(MediaType.APPLICATION_XML).get(confType); client.close(); if (confs.size() == 0) { GeneralPurposeDialogs.infoMessage(shell, settings.msg("general.notice.searchenginenoresults", new String[] { EditProfileDialog.DBCONFWS, currTitle })); } else { SharedConfLoading result = (SharedConfLoading) new LoadSharedConfDialog(shell, currTitle, confs).open(); if (result != null) { profile.getConf().loadSharedConf(result.conf.getIncrConf(), result.reloadDosboxDefaults); selectSettingsByConfiguration(profile.getConf()); } } } catch (Exception e) { GeneralPurposeDialogs.warningMessage(shell, settings.msg( "general.error.retrieveinfosearchengine", new String[] { EditProfileDialog.DBCONFWS, currTitle, StringRelatedUtils.toString(e) }), e); } } } if ((Boolean) engineSelector.getData("selected")) { String currTitle = title.getText(); if (currTitle.length() >= 1) { WebSearchEngine engine = getSelectedSearchEngine(); try { WebProfile thisGame = null; java.util.List<WebProfile> webGamesList = engine.getEntries(currTitle, settings.getSettings().getValues(engine.getSimpleName(), "platform_filter")); if (webGamesList.size() >= 1) { BrowseSearchEngineDialog mobyDialog = new BrowseSearchEngineDialog(shell); mobyDialog.setProfilesToBrowse(currTitle, webGamesList); mobyDialog.setEngine(engine); Integer idx = (Integer) mobyDialog.open(); if (idx != null) { thisGame = webGamesList.get(idx); } } if (thisGame != null) { final WebProfile profExt = engine.getEntryDetailedInformation(thisGame); if (settings.getSettings().getBooleanValue(engine.getSimpleName(), "set_title")) title.setText(profExt.getTitle()); if (settings.getSettings().getBooleanValue(engine.getSimpleName(), "set_developer")) developer = profExt.getDeveloperName(); if (settings.getSettings().getBooleanValue(engine.getSimpleName(), "set_publisher")) publisher = profExt.getPublisherName(); if (settings.getSettings().getBooleanValue(engine.getSimpleName(), "set_year")) year = profExt.getYear(); if (settings.getSettings().getBooleanValue(engine.getSimpleName(), "set_genre")) genre = profExt.getGenre(); if (settings.getSettings().getBooleanValue(engine.getSimpleName(), "set_link")) { link[0] = profExt.getUrl(); linkTitle[0] = settings.msg("dialog.profile.searchengine.link.maininfo", new String[] { engine.getName() }); } if (settings.getSettings().getBooleanValue(engine.getSimpleName(), "set_description")) { notes = profExt.getNotes(); } if (settings.getSettings().getBooleanValue(engine.getSimpleName(), "set_rank")) { customInts[0] = profExt.getRank(); } } } catch (Exception e) { GeneralPurposeDialogs.warningMessage(shell, settings.msg("general.error.retrieveinfosearchengine", new String[] { engine.getName(), currTitle, StringRelatedUtils.toString(e) }), e); } } } if (btnGameNeedsToBeInstalled.getSelection() && StringUtils.isBlank(installExe.getText())) { profile.getConf().unmountDosboxMounts(); profile.getConf().addMount("mount C \"" + FileUtils.getTmpInstallFile() + "\""); mountingpoints.setItems(profile.getConf().getAutoexec().getMountingpoints()); } return true; } private boolean installExeEntered() { if (installExe.getText().trim().length() <= 0) GeneralPurposeDialogs.addError(settings.msg("dialog.addgamewizard.required.installexe"), installExe); return !GeneralPurposeDialogs.displayErrorDialog(shell); } private boolean runInstallerAndCheckResults() { try { org.apache.commons.io.FileUtils.deleteDirectory(FileUtils.getTmpInstallFile()); FileUtils.createDir(FileUtils.getTmpInstallFile()); profile.getConf().getAutoexec().setMainExecutable(installExe.getText(), installParameters.getText()); FileUtils.doRunInstaller(profile, profile.getConf(), dbversionsList, null, btnInstallManual.getSelection()); shell.forceFocus(); shell.forceActive(); orgImages = new ArrayList<File>(); File[] firstImageMountPath = profile.getConf().getFirstImageMountPath(); if (firstImageMountPath != null) { for (File f : firstImageMountPath) orgImages.add(FileUtils.canonicalToDosroot(f.getPath())); } java.util.List<File> additionalImageFiles = new ArrayList<File>(); for (File file : orgImages) { if (file.getName().toLowerCase().endsWith(FileUtils.CDIMAGES[1])) { // cue sheet File binFile = ISO9660FileSystem.parseCueSheet(file); if (binFile != null && file.getParentFile().equals(binFile.getParentFile())) { additionalImageFiles.add(FileUtils.canonicalToDosroot(binFile.getPath())); } } } orgImages.addAll(additionalImageFiles); installedFiles = FileUtils.getTmpInstallFile().listFiles(); if (installedFiles.length == 0) { GeneralPurposeDialogs.warningMessage(shell, settings.msg("dialog.addgamewizard.error.nofilesinstalled")); return false; } return true; } catch (IOException e) { GeneralPurposeDialogs.warningMessage(shell, e); return false; } } private boolean determineMainAndSetup() { if (patchExe.getText().trim().length() > 0) { try { profile.getConf().getAutoexec().setMainExecutable(patchExe.getText(), patchParameters.getText()); FileUtils.doRunInstaller(profile, profile.getConf(), dbversionsList, null, btnPatchManual.getSelection()); shell.forceFocus(); shell.forceActive(); } catch (IOException e) { GeneralPurposeDialogs.warningMessage(shell, e); return false; } } orgImagesList.removeAll(); if (orgImages != null) { for (File file : orgImages) { orgImagesList.add(FileUtils.makeRelativeToDosroot(file).getPath()); } } orgImagesList.selectAll(); orgImagesList.pack(); orgImagesList.getParent().layout(); installedFilesList.removeAll(); File gameDir = null; for (File file : installedFiles) { if (file.isDirectory()) { installedFilesList.add("[ " + FileUtils.makeRelativeToDosroot(file).getPath() + " ]"); if (gameDir == null) gameDir = file; } else { installedFilesList.add(FileUtils.makeRelativeToDosroot(file).getPath()); } } installedFilesList.selectAll(); installedFilesList.pack(); installedFilesList.getParent().layout(); moveImages.setEnabled(profile.getConf().countImageMounts() == 1); String imagesDirString = settings.getSettings().getValue("directory", "orgimages"); File imagesSubDir = gameDir != null ? new File(gameDir.getName(), imagesDirString) : new File(imagesDirString); imagesDstDirectory.setText(imagesSubDir.getPath()); java.util.List<File> executables = FileUtils.getExecutablesInDirRecursive(FileUtils.getTmpInstallFile()); main.removeAll(); setup.removeAll(); setup.add(""); for (File f : executables) { main.add(FileUtils.makeRelativeToDosroot(f).getPath()); setup.add(FileUtils.makeRelativeToDosroot(f).getPath()); } if (executables.isEmpty()) main.add(installExe.getText()); int mainFileIndex = FileUtils.findMostLikelyMainIndex(title.getText(), executables); if (mainFileIndex != -1) { main.select(mainFileIndex); } else { main.select(0); } int setupFileIndex = FileUtils.findSetupIndex(executables); if (setupFileIndex != -1) { setup.select(setupFileIndex + 1); } else { setup.select(0); } setup.setEnabled(setup.getItemCount() > 1); return true; } private boolean mainExeEntered() { if (btnPreinstalledGame.getSelection()) { if (mainText.getText().trim().length() <= 0) GeneralPurposeDialogs.addError(settings.msg("dialog.profile.required.mainexe"), mainText); } else { if (main.getText().trim().length() <= 0) GeneralPurposeDialogs.addError(settings.msg("dialog.profile.required.mainexe"), main); } return !GeneralPurposeDialogs.displayErrorDialog(shell); } private boolean setMain() { if (btnPreinstalledGame.getSelection()) { if (profile.getConf().getRequiredMount(false, mainText.getText()) != null) { profile.getConf().addRequiredMount(false, mainText.getText()); } profile.getConf().getAutoexec().setMainExecutable(mainText.getText(), ""); } else { if (profile.getConf().getRequiredMount(false, main.getText()) != null) { profile.getConf().addRequiredMount(false, main.getText()); } profile.getConf().getAutoexec().setMainExecutable(main.getText(), ""); } return true; } private boolean conditionsOkForStep5() { if (btnPreinstalledGame.getSelection()) return true; try { if (installedFilesList.getSelectionCount() > 0) { File destDir = new File(dstDirectory.getText()); if (!destDir.isDirectory()) { if (GeneralPurposeDialogs.confirmMessage(shell, settings.msg("dialog.addgamewizard.confirm.createdestinationdir", new String[] { destDir.toString() }))) { destDir.mkdirs(); } } if (!destDir.isDirectory()) { GeneralPurposeDialogs.addError(settings.msg("dialog.addgamewizard.error.destinationdirmissing", new String[] { destDir.toString() }), dstDirectory); } else { for (int i = 0; i < installedFiles.length; i++) { if (installedFilesList.isSelected(i)) { File destFile = new File(destDir, installedFiles[i].getName()); if (org.apache.commons.io.FileUtils.directoryContains(destDir, destFile)) { GeneralPurposeDialogs .addError(settings.msg("dialog.addgamewizard.error.gamedatadirexists", new String[] { destFile.toString() }), dstDirectory); } } } } } else { GeneralPurposeDialogs.addError(settings.msg("dialog.addgamewizard.error.gamedatamustbemoved"), installedFilesList); } return !GeneralPurposeDialogs.displayErrorDialog(shell); } catch (IOException e) { GeneralPurposeDialogs.warningMessage(shell, e); return false; } } private boolean createProfile() { try { String setupString = btnPreinstalledGame.getSelection() ? setupText.getText() : setup.getText(); if (installedFilesList.getSelectionCount() > 0) { File destDir = new File(dstDirectory.getText()); profile.getConf().getAutoexec().migrateTo(FileUtils.getTmpInstallFile(), destDir); profile.getConf().removeFloppyMounts(); profile.getConf().removeUnnecessaryMounts(); if (StringUtils.isNotBlank(setupString)) { setupString = FileUtils.makeRelativeTo(FileUtils.canonicalToDosroot(setupString), FileUtils.getTmpInstallFile()).getPath(); setupString = FileUtils.makeRelativeToDosroot(new File(destDir, setupString)).getPath(); } for (int i = 0; i < installedFiles.length; i++) { File src = installedFiles[i]; if (installedFilesList.isSelected(i)) { org.apache.commons.io.FileUtils.moveToDirectory(src, destDir, true); } } if (moveImages.getSelection()) { File imgDestDir = new File(destDir, imagesDstDirectory.getText()); FileUtils.createDir(imgDestDir); for (int i = 0; i < orgImages.size(); i++) { File src = orgImages.get(i); if (orgImagesList.isSelected(i)) { org.apache.commons.io.FileUtils.moveToDirectory(src, imgDestDir, true); profile.getConf().getAutoexec().migrateTo(src, new File(imgDestDir, src.getName())); } } } } String status = ""; boolean favorite = false; int devId = KeyValuePair.findIdByValue(dbase.readDevelopersList(), developer); int publId = KeyValuePair.findIdByValue(dbase.readPublishersList(), publisher); int genId = KeyValuePair.findIdByValue(dbase.readGenresList(), genre); int yrId = KeyValuePair.findIdByValue(dbase.readYearsList(), year); int statId = KeyValuePair.findIdByValue(dbase.readStatusList(), status); int[] custIDs = new int[] { 0, 0, 0, 0 }; for (int i = 0; i < 4; i++) { custIDs[i] = KeyValuePair.findIdByValue(dbase.readCustomList(i), ""); } dbase.startTransaction(); Profile newProfile = dbase.addOrEditProfile(title.getText(), developer, publisher, genre, year, status, notes, favorite, new String[] { setupString, "", "" }, new String[] { "", "", "" }, devId, publId, genId, yrId, statId, profile.getDbversionId(), link, linkTitle, CUST_STRINGS, customInts, custIDs, -1); dbase.saveNativeCommands(profile.getNativeCommandsList(), newProfile.getId(), -1); String confString = FileUtils.constructUniqueConfigFileString(newProfile.getId(), title.getText(), profile.getConf().getAutoexec().isIncomplete() ? null : profile.getConf().getAutoexec().getCanonicalMainDir()); String capturesString = FileUtils.constructCapturesDir(newProfile.getId()); FileUtils.createDir(FileUtils.canonicalToData(capturesString)); newProfile = dbase.updateProfileConf(confString, capturesString, newProfile.getId()); updateConfigurationBySettings(profile.getConf()); profile.getConf().injectOrUpdateProfile(newProfile); profile.getConf().save(); dbase.commitTransaction(); result = newProfile; } catch (IOException | SQLException e) { GeneralPurposeDialogs.warningMessage(shell, e); try { dbase.rollbackTransaction(); } catch (SQLException se) { GeneralPurposeDialogs.warningMessage(shell, se); } } finally { dbase.finishTransaction(); } return true; } private WebSearchEngine getSearchEngineBySimpleName(String simpleName) { for (WebSearchEngine engn : webSearchEngines) { if (engn.getSimpleName().equalsIgnoreCase(simpleName)) return engn; } return null; } private WebSearchEngine getSelectedSearchEngine() { WebSearchEngine engine = null; for (WebSearchEngine engn : webSearchEngines) { if (engn.getName().equals(engineSelector.getData("engine"))) engine = engn; } return engine; } protected void fillPages() { addStep(page0()); addStep(page1()); addStep(page2()); addStep(page3()); addStep(page4()); addStep(page5()); addStep(page6()); } private Control page0() { final Group group = new Group(shell, SWT.NONE); group.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); group.setText(settings.msg("dialog.addgamewizard.step1")); group.setLayout(new GridLayout(4, false)); final Label titleLabel = new Label(group, SWT.NONE); titleLabel.setText(settings.msg("dialog.profile.title")); title = new Text(group, SWT.BORDER); title.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); title.setFocus(); WebSearchEngine defaultEngine = getSearchEngineBySimpleName( settings.getSettings().getValue("gui", "searchengine")); if (defaultEngine == null) defaultEngine = webSearchEngines.get(0); final ToolBar toolBar = new ToolBar(group, SWT.FLAT); engineSelector = new ToolItem(toolBar, SWT.DROP_DOWN); boolean engineEnabledByDefault = settings.getSettings().getBooleanValue("addgamewizard", "consultsearchengine"); if (engineEnabledByDefault) engineSelector.setImage(SWTImageManager.getResourceImage(shell.getDisplay(), defaultEngine.getIcon())); else engineSelector.setImage(SWTImageManager.createDisabledImage( SWTImageManager.getResourceImage(shell.getDisplay(), defaultEngine.getIcon()))); engineSelector.setData("selected", engineEnabledByDefault); engineSelector.setToolTipText( settings.msg("dialog.profile.consultsearchengine", new String[] { defaultEngine.getName() })); engineSelector.setData("engine", defaultEngine.getName()); final Menu menu = new Menu(shell, SWT.POP_UP); for (final WebSearchEngine engine : webSearchEngines) { MenuItem item = new MenuItem(menu, SWT.PUSH); item.setImage(SWTImageManager.getResourceImage(shell.getDisplay(), engine.getIcon())); item.setText(engine.getName()); item.addSelectionListener(new SelectionAdapter() { public void widgetSelected(final SelectionEvent event) { MenuItem sel = (MenuItem) event.widget; engineSelector.setImage(sel.getImage()); engineSelector.setData("engine", sel.getText()); engineSelector.setToolTipText(settings.msg("dialog.profile.consultsearchengine", new String[] { engineSelector.getData("engine").toString() })); engineSelector.setData("selected", true); settings.getSettings().setBooleanValue("addgamewizard", "consultsearchengine", true); settings.getSettings().setValue("gui", "searchengine", engine.getSimpleName()); } }); } engineSelector.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { if (event.detail == SWT.ARROW) { Rectangle rect = engineSelector.getBounds(); Point pt = new Point(rect.x, rect.y + rect.height); pt = toolBar.toDisplay(pt); menu.setLocation(pt.x, pt.y); menu.setVisible(true); } else { WebSearchEngine engine = getSelectedSearchEngine(); boolean engineEnabled = !((Boolean) engineSelector.getData("selected")); if (engineEnabled) engineSelector .setImage(SWTImageManager.getResourceImage(shell.getDisplay(), engine.getIcon())); else engineSelector.setImage(SWTImageManager.createDisabledImage( SWTImageManager.getResourceImage(shell.getDisplay(), engine.getIcon()))); engineSelector.setData("selected", engineEnabled); settings.getSettings().setBooleanValue("addgamewizard", "consultsearchengine", engineEnabled); } } }); loadSharedConfButton = new ToolItem(toolBar, SWT.PUSH); boolean loadSharedConfEnabledByDefault = settings.getSettings().getBooleanValue("addgamewizard", "consultdbconfws"); if (loadSharedConfEnabledByDefault) loadSharedConfButton .setImage(SWTImageManager.getResourceImage(shell.getDisplay(), SWTImageManager.IMG_SHARE)); else loadSharedConfButton.setImage(SWTImageManager.createDisabledImage( SWTImageManager.getResourceImage(shell.getDisplay(), SWTImageManager.IMG_SHARE))); loadSharedConfButton.setData("selected", loadSharedConfEnabledByDefault); loadSharedConfButton.setToolTipText( settings.msg("button.consultconfsearchengine", new String[] { EditProfileDialog.DBCONFWS })); loadSharedConfButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(final SelectionEvent event) { if ((Boolean) loadSharedConfButton.getData("selected")) { loadSharedConfButton.setImage(SWTImageManager.createDisabledImage( SWTImageManager.getResourceImage(shell.getDisplay(), SWTImageManager.IMG_SHARE))); loadSharedConfButton.setData("selected", false); settings.getSettings().setBooleanValue("addgamewizard", "consultdbconfws", false); } else { loadSharedConfButton.setImage( SWTImageManager.getResourceImage(shell.getDisplay(), SWTImageManager.IMG_SHARE)); loadSharedConfButton.setData("selected", true); settings.getSettings().setBooleanValue("addgamewizard", "consultdbconfws", true); } } }); Composite composite = new Composite(group, SWT.NONE); composite.setLayout(new GridLayout()); GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false, 4, 1); gd.verticalIndent = 20; composite.setLayoutData(gd); final Label thisGameLabel = new Label(composite, SWT.NONE); thisGameLabel.setText(settings.msg("dialog.addgamewizard.thisgame")); btnPreinstalledGame = new Button(composite, SWT.RADIO); btnPreinstalledGame.setText(settings.msg("dialog.addgamewizard.preinstalled")); btnGameNeedsToBeInstalled = new Button(composite, SWT.RADIO); btnGameNeedsToBeInstalled.setText(settings.msg("dialog.addgamewizard.notyetinstalled")); boolean requiresInstallation = settings.getSettings().getBooleanValue("addgamewizard", "requiresinstallation"); btnPreinstalledGame.setSelection(!requiresInstallation); btnGameNeedsToBeInstalled.setSelection(requiresInstallation); SelectionAdapter adapter = new SelectionAdapter() { public void widgetSelected(final SelectionEvent event) { settings.getSettings().setBooleanValue("addgamewizard", "requiresinstallation", event.widget == btnGameNeedsToBeInstalled); } }; btnPreinstalledGame.addSelectionListener(adapter); btnGameNeedsToBeInstalled.addSelectionListener(adapter); return group; } private Control page1() { final Group group = new Group(shell, SWT.NONE); group.setText(settings.msg("dialog.addgamewizard.step2")); group.setLayout(new GridLayout()); Composite installexeComposite = new Composite(group, SWT.NONE); installexeComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); installexeComposite.setLayout(new GridLayout(3, false)); final Label mainExeLabel = new Label(installexeComposite, SWT.NONE); mainExeLabel.setText(settings.msg("dialog.addgamewizard.installexe")); installExe = new Text(installexeComposite, SWT.BORDER); installExe.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); final BrowseButton installexeBrowseButton = new BrowseButton(installexeComposite, SWT.NONE); installexeBrowseButton.connect(shell, installExe, null, BrowseType.FILE, CanonicalType.INSTALLER, false, null); final Label parametersLabel = new Label(installexeComposite, SWT.NONE); parametersLabel.setText(settings.msg("dialog.profile.mainparameters")); installParameters = new Text(installexeComposite, SWT.BORDER); installParameters.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1)); final Label manualLabel = new Label(installexeComposite, SWT.NONE); manualLabel.setText(settings.msg("dialog.addgamewizard.manualmode")); btnInstallManual = new Button(installexeComposite, SWT.CHECK); btnInstallManual.setText(settings.msg("dialog.addgamewizard.manualmodeinfo")); btnInstallManual.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false, 2, 1)); final Group mountGroup = new Group(group, SWT.NONE); GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false); gd.verticalIndent = 20; mountGroup.setLayoutData(gd); mountGroup.setText(settings.msg("dialog.template.mountingoverview")); mountGroup.setLayout(new GridLayout(2, false)); mountingpoints = new List(mountGroup, SWT.V_SCROLL | SWT.BORDER); mountingpoints.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 3)); mountingpoints.addMouseListener(new MouseAdapter() { public void mouseDoubleClick(final MouseEvent event) { if (mountingpoints.getSelectionIndex() == -1) { doAddMount(); } else { doEditMount(); } } }); final Button addButton = new Button(mountGroup, SWT.NONE); addButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false)); addButton.setText(settings.msg("dialog.template.mount.add")); addButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(final SelectionEvent event) { doAddMount(); } }); final Button editButton = new Button(mountGroup, SWT.NONE); editButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false)); editButton.setText(settings.msg("dialog.template.mount.edit")); editButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(final SelectionEvent event) { doEditMount(); } }); final Button removeButton = new Button(mountGroup, SWT.NONE); removeButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false)); removeButton.setText(settings.msg("dialog.template.mount.remove")); removeButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(final SelectionEvent event) { doRemoveMount(); } }); VerifyListener addMountListener = new VerifyListener() { public void verifyText(final VerifyEvent event) { if (event.text.length() > 1) { addMountIfNoMounts(event.text); } } }; installExe.addVerifyListener(addMountListener); Group associationGroup = new Group(group, SWT.NONE); associationGroup.setText(settings.msg("dialog.template.association")); associationGroup.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); associationGroup.setLayout(new GridLayout(2, false)); final Label dbversionLabel = new Label(associationGroup, SWT.NONE); dbversionLabel.setText(settings.msg("dialog.template.dosboxversion")); final Combo dbversion = new Combo(associationGroup, SWT.READ_ONLY); dbversion.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); dbversion.setVisibleItemCount(20); for (DosboxVersion dbv : dbversionsList) { dbversion.add(dbv.getTitle()); } int dbversionIndex = DosboxVersion.findIndexById(dbversionsList, profile.getDbversionId()); dbversion.select(dbversionIndex); dbversion.addSelectionListener(new SelectionAdapter() { public void widgetSelected(final SelectionEvent event) { try { String[] mounts = profile.getConf().getAutoexec().getMountingpoints(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(bos); Conf newDosboxVersion = new Conf(dbversionsList.get(dbversion.getSelectionIndex()), ps); profile.getConf().switchToDosboxVersion(newDosboxVersion); profile.setDbversionId(newDosboxVersion.getDbversion().getId()); profile.getConf().unmountDosboxMounts(); for (String m : mounts) profile.getConf().addMount(m); mountingpoints.setItems(profile.getConf().getAutoexec().getMountingpoints()); if (bos.size() > 0) { GeneralPurposeDialogs.warningMessage(getParent(), bos.toString()); bos.reset(); } } catch (IOException e) { GeneralPurposeDialogs.warningMessage(getParent(), e); } } }); return group; } private void addMountIfNoMounts(final String hostFileLocation) { profile.getConf().unmountDosboxMounts(); profile.getConf().addMount("mount C \"" + FileUtils.getTmpInstallFile() + "\""); mountingpoints.setItems(profile.getConf().addRequiredMountForInstaller(hostFileLocation)); } private Control page2() { final Group group = new Group(shell, SWT.NONE); group.setText(settings.msg("dialog.addgamewizard.step3")); // patch group.setLayout(new GridLayout()); Composite patchexeComposite = new Composite(group, SWT.NONE); patchexeComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); patchexeComposite.setLayout(new GridLayout(3, false)); final Label patchExeLabel = new Label(patchexeComposite, SWT.NONE); patchExeLabel.setText(settings.msg("dialog.addgamewizard.patcherexe")); patchExe = new Text(patchexeComposite, SWT.BORDER); patchExe.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); final BrowseButton patchexeBrowseButton = new BrowseButton(patchexeComposite, SWT.NONE); patchexeBrowseButton.connect(shell, patchExe, null, BrowseType.FILE, CanonicalType.INSTALLER, false, null); final Label parametersLabel = new Label(patchexeComposite, SWT.NONE); parametersLabel.setText(settings.msg("dialog.profile.mainparameters")); patchParameters = new Text(patchexeComposite, SWT.BORDER); patchParameters.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1)); final Label manualLabel = new Label(patchexeComposite, SWT.NONE); manualLabel.setText(settings.msg("dialog.addgamewizard.manualmode")); btnPatchManual = new Button(patchexeComposite, SWT.CHECK); btnPatchManual.setText(settings.msg("dialog.addgamewizard.manualpatchmodeinfo")); btnPatchManual.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false, 2, 1)); return group; } private Control page3() { final Group group = new Group(shell, SWT.NONE); group.setText(settings.msg("dialog.addgamewizard.step4")); group.setLayout(new GridLayout()); Composite composite = new Composite(group, SWT.NONE); composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); composite.setLayout(new GridLayout(2, false)); final Label mainExeLabel = new Label(composite, SWT.NONE); mainExeLabel.setText(settings.msg("dialog.profile.mainexe")); main = new Combo(composite, SWT.READ_ONLY); main.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); final Label setupExeLabel = new Label(composite, SWT.NONE); setupExeLabel.setText(settings.msg("dialog.profile.setupexe")); setup = new Combo(composite, SWT.READ_ONLY); setup.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); return group; } private Control page4() { final Group group = new Group(shell, SWT.NONE); group.setText(settings.msg("dialog.addgamewizard.step4")); group.setLayout(new GridLayout()); Composite composite = new Composite(group, SWT.NONE); composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); composite.setLayout(new GridLayout(3, false)); final Label mainExeLabel = new Label(composite, SWT.NONE); mainExeLabel.setText(settings.msg("dialog.profile.mainexe")); mainText = new Text(composite, SWT.BORDER); mainText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); final BrowseButton mainBrowseButton = new BrowseButton(composite, SWT.NONE); mainBrowseButton.connect(shell, mainText, null, BrowseType.FILE, CanonicalType.EXE, false, null); final Label setupExeLabel = new Label(composite, SWT.NONE); setupExeLabel.setText(settings.msg("dialog.profile.setupexe")); setupText = new Text(composite, SWT.BORDER); setupText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); final BrowseButton setupBrowseButton = new BrowseButton(composite, SWT.NONE); setupBrowseButton.connect(shell, setupText, mainText, BrowseType.FILE, CanonicalType.EXE, false, null); return group; } private Control page5() { final Group group = new Group(shell, SWT.NONE); group.setText(settings.msg("dialog.addgamewizard.step5")); group.setLayout(new GridLayout()); final Group installedFilesGroup = new Group(group, SWT.NONE); installedFilesGroup.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); installedFilesGroup.setLayout(new GridLayout(3, false)); installedFilesGroup.setText(settings.msg("dialog.addgamewizard.installedfiles")); installedFilesList = new List(installedFilesGroup, SWT.V_SCROLL | SWT.BORDER | SWT.MULTI); installedFilesList.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1)); final Label toLabel = new Label(installedFilesGroup, SWT.NONE); toLabel.setText(settings.msg("dialog.migration.to")); dstDirectory = new Text(installedFilesGroup, SWT.BORDER); dstDirectory.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); dstDirectory.setText(FileUtils.getDosRoot()); final BrowseButton fromBrowseButton = new BrowseButton(installedFilesGroup, SWT.NONE); fromBrowseButton.connect(shell, dstDirectory, null, BrowseType.DIR, CanonicalType.NONE, false, null); final Group orgImagesGroup = new Group(group, SWT.NONE); orgImagesGroup.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); orgImagesGroup.setLayout(new GridLayout(3, false)); orgImagesGroup.setText(settings.msg("dialog.addgamewizard.originalimages")); orgImagesList = new List(orgImagesGroup, SWT.V_SCROLL | SWT.BORDER | SWT.MULTI); orgImagesList.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1)); final Label moveImagesLabel = new Label(orgImagesGroup, SWT.NONE); moveImagesLabel.setText(settings.msg("dialog.addgamewizard.moveimages")); moveImages = new Button(orgImagesGroup, SWT.CHECK); new Label(orgImagesGroup, SWT.NONE); final Label imagesToLabel = new Label(orgImagesGroup, SWT.NONE); imagesToLabel.setText(settings.msg("dialog.migration.to")); imagesDstDirectory = new Text(orgImagesGroup, SWT.BORDER); imagesDstDirectory.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); new Label(orgImagesGroup, SWT.NONE); moveImages.addSelectionListener(new SelectionAdapter() { public void widgetSelected(final SelectionEvent event) { imagesDstDirectory.setEnabled(moveImages.getSelection()); } }); imagesDstDirectory.setEnabled(moveImages.getSelection()); return group; } private Control page6() { final Group group = new Group(shell, SWT.NONE); group.setText(settings.msg("dialog.addgamewizard.step6")); group.setLayout(new GridLayout(3, false)); final Label templateLabel = new Label(group, SWT.NONE); templateLabel.setText(settings.msg("dialog.profile.template")); template = new Combo(group, SWT.READ_ONLY); template.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); template.setVisibleItemCount(10); for (Template templ : templatesList) { template.add(templ.getTitle()); } if (templateIndex != -1) { template.select(templateIndex); } templateReload = new Button(group, SWT.NONE); templateReload.setText(settings.msg("dialog.profile.reloadsettings")); templateReload.setToolTipText(settings.msg("dialog.profile.reloadsettings.tooltip")); templateReload.addSelectionListener(new SelectionAdapter() { public void widgetSelected(final SelectionEvent event) { if (template.getSelectionIndex() != -1) { doReloadTemplate(template.getSelectionIndex()); } } }); final Label machineLabel = new Label(group, SWT.NONE); machineLabel.setText(settings.msg("dialog.template.machine")); machine = new Combo(group, SWT.READ_ONLY); machine.setLayoutData(new GridData()); machine.setVisibleItemCount(20); machine.setToolTipText(settings.msg("dialog.template.machine.tooltip")); if (profile.getConf().getSettings().detectDosboxVersionGeneration() >= 3) { machine.setItems(settings.getSettings().getValues("profile", "machine073")); } else { machine.setItems(settings.getSettings().getValues("profile", "machine")); } new Label(group, SWT.NONE); final Label coreLabel = new Label(group, SWT.NONE); coreLabel.setText(settings.msg("dialog.template.core")); core = new Combo(group, SWT.READ_ONLY); core.setLayoutData(new GridData()); core.setToolTipText(settings.msg("dialog.template.core.tooltip")); core.setItems(settings.getSettings().getValues("profile", "core")); new Label(group, SWT.NONE); final Label cyclesLabel = new Label(group, SWT.NONE); cyclesLabel.setText(settings.msg("dialog.template.cycles")); cycles = new Combo(group, SWT.NONE); cycles.setLayoutData(new GridData(100, SWT.DEFAULT)); cycles.setVisibleItemCount(15); cycles.setToolTipText(settings.msg("dialog.template.cycles.tooltip")); cycles.setItems(settings.getSettings().getValues("profile", "cycles")); new Label(group, SWT.NONE); selectSettingsByConfiguration(profile.getConf()); return group; } }