You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

UserMessage.java 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. /*
  2. * $Id$
  3. * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
  4. * For details on use and redistribution please refer to the
  5. * LICENSE file included with these sources.
  6. */
  7. package org.apache.fop.viewer;
  8. import java.awt.*;
  9. import java.io.*;
  10. import java.awt.event.*;
  11. import java.util.*;
  12. import javax.swing.*;
  13. import javax.swing.JComponent.*;
  14. /**
  15. * Klasse <code>UserMessage</code> ist ein utility zum Abfragen oder zum Informieren des Benutzers.<br>
  16. * Eine Meldung besteht aus dem Identifikator (Suchschlüssel im Meldungspool), einem Dialogtitel, einem Buttonset und
  17. * dem Meldungstext mit eventuellen Platzhaltern für die Parameter.
  18. *
  19. * @author S. Gorkhover
  20. * @version 18.03.1999
  21. *
  22. * @changed 23.04.99 Juergen.Verwohlt@jCatalog.com
  23. * @subject Weitere Ausgabemethoden: show(String, String) und show(String,String,Frame)
  24. *
  25. * @changed 28.05.99 Juergen.Verwohlt@jCatalog.com
  26. * @subject MessageException unterstützen
  27. *
  28. * @changed 09.06.99 Juergen.Verwohlt@jCatalog.com
  29. * @subject Neue Klasse MessagesException zur Anzeige verwenden
  30. *
  31. * @changed 10.12.00 gears@apache.org
  32. * @subject Unicode
  33. */
  34. public class UserMessage {
  35. private static Translator res = null;
  36. public static void setTranslator(Translator aRes) {
  37. res = aRes;
  38. if (res == null) {
  39. //log.debug("UserMessage: setTranslator(null) !");
  40. res = new SecureResourceBundle(null);
  41. }
  42. MessagesDialog.setTranslator(res);
  43. }
  44. // Zulässige Werte für Dialogart:
  45. /**
  46. * Möglicher Wert des Meldungstypes. Fenster-Title "Info" (de).
  47. */
  48. private static final int INFO = JOptionPane.PLAIN_MESSAGE;
  49. /**
  50. * Möglicher Wert des Meldungstypes. Fenster-Title "Warnung" (de).
  51. */
  52. private static final int WARNING = JOptionPane.WARNING_MESSAGE;
  53. /**
  54. * Möglicher Wert des Meldungstypes. Fenster-Title "Frage" (de).
  55. */
  56. private static final int QUESTION = JOptionPane.QUESTION_MESSAGE;
  57. /**
  58. * Möglicher Wert des Meldungstypes. Fenster-Title "Fehler" (de).
  59. */
  60. private static final int ERROR = JOptionPane.ERROR_MESSAGE;
  61. /**
  62. * Möglicher Wert des Meldungstypes. Fenster-Title "Systemfehler" (de).
  63. */
  64. private static final int SYS_ERROR = JOptionPane.ERROR_MESSAGE;
  65. /*
  66. * Style Constanten orientieren sich auf die
  67. * Constanten der ButtonDialog-Klasse und legen das Dialog-ButtonSet fest.
  68. */
  69. /**
  70. * Wert für Setzten keines Buttons
  71. */
  72. public static final int STYLE_NOBUTTON = -2;
  73. /**
  74. * Wert für Setzten von nur Ja-Button.
  75. */
  76. public static final int STYLE_Y = JOptionPane.DEFAULT_OPTION;
  77. // ButtonDialog.YES; // = 1
  78. /**
  79. * Wert für Setzten von Ja- und Nein-Buttons.
  80. */
  81. public static final int STYLE_Y_N = JOptionPane.YES_NO_OPTION;
  82. // ButtonDialog.YES_NO; // = 2;
  83. /**
  84. * Wert für Setzten von Ja-, Nein-und Abbruch Buttons.
  85. */
  86. public static final int STYLE_Y_N_C = JOptionPane.YES_NO_CANCEL_OPTION;
  87. // ButtonDialog.YES_NO_CANCEL; // = 3;
  88. // Platzhalter für Parameter in der Properties-Datei
  89. private static final String PARAMETER_TAG = "&&&";
  90. /**
  91. * Benutzer-Antwort-Constanten orientieren sich auf die
  92. * Constanten der ButtonDialog-Klasse
  93. */
  94. /**
  95. * Möglicher Rückgabewert @see ButtonDialog
  96. */
  97. public static final int YES = JOptionPane.YES_OPTION;
  98. // ButtonDialog.YES; // = 2
  99. /**
  100. * Möglicher Rückgabewert @see ButtonDialog
  101. */
  102. public static final int NO = JOptionPane.NO_OPTION;
  103. // ButtonDialog.NO; // = 4;
  104. /**
  105. * Möglicher Rückgabewert @see ButtonDialog
  106. */
  107. public static final int CANCEL = JOptionPane.CANCEL_OPTION;
  108. // ButtonDialog.CANCEL; // = 8;
  109. // Default-Values
  110. private static int buttonType = STYLE_Y;
  111. private static int iconType = WARNING;
  112. private static String currentIconName = "";
  113. private static String actMessId = null;
  114. // private static MessagesDialog nobuttonDialog = null;
  115. /**
  116. * Ersetzt die eventuellen Platzhalter durch die übergebenen Parameter
  117. */
  118. static String prepareMessage(String rawText, String[] par) {
  119. //log.debug("prepareMessage(): " + rawText + ", parameter: "
  120. // + par);
  121. int index = rawText.indexOf(PARAMETER_TAG);
  122. String composedMess = "";
  123. if ((index == -1) && (par == null))
  124. return rawText;
  125. if ((index != -1) && (par == null)) {
  126. //log.debug("Message " + actMessId
  127. // + " erwartet Parameter. Aufgerufen ohne Parameter");
  128. return rawText;
  129. }
  130. if ((index == -1) && (par != null)) {
  131. //log.debug("Message " + actMessId
  132. // + " erwartet keine Parameter. Aufgerufen mit folgenden Parametern:");
  133. for (int i = 0; i < par.length; ++i) {
  134. //log.debug(par[i].toString());
  135. }
  136. return rawText;
  137. }
  138. int tagCount = 0;
  139. while (rawText.indexOf(PARAMETER_TAG) != -1) {
  140. index = rawText.indexOf(PARAMETER_TAG);
  141. try {
  142. composedMess += rawText.substring(0, index) + par[tagCount];
  143. } catch (ArrayIndexOutOfBoundsException ex) {
  144. //log.error("Anzahl der übergebenen Parameter zu der Meldung "
  145. // + actMessId
  146. // + " ist weniger als erwartet.", ex);
  147. return composedMess + rawText;
  148. }
  149. rawText = rawText.substring(index + PARAMETER_TAG.length());
  150. tagCount++;
  151. }
  152. composedMess += rawText;
  153. if (tagCount != par.length) {
  154. //log.debug("Die zu der Meldung " + actMessId
  155. // + " übergebenen Parameter sind mehr als die Meldung vorsieht.");
  156. }
  157. return composedMess;
  158. }
  159. /**
  160. * Gibt den Title fürs Dialogfenster.
  161. * Dieser wird durch die Dialogart festgelegt
  162. * (erster Teil in der MeldungsDefinition in der Properties-Datei).
  163. */
  164. static String getTitle(String strVal) {
  165. String title = null;
  166. int choice = getValue(strVal);
  167. switch (choice) {
  168. case INFO:
  169. title = "Info";
  170. currentIconName = "info.gif";
  171. break;
  172. case WARNING:
  173. title = "Warning";
  174. currentIconName = "warn.gif";
  175. break;
  176. case QUESTION:
  177. title = "Question";
  178. currentIconName = "quest.gif";
  179. break;
  180. case ERROR:
  181. title = "Error";
  182. currentIconName = "error.gif";
  183. break;
  184. default:
  185. title =
  186. "Ungültiger IonType für diese Meldung. Prüfen in Übersetzungsdatei.";
  187. }
  188. return title;
  189. }
  190. /**
  191. * Liefert den Wert der über den Nemen übergebenen Klassenvariablen.
  192. */
  193. static int getValue(String fieldName) {
  194. int val = -1;
  195. if (fieldName.equals("INFO"))
  196. return INFO;
  197. else if (fieldName.equals("WARNING"))
  198. return WARNING;
  199. else if (fieldName.equals("ERROR"))
  200. return ERROR;
  201. else if (fieldName.equals("SYS_ERROR"))
  202. return SYS_ERROR;
  203. else if (fieldName.equals("QUESTION"))
  204. return QUESTION;
  205. else if (fieldName.equals("STYLE_NOBUTTON"))
  206. return STYLE_NOBUTTON;
  207. else if (fieldName.equals("STYLE_Y"))
  208. return STYLE_Y;
  209. else if (fieldName.equals("STYLE_Y_N"))
  210. return STYLE_Y_N;
  211. else if (fieldName.equals("STYLE_Y_N_C"))
  212. return STYLE_Y_N_C;
  213. return val;
  214. }
  215. private static String getStackTrace(Exception exception) {
  216. if (exception == null)
  217. return "null";
  218. String stack = "";
  219. StringWriter strWriter = new StringWriter();
  220. exception.printStackTrace(new PrintWriter(strWriter));
  221. stack = strWriter.toString();
  222. stack = stack.replace('\r', ' ');
  223. stack = stack.replace('\t', ' ');
  224. return stack;
  225. }
  226. private static int display(String textID, String[] param,
  227. Exception exception, Frame frame) {
  228. String translatedMes = "";
  229. String preparedMes = "";
  230. String messageType = "";
  231. String optionType = "";
  232. String title = "";
  233. MessagesDialog dialog = null;
  234. actMessId = textID;
  235. boolean messageFound = res.contains(textID);
  236. translatedMes = res.getString(textID);
  237. if (messageFound) {
  238. try {
  239. messageType =
  240. translatedMes.substring(0, translatedMes.indexOf(':'));
  241. translatedMes =
  242. translatedMes.substring(translatedMes.indexOf(':') + 1);
  243. optionType =
  244. translatedMes.substring(0, translatedMes.indexOf(':'));
  245. translatedMes =
  246. translatedMes.substring(translatedMes.indexOf(':') + 1);
  247. } catch (Exception ex) {
  248. //log.debug("FALSCHES FORMAT: MESSAGE: " + textID);
  249. }
  250. } else { // Message not found
  251. //log.debug("UserMessage: textID '" + textID
  252. // + "' not found. Return "
  253. // + "value 'CANCEL' = " + CANCEL);
  254. // return CANCEL;
  255. messageType = "ERROR";
  256. optionType = "STYLE_Y";
  257. translatedMes = "textID '" + textID + "' not found."
  258. + "\nIt is possible the message file not found.";
  259. }
  260. preparedMes = prepareMessage(translatedMes, param);
  261. // Exception exception = getException(param);
  262. // WARNING -> nach Warnung übersetzen
  263. title = res.getString(getTitle(messageType));
  264. // WARNING -> JOptionPane.WARNING_MESSAGE
  265. int messageTypeIndex = getValue(messageType);
  266. // Button Set idetifizieren
  267. int optionTypeIndex = getValue(optionType);
  268. int result = CANCEL;
  269. if (exception != null) {
  270. String str = getStackTrace(exception);
  271. if (exception instanceof MessageException) {
  272. MessageException ex = (MessageException)exception;
  273. if (ex.getException() != null)
  274. str += "\n" + getStackTrace(ex.getException());
  275. }
  276. result = MessagesDialog.showDetailDialog(null, preparedMes,
  277. title, optionTypeIndex,
  278. messageTypeIndex, null,
  279. str);
  280. } else {
  281. if (optionTypeIndex == STYLE_NOBUTTON) {
  282. // Wird nicht mehr unterstützt
  283. //log.debug("UserMessage: STYLE_NOBUTTON wird nicht unterstützt");
  284. return result;
  285. } else {
  286. result = MessagesDialog.showConfirmDialog(null, preparedMes,
  287. title,
  288. optionTypeIndex,
  289. messageTypeIndex);
  290. }
  291. }
  292. return result;
  293. }
  294. /**
  295. * Öffnet das Dialogfenster mit der Übersetzung der per Suchschlüssel übergebenen Meldung
  296. * mit eingesetzten Parametern. Für die Übersetzung der Parameter trägt die aufrufende Stelle die Sorge.
  297. * Der Dialog ist modal zum Frame <code>frame</code>.
  298. * @param <UL>
  299. * <LI> textID - Suchschlüssel der Meldung im Meldungspool,
  300. * <LI> param - Array der in die Meldung einzusetztenden Parameter,
  301. * <LI> frame - das Fenster, zu dem der Dialog modal ist.
  302. * </UL>
  303. * @return <UL>
  304. * <LI> -1 wenn keine Rückgabe möglich ist oder Dialog NICHT MODAL ist.
  305. * <LI> ButtonDialog.YES = 2
  306. * <LI> ButtonDialog.NO = 4
  307. * <LI> ButtonDialog.CANCEL = 8
  308. * <LI> Wird das Dialog-Fenster ohne Buttonklick geschlossen (Kreuzchen oben rechts), so ist die Rückgabe gleich ButtonDialog.CANCEL.
  309. * </UL>
  310. */
  311. public static int show(String messageId, String[] parameterList,
  312. Exception anException, Frame parentFrame) {
  313. return display(messageId, parameterList, anException, parentFrame);
  314. }
  315. public static int show(String messageId, String[] parameterList,
  316. Exception anException) {
  317. return display(messageId, parameterList, anException, (Frame)null);
  318. }
  319. public static int show(String messageId, String[] parameterList,
  320. Frame parentFrame) {
  321. return display(messageId, parameterList, (Exception)null,
  322. parentFrame);
  323. }
  324. public static int show(String messageId, String[] parameterList) {
  325. return display(messageId, parameterList, (Exception)null,
  326. (Frame)null);
  327. }
  328. public static int show(String messageId, String parameter,
  329. Frame parentFrame) {
  330. return display(messageId, new String[] {
  331. parameter
  332. }, (Exception)null, parentFrame);
  333. }
  334. public static int show(String messageId, String parameter) {
  335. return display(messageId, new String[] {
  336. parameter
  337. }, (Exception)null, (Frame)null);
  338. }
  339. public static int show(String messageId, Frame parentFrame) {
  340. return display(messageId, (String[])null, (Exception)null,
  341. parentFrame);
  342. }
  343. public static int show(String messageId) {
  344. return display(messageId, (String[])null, (Exception)null,
  345. (Frame)null);
  346. }
  347. public static int show(String messageId, Exception anException,
  348. Frame aFrame) {
  349. return display(messageId, (String[])null, anException, aFrame);
  350. }
  351. public static int show(String messageId, Exception anException) {
  352. return display(messageId, (String[])null, anException, (Frame)null);
  353. }
  354. public static int show(Exception anException, Frame aFrame) {
  355. if (anException instanceof MessageException) {
  356. MessageException ex = (MessageException)anException;
  357. return show(ex.getMessageId(), ex.getParameterList(), ex, aFrame);
  358. } else
  359. return show("UNHANDLED_EXCEPTION", (String[])null, anException,
  360. aFrame);
  361. }
  362. }