00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 package com.realtime.crossfire.jxclient.window;
00023
00024 import com.realtime.crossfire.jxclient.gui.gui.Gui;
00025 import com.realtime.crossfire.jxclient.gui.label.JXCWindowRenderer;
00026 import com.realtime.crossfire.jxclient.settings.Filenames;
00027 import com.realtime.crossfire.jxclient.skin.skin.JXCSkin;
00028 import com.realtime.crossfire.jxclient.skin.skin.JXCSkinException;
00029 import java.io.BufferedReader;
00030 import java.io.BufferedWriter;
00031 import java.io.File;
00032 import java.io.FileInputStream;
00033 import java.io.FileNotFoundException;
00034 import java.io.FileOutputStream;
00035 import java.io.IOException;
00036 import java.io.InputStreamReader;
00037 import java.io.OutputStreamWriter;
00038 import java.io.Writer;
00039 import java.util.LinkedList;
00040 import java.util.List;
00041 import java.util.regex.Pattern;
00042 import org.jetbrains.annotations.NotNull;
00043
00048 public class DialogStateParser {
00049
00053 @NotNull
00054 private static final Pattern PATTERN = Pattern.compile(" ");
00055
00059 private DialogStateParser() {
00060 }
00061
00067 public static void load(@NotNull final JXCSkin skin, @NotNull final JXCWindowRenderer windowRenderer) {
00068 final String skinName = skin.getSkinName();
00069 final File dialogsFile;
00070 try {
00071 dialogsFile = Filenames.getDialogsFile(skinName);
00072 } catch (final IOException ex) {
00073 System.err.println(skin.getSkinName()+": "+ex.getMessage());
00074 return;
00075 }
00076
00077 try {
00078 final FileInputStream fis = new FileInputStream(dialogsFile);
00079 try {
00080 final InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
00081 try {
00082 final BufferedReader br = new BufferedReader(isr);
00083 try {
00084 while (true) {
00085 final String line = br.readLine();
00086 if (line == null) {
00087 break;
00088 }
00089
00090 final String[] tmp = PATTERN.split(line, -1);
00091 if (tmp.length != 6) {
00092 throw new IOException("syntax error: "+line);
00093 }
00094
00095 final boolean open;
00096 if (tmp[0].equals("open")) {
00097 open = true;
00098 } else if (tmp[0].equals("close")) {
00099 open = false;
00100 } else {
00101 throw new IOException("syntax error: "+line);
00102 }
00103
00104 final Gui dialog;
00105 try {
00106 dialog = skin.getDialog(tmp[1]);
00107 } catch (final JXCSkinException ex) {
00108 throw new IOException("no such dialog: "+tmp[1], ex);
00109 }
00110
00111 if (!dialog.isAutoSize() && dialog.isSaveDialog()) {
00112 final int x;
00113 final int y;
00114 final int w;
00115 final int h;
00116 try {
00117 x = Integer.parseInt(tmp[2]);
00118 y = Integer.parseInt(tmp[3]);
00119 w = Integer.parseInt(tmp[4]);
00120 h = Integer.parseInt(tmp[5]);
00121 } catch (final NumberFormatException ex) {
00122 throw new IOException("syntax error: "+line, ex);
00123 }
00124
00125 try {
00126 dialog.setSize(w, h);
00127 } catch (final IllegalArgumentException ex) {
00128 throw new IOException("invalid dialog size for "+tmp[1]+": "+w+"x"+h, ex);
00129 }
00130
00131 dialog.setPosition(x, y);
00132 }
00133
00134 if (open) {
00135 windowRenderer.openDialog(dialog, false);
00136 } else {
00137 windowRenderer.closeDialog(dialog);
00138 }
00139 }
00140 } finally {
00141 br.close();
00142 }
00143 } finally {
00144 isr.close();
00145 }
00146 } finally {
00147 fis.close();
00148 }
00149 } catch (final FileNotFoundException ignored) {
00150
00151 } catch (final IOException ex) {
00152 System.err.println(dialogsFile+": "+ex.getMessage());
00153 }
00154 }
00155
00161 public static void save(@NotNull final JXCSkin skin, @NotNull final JXCWindowRenderer windowRenderer) {
00162 final File dialogsFile;
00163 try {
00164 dialogsFile = Filenames.getDialogsFile(skin.getSkinName());
00165 } catch (final IOException ex) {
00166 System.err.println(skin.getSkinName()+": "+ex.getMessage());
00167 return;
00168 }
00169
00170 final File dir = dialogsFile.getParentFile();
00171 if (dir != null && !dir.exists() && !dir.mkdirs()) {
00172 System.err.println(skin.getSkinName()+": cannot create directory");
00173 }
00174
00175 final List<Gui> openDialogs = new LinkedList<Gui>();
00176 for (final Gui dialog : windowRenderer.getOpenDialogs()) {
00177 openDialogs.add(0, dialog);
00178 }
00179
00180 try {
00181 final FileOutputStream fos = new FileOutputStream(dialogsFile);
00182 try {
00183 final OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
00184 try {
00185 final BufferedWriter bw = new BufferedWriter(osw);
00186 try {
00187 for (final Gui dialog : openDialogs) {
00188 saveDialog(dialog, "open", bw);
00189 }
00190
00191 for (final Gui dialog : skin) {
00192 if (!windowRenderer.isDialogOpen(dialog)) {
00193 saveDialog(dialog, "close", bw);
00194 }
00195 }
00196 } finally {
00197 bw.close();
00198 }
00199 } finally {
00200 osw.close();
00201 }
00202 } finally {
00203 fos.close();
00204 }
00205 } catch (final IOException ex) {
00206 System.err.println(dialogsFile+": "+ex.getMessage());
00207 }
00208 }
00209
00217 private static void saveDialog(@NotNull final Gui dialog, @NotNull final String type, @NotNull final Writer bw) throws IOException {
00218 if (dialog.isAutoSize()) {
00219 return;
00220 }
00221
00222 if (!dialog.isSaveDialog()) {
00223 return;
00224 }
00225
00226 final int w = dialog.getWidth();
00227 if (w <= 0) {
00228 return;
00229 }
00230
00231 final int h = dialog.getHeight();
00232 if (h <= 0) {
00233 return;
00234 }
00235
00236 bw.write(type);
00237 bw.write(" ");
00238 bw.write(dialog.getName());
00239 bw.write(" ");
00240 bw.write(Integer.toString(dialog.getX()));
00241 bw.write(" ");
00242 bw.write(Integer.toString(dialog.getY()));
00243 bw.write(" ");
00244 bw.write(Integer.toString(dialog.getWidth()));
00245 bw.write(" ");
00246 bw.write(Integer.toString(dialog.getHeight()));
00247 bw.write("\n");
00248 }
00249
00250 }