ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/java/installer2/src/net/oni2/aeinstaller/gui/MainWin.java
Revision: 857
Committed: Fri May 3 21:52:50 2013 UTC (12 years, 5 months ago) by alloc
Content type: text/x-java
File size: 30346 byte(s)
Log Message:
AEI2.10:
- Switched caching from Raw Depot cache to AEI packages cache (more compact, faster startup)

File Contents

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