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

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

AEI2.11:

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