fixed crashing when removing mods

This commit is contained in:
huangyuhui
2015-12-29 20:35:40 +08:00
parent e3f0254736
commit 3471b4fec7
20 changed files with 152 additions and 243 deletions

View File

@@ -1,7 +1,7 @@
/*
* Hello Minecraft! Launcher.
* Copyright (C) 2013 huangyuhui
*
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
@@ -38,5 +38,5 @@ public abstract class IMinecraftModService extends IMinecraftService {
public abstract boolean addMod(File f);
public abstract void removeMod(int[] index);
public abstract void removeMod(Object[] mods);
}

View File

@@ -1,7 +1,7 @@
/*
* Hello Minecraft! Launcher.
* Copyright (C) 2013 huangyuhui <huanghongxun2008@126.com>
*
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
@@ -88,6 +88,11 @@ public class ModInfo implements Comparable<ModInfo> {
return location.hashCode();
}
@Override
public String toString() {
return getFileName();
}
public String getFileName() {
String n = location.getName();
return FileUtils.removeExtension(isActive() ? n : n.substring(0, n.length() - ".disabled".length()));
@@ -107,8 +112,8 @@ public class ModInfo implements Comparable<ModInfo> {
ModInfo i = new ModInfo();
i.location = f;
List<ModInfo> m = C.gson.fromJson(new InputStreamReader(jar.getInputStream(entry)),
new TypeToken<List<ModInfo>>() {
}.getType());
new TypeToken<List<ModInfo>>() {
}.getType());
if (m != null && m.size() > 0) {
i = m.get(0);
i.location = f;
@@ -118,8 +123,9 @@ public class ModInfo implements Comparable<ModInfo> {
private static ModInfo getLiteLoaderModInfo(File f, ZipFile jar, ZipEntry entry) throws IOException {
ModInfo m = C.gson.fromJson(new InputStreamReader(jar.getInputStream(entry)),
ModInfo.class);
if (m == null) m = new ModInfo();
ModInfo.class);
if (m == null)
m = new ModInfo();
m.location = f;
return m;
}

View File

@@ -104,13 +104,14 @@ public class MinecraftModService extends IMinecraftModService {
}
@Override
public void removeMod(int[] rows) {
Arrays.sort(rows);
for (int idx : rows) {
ModInfo mi = getMods().get(idx);
File f = mi.location;
f.delete();
}
public void removeMod(Object[] rows) {
if (rows.length == 0)
return;
for (Object r : rows)
if (r instanceof ModInfo)
((ModInfo) r).location.delete();
else if (r instanceof Number)
getMods().get(((Number) r).intValue()).location.delete();
recacheMods();
}

View File

@@ -615,9 +615,6 @@
<TableColumnModel selectionModel="1"/>
</Property>
<Property name="columnSelectionAllowed" type="boolean" value="true"/>
<Property name="selectionModel" type="javax.swing.ListSelectionModel" editor="org.netbeans.modules.form.editors2.JTableSelectionModelEditor">
<JTableSelectionModel selectionMode="0"/>
</Property>
<Property name="tableHeader" type="javax.swing.table.JTableHeader" editor="org.netbeans.modules.form.editors2.JTableHeaderEditor">
<TableHeader reorderingAllowed="false" resizingAllowed="true"/>
</Property>

View File

@@ -610,7 +610,6 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget
lstExternalMods.setModel(SwingUtils.makeDefaultTableModel(new String[]{"", "Mod", C.i18n("ui.label.version")}, new Class[]{Boolean.class,String.class,String.class}, new boolean[]{true,false,false}));
lstExternalMods.setColumnSelectionAllowed(true);
lstExternalMods.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
lstExternalMods.getTableHeader().setReorderingAllowed(false);
lstExternalMods.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
@@ -1069,7 +1068,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget
}//GEN-LAST:event_btnAddModActionPerformed
private void btnRemoveModActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRemoveModActionPerformed
getProfile().getMinecraftProvider().getModService().removeMod(lstExternalMods.getSelectedRows());
getProfile().getMinecraftProvider().getModService().removeMod(SwingUtils.getValueBySelectedRow(lstExternalMods, lstExternalMods.getSelectedRows(), 1));
reloadMods();
}//GEN-LAST:event_btnRemoveModActionPerformed
@@ -1248,12 +1247,13 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget
reloadingMods = true;
DefaultTableModel model = SwingUtils.clearDefaultTable(lstExternalMods);
Observable.<List<ModInfo>>createWithEmptySubscription(
t -> t.onNext(getProfile().getMinecraftProvider().getModService().recacheMods()))
.subscribeOn(Schedulers.newThread()).observeOn(Schedulers.eventQueue())
.flatMap(t -> Observable.from(t))
.subscribe(t -> model.addRow(new Object[] {t.isActive(), t.getFileName(), t.version}),
null,
() -> reloadingMods = false);
t -> t.onNext(getProfile().getMinecraftProvider().getModService().recacheMods()))
.subscribeOn(Schedulers.newThread()).observeOn(Schedulers.eventQueue())
.subscribe(t -> {
for (ModInfo x : t)
model.addRow(new Object[]{x.isActive(), x, x.version});
reloadingMods = false;
});
}
// </editor-fold>

View File

@@ -139,7 +139,7 @@ public final class MainFrame extends DraggableFrame {
if (enableShadow)
try {
//setBackground(new Color(0, 0, 0, 0));
setBackground(new Color(0, 0, 0, 0));
getRootPane().setBorder(border = new DropShadowBorder(borderColor, 4));
} catch (Throwable ex) {
HMCLog.err("Failed to set window transparent.", ex);