source: AE/installer2/src/net/oni2/aeinstaller/gui/MainWin.java@ 658

Last change on this file since 658 was 658, checked in by alloc, 12 years ago

AEI2 0.99i:

  • Lots of refactorings for the GUI:
    • Global type for the mod info box (Main, Tools, Core)
    • Same table for Main, Tools, Core
File size: 25.2 KB
RevLine 
[591]1package net.oni2.aeinstaller.gui;
2
[627]3import java.awt.BorderLayout;
[608]4import java.awt.Desktop;
[632]5import java.awt.GridLayout;
[608]6import java.awt.event.ActionEvent;
[627]7import java.awt.event.ItemEvent;
8import java.awt.event.ItemListener;
[604]9import java.io.File;
[623]10import java.net.URL;
[634]11import java.util.Date;
[605]12import java.util.HashMap;
13import java.util.HashSet;
[591]14import java.util.ResourceBundle;
15import java.util.TreeMap;
[600]16import java.util.TreeSet;
[605]17import java.util.Vector;
[591]18
[623]19import javax.swing.AbstractAction;
20import javax.swing.Icon;
21import javax.swing.ImageIcon;
[600]22import javax.swing.JButton;
[627]23import javax.swing.JCheckBox;
[591]24import javax.swing.JComboBox;
[604]25import javax.swing.JFileChooser;
[591]26import javax.swing.JFrame;
[592]27import javax.swing.JLabel;
[593]28import javax.swing.JMenu;
[608]29import javax.swing.JMenuItem;
[593]30import javax.swing.JOptionPane;
[627]31import javax.swing.JPanel;
[630]32import javax.swing.JRadioButton;
[658]33import javax.swing.JScrollPane;
[592]34import javax.swing.JSplitPane;
[591]35import javax.swing.SwingUtilities;
[631]36import javax.swing.ToolTipManager;
[604]37import javax.swing.filechooser.FileFilter;
[591]38
[623]39import net.oni2.aeinstaller.AEInstaller2;
40import net.oni2.aeinstaller.backend.AppExecution;
[604]41import net.oni2.aeinstaller.backend.Paths;
[591]42import net.oni2.aeinstaller.backend.Settings;
[593]43import net.oni2.aeinstaller.backend.Settings.Platform;
[600]44import net.oni2.aeinstaller.backend.SizeFormatter;
[591]45import net.oni2.aeinstaller.backend.depot.DepotManager;
[658]46import net.oni2.aeinstaller.backend.oni.InstallProgressListener;
47import net.oni2.aeinstaller.backend.oni.Installer;
48import net.oni2.aeinstaller.backend.oni.OniSplit;
[648]49import net.oni2.aeinstaller.backend.packages.Package;
50import net.oni2.aeinstaller.backend.packages.PackageManager;
51import net.oni2.aeinstaller.backend.packages.Type;
52import net.oni2.aeinstaller.backend.packages.download.ModDownloader;
[658]53import net.oni2.aeinstaller.backend.packages.download.ModDownloader.State;
[648]54import net.oni2.aeinstaller.backend.packages.download.ModDownloaderListener;
[593]55import net.oni2.aeinstaller.gui.about.AboutDialog;
[648]56import net.oni2.aeinstaller.gui.corepackages.CorePackagesDialog;
[605]57import net.oni2.aeinstaller.gui.downloadwindow.Downloader;
[600]58import net.oni2.aeinstaller.gui.modtable.DownloadSizeListener;
[631]59import net.oni2.aeinstaller.gui.modtable.ModSelectionListener;
60import net.oni2.aeinstaller.gui.modtable.ModTable;
[658]61import net.oni2.aeinstaller.gui.modtable.ModTable.ETableContentType;
62import net.oni2.aeinstaller.gui.packageinfobox.PackageInfoBox;
[591]63import net.oni2.aeinstaller.gui.settings.SettingsDialog;
[625]64import net.oni2.aeinstaller.gui.toolmanager.ToolManager;
[591]65
66import org.javabuilders.BuildResult;
67import org.javabuilders.annotations.DoInBackground;
68import org.javabuilders.event.BackgroundEvent;
69import org.javabuilders.swing.SwingJavaBuilder;
[593]70import org.simplericity.macify.eawt.ApplicationEvent;
71import org.simplericity.macify.eawt.ApplicationListener;
[591]72
73/**
74 * @author Christian Illy
75 */
[600]76public class MainWin extends JFrame implements ApplicationListener,
[631]77 DownloadSizeListener, ModSelectionListener {
[591]78 private static final long serialVersionUID = -4027395051382659650L;
79
[629]80 private ResourceBundle bundle = ResourceBundle
81 .getBundle("net.oni2.aeinstaller.localization."
82 + getClass().getSimpleName());
[591]83 @SuppressWarnings("unused")
84 private BuildResult result = SwingJavaBuilder.build(this, bundle);
85
[593]86 private JMenu mainMenu;
[623]87 private JMenu toolsMenu;
[641]88 private Vector<JMenuItem> toolsMenuItems = new Vector<JMenuItem>();
[593]89
[592]90 private JSplitPane contents;
91
[591]92 private JComboBox cmbModTypes;
[630]93 private JRadioButton radAll;
94 private JRadioButton radOnline;
95 private JRadioButton radLocal;
[658]96 private JScrollPane scrollMods;
[631]97 private ModTable tblMods;
[600]98 private JLabel lblDownloadSizeVal;
[591]99
[658]100 private PackageInfoBox pkgInfo;
101
[600]102 private JButton btnInstall;
103
[648]104 private TreeSet<Package> execCoreUpdates = new TreeSet<Package>();
105 private TreeSet<Package> execUpdates = null;
[621]106
[641]107 private enum EInstallState {
[621]108 DONE,
[641]109 READY,
110 ABORTED,
[621]111 OFFLINE,
[641]112 INCOMPATIBLE,
113 CHECKING
[621]114 };
115
[641]116 private EInstallState installState = EInstallState.DONE;
[648]117 private TreeSet<Package> installMods = null;
118 private TreeSet<Package> installDeps = null;
[621]119
[591]120 /**
121 * Constructor of main window.
122 */
123 public MainWin() {
[593]124 this.setTitle(SwingJavaBuilder.getConfig().getResource("appname")
125 + " - v"
126 + SwingJavaBuilder.getConfig().getResource("appversion"));
[591]127
[658]128 tblMods = new ModTable(ETableContentType.MODS);
129 tblMods.setVisible(false);
130 scrollMods.setViewportView(tblMods);
131
[651]132 contents.setDividerLocation(550);
[631]133 contents.setResizeWeight(0.4);
[593]134
135 if (Settings.getPlatform() == Platform.MACOS) {
136 mainMenu.setVisible(false);
137 }
[600]138
[631]139 ToolTipManager.sharedInstance().setInitialDelay(250);
140
[600]141 getRootPane().setDefaultButton(btnInstall);
[605]142 lblDownloadSizeVal.setText(SizeFormatter.format(0, 2));
[630]143 radAll.setSelected(true);
[631]144
145 tblMods.addModSelectionListener(this);
146 tblMods.addDownloadSizeListener(this);
[591]147 }
148
149 private void initModTypeBox() {
[592]150 cmbModTypes.removeAllItems();
151
[600]152 TreeMap<String, Type> types = new TreeMap<String, Type>();
[648]153 for (Type t : PackageManager.getInstance().getTypesWithContent()) {
[600]154 types.put(t.getName(), t);
[591]155 }
[630]156 cmbModTypes.addItem("-All-");
[600]157 for (Type t : types.values()) {
[591]158 cmbModTypes.addItem(t);
159 }
160 cmbModTypes.setSelectedIndex(0);
161 }
162
163 private void exit() {
164 dispose();
[608]165 System.exit(0);
[591]166 }
167
168 private void saveLocalData() {
169 Settings.getInstance().serializeToFile();
170 }
171
172 @DoInBackground(progressMessage = "updateDepot.title", cancelable = false, indeterminateProgress = false)
173 private void execDepotUpdate(final BackgroundEvent evt) {
[657]174 if (!Settings.getInstance().isOfflineMode()
175 && !Settings.getInstance().isNoCacheUpdateMode()) {
[634]176 long start = new Date().getTime();
177
[621]178 try {
[634]179 DepotManager.getInstance().updateInformation(false);
[621]180 } catch (Exception e) {
181 e.printStackTrace();
182 }
[634]183
184 System.out.println("Took: " + (new Date().getTime() - start)
185 + " msec");
[621]186 }
[633]187
[648]188 PackageManager.getInstance().init();
[631]189 tblMods.reloadData();
[621]190 initModTypeBox();
[600]191
[621]192 tblMods.setVisible(true);
193 }
194
195 @SuppressWarnings("unused")
196 private void checkUpdates(Object evtSource) {
197 if ((evtSource != this)
198 || Settings.getInstance().get("notifyupdates", true)) {
199 if (Settings.getInstance().isOfflineMode()) {
200 if (evtSource != this) {
[657]201 JOptionPane.showMessageDialog(
202 this,
203 SwingJavaBuilder.getConfig().getResource(
204 "offlineMode.text"),
205 SwingJavaBuilder.getConfig().getResource(
206 "offlineMode.title"),
[621]207 JOptionPane.WARNING_MESSAGE);
208 }
209 } else {
[657]210 TreeSet<Package> mods = PackageManager.getInstance()
211 .getUpdatableMods();
[648]212 TreeSet<Package> tools = PackageManager.getInstance()
[621]213 .getUpdatableTools();
214 int size = 0;
[632]215 JPanel panPackages = new JPanel(new GridLayout(0, 1));
[648]216 execUpdates = new TreeSet<Package>();
[632]217 execUpdates.addAll(mods);
218 execUpdates.addAll(tools);
[648]219 for (final Package m : mods) {
[621]220 size += m.getZipSize();
[632]221 JCheckBox check = new JCheckBox("Mod: " + m.getName());
222 check.setSelected(true);
223 check.addItemListener(new ItemListener() {
224 @Override
225 public void itemStateChanged(ItemEvent e) {
226 if (e.getStateChange() == ItemEvent.SELECTED)
227 execUpdates.add(m);
228 else
229 execUpdates.remove(m);
230 }
231 });
232 panPackages.add(check);
[621]233 }
[648]234 for (final Package m : tools) {
[621]235 size += m.getZipSize();
[632]236 JCheckBox check = new JCheckBox("Tool: " + m.getName());
237 check.setSelected(true);
238 panPackages.add(check);
[621]239 }
[622]240 if (size > 0) {
[627]241 // Build info dialog content
[632]242 JPanel packages = new JPanel(new BorderLayout(0, 7));
243 JLabel lblIntro = new JLabel("<html>"
244 + bundle.getString("updatesAvailable.text")
245 + "</html>");
246 JLabel lblSize = new JLabel("<html>"
247 + String.format(bundle
248 .getString("updatesAvailableSize.text"),
249 SizeFormatter.format(size, 3)) + "</html>");
250 packages.add(lblIntro, BorderLayout.NORTH);
251 packages.add(panPackages, BorderLayout.CENTER);
252 packages.add(lblSize, BorderLayout.SOUTH);
[627]253
[632]254 JPanel pan = new JPanel(new BorderLayout(0, 25));
255 pan.add(packages, BorderLayout.CENTER);
[627]256 JCheckBox checkFutureUpdates = new JCheckBox(
257 bundle.getString("checkOnStartup.text"));
258 checkFutureUpdates.setSelected(Settings.getInstance().get(
259 "notifyupdates", true));
260 checkFutureUpdates.addItemListener(new ItemListener() {
261 @Override
262 public void itemStateChanged(ItemEvent evt) {
263 Settings.getInstance().put("notifyupdates",
264 evt.getStateChange() == ItemEvent.SELECTED);
265 }
266 });
267 pan.add(checkFutureUpdates, BorderLayout.SOUTH);
268
269 // Show dialog
270 int res = JOptionPane.showConfirmDialog(this, pan,
[622]271 bundle.getString("updatesAvailable.title"),
272 JOptionPane.YES_NO_OPTION,
273 JOptionPane.QUESTION_MESSAGE);
[632]274 if (res == JOptionPane.NO_OPTION) {
275 execUpdates = null;
[622]276 }
[656]277 } else {
278 if (evtSource != this) {
279 JOptionPane.showMessageDialog(this,
280 bundle.getString("updatesNotAvailable.text"),
281 bundle.getString("updatesNotAvailable.title"),
282 JOptionPane.INFORMATION_MESSAGE);
283 }
[621]284 }
285 }
[591]286 }
287 }
288
[624]289 @SuppressWarnings("unused")
290 private void doUpdate() {
[632]291 if (execUpdates != null && execUpdates.size() > 0) {
[646]292 Downloader dl = new Downloader(execUpdates, null);
[624]293 try {
294 dl.setVisible(true);
295 if (dl.isFinished()) {
296 TreeSet<Integer> installed = Installer.getInstalledTools();
[648]297 TreeSet<Package> tools = new TreeSet<Package>();
298 for (Package m : execUpdates)
[624]299 if (m.isTool()
300 && installed.contains(m.getPackageNumber()))
301 tools.add(m);
302 if (tools.size() > 0) {
303 Installer.installTools(tools);
304 }
305 }
306 } finally {
307 dl.dispose();
308 }
[591]309 }
[621]310 execUpdates = null;
[591]311 }
312
313 @SuppressWarnings("unused")
314 private void focus() {
315 SwingUtilities.invokeLater(new Runnable() {
316
317 @Override
318 public void run() {
319 toFront();
320 repaint();
321 }
322 });
323
324 }
[646]325
[645]326 @SuppressWarnings("unused")
[648]327 private void showCorePackagesDialog() {
328 new CorePackagesDialog().setVisible(true);
[645]329 }
[591]330
331 private void showSettings() {
[593]332 new SettingsDialog().setVisible(true);
[591]333 }
334
[593]335 private void showAbout() {
336 new AboutDialog().setVisible(true);
337 }
338
[604]339 private JFileChooser getConfigOpenSaveDialog(boolean save) {
340 JFileChooser fc = new JFileChooser();
341 fc.setCurrentDirectory(Paths.getEditionBasePath());
342 if (save)
343 fc.setDialogType(JFileChooser.SAVE_DIALOG);
344 else
345 fc.setDialogType(JFileChooser.OPEN_DIALOG);
346 fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
347 fc.setFileFilter(new FileFilter() {
348 @Override
349 public String getDescription() {
350 return "XML files";
351 }
352
353 @Override
354 public boolean accept(File arg0) {
355 return (arg0.isDirectory())
356 || (arg0.getName().toLowerCase().endsWith(".xml"));
357 }
358 });
359 fc.setMultiSelectionEnabled(false);
360 return fc;
361 }
362
[593]363 @SuppressWarnings("unused")
364 private void loadConfig() {
[604]365 JFileChooser fc = getConfigOpenSaveDialog(false);
366 int res = fc.showOpenDialog(this);
367 if (res == JFileChooser.APPROVE_OPTION) {
368 if (fc.getSelectedFile().exists())
[631]369 tblMods.reloadSelection(fc.getSelectedFile());
[604]370 }
[593]371 }
372
373 @SuppressWarnings("unused")
374 private void saveConfig() {
[604]375 JFileChooser fc = getConfigOpenSaveDialog(true);
376 int res = fc.showSaveDialog(this);
377 if (res == JFileChooser.APPROVE_OPTION) {
378 File f = fc.getSelectedFile();
379 if (!f.getName().endsWith(".xml"))
380 f = new File(f.getParentFile(), f.getName() + ".xml");
[648]381 PackageManager.getInstance().saveModSelection(f,
[631]382 tblMods.getSelectedMods());
[604]383 }
[593]384 }
385
[600]386 @DoInBackground(progressMessage = "initializingEdition.title", cancelable = false, indeterminateProgress = false)
387 private void reglobalize(final BackgroundEvent evt) {
388 Installer.initializeEdition(new InstallProgressListener() {
389 @Override
390 public void installProgressUpdate(int done, int total, String step) {
391 evt.setProgressEnd(total);
392 evt.setProgressValue(done);
393 evt.setProgressMessage(step);
394 }
395 });
396 }
397
[593]398 @SuppressWarnings("unused")
[600]399 private void tools() {
[625]400 new ToolManager().setVisible(true);
[593]401 }
[596]402
[593]403 @SuppressWarnings("unused")
[623]404 private void refreshToolsMenu() {
405 for (JMenuItem i : toolsMenuItems) {
406 toolsMenu.remove(i);
407 }
408 toolsMenuItems.clear();
[648]409 for (Package m : PackageManager.getInstance().getInstalledTools()) {
[640]410 File exe = m.getExeFile();
411 if (exe != null && exe.exists()) {
[623]412 JMenuItem item = new JMenuItem();
413 final Vector<String> params = new Vector<String>();
[640]414 if (exe.getName().toLowerCase().endsWith(".jar")) {
415 File jre = null;
416 if (Settings.getPlatform() == Platform.WIN)
417 jre = new File(System.getProperties().getProperty(
418 "java.home"), "bin/javaw.exe");
419 else
420 jre = new File(System.getProperties().getProperty(
421 "java.home"), "bin/java");
422 params.add(jre.getPath());
423 params.add("-jar");
424 }
425 params.add(exe.getPath());
[623]426 final File wd = m.getWorkingDir();
427 Icon ico = null;
428 if (m.getIconFile() != null && m.getIconFile().exists()) {
429 ico = new ImageIcon(m.getIconFile().getPath());
430 } else {
[624]431 URL icon = AEInstaller2.class
432 .getResource("images/transparent.png");
[623]433 ico = new ImageIcon(icon);
434 }
435 item.setAction(new AbstractAction(m.getName(), ico) {
436 private static final long serialVersionUID = 1L;
437
438 @Override
439 public void actionPerformed(ActionEvent e) {
440 AppExecution.execute(params, wd);
441 }
442 });
443 toolsMenuItems.add(item);
444 toolsMenu.add(item);
445 }
446 }
447 }
448
[593]449 private void revertSelection() {
[631]450 tblMods.revertSelection();
[593]451 }
[658]452
[657]453 @SuppressWarnings("unused")
454 private void unSelectAll() {
455 tblMods.unSelectAll();
456 }
[593]457
[648]458 @DoInBackground(progressMessage = "checkCorePackages.title", cancelable = false, indeterminateProgress = false)
459 private void checkCorePackages(final BackgroundEvent evt) {
[621]460 if (!Settings.getInstance().isOfflineMode()) {
[648]461 for (Package m : PackageManager.getInstance().getCoreTools()) {
[621]462 if (m.isNewerAvailable()) {
[648]463 execCoreUpdates.add(m);
[621]464 }
[604]465 }
[648]466 for (Package m : PackageManager.getInstance().getCoreMods()) {
[621]467 if (m.isNewerAvailable()) {
[648]468 execCoreUpdates.add(m);
[621]469 }
[604]470 }
[648]471 if (execCoreUpdates.size() > 0) {
472 ModDownloader m = new ModDownloader(execCoreUpdates,
[621]473 new ModDownloaderListener() {
474 @Override
475 public void updateStatus(ModDownloader source,
[648]476 Package currentDownload, State state,
[646]477 int filesDown, int filesTotal,
[621]478 int bytesDown, int bytesTotal,
479 int duration, int remaining, int speed) {
480 evt.setProgressEnd(filesTotal);
481 evt.setProgressValue(filesDown);
482 }
483 });
484 while (!m.isFinished()) {
485 try {
486 Thread.sleep(10);
487 } catch (InterruptedException e) {
488 e.printStackTrace();
489 }
[604]490 }
491 }
[657]492 evt.setProgressMessage(bundle.getString("coreToolsInstall.title"));
493 Installer.installTools(PackageManager.getInstance().getCoreTools());
[604]494 }
[602]495 }
496
[641]497 @SuppressWarnings("unused")
[648]498 private void infoCorePackages() {
499 if (execCoreUpdates.size() > 0) {
[645]500 String packages = "";
[648]501 for (Package m : execCoreUpdates) {
[645]502 packages += String.format("\n - %s (%s)", m.getName(),
503 m.getVersion());
504 }
505 JOptionPane.showMessageDialog(this, String.format(
[648]506 bundle.getString("corePackagesUpdated.text"), packages),
507 bundle.getString("corePackagesUpdated.title"),
[645]508 JOptionPane.INFORMATION_MESSAGE);
509 }
510 }
511
512 @SuppressWarnings("unused")
[641]513 private void install() {
[648]514 TreeSet<Package> mods = new TreeSet<Package>();
515 mods.addAll(PackageManager.getInstance().getCoreMods());
[631]516 mods.addAll(tblMods.getSelectedMods());
[600]517
[648]518 installDeps = new TreeSet<Package>();
[646]519
[641]520 installState = EInstallState.CHECKING;
[605]521
[641]522 while (installState == EInstallState.CHECKING) {
[648]523 TreeSet<Package> toDownload = new TreeSet<Package>();
524 for (Package m : mods) {
[605]525 if (!m.isLocalAvailable())
526 toDownload.add(m);
527 }
[657]528 if (toDownload.size() > 0 && Settings.getInstance().isOfflineMode()) {
[641]529 installState = EInstallState.OFFLINE;
[621]530 break;
531 }
[605]532 if (toDownload.size() > 0) {
[646]533 Downloader dl = new Downloader(toDownload, installDeps);
[617]534 try {
535 dl.setVisible(true);
[641]536 if (!dl.isFinished()) {
537 installState = EInstallState.ABORTED;
[617]538 break;
[641]539 }
[617]540 } finally {
541 dl.dispose();
542 }
[605]543 }
[657]544 HashMap<Package, HashSet<Package>> dependencies = PackageManager
545 .getInstance().checkDependencies(mods);
[605]546 if (dependencies.size() > 0) {
[648]547 for (HashSet<Package> hm : dependencies.values()) {
[646]548 installDeps.addAll(hm);
549 }
[647]550
[646]551 if (!Settings.getInstance()
552 .get("notifyDepsAfterInstall", false)) {
553 int size = 0;
554 String depsLocalString = "";
555 String depsDownloadString = "";
[648]556 for (Package m : dependencies.keySet()) {
557 for (Package mDep : dependencies.get(m)) {
[646]558 if (!mods.contains(mDep)) {
559 mods.add(mDep);
560 if (!mDep.isLocalAvailable()) {
561 size += mDep.getZipSize();
562 if (depsDownloadString.length() > 0)
563 depsDownloadString += "\n";
564 depsDownloadString += " - "
565 + mDep.getName();
566 } else {
567 if (depsLocalString.length() > 0)
568 depsLocalString += "\n";
569 depsLocalString += " - " + mDep.getName();
570 }
[641]571 }
572 }
573 }
[646]574 if (depsLocalString.length() == 0)
575 depsLocalString = bundle
576 .getString("installDependencies.none");
577 if (depsDownloadString.length() == 0)
578 depsDownloadString = bundle
579 .getString("installDependencies.none");
[641]580
[646]581 int res = JOptionPane.showConfirmDialog(this, String
582 .format(bundle
583 .getString("installDependencies.text"),
584 depsLocalString, depsDownloadString,
585 SizeFormatter.format(size, 3)), bundle
586 .getString("installDependencies.title"),
587 JOptionPane.YES_NO_OPTION,
588 JOptionPane.INFORMATION_MESSAGE);
589 if (res == JOptionPane.NO_OPTION) {
590 installState = EInstallState.ABORTED;
591 break;
592 }
[641]593 }
[605]594 } else {
[648]595 HashMap<Package, HashSet<Package>> incompatibilities = PackageManager
[645]596 .getInstance().checkIncompabitilites(mods);
[643]597 if (incompatibilities.size() > 0) {
[641]598 installState = EInstallState.INCOMPATIBLE;
[643]599
600 String incompatString = "";
[648]601 for (Package m : incompatibilities.keySet()) {
[643]602 if (incompatString.length() > 0)
603 incompatString += "\n";
604 incompatString += m.getName() + ": ";
605 String confMods = "";
[648]606 for (Package mConf : incompatibilities.get(m)) {
[643]607 if (confMods.length() > 0)
608 confMods += ", ";
609 confMods += mConf.getName();
610 }
611 incompatString += confMods;
612 }
613
614 JOptionPane.showMessageDialog(this, String.format(
615 bundle.getString("installIncompatibilities.text"),
616 incompatString), bundle
617 .getString("installIncompatibilities.title"),
618 JOptionPane.ERROR_MESSAGE);
[605]619 break;
620 } else {
[641]621 installState = EInstallState.READY;
[605]622 }
623 }
[600]624 }
[618]625
[641]626 if (installState == EInstallState.READY) {
[648]627 installMods = new TreeSet<Package>();
628 TreeSet<Package> actuallyTools = new TreeSet<Package>();
[623]629
[648]630 for (Package m : mods) {
[623]631 if (m.isTool())
632 actuallyTools.add(m);
633 else
[641]634 installMods.add(m);
[623]635 }
636
637 if (actuallyTools.size() > 0) {
638 Installer.installTools(actuallyTools);
639 }
[641]640 }
[623]641
[641]642 }
643
644 @DoInBackground(progressMessage = "installing.title", cancelable = false, indeterminateProgress = false)
645 private void installExec(final BackgroundEvent evt) {
646 if (installState == EInstallState.READY) {
647 Installer.install(installMods, new InstallProgressListener() {
[605]648 @Override
649 public void installProgressUpdate(int done, int total,
650 String step) {
651 evt.setProgressEnd(total);
652 evt.setProgressValue(done);
653 evt.setProgressMessage(step);
654 }
655 });
[641]656 installState = EInstallState.DONE;
[605]657 }
[641]658 installMods = null;
[600]659 }
[618]660
[617]661 @SuppressWarnings("unused")
662 private void installDone() {
[648]663 PackageManager.getInstance().updateInstalledMods();
[641]664 switch (installState) {
[621]665 case DONE:
[641]666 revertSelection();
[646]667 if (installDeps.size() > 0
668 && Settings.getInstance().get("notifyDepsAfterInstall",
669 false)) {
670 String installedDeps = "";
[648]671 for (Package m : installDeps) {
[646]672 if (installedDeps.length() > 0)
673 installedDeps += "\n";
674 installedDeps += " - " + m.getName();
675 }
676 JOptionPane.showMessageDialog(this, String.format(
677 bundle.getString("installDoneDeps.text"),
678 installedDeps), bundle
679 .getString("installDone.title"),
680 JOptionPane.INFORMATION_MESSAGE);
681 } else {
682 JOptionPane.showMessageDialog(this,
683 bundle.getString("installDone.text"),
684 bundle.getString("installDone.title"),
685 JOptionPane.INFORMATION_MESSAGE);
686 }
[621]687 break;
688 case OFFLINE:
[657]689 JOptionPane.showMessageDialog(
690 this,
691 SwingJavaBuilder.getConfig().getResource(
692 "offlineMode.text"),
693 SwingJavaBuilder.getConfig().getResource(
694 "offlineMode.title"),
[621]695 JOptionPane.WARNING_MESSAGE);
696 break;
[641]697 default:
[621]698 break;
699 }
[646]700 installDeps = null;
[617]701 }
[600]702
[631]703 @Override
[648]704 public void modSelectionChanged(ModTable source, Package m) {
[658]705 pkgInfo.updateInfo(m);
[591]706 }
707
[630]708 private void updateTableFilter() {
709 Object o = cmbModTypes.getSelectedItem();
710 Type t = null;
711 if (o instanceof Type)
712 t = (Type) o;
713 int downloadState = 0;
714 if (radOnline.isSelected())
715 downloadState = 1;
716 if (radLocal.isSelected())
717 downloadState = 2;
[631]718 tblMods.setFilter(t, downloadState);
[630]719 }
720
[591]721 @SuppressWarnings("unused")
[592]722 private void modTypeSelection() {
[630]723 updateTableFilter();
[591]724 }
[593]725
[630]726 @SuppressWarnings("unused")
727 private void showTypeSelection() {
728 updateTableFilter();
729 }
730
[593]731 @Override
[600]732 public void downloadSizeChanged(int newSize) {
733 lblDownloadSizeVal.setText(SizeFormatter.format(newSize, 2));
734 }
735
[616]736 @SuppressWarnings("unused")
737 private void checkInitialize() {
[600]738 if (!Installer.isEditionInitialized()) {
[621]739 if (!OniSplit.isOniSplitInstalled()) {
740 JOptionPane.showMessageDialog(this,
741 bundle.getString("noOniSplit.text"),
742 bundle.getString("noOniSplit.title"),
743 JOptionPane.ERROR_MESSAGE);
[600]744 exit();
[621]745 } else {
746 int res = JOptionPane
747 .showConfirmDialog(this,
748 bundle.getString("askInitialize.text"),
749 bundle.getString("askInitialize.title"),
750 JOptionPane.YES_NO_OPTION,
751 JOptionPane.QUESTION_MESSAGE);
752 if (res == JOptionPane.NO_OPTION) {
753 saveLocalData();
754 exit();
755 }
[600]756 }
757 }
758 }
[606]759
[616]760 @DoInBackground(progressMessage = "initializingEdition.title", cancelable = false, indeterminateProgress = false)
761 private void initialize(final BackgroundEvent evt) {
762 if (!Installer.isEditionInitialized()) {
763 Installer.initializeEdition(new InstallProgressListener() {
764 @Override
765 public void installProgressUpdate(int done, int total,
766 String step) {
767 evt.setProgressEnd(total);
768 evt.setProgressValue(done);
769 evt.setProgressMessage(step);
770 }
771 });
772 }
773 }
774
[605]775 private Vector<String> getBasicOniLaunchParams() {
776 Vector<String> params = new Vector<String>();
[618]777 File exe = null;
[605]778 switch (Settings.getPlatform()) {
779 case WIN:
[618]780 exe = new File(Paths.getEditionBasePath(), "Oni.exe");
781 if (exe.exists())
782 params.add(exe.getPath());
[605]783 break;
784 case MACOS:
[618]785 exe = new File(Paths.getEditionBasePath(),
786 "Oni.app/Contents/MacOS/Oni");
787 if (exe.exists())
788 params.add(exe.getPath());
[605]789 break;
790 case LINUX:
791 String wine = Settings.getWinePath();
[618]792 exe = new File(Paths.getEditionBasePath(), "Oni.exe");
793 if (exe.exists()) {
794 if (wine != null) {
795 params.add(wine);
796 params.add(exe.getPath());
797 }
[605]798 }
799 break;
800 default:
801 }
802 if (params.size() > 0) {
803 params.add("-debugfiles");
804 }
805 return params;
806 }
[600]807
[605]808 @SuppressWarnings("unused")
809 private void oniFull() {
810 Vector<String> params = getBasicOniLaunchParams();
811 if (params.size() > 0) {
[623]812 AppExecution.execute(params, Paths.getEditionBasePath());
[605]813 }
814 }
815
816 @SuppressWarnings("unused")
817 private void oniWin() {
818 Vector<String> params = getBasicOniLaunchParams();
819 if (params.size() > 0) {
820 params.add("-noswitch");
[623]821 AppExecution.execute(params, Paths.getEditionBasePath());
[605]822 }
823 }
824
[608]825 @SuppressWarnings("unused")
826 private void openEditionFolder() {
827 try {
828 Desktop.getDesktop().open(Paths.getEditionBasePath());
[639]829 } catch (Exception e) {
[608]830 e.printStackTrace();
831 }
832 }
833
[600]834 @Override
[593]835 public void handleAbout(ApplicationEvent event) {
836 event.setHandled(true);
837 showAbout();
838 }
839
840 @Override
841 public void handleOpenApplication(ApplicationEvent event) {
842 }
843
844 @Override
845 public void handleOpenFile(ApplicationEvent event) {
846 }
847
848 @Override
849 public void handlePreferences(ApplicationEvent event) {
850 showSettings();
851 }
852
853 @Override
854 public void handlePrintFile(ApplicationEvent event) {
855 }
856
857 @Override
858 public void handleQuit(ApplicationEvent event) {
[605]859 event.setHandled(true);
860 saveLocalData();
861 exit();
[593]862 }
863
864 @Override
865 public void handleReOpenApplication(ApplicationEvent event) {
866 }
[600]867
[592]868}
Note: See TracBrowser for help on using the repository browser.