diff --git a/.gitattributes b/.gitattributes index 4606102c3c9..dc87add3c79 100644 --- a/.gitattributes +++ b/.gitattributes @@ -14403,6 +14403,7 @@ src/main/java/forge/gui/framework/IDocIdList.java -text src/main/java/forge/gui/framework/ILocalRepaint.java -text src/main/java/forge/gui/framework/IVDoc.java -text src/main/java/forge/gui/framework/IVTopLevelUI.java -text +src/main/java/forge/gui/framework/InvalidLayoutFileException.java -text src/main/java/forge/gui/framework/RectangleOfDouble.java -text src/main/java/forge/gui/framework/SDisplayUtil.java -text src/main/java/forge/gui/framework/SLayoutConstants.java -text diff --git a/src/main/java/forge/control/FControl.java b/src/main/java/forge/control/FControl.java index d762cf99092..a4d5c27ff56 100644 --- a/src/main/java/forge/control/FControl.java +++ b/src/main/java/forge/control/FControl.java @@ -42,11 +42,14 @@ import forge.game.Game; import forge.game.ai.AiProfileUtil; import forge.game.player.LobbyPlayer; import forge.game.player.Player; +import forge.gui.GuiDialog; import forge.gui.SOverlayUtils; import forge.gui.deckeditor.CDeckEditorUI; import forge.gui.deckeditor.VDeckEditorUI; import forge.gui.framework.EDocID; +import forge.gui.framework.InvalidLayoutFileException; import forge.gui.framework.SDisplayUtil; +import forge.gui.framework.SLayoutIO; import forge.gui.framework.SOverflowUtil; import forge.gui.framework.SResizingUtil; import forge.gui.home.CHomeUI; @@ -406,7 +409,16 @@ public enum FControl { Singletons.getModel().getPreferences().actuateMatchPreferences(); - Singletons.getControl().changeState(Screens.MATCH_SCREEN); + + try { + Singletons.getControl().changeState(Screens.MATCH_SCREEN); + } catch (InvalidLayoutFileException ex) { + GuiDialog.message("Your match layout file could not be read. It will be deleted after you press OK.\nThe game will proceed with default layout."); + File fLayout = new File(SLayoutIO.getFilePreferred(Screens.MATCH_SCREEN)); + fLayout.delete(); + // try again + Singletons.getControl().changeState(Screens.MATCH_SCREEN); + } SDisplayUtil.showTab(EDocID.REPORT_LOG.getDoc()); CMessage.SINGLETON_INSTANCE.getInputControl().setGame(game); diff --git a/src/main/java/forge/gui/framework/InvalidLayoutFileException.java b/src/main/java/forge/gui/framework/InvalidLayoutFileException.java new file mode 100644 index 00000000000..e446852138f --- /dev/null +++ b/src/main/java/forge/gui/framework/InvalidLayoutFileException.java @@ -0,0 +1,9 @@ +package forge.gui.framework; + +/** + * TODO: Write javadoc for this type. + * + */ +public class InvalidLayoutFileException extends RuntimeException { + +} diff --git a/src/main/java/forge/gui/framework/SLayoutIO.java b/src/main/java/forge/gui/framework/SLayoutIO.java index e427cf791ae..0f1fa9eff53 100644 --- a/src/main/java/forge/gui/framework/SLayoutIO.java +++ b/src/main/java/forge/gui/framework/SLayoutIO.java @@ -3,6 +3,7 @@ package forge.gui.framework; import java.awt.BorderLayout; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.util.Collection; import java.util.Iterator; @@ -136,17 +137,35 @@ public final class SLayoutIO { // Read a model for new layout MapOfLists model = null; + + boolean usedCustomPrefsFile = false; + + FileInputStream fis = null; + try { - FileInputStream fis = null; if (f != null && f.exists()) fis = new FileInputStream(f); else { File userSetting = new File(file.userPrefLoc); - fis = userSetting.exists() ? new FileInputStream(userSetting) : new FileInputStream(file.defaultLoc); + if ( userSetting.exists() ) { + usedCustomPrefsFile = true; + fis = new FileInputStream(userSetting); + } else { + fis = new FileInputStream(file.defaultLoc); + } } - + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } + + try { model = readLayout(inputFactory.createXMLEventReader(fis)); - } catch (final Exception e) { e.printStackTrace(); } + } catch (final XMLStreamException e) { + if ( usedCustomPrefsFile ) // the one we can safely delete + throw new InvalidLayoutFileException(); + else + throw new RuntimeException(e); + } // Apply new layout DragCell cell = null; @@ -170,8 +189,8 @@ public final class SLayoutIO { SResizingUtil.resizeWindow(); } - private static MapOfLists readLayout(final XMLEventReader reader) - throws XMLStreamException { + private static MapOfLists readLayout(final XMLEventReader reader) throws XMLStreamException + { XMLEvent event; StartElement element; Iterator attributes;