/* LanguageTool, a natural language style checker
* Copyright (C) 2005 Daniel Naber (http://www.danielnaber.de)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
* USA
*/
package de.danielnaber.languagetool.gui;
import java.awt.Frame;
import java.io.File;
import java.text.MessageFormat;
import java.util.ResourceBundle;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileFilter;
import de.danielnaber.languagetool.tools.StringTools;
/**
* GUI-related tools.
*
* @author Daniel Naber
*/
public class Tools {
private static final int DEFAULT_CONTEXT_SIZE = 40; // characters
private static final String MARKER_START = "";
private static final String MARKER_END = "";
private Tools() {
// no constructor
}
public static String makeTexti18n(final ResourceBundle messages, final String key,
final Object[] messageArguments) {
final MessageFormat formatter = new MessageFormat("");
formatter.applyPattern(messages.getString(key));
return formatter.format(messageArguments);
}
/**
* Get the default context (40 characters) of the given text range,
* highlighting the range with HTML.
*/
public static String getContext(final int fromPos, final int toPos, final String text) {
return getContext(fromPos, toPos, text, DEFAULT_CONTEXT_SIZE);
}
/**
* Get the context (contextSize
characters) of the given text
* range, highlighting the range with HTML code.
*/
public static String getContext(final int fromPos, final int toPos, final String fileContents,
int contextSize) {
return getContext(fromPos, toPos, fileContents, contextSize, MARKER_START,
MARKER_END, true);
}
/**
* Get the context (contextSize
characters) of the given text
* range, highlighting the range with the given marker strings, not escaping
* HTML.
*/
public static String getContext(final int fromPos, final int toPos,
final String fileContents, final int contextSize,
final String markerStart, final String markerEnd) {
return getContext(fromPos, toPos, fileContents, contextSize, markerStart,
markerEnd, false);
}
/**
* Get the context (contextSize
characters) of the given text
* range, highlighting the range with the given marker strings.
*
* @param fromPos
* the start position of the error in characters
* @param toPos
* the end position of the error in characters
* @param text
* the text from which the context should be taken
* @param contextSize
* the size of the context in characters
* @param markerStart
* the string used to mark the beginning of the error
* @param markerEnd
* the string used to mark the end of the error
* @param escapeHTML
* whether HTML/XML characters should be escaped
*/
public static String getContext(final int fromPos, final int toPos,
String text, final int contextSize, final String markerStart,
final String markerEnd, final boolean escapeHTML) {
text = text.replace('\n', ' ');
// calculate context region:
int startContent = fromPos - contextSize;
String prefix = "...";
String postfix = "...";
String markerPrefix = " ";
if (startContent < 0) {
prefix = "";
markerPrefix = "";
startContent = 0;
}
int endContent = toPos + contextSize;
final int fileLen = text.length();
if (endContent > fileLen) {
postfix = "";
endContent = fileLen;
}
// make "^" marker. inefficient but robust implementation:
final StringBuilder marker = new StringBuilder();
final int totalLen = fileLen + prefix.length();
for (int i = 0; i < totalLen; i++) {
if (i >= fromPos && i < toPos) {
marker.append('^');
} else {
marker.append(' ');
}
}
// now build context string plus marker:
final StringBuilder sb = new StringBuilder();
sb.append(prefix);
sb.append(text.substring(startContent, endContent));
final String markerStr = markerPrefix
+ marker.substring(startContent, endContent);
sb.append(postfix);
final int startMark = markerStr.indexOf('^');
final int endMark = markerStr.lastIndexOf('^');
String result = sb.toString();
if (escapeHTML) {
result = StringTools.escapeHTML(result.substring(0, startMark))
+ markerStart
+ StringTools.escapeHTML(result.substring(startMark, endMark + 1))
+ markerEnd + StringTools.escapeHTML(result.substring(endMark + 1));
} else {
result = result.substring(0, startMark) + markerStart
+ result.substring(startMark, endMark + 1) + markerEnd
+ result.substring(endMark + 1);
}
return result;
}
/**
* Show a file chooser dialog and return the file selected by the user or
* null
.
*/
static File openFileDialog(final Frame frame, final FileFilter fileFilter) {
final JFileChooser jfc = new JFileChooser();
jfc.setFileFilter(fileFilter);
jfc.showOpenDialog(frame);
final File file = jfc.getSelectedFile();
if (file == null) {
return null;
}
return file;
}
/**
* Show the exception (with stacktrace) in a dialog and print it to STDERR.
*/
static void showError(final Exception e) {
final String msg = de.danielnaber.languagetool.tools.Tools
.getFullStackTrace(e);
JOptionPane
.showMessageDialog(null, msg, "Error", JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
}
/**
* Show the exception (message without stacktrace) in a dialog and print it to
* STDERR.
*/
static void showErrorMessage(final Exception e) {
final String msg = e.getMessage();
JOptionPane
.showMessageDialog(null, msg, "Error", JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
}
}