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

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

AEI2.14:

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