summaryrefslogtreecommitdiff
path: root/BKUCommonGUI/src
diff options
context:
space:
mode:
Diffstat (limited to 'BKUCommonGUI/src')
-rw-r--r--BKUCommonGUI/src/main/java/META-INF/MANIFEST.MF3
-rw-r--r--BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/AbstractHelpListener.java103
-rw-r--r--BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUIFacade.java22
-rw-r--r--BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUIImpl.java4160
-rw-r--r--BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUIcons.java17
-rw-r--r--BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/DeafHelpListener.java67
-rw-r--r--BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/DefaultHelpListener.java81
-rw-r--r--BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/FocusBorder.java69
-rw-r--r--BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HashDataTableModel.java12
-rw-r--r--BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HelpKeyListener.java46
-rw-r--r--BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HelpListener.java84
-rw-r--r--BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HelpMouseListener.java54
-rw-r--r--BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HelpURLProvider.java33
-rw-r--r--BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HelpViewer.java13
-rw-r--r--BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HyperlinkRenderer.java11
-rw-r--r--BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/ImagePanel.java2
-rw-r--r--BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/SecureViewerDialog.java139
-rw-r--r--BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/SwitchFocusFocusListener.java82
-rw-r--r--BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/SwitchFocusListener.java98
-rw-r--r--BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/ViewerHelpListener.java101
-rw-r--r--BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/WindowCloseAdapter.java54
-rw-r--r--BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/html/RestrictedHTMLEditorKit.java3
-rw-r--r--BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/viewer/FontProviderException.java2
-rw-r--r--BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/viewer/SecureViewerSaveDialog.java51
-rw-r--r--BKUCommonGUI/src/main/java/at/gv/egiz/stal/impl/ByteArrayHashDataInput.java8
-rw-r--r--BKUCommonGUI/src/main/resources/at/gv/egiz/bku/gui/Messages.properties3
-rw-r--r--BKUCommonGUI/src/main/resources/at/gv/egiz/bku/gui/Messages_en.properties4
-rw-r--r--BKUCommonGUI/src/test/java/at/gv/egiz/bku/gui/BKUGUIWorker.java9
-rw-r--r--BKUCommonGUI/src/test/java/at/gv/egiz/bku/gui/DummyFontLoader.java8
-rw-r--r--BKUCommonGUI/src/test/java/at/gv/egiz/bku/gui/SecureViewerDialogTest.java4
-rw-r--r--BKUCommonGUI/src/test/java/at/gv/egiz/bku/gui/SimplePinInfo.java46
-rw-r--r--BKUCommonGUI/src/test/resources/commons-logging.properties1
32 files changed, 3393 insertions, 1997 deletions
diff --git a/BKUCommonGUI/src/main/java/META-INF/MANIFEST.MF b/BKUCommonGUI/src/main/java/META-INF/MANIFEST.MF
deleted file mode 100644
index 5e949512..00000000
--- a/BKUCommonGUI/src/main/java/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,3 +0,0 @@
-Manifest-Version: 1.0
-Class-Path:
-
diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/AbstractHelpListener.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/AbstractHelpListener.java
deleted file mode 100644
index 6fd1ffea..00000000
--- a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/AbstractHelpListener.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright 2008 Federal Chancellery Austria and
- * Graz University of Technology
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package at.gv.egiz.bku.gui;
-
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Locale;
-import java.util.ResourceBundle;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * Implement the showDocument(URL) method to provide an actual HelpListener.
- * This class does not keep a GUI reference and subclasses should not interfere with the GUI.
- * Therefore, any errors occurring in showDocument() should be handled/displayed within
- * showDocument() and exceptions thrown from showDocument() are logged, not displayed in the GUI.
- * <br/>
- * The help URL is build as [baseURL]/[locale]/[helpTopic].html
- * (note that no session information is contained).
- *
- * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at>
- */
-public abstract class AbstractHelpListener implements ActionListener {
-
- /**
- * any locale not in the list will be mapped to 'de'
- */
- public static final String[] SUPPORTED_LANGUAGES = new String[] { "de" };
-
- protected final static Log log = LogFactory.getLog(AbstractHelpListener.class);
- protected URL baseURL;
- protected Locale locale;
- protected ResourceBundle messages;
-
- public AbstractHelpListener(URL baseURL, Locale locale) {
- if (baseURL == null || "".equals(baseURL.toString())) {
- throw new RuntimeException("no help URL provided");
- }
- this.baseURL = baseURL;
- this.locale = locale;
- if (locale != null) {
- messages = ResourceBundle.getBundle(BKUGUIFacade.MESSAGES_BUNDLE, locale);
- } else {
- messages = ResourceBundle.getBundle(BKUGUIFacade.MESSAGES_BUNDLE);
- }
- }
-
- @Override
- public void actionPerformed(ActionEvent e) {
- log.debug("received help action: " + e.getActionCommand());
- URL helpURL = constructHelpURL(baseURL, e.getActionCommand());
- try {
- showDocument(helpURL, e.getActionCommand());
- } catch (Exception ex) {
- log.error("could not display help document " + helpURL + ": " + ex.getMessage());
- }
- }
-
- private URL constructHelpURL(URL baseURL, String helpTopic) {
- URL helpURL = baseURL;
- log.trace("constructing help URL: " + helpURL);
- try {
- // not localized for now
- //check if locale.getLanguage() supported and add default if not
-// if (locale != null) {
-// helpURL = new URL(helpURL, locale.toString() + "/");
-// log.trace("constructing help URL: " + helpURL);
-// }
- if (helpTopic != null && !"".equals(helpTopic)) {
- helpURL = new URL(helpURL, "de/" + helpTopic + ".html");
- log.trace("constructing help URL: " + helpURL);
- }
- } catch (MalformedURLException ex) {
- log.error("Failed to construct help URL for help item " + helpTopic + ": " + ex.getMessage());
- }
- return helpURL;
- }
-
- /**
- * Errors from HelpListeners should not (are not) displayed in the applet,
- * but should rather be in the HelpListener specific way.
- * Therefore, implementations SHOULD NOT throw exceptions (these are only logged).
- * @param helpDocument
- * @throws java.lang.Exception
- */
- public abstract void showDocument(URL helpDocument, String helpTopic) throws Exception;
-}
diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUIFacade.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUIFacade.java
index 1e23c64c..b7ab156f 100644
--- a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUIFacade.java
+++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUIFacade.java
@@ -17,7 +17,7 @@
package at.gv.egiz.bku.gui;
import at.gv.egiz.stal.HashDataInput;
-import at.gv.egiz.smcc.PINSpec;
+import at.gv.egiz.smcc.PinInfo;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.util.List;
@@ -46,10 +46,14 @@ public interface BKUGUIFacade {
public static final String DEFAULT_BACKGROUND = "/at/gv/egiz/bku/gui/chip32.png";
public static final String DEFAULT_ICON = "/at/gv/egiz/bku/gui/chiperling105.png";
public static final String HELP_IMG = "/at/gv/egiz/bku/gui/help.png";
+ public static final String HELP_IMG_L = "/at/gv/egiz/bku/gui/help_l.png";
+ public static final String HELP_IMG_XL = "/at/gv/egiz/bku/gui/help_xl.png";
+ public static final String HELP_IMG_XXL = "/at/gv/egiz/bku/gui/help_xxl.png";
public static final String HELP_IMG_FOCUS = "/at/gv/egiz/bku/gui/help.png"; //help_focus.png";
public static final String HASHDATA_FONT = "Monospaced";
public static final Color ERROR_COLOR = Color.RED;
public static final Color HYPERLINK_COLOR = Color.BLUE;
+ public static final Color HELP_COLOR = new Color(70, 148, 169);
public static final String TITLE_WELCOME = "title.welcome";
public static final String TITLE_INSERTCARD = "title.insertcard";
public static final String TITLE_CARD_NOT_SUPPORTED = "title.cardnotsupported";
@@ -114,11 +118,17 @@ public interface BKUGUIFacade {
public static final String SAVE_HASHDATAINPUT_PREFIX = "save.hashdatainput.prefix";
public static final String ALT_HELP = "alt.help";
- public void showEnterPINDirect(PINSpec spec, int retries);
+ public static final String SIGDATA_TOOLTIPTEXT = "dialog.sigpin.infolabel.sigdata.tooltiptext";
+ public static final String SWITCH_FOCUS_DUMMY_LABEL_NAME = "DummyLabel";
+
+ public enum DIALOG_TYPE {DIALOGUE_UNDEFINED, DIALOGUE_VERIFY_PIN, DIALOGUE_ENTER_PIN, DIALOGUE_SHOW_SIG_DATA, DIALOGUE_SIGNATURE_PIN, DIALOGUE_MESSAGE};
+
+
+ public void showEnterPINDirect(PinInfo pinInfo, int retries);
- public void showEnterPIN(PINSpec spec, int retries);
+ public void showEnterPIN(PinInfo pinInfo, int retries);
- public void showSignatureDataDialog(PINSpec spec, ActionListener listener, String string, ActionListener aThis0, String string0, ActionListener aThis1, String string1);
+ public void showSignatureDataDialog(PinInfo pinInfo, ActionListener listener, String string, ActionListener aThis0, String string0, ActionListener aThis1, String string1);
public void correctionButtonPressed();
@@ -134,11 +144,11 @@ public interface BKUGUIFacade {
*/
public Locale getLocale();
- public void showVerifyPINDialog(PINSpec pinSpec, int numRetries,
+ public void showVerifyPINDialog(PinInfo pinSpec, int numRetries,
ActionListener okListener, String okCommand,
ActionListener cancelListener, String cancelCommand);
- public void showSignaturePINDialog(PINSpec pinSpec, int numRetries,
+ public void showSignaturePINDialog(PinInfo pinSpec, int numRetries,
ActionListener signListener, String signCommand,
ActionListener cancelListener, String cancelCommand,
ActionListener viewerListener, String viewerCommand);
diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUIImpl.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUIImpl.java
index e005836c..d806c5fa 100644
--- a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUIImpl.java
+++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUIImpl.java
@@ -20,15 +20,19 @@ package at.gv.egiz.bku.gui;
import at.gv.egiz.bku.gui.viewer.FontProviderException;
import at.gv.egiz.bku.gui.viewer.FontProvider;
import at.gv.egiz.bku.gui.viewer.SecureViewerSaveDialog;
-import at.gv.egiz.smcc.PINSpec;
+import at.gv.egiz.smcc.PinInfo;
import at.gv.egiz.stal.HashDataInput;
import java.awt.Color;
+import java.awt.Component;
import java.awt.Container;
import java.awt.Cursor;
+import java.awt.FocusTraversalPolicy;
import java.awt.Font;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
+import java.awt.event.ComponentAdapter;
+import java.awt.event.ComponentEvent;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.KeyAdapter;
@@ -36,16 +40,19 @@ import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
import java.net.URL;
import java.text.MessageFormat;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+
+import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
+import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
@@ -59,1607 +66,2730 @@ import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
- *
+ *
* @author clemens
*/
public class BKUGUIImpl implements BKUGUIFacade {
-
- protected static final Log log = LogFactory.getLog(BKUGUIImpl.class);
- protected enum PinLabelPosition {
- LEFT, ABOVE
- }
+ private final Logger log = LoggerFactory.getLogger(BKUGUIImpl.class);
- protected HelpMouseListener helpMouseListener;
- protected HelpKeyListener helpKeyListener;
- protected SwitchFocusFocusListener switchFocusKeyListener;
- protected SecureViewerDialog secureViewer;
- protected FontProvider fontProvider;
-
- protected Container contentPane;
- protected ResourceBundle messages;
- /** left and right side main panels */
- protected JPanel iconPanel;
- protected JPanel contentPanel;
- /** right side content panels and layouts */
- protected JPanel headerPanel;
- protected JPanel mainPanel;
- protected JPanel buttonPanel;
- /** right side fixed labels */
- protected JLabel titleLabel;
- protected JLabel helpLabel;
- protected JLabel switchFocusDummyLabel;
- /** remember the pinfield to return to worker */
- protected JPasswordField pinField;
- protected Document pinpadPIN;
-
- protected int buttonSize;
-
- /** gui style config (default 'simple') */
- protected boolean renderHeaderPanel = false;
- protected boolean renderIconPanel = false;
- protected boolean renderCancelButton = false;
- protected boolean shortText = false;
- protected PinLabelPosition pinLabelPos = PinLabelPosition.LEFT;
- protected boolean renderRefId = false;
-
- /**
- * set contentPane
- * init message bundle
- * configure the style
- * register the help listener
- * create GUI (on event-dispatching thread)
- *
- * @param contentPane
- * @param locale
- * @param guiStyle
- * @param background
- * @param helpListener
- */
- public BKUGUIImpl(Container contentPane,
- Locale locale,
- Style guiStyle,
- URL background,
- FontProvider fontProvider,
- ActionListener helpListener,
- SwitchFocusListener switchFocusListener) {
- this.contentPane = contentPane;
-
- loadMessageBundle(locale);
-
- if (guiStyle == Style.advanced) {
- renderHeaderPanel = true;
- renderIconPanel = false;
- renderCancelButton = true;
- renderRefId = true;
- } else if (guiStyle == Style.tiny) {
- shortText = true;
- pinLabelPos = PinLabelPosition.ABOVE;
- }
-
- // ensure that buttons can be fired with enter key too
- UIManager.put("Button.defaultButtonFollowsFocus", Boolean.TRUE);
-
- registerHelpListener(helpListener);
-
- registerSwitchFocusListener(switchFocusListener);
-
- this.fontProvider = fontProvider;
- createGUI(background);
- }
-
- private void createGUI(final URL background) {
-
- try {
-
- log.debug("scheduling gui initialization");
-
- SwingUtilities.invokeLater(new Runnable() {
-
- @Override
- public void run() {
-
- log.debug("[" + Thread.currentThread().getName() + "] initializing gui");
-
- if (renderIconPanel) {
- initIconPanel(background);
- initContentPanel(null);
- } else {
- initContentPanel(background);
- }
-
- GroupLayout layout = new GroupLayout(contentPane);
- contentPane.setLayout(layout);
-
- if (renderIconPanel) {
- layout.setHorizontalGroup(layout.createSequentialGroup()
- .addContainerGap()
- .addComponent(iconPanel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)
- .addComponent(contentPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
- .addContainerGap());
- layout.setVerticalGroup(layout.createSequentialGroup()
- .addContainerGap()
- .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addComponent(iconPanel, GroupLayout.Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
- .addComponent(contentPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
- .addContainerGap());
- } else {
- layout.setHorizontalGroup(layout.createSequentialGroup()
- // left border
- .addContainerGap()
- .addComponent(contentPanel)
- .addContainerGap());
- layout.setVerticalGroup(layout.createSequentialGroup()
- .addContainerGap()
- .addComponent(contentPanel)
- .addContainerGap());
- }
- }
- });
- } catch (Exception ex) {
- throw new RuntimeException("Failed to init GUI: " + ex.getMessage());
- }
- }
-
- protected void initIconPanel(URL background) {
- if (background == null) {
- background = getClass().getResource(DEFAULT_ICON);
- }
- if ("file".equals(background.getProtocol())) {
- log.warn("file:// background images not permitted: " + background +
- ", loading default background");
- background = getClass().getResource(DEFAULT_ICON);
- }
- log.debug("loading icon panel background " + background);
-
- iconPanel = new JPanel();
- JLabel iconLabel = new JLabel();
- iconLabel.setIcon(new ImageIcon(background));
-
- GroupLayout iconPanelLayout = new GroupLayout(iconPanel);
- iconPanel.setLayout(iconPanelLayout);
- iconPanelLayout.setHorizontalGroup(
- iconPanelLayout.createSequentialGroup()
- .addComponent(iconLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE));
- iconPanelLayout.setVerticalGroup(
- iconPanelLayout.createSequentialGroup()
- .addComponent(iconLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE));
- }
+ protected enum PinLabelPosition {
+ LEFT, ABOVE
+ }
- protected void initContentPanel(URL background) {
-
- if (background == null) {
- log.debug("no background image set");
-// contentPanel = new ImagePanel(getClass().getResource(DEFAULT_BACKGROUND));
- contentPanel = new JPanel();
- } else if ("file".equals(background.getProtocol())) {
- log.warn("file:// background images not permitted: " + background);
- contentPanel = new JPanel();
- } else {
- log.debug("loading background " + background);
- contentPanel = new ImagePanel(background);
- }
- contentPanel.setOpaque(false);
- mainPanel = new JPanel();
- mainPanel.setOpaque(false);
- buttonPanel = new JPanel();
- buttonPanel.setOpaque(false);
-
- helpLabel = new JLabel();
- helpLabel.setIcon(new ImageIcon(getClass().getResource(HELP_IMG)));
- helpLabel.getAccessibleContext().setAccessibleName(getMessage(ALT_HELP));
- helpLabel.setFocusable(true);
- helpLabel.addMouseListener(helpMouseListener);
- helpLabel.addKeyListener(helpKeyListener);
- helpLabel.addFocusListener(new FocusAdapter() {
-
- @Override
- public void focusGained(FocusEvent e) {
-
- helpLabel.setIcon(new ImageIcon(getClass().getResource(HELP_IMG_FOCUS)));
- }
-
- @Override
- public void focusLost(FocusEvent e) {
-
- helpLabel.setIcon(new ImageIcon(getClass().getResource(HELP_IMG)));
- }
-
-
- });
- helpLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
-
- switchFocusDummyLabel = new JLabel();
- switchFocusDummyLabel.setText("");
- switchFocusDummyLabel.setFocusable(true);
- switchFocusDummyLabel.addFocusListener(switchFocusKeyListener);
-
- buttonSize = initButtonSize();
-
- if (renderHeaderPanel) {
- headerPanel = new JPanel();
- headerPanel.setOpaque(false);
-
- titleLabel = new JLabel();
- titleLabel.setFont(titleLabel.getFont().deriveFont(titleLabel.getFont().getStyle() |
- java.awt.Font.BOLD, titleLabel.getFont().getSize() + 2));
-
- GroupLayout headerPanelLayout = new GroupLayout(headerPanel);
- headerPanel.setLayout(headerPanelLayout);
-
- headerPanelLayout.setHorizontalGroup(
- headerPanelLayout.createSequentialGroup()
- .addComponent(titleLabel, 0, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE)
- .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED, 0, Short.MAX_VALUE)
- .addComponent(switchFocusDummyLabel)
- .addComponent(helpLabel)
- );
- headerPanelLayout.setVerticalGroup(
- headerPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addComponent(titleLabel, 0, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE)
- .addComponent(switchFocusDummyLabel)
- .addComponent(helpLabel)
- );
- }
-
- GroupLayout contentPanelLayout = new GroupLayout(contentPanel);
- contentPanel.setLayout(contentPanelLayout);
-
- // align header, main and button to the right
- GroupLayout.ParallelGroup horizontalContent =
- contentPanelLayout.createParallelGroup(GroupLayout.Alignment.TRAILING); //LEADING);
- GroupLayout.SequentialGroup verticalContent =
- contentPanelLayout.createSequentialGroup();
-
- if (renderHeaderPanel) {
- horizontalContent
- .addComponent(headerPanel, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE);
- verticalContent
- .addComponent(headerPanel, 0, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED);
-
- }
- horizontalContent
- .addComponent(mainPanel, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
- .addComponent(buttonPanel, 0, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE); //Short.MAX_VALUE);
- verticalContent
- .addComponent(mainPanel, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
- .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)
- .addComponent(buttonPanel, 0, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE);
-
- contentPanelLayout.setHorizontalGroup(horizontalContent); //Outer);
- contentPanelLayout.setVerticalGroup(verticalContent);
+ protected Component primaryFocusHolder;
+ protected SecureViewerDialog secureViewer;
+
+ protected HelpListener helpListener;
+ protected SwitchFocusFocusListener switchFocusKeyListener;
+ protected FontProvider fontProvider;
+
+ protected Container contentPane;
+ protected WindowCloseAdapter windowCloseAdapter;
+ protected ResourceBundle messages;
+ /** left and right side main panels */
+ protected JPanel iconPanel;
+ protected JPanel contentPanel;
+ /** right side content panels and layouts */
+ protected JPanel headerPanel;
+ protected JPanel mainPanel;
+ protected JPanel buttonPanel;
+ /** right side fixed labels */
+ protected JLabel titleLabel;
+ protected JLabel msgTitleLabel;
+ protected JLabel helpLabel;
+ protected JLabel switchFocusDummyLabel;
+ /** remember the pinfield to return to worker */
+ protected JPasswordField pinField;
+ protected Document pinpadPIN;
+
+ protected JButton okButton;
+ protected JButton backButton;
+ protected JButton enterPINButton;
+ protected final JButton cancelButton;
+ protected JLabel infoLabel;
+ protected final JLabel pinsizeLabel;
+ protected final JLabel signPinLabel;
+ protected final JButton signButton;
+ protected JLabel cardPinLabel;
+ protected JLabel pinLabel;
+ protected JPasswordField pinpadPINField;
+ protected JLabel msgLabel;
+ protected boolean showMessageOKButton;
+ protected JLabel refIdLabel;
+ protected JScrollPane hashDataScrollPane;
+ protected JTable hashDataTable;
+ protected HyperlinkRenderer hyperlinkRenderer;
+ protected int baseTableRowHeight;
+
+ protected FocusBorder sigDataFocusBorder;
+ protected FocusBorder helpFocusBorder;
+
+ protected Method methodToRunAtResize;
+
+ protected int buttonSize;
+ protected int baseButtonSize;
+ protected Integer baseWidth;
+ protected Integer baseHeight;
+ protected int baseFontSize;
+
+ /** gui style config (default 'simple') */
+ protected boolean renderHeaderPanel = false;
+ protected boolean renderIconPanel = false;
+ protected boolean renderCancelButton = false;
+ protected boolean shortText = false;
+ protected PinLabelPosition pinLabelPos = PinLabelPosition.LEFT;
+ protected boolean renderRefId = false;
+ protected boolean useFocusTraversalPolicy = false;
+
+// protected HashDataInput storedSelection;
+ protected List<HashDataInput> signedReferences;
+ protected Integer referenceIndex;
+ private at.gv.egiz.bku.gui.BKUGUIImpl.SignedReferencesSelectionListener.SignedReferencesListDisplayer storedBackToListListener;
+
+ /**
+ * set contentPane init message bundle configure the style register the help
+ * listener create GUI (on event-dispatching thread)
+ *
+ * @param contentPane
+ * @param locale
+ * @param guiStyle
+ * @param background
+ * @param helpListener
+ */
+ public BKUGUIImpl(Container contentPane, Locale locale, Style guiStyle,
+ URL background, FontProvider fontProvider,
+ HelpListener helpListener, SwitchFocusListener switchFocusListener) {
+ this.contentPane = contentPane;
+ Window w = SwingUtilities.getWindowAncestor(contentPane);
+ if (w != null && w instanceof JFrame) {
+ this.windowCloseAdapter = new WindowCloseAdapter();
+ ((JFrame) w).addWindowListener(windowCloseAdapter);
}
+
+ loadMessageBundle(locale);
+
+ cancelButton = new JButton();
+ infoLabel = new JLabel();
+ cardPinLabel = new JLabel();
+ pinsizeLabel = new JLabel();
+ signPinLabel = new JLabel();
+ signButton = new JButton();
+ pinLabel = new JLabel();
+ pinpadPINField = new JPasswordField();
+ msgLabel = new JLabel();
+ showMessageOKButton = false;
+
+ this.baseFontSize = new JLabel().getFont().getSize();
+ this.baseTableRowHeight = new JTable().getRowHeight();
+
+ if (guiStyle == Style.advanced) {
+ renderHeaderPanel = true;
+ renderIconPanel = false;
+ renderCancelButton = true;
+ renderRefId = true;
+ useFocusTraversalPolicy = true;
+ } else if (guiStyle == Style.tiny) {
+ shortText = true;
+ pinLabelPos = PinLabelPosition.ABOVE;
+ }
+
+ // ensure that buttons can be fired with enter key too
+ UIManager.put("Button.defaultButtonFollowsFocus", Boolean.TRUE);
+
+ registerSwitchFocusListener(switchFocusListener);
+
+ this.fontProvider = fontProvider;
+ this.helpListener = helpListener;
+ createGUI(background);
- /**
- * BKUWorker inits signaturecard with locale
- * @return
- */
- @Override
- public Locale getLocale() {
- return messages.getLocale();
- }
+ }
- /**
- * to be overridden by subclasses providing additional resource messages
- * @param key
- * @return
- */
- protected String getMessage(String key) {
- return messages.getString(key);
- }
+ private void createGUI(final URL background) {
+
+ try {
+
+ log.debug("Scheduling gui initialization.");
+
+ SwingUtilities.invokeLater(new Runnable() {
+
+ @Override
+ public void run() {
+
+ log.debug("[{}] Initializing gui.", Thread.currentThread().getName());
+
+ if (renderIconPanel) {
+ initIconPanel(background);
+ initContentPanel(null);
+ } else {
+ initContentPanel(background);
+ }
+
+ contentPanel.addComponentListener(new ComponentAdapter() {
+
+ @Override
+ public void componentResized(ComponentEvent e) {
+
+ log.debug("Component resize detected.");
+
+ resize();
+ }
+
+ });
+
+ GroupLayout layout = new GroupLayout(contentPane);
+ contentPane.setLayout(layout);
+
+ if (renderIconPanel) {
+ layout
+ .setHorizontalGroup(layout
+ .createSequentialGroup()
+ .addContainerGap()
+ .addComponent(iconPanel,
+ GroupLayout.PREFERRED_SIZE,
+ GroupLayout.DEFAULT_SIZE,
+ GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(
+ LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(contentPanel,
+ GroupLayout.DEFAULT_SIZE,
+ GroupLayout.DEFAULT_SIZE,
+ Short.MAX_VALUE)
+ .addContainerGap());
+ layout
+ .setVerticalGroup(layout
+ .createSequentialGroup()
+ .addContainerGap()
+ .addGroup(
+ layout
+ .createParallelGroup(
+ GroupLayout.Alignment.LEADING)
+ .addComponent(
+ iconPanel,
+ GroupLayout.Alignment.TRAILING,
+ GroupLayout.DEFAULT_SIZE,
+ GroupLayout.DEFAULT_SIZE,
+ Short.MAX_VALUE)
+ .addComponent(
+ contentPanel,
+ GroupLayout.DEFAULT_SIZE,
+ GroupLayout.DEFAULT_SIZE,
+ Short.MAX_VALUE))
+ .addContainerGap());
+ } else {
+ layout.setHorizontalGroup(layout
+ .createSequentialGroup()
+ // left border
+ .addContainerGap().addComponent(contentPanel)
+ .addContainerGap());
+ layout.setVerticalGroup(layout.createSequentialGroup()
+ .addContainerGap().addComponent(contentPanel)
+ .addContainerGap());
+ }
+ }
+ });
+
+ } catch (Exception ex) {
+ throw new RuntimeException("Failed to init GUI: " + ex.getMessage());
+ }
+ }
- /**
- * to be overridden by subclasses providing additional resource messages
- * @param key
- * @return
- */
- protected boolean hasMessage(String key) {
- return messages.containsKey(key);
- }
+ protected void initIconPanel(URL background) {
+ if (background == null) {
+ background = getClass().getResource(DEFAULT_ICON);
+ }
+ if ("file".equals(background.getProtocol())) {
+ log.warn("file:// background images not permitted: {}, "
+ + "loading default background", background);
+ background = getClass().getResource(DEFAULT_ICON);
+ }
+ log.debug("Loading icon panel background {}.", background);
+
+ iconPanel = new JPanel();
+ JLabel iconLabel = new JLabel();
+ iconLabel.setIcon(new ImageIcon(background));
+
+ GroupLayout iconPanelLayout = new GroupLayout(iconPanel);
+ iconPanel.setLayout(iconPanelLayout);
+ iconPanelLayout.setHorizontalGroup(iconPanelLayout
+ .createSequentialGroup().addComponent(iconLabel,
+ GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE,
+ GroupLayout.PREFERRED_SIZE));
+ iconPanelLayout.setVerticalGroup(iconPanelLayout
+ .createSequentialGroup().addComponent(iconLabel,
+ GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE,
+ GroupLayout.PREFERRED_SIZE));
+ }
+
+ protected void initContentPanel(URL background) {
+
+ if (background == null) {
+ log.debug("No background image set.");
+ // contentPanel = new
+ // ImagePanel(getClass().getResource(DEFAULT_BACKGROUND));
+ contentPanel = new JPanel();
+ } else if ("file".equals(background.getProtocol())) {
+ log.warn("file:// background images not permitted: {}.", background);
+ contentPanel = new JPanel();
+ } else {
+ log.debug("Loading background {}.", background);
+ contentPanel = new ImagePanel(background);
+ }
+ contentPanel.setOpaque(false);
+ mainPanel = new JPanel();
+ mainPanel.setOpaque(false);
+ buttonPanel = new JPanel();
+ buttonPanel.setOpaque(false);
+
+ okButton = new JButton();
+ backButton = new JButton();
+ enterPINButton = new JButton();
+
+ sigDataFocusBorder = new FocusBorder(HYPERLINK_COLOR);
+ helpFocusBorder = new FocusBorder(HELP_COLOR);
+
+ if (helpListener.implementsListener()) {
+ helpLabel = new JLabel();
+ helpLabel.setIcon(new ImageIcon(getClass().getResource(HELP_IMG)));
+ helpLabel.getAccessibleContext().setAccessibleName(
+ getMessage(ALT_HELP));
+ helpLabel.setFocusable(true);
+ helpLabel.addMouseListener(helpListener);
+ helpLabel.addKeyListener(helpListener);
+ helpLabel.addFocusListener(new FocusAdapter() {
+
+ @Override
+ public void focusGained(FocusEvent e) {
+
+ log.debug("Help label obtained focus.");
+ updateHelpLabelIcon();
+ }
+
+ @Override
+ public void focusLost(FocusEvent e) {
+
+ updateHelpLabelIcon();
+ }
+
+ });
+ helpLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
+ }
+
+ // This is a hidden label. When it gains focus, it hands over focus to
+ // the web browser
+ switchFocusDummyLabel = new JLabel();
+ switchFocusDummyLabel.setText("");
+ switchFocusDummyLabel.setName(SWITCH_FOCUS_DUMMY_LABEL_NAME);
+ switchFocusDummyLabel.setFocusable(true);
+ switchFocusDummyLabel.addFocusListener(switchFocusKeyListener);
+
+ buttonSize = initButtonSize();
+ baseButtonSize = buttonSize;
+
+ titleLabel = new JLabel();
+ msgTitleLabel = new JLabel();
+
+ if (renderHeaderPanel) {
+ headerPanel = new JPanel();
+ headerPanel.setOpaque(false);
+
+ titleLabel.setFocusable(true);
+ titleLabel.setFont(titleLabel.getFont().deriveFont(
+ titleLabel.getFont().getStyle() | java.awt.Font.BOLD,
+ titleLabel.getFont().getSize() + 2));
+
+ GroupLayout headerPanelLayout = new GroupLayout(headerPanel);
+ headerPanel.setLayout(headerPanelLayout);
+
+ GroupLayout.SequentialGroup horizontalHeader = headerPanelLayout
+ .createSequentialGroup().addComponent(titleLabel, 0,
+ GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE);
+
+ GroupLayout.ParallelGroup verticalHeader = headerPanelLayout
+ .createParallelGroup(GroupLayout.Alignment.LEADING)
+ .addComponent(titleLabel, 0, GroupLayout.PREFERRED_SIZE,
+ Short.MAX_VALUE);
+
+ if (helpListener.implementsListener()) {
+ horizontalHeader.addPreferredGap(
+ LayoutStyle.ComponentPlacement.UNRELATED, 0,
+ Short.MAX_VALUE).addComponent(helpLabel);
+ verticalHeader.addComponent(helpLabel);
+ }
+
+ horizontalHeader.addComponent(switchFocusDummyLabel);
+ verticalHeader.addComponent(switchFocusDummyLabel);
+
+ headerPanelLayout.setHorizontalGroup(horizontalHeader);
+ headerPanelLayout.setVerticalGroup(verticalHeader);
+ }
+
+ GroupLayout contentPanelLayout = new GroupLayout(contentPanel);
+ contentPanel.setLayout(contentPanelLayout);
+
+ // align header, main and button to the right
+ GroupLayout.ParallelGroup horizontalContent = contentPanelLayout
+ .createParallelGroup(GroupLayout.Alignment.TRAILING); // LEADING);
+ GroupLayout.SequentialGroup verticalContent = contentPanelLayout
+ .createSequentialGroup();
+
+ if (renderHeaderPanel) {
+ horizontalContent.addComponent(headerPanel, 0,
+ GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE);
+ verticalContent.addComponent(headerPanel, 0,
+ GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED);
+
+ }
+ horizontalContent.addComponent(mainPanel, 0, GroupLayout.DEFAULT_SIZE,
+ Short.MAX_VALUE).addComponent(buttonPanel, 0,
+ GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE); // Short.MAX_VALUE);
+ verticalContent.addComponent(mainPanel, 0, GroupLayout.DEFAULT_SIZE,
+ Short.MAX_VALUE).addPreferredGap(
+ LayoutStyle.ComponentPlacement.UNRELATED).addComponent(
+ buttonPanel, 0, GroupLayout.DEFAULT_SIZE,
+ GroupLayout.PREFERRED_SIZE);
+
+ contentPanelLayout.setHorizontalGroup(horizontalContent); // Outer);
+ contentPanelLayout.setVerticalGroup(verticalContent);
+
+ }
+
+ /**
+ * BKUWorker inits signaturecard with locale
+ *
+ * @return
+ */
+ @Override
+ public Locale getLocale() {
+ return messages.getLocale();
+ }
+
+ /**
+ * to be overridden by subclasses providing additional resource messages
+ *
+ * @param key
+ * @return
+ */
+ protected String getMessage(String key) {
+ return messages.getString(key);
+ }
+
+ /**
+ * to be overridden by subclasses providing additional resource messages
+ *
+ * @param key
+ * @return
+ */
+ protected boolean hasMessage(String key) {
+ return messages.containsKey(key);
+ }
@Override
- public void showVerifyPINDialog(final PINSpec pinSpec, final int numRetries,
+ public void showVerifyPINDialog(final PinInfo pinSpec, final int numRetries,
final ActionListener okListener, final String okCommand,
final ActionListener cancelListener, final String cancelCommand) {
-
- log.debug("scheduling verify pin dialog");
-
- SwingUtilities.invokeLater(new Runnable() {
-
- @Override
- public void run() {
-
- log.debug("[" + Thread.currentThread().getName() + "] show verify pin dialog");
-
- mainPanel.removeAll();
- buttonPanel.removeAll();
-
- if (renderHeaderPanel) {
- if (numRetries < 0) {
- String verifyTitle = getMessage(TITLE_VERIFY_PIN);
- titleLabel.setText(MessageFormat.format(verifyTitle, new Object[]{pinSpec.getLocalizedName()}));
- } else {
- titleLabel.setText(getMessage(TITLE_RETRY));
- }
- }
-
- JButton okButton = new JButton();
- okButton.setFont(okButton.getFont().deriveFont(okButton.getFont().getStyle() & ~java.awt.Font.BOLD));
- okButton.setText(getMessage(BUTTON_OK));
- okButton.setEnabled(pinSpec.getMinLength() <= 0);
- okButton.setActionCommand(okCommand);
- okButton.addActionListener(okListener);
-
- JLabel cardPinLabel = new JLabel();
- cardPinLabel.setFont(cardPinLabel.getFont().deriveFont(cardPinLabel.getFont().getStyle() & ~java.awt.Font.BOLD));
- String pinLabel = getMessage(LABEL_PIN);
- cardPinLabel.setText(MessageFormat.format(pinLabel, new Object[]{pinSpec.getLocalizedName()}));
-
- pinField = new JPasswordField();
- pinField.setText("");
- pinField.setDocument(new PINDocument(pinSpec.getMinLength(), pinSpec.getMaxLength(), pinSpec.getRexepPattern(), okButton));
- pinField.setActionCommand(okCommand);
- pinField.addActionListener(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- if (pinField.getPassword().length >= pinSpec.getMinLength()) {
- okListener.actionPerformed(e);
- }
- }
- });
-
- JLabel infoLabel = new JLabel();
- if (numRetries < 0) {
- infoLabel.setFont(infoLabel.getFont().deriveFont(infoLabel.getFont().getStyle() & ~java.awt.Font.BOLD));
- String infoPattern = getMessage(MESSAGE_ENTERPIN);
- if (shortText) {
- infoLabel.setText(MessageFormat.format(infoPattern, new Object[] {"PIN"}));
- } else {
- infoLabel.setText(MessageFormat.format(infoPattern, new Object[] {pinSpec.getLocalizedName()}));
- }
- helpMouseListener.setHelpTopic(HELP_VERIFY_PIN);
- helpKeyListener.setHelpTopic(HELP_VERIFY_PIN);
- } else {
- String retryPattern;
- if (numRetries < 2) {
- retryPattern = getMessage(MESSAGE_LAST_RETRY);
- } else {
- retryPattern = getMessage(MESSAGE_RETRIES);
- }
- infoLabel.setFont(infoLabel.getFont().deriveFont(infoLabel.getFont().getStyle() | java.awt.Font.BOLD));
- infoLabel.setText(MessageFormat.format(retryPattern, new Object[]{String.valueOf(numRetries)}));
- infoLabel.setForeground(ERROR_COLOR);
- helpMouseListener.setHelpTopic(HELP_RETRY);
- helpKeyListener.setHelpTopic(HELP_RETRY);
- }
-
- JLabel pinsizeLabel = new JLabel();
- pinsizeLabel.setFont(pinsizeLabel.getFont().deriveFont(pinsizeLabel.getFont().getStyle() & ~java.awt.Font.BOLD, pinsizeLabel.getFont().getSize()-2));
- pinsizeLabel.setText(MessageFormat.format(getMessage(LABEL_PINSIZE), pinSpec.getLocalizedLength()));
-
- GroupLayout mainPanelLayout = new GroupLayout(mainPanel);
- mainPanel.setLayout(mainPanelLayout);
-
- GroupLayout.SequentialGroup infoHorizontal = mainPanelLayout.createSequentialGroup()
- .addComponent(infoLabel);
- GroupLayout.ParallelGroup infoVertical = mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addComponent(infoLabel);
-
- if (!renderHeaderPanel) {
- infoHorizontal
- .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED, 0, Short.MAX_VALUE)
- .addComponent(switchFocusDummyLabel)
- .addComponent(helpLabel)
- ;
- infoVertical
- .addComponent(switchFocusDummyLabel)
- .addComponent(helpLabel)
- ;
- }
-
- // align pinfield and pinsize to the right
- GroupLayout.ParallelGroup pinHorizontal = mainPanelLayout.createParallelGroup(GroupLayout.Alignment.TRAILING);
- GroupLayout.Group pinVertical;
-
- if (pinLabelPos == PinLabelPosition.ABOVE) {
- pinHorizontal
- .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addComponent(cardPinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
- .addComponent(pinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
- .addComponent(pinsizeLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE);
- pinVertical = mainPanelLayout.createSequentialGroup()
- .addComponent(cardPinLabel)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(pinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE);
- } else {
- pinHorizontal
- .addGroup(mainPanelLayout.createSequentialGroup()
- .addComponent(cardPinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(pinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
- .addComponent(pinsizeLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE);
- pinVertical = mainPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
- .addComponent(cardPinLabel)
- .addComponent(pinField);
- }
-
- mainPanelLayout.setHorizontalGroup(
- mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addGroup(infoHorizontal)
- .addGroup(pinHorizontal));
-
- mainPanelLayout.setVerticalGroup(
- mainPanelLayout.createSequentialGroup()
- .addGroup(infoVertical)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addGroup(pinVertical)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(pinsizeLabel));
-
-
- GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel);
- buttonPanel.setLayout(buttonPanelLayout);
-
- GroupLayout.SequentialGroup buttonHorizontal = buttonPanelLayout.createSequentialGroup()
- .addComponent(okButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE);
- GroupLayout.Group buttonVertical;
-
- if (renderCancelButton) {
- JButton cancelButton = new JButton();
- cancelButton.setFont(cancelButton.getFont().deriveFont(cancelButton.getFont().getStyle() & ~java.awt.Font.BOLD));
- cancelButton.setText(getMessage(BUTTON_CANCEL));
- cancelButton.setActionCommand(cancelCommand);
- cancelButton.addActionListener(cancelListener);
-
- buttonHorizontal
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(cancelButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE);
- buttonVertical = buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
- .addComponent(okButton)
- .addComponent(cancelButton);
- } else {
- buttonVertical = buttonPanelLayout.createSequentialGroup()
- .addComponent(okButton);
- }
-
- buttonPanelLayout.setHorizontalGroup(buttonHorizontal);
- buttonPanelLayout.setVerticalGroup(buttonVertical);
-
-// pinField.requestFocusInWindow();
-// helpLabel.requestFocus();
- pinField.requestFocus();
- contentPanel.validate();
-
- }
- });
- }
- @Override
- public void showEnterPINDirect(PINSpec pinSpec, int retries) {
- if (retries < 0) {
- showMessageDialog(TITLE_VERIFY_PINPAD, MESSAGE_ENTERPIN_PINPAD_DIRECT, new Object[] {
- pinSpec.getLocalizedName(), pinSpec.getLocalizedLength() });
- } else {
- showMessageDialog(TITLE_RETRY, MESSAGE_RETRIES, new Object[]{String.valueOf(retries) });
- }
- }
+ log.debug("Scheduling verify pin dialog.");
+
+ SwingUtilities.invokeLater(new Runnable() {
+
+ @Override
+ public void run() {
+
+ log.debug("[{}] Show verify pin dialog.", Thread.currentThread()
+ .getName());
+
+ mainPanel.removeAll();
+ buttonPanel.removeAll();
+
+ // avoid that dummy label gains focus during load
+ switchFocusDummyLabel.setFocusable(false);
+
+ if (renderHeaderPanel) {
+ if (numRetries < 0) {
+ String verifyTitle = getMessage(TITLE_VERIFY_PIN);
+ titleLabel.setText(MessageFormat.format(verifyTitle,
+ new Object[] { pinSpec.getLocalizedName() }));
+ } else {
+ titleLabel.setText(getMessage(TITLE_RETRY));
+ }
+ }
+
+ okButton.setFont(okButton.getFont().deriveFont(
+ okButton.getFont().getStyle() & ~java.awt.Font.BOLD));
+ okButton.setText(getMessage(BUTTON_OK));
+ okButton.setEnabled(pinSpec.getMinLength() <= 0);
+ okButton.setActionCommand(okCommand);
+ okButton.addActionListener(okListener);
+
+ cardPinLabel.setFont(cardPinLabel.getFont()
+ .deriveFont(
+ cardPinLabel.getFont().getStyle()
+ & ~java.awt.Font.BOLD));
+ String pinLabel = getMessage(LABEL_PIN);
+ cardPinLabel.setText(MessageFormat.format(pinLabel,
+ new Object[] { pinSpec.getLocalizedName() }));
+
+ pinField = new JPasswordField();
+ pinField.setText("");
+ pinField.setName("PINField");
+ pinField.setDocument(new PINDocument(pinSpec.getMinLength(),
+ pinSpec.getMaxLength(), pinSpec.getRexepPattern(),
+ okButton));
+ pinField.setActionCommand(okCommand);
+ pinField.addActionListener(new ActionListener() {
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ if (pinField.getPassword().length >= pinSpec
+ .getMinLength()) {
+ okListener.actionPerformed(e);
+ }
+ }
+ });
+
+ pinField.addFocusListener(new FocusAdapter() {
+
+ @Override
+ public void focusGained(FocusEvent e) {
+
+ // focus has been set accordingly - re-enable dummy
+ // label
+ switchFocusDummyLabel.setFocusable(true);
+ }
+
+ });
+
+ infoLabel = new JLabel();
+ if (numRetries < 0) {
+ infoLabel.setFont(infoLabel.getFont().deriveFont(
+ infoLabel.getFont().getStyle()
+ & ~java.awt.Font.BOLD));
+ String infoPattern = getMessage(MESSAGE_ENTERPIN);
+ if (shortText) {
+ infoLabel.setText(MessageFormat.format(infoPattern,
+ new Object[] { "PIN" }));
+ } else {
+ infoLabel.setText(MessageFormat.format(infoPattern,
+ new Object[] { pinSpec.getLocalizedName() }));
+ }
+ helpListener.setHelpTopic(HELP_VERIFY_PIN);
+ } else {
+ String retryPattern;
+ if (numRetries < 2) {
+ retryPattern = getMessage(MESSAGE_LAST_RETRY);
+ } else {
+ retryPattern = getMessage(MESSAGE_RETRIES);
+ }
+ infoLabel.setFont(infoLabel.getFont()
+ .deriveFont(
+ infoLabel.getFont().getStyle()
+ | java.awt.Font.BOLD));
+ infoLabel.setText(MessageFormat.format(retryPattern,
+ new Object[] { String.valueOf(numRetries) }));
+ infoLabel.setForeground(ERROR_COLOR);
+ helpListener.setHelpTopic(HELP_RETRY);
+ }
+
+ pinsizeLabel.setFont(pinsizeLabel.getFont()
+ .deriveFont(
+ pinsizeLabel.getFont().getStyle()
+ & ~java.awt.Font.BOLD,
+ pinsizeLabel.getFont().getSize() - 2));
+ pinsizeLabel.setText(MessageFormat
+ .format(getMessage(LABEL_PINSIZE), pinSpec
+ .getLocalizedLength()));
+
+ pinField.getAccessibleContext().setAccessibleDescription(
+ cardPinLabel.getText() + pinsizeLabel.getText());
+
+ GroupLayout mainPanelLayout = new GroupLayout(mainPanel);
+ mainPanel.setLayout(mainPanelLayout);
+
+ GroupLayout.SequentialGroup infoHorizontal = mainPanelLayout
+ .createSequentialGroup().addComponent(infoLabel);
+ GroupLayout.ParallelGroup infoVertical = mainPanelLayout
+ .createParallelGroup(GroupLayout.Alignment.LEADING)
+ .addComponent(infoLabel);
+
+ if (!renderHeaderPanel) {
+
+ if (helpListener.implementsListener()) {
+ infoHorizontal.addPreferredGap(
+ LayoutStyle.ComponentPlacement.UNRELATED, 0,
+ Short.MAX_VALUE).addComponent(helpLabel);
+ infoVertical.addComponent(helpLabel);
+ }
+ infoHorizontal.addComponent(switchFocusDummyLabel);
+ infoVertical.addComponent(switchFocusDummyLabel);
+ }
+
+ // align pinfield and pinsize to the right
+ GroupLayout.ParallelGroup pinHorizontal = mainPanelLayout
+ .createParallelGroup(GroupLayout.Alignment.TRAILING);
+ GroupLayout.Group pinVertical;
+
+ if (pinLabelPos == PinLabelPosition.ABOVE) {
+ pinHorizontal.addGroup(
+ mainPanelLayout.createParallelGroup(
+ GroupLayout.Alignment.LEADING)
+ .addComponent(cardPinLabel,
+ GroupLayout.PREFERRED_SIZE,
+ GroupLayout.DEFAULT_SIZE,
+ GroupLayout.PREFERRED_SIZE)
+ .addComponent(pinField,
+ GroupLayout.PREFERRED_SIZE,
+ GroupLayout.DEFAULT_SIZE,
+ Short.MAX_VALUE)).addComponent(
+ pinsizeLabel, GroupLayout.PREFERRED_SIZE,
+ GroupLayout.DEFAULT_SIZE,
+ GroupLayout.PREFERRED_SIZE);
+ pinVertical = mainPanelLayout.createSequentialGroup()
+ .addComponent(cardPinLabel).addPreferredGap(
+ LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(pinField, GroupLayout.PREFERRED_SIZE,
+ GroupLayout.DEFAULT_SIZE,
+ GroupLayout.PREFERRED_SIZE);
+ } else {
+ pinHorizontal
+ .addGroup(
+ mainPanelLayout
+ .createSequentialGroup()
+ .addComponent(cardPinLabel,
+ GroupLayout.PREFERRED_SIZE,
+ GroupLayout.DEFAULT_SIZE,
+ GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(
+ LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(pinField,
+ GroupLayout.PREFERRED_SIZE,
+ GroupLayout.DEFAULT_SIZE,
+ Short.MAX_VALUE))
+ .addComponent(pinsizeLabel,
+ GroupLayout.PREFERRED_SIZE,
+ GroupLayout.DEFAULT_SIZE,
+ GroupLayout.PREFERRED_SIZE);
+ pinVertical = mainPanelLayout.createParallelGroup(
+ GroupLayout.Alignment.BASELINE).addComponent(
+ cardPinLabel).addComponent(pinField);
+ }
+
+ mainPanelLayout.setHorizontalGroup(mainPanelLayout
+ .createParallelGroup(GroupLayout.Alignment.LEADING)
+ .addGroup(infoHorizontal).addGroup(pinHorizontal));
+
+ mainPanelLayout
+ .setVerticalGroup(mainPanelLayout
+ .createSequentialGroup().addGroup(infoVertical)
+ .addPreferredGap(
+ LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(pinVertical).addPreferredGap(
+ LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(pinsizeLabel));
+
+ if (renderCancelButton) {
+ cancelButton.setFont(cancelButton.getFont().deriveFont(
+ cancelButton.getFont().getStyle()
+ & ~java.awt.Font.BOLD));
+ cancelButton.setText(getMessage(BUTTON_CANCEL));
+ cancelButton.setActionCommand(cancelCommand);
+ cancelButton.addActionListener(cancelListener);
+ }
+
+ renderVerifyPINDialogueButtonPanel();
+
+ updateMethodToRunAtResize("at.gv.egiz.bku.gui.BKUGUIImpl",
+ "renderVerifyPINDialogueButtonPanel");
+
+ if (windowCloseAdapter != null) {
+ windowCloseAdapter.registerListener(cancelListener, cancelCommand);
+ }
- @Override
- public void showEnterPIN(final PINSpec pinSpec, final int retries) {
- showEnterPIN(pinSpec, retries, TITLE_VERIFY_PINPAD, MESSAGE_ENTERPIN_PINPAD, null);
- }
+ primaryFocusHolder = pinField;
+
+ pinField.requestFocus();
+ contentPanel.validate();
+
+ resize();
- protected void showEnterPIN(final PINSpec pinSpec, final int retries, final String titleKey, final String messageKey, final Object[] messageParams) {
- log.debug("scheduling pinpad dialog");
+ }
+ });
+ }
- SwingUtilities.invokeLater(new Runnable() {
+ @SuppressWarnings("unchecked")
+ protected void updateMethodToRunAtResize(String className, String methodName) {
+
+ try {
+ Class<at.gv.egiz.bku.gui.BKUGUIImpl> thisClass = (Class<at.gv.egiz.bku.gui.BKUGUIImpl>) Class
+ .forName(className);
+ Method m = thisClass.getMethod(methodName);
+ methodToRunAtResize = m;
+ } catch (SecurityException e1) {
+ log.error("Unable to store rendering method.", e1);
+ } catch (NoSuchMethodException e1) {
+ log.error("Unable to store rendering method.", e1);
+ } catch (ClassNotFoundException e) {
+ log.error("Unable to store rendering method.", e);
+ }
- @Override
- public void run() {
+ }
- log.debug("[" + Thread.currentThread().getName() + "] show pinpad dialog");
+ public void renderVerifyPINDialogueButtonPanel() {
- mainPanel.removeAll();
- buttonPanel.removeAll();
+ GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel);
+ buttonPanel.setLayout(buttonPanelLayout);
- if (renderHeaderPanel) {
- if (retries < 0) {
- titleLabel.setText(getMessage(titleKey));
- } else {
- titleLabel.setText(getMessage(TITLE_RETRY));
- }
- }
+ GroupLayout.SequentialGroup buttonHorizontal = buttonPanelLayout
+ .createSequentialGroup().addComponent(okButton,
+ GroupLayout.PREFERRED_SIZE, buttonSize,
+ GroupLayout.PREFERRED_SIZE);
+ GroupLayout.Group buttonVertical;
- final JLabel infoLabel = new JLabel();
- if (retries < 0) {
- infoLabel.setFont(infoLabel.getFont().deriveFont(infoLabel.getFont().getStyle() & ~java.awt.Font.BOLD));
- infoLabel.setText(MessageFormat.format(getMessage(messageKey), messageParams));
- helpMouseListener.setHelpTopic(HELP_PINPAD);
- helpKeyListener.setHelpTopic(HELP_PINPAD);
- } else {
- String retryPattern;
- if (retries == 1) {
- retryPattern = getMessage(MESSAGE_LAST_RETRY);
- } else {
- retryPattern = getMessage(MESSAGE_RETRIES);
- }
- infoLabel.setText(MessageFormat.format(retryPattern, new Object[]{String.valueOf(retries)}));
- infoLabel.setFont(infoLabel.getFont().deriveFont(infoLabel.getFont().getStyle() | java.awt.Font.BOLD));
- infoLabel.setForeground(ERROR_COLOR);
- helpMouseListener.setHelpTopic(HELP_RETRY);
- helpKeyListener.setHelpTopic(HELP_RETRY);
- }
+ if (renderCancelButton) {
- JLabel pinLabel = new JLabel();
- pinLabel.setFont(pinLabel.getFont().deriveFont(pinLabel.getFont().getStyle() & ~java.awt.Font.BOLD));
- String pinName = getMessage(LABEL_PIN);
- pinLabel.setText(MessageFormat.format(pinName, new Object[]{pinSpec.getLocalizedName()}));
-
- JPasswordField pinpadPINField = new JPasswordField();
- pinpadPINField.setText("");
- pinpadPINField.setEnabled(false);
- pinpadPIN = pinpadPINField.getDocument();
-
- JLabel pinsizeLabel = new JLabel();
- pinsizeLabel.setFont(pinsizeLabel.getFont().deriveFont(pinsizeLabel.getFont().getStyle() & ~java.awt.Font.BOLD, pinsizeLabel.getFont().getSize()-2));
- pinsizeLabel.setText(MessageFormat.format(getMessage(LABEL_PINSIZE), pinSpec.getLocalizedLength()));
-
- GroupLayout mainPanelLayout = new GroupLayout(mainPanel);
- mainPanel.setLayout(mainPanelLayout);
-
- GroupLayout.SequentialGroup infoHorizontal = mainPanelLayout.createSequentialGroup()
- .addComponent(infoLabel);
- GroupLayout.ParallelGroup infoVertical = mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addComponent(infoLabel);
-
- if (!renderHeaderPanel) {
- infoHorizontal
- .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED, 0, Short.MAX_VALUE)
- .addComponent(switchFocusDummyLabel)
- .addComponent(helpLabel)
- ;
- infoVertical
- .addComponent(switchFocusDummyLabel)
- .addComponent(helpLabel)
- ;
- }
+ buttonHorizontal.addPreferredGap(
+ LayoutStyle.ComponentPlacement.RELATED).addComponent(
+ cancelButton, GroupLayout.PREFERRED_SIZE, buttonSize,
+ GroupLayout.PREFERRED_SIZE);
+ buttonVertical = buttonPanelLayout.createParallelGroup(
+ GroupLayout.Alignment.BASELINE).addComponent(okButton)
+ .addComponent(cancelButton);
+ } else {
+ buttonVertical = buttonPanelLayout.createSequentialGroup()
+ .addComponent(okButton);
+ }
- // align pinfield and pinsize to the right
- GroupLayout.Group pinHorizontal = mainPanelLayout.createParallelGroup(GroupLayout.Alignment.TRAILING);
- GroupLayout.SequentialGroup pinVertical = mainPanelLayout.createSequentialGroup();
-
- if (pinLabelPos == PinLabelPosition.ABOVE) {
- pinHorizontal
- .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addComponent(pinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
- .addComponent(pinpadPINField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
- .addComponent(pinsizeLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE);
- pinVertical
- .addComponent(pinLabel)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(pinpadPINField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(pinsizeLabel);
- } else { // PinLabelPosition.LEFT
- pinHorizontal
- .addGroup(mainPanelLayout.createSequentialGroup()
- .addComponent(pinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(pinpadPINField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
- .addComponent(pinsizeLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE);
- pinVertical
- .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
- .addComponent(pinLabel)
- .addComponent(pinpadPINField))
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(pinsizeLabel);
- }
+ buttonPanelLayout.setHorizontalGroup(buttonHorizontal);
+ buttonPanelLayout.setVerticalGroup(buttonVertical);
+
+ }
+
+ @Override
+ public void showEnterPINDirect(PinInfo pinSpec, int retries) {
+ if (retries < 0) {
+ showMessageDialog(TITLE_VERIFY_PINPAD,
+ MESSAGE_ENTERPIN_PINPAD_DIRECT, new Object[] {
+ pinSpec.getLocalizedName(),
+ pinSpec.getLocalizedLength() });
+ } else {
+ showMessageDialog(TITLE_RETRY, MESSAGE_RETRIES,
+ new Object[] { String.valueOf(retries) });
+ }
+ }
+
+ @Override
+ public void showEnterPIN(final PinInfo pinSpec, final int retries) {
+ showEnterPIN(pinSpec, retries, TITLE_VERIFY_PINPAD,
+ MESSAGE_ENTERPIN_PINPAD, null);
+ }
+
+ protected void showEnterPIN(final PinInfo pinSpec, final int retries,
+ final String titleKey, final String messageKey,
+ final Object[] messageParams) {
+ log.debug("Scheduling pinpad dialog.");
+
+ SwingUtilities.invokeLater(new Runnable() {
+
+ @Override
+ public void run() {
+
+ log.debug("[{}] show pinpad dialog.", Thread.currentThread().getName());
+
+ mainPanel.removeAll();
+ buttonPanel.removeAll();
+
+ // avoid that dummy label gains focus during load
+ switchFocusDummyLabel.setFocusable(false);
+
+ if (renderHeaderPanel) {
+ if (retries < 0) {
+ titleLabel.setText(getMessage(titleKey));
+ } else {
+ titleLabel.setText(getMessage(TITLE_RETRY));
+ }
+ }
+
+ infoLabel = new JLabel();
+ if (retries < 0) {
+ infoLabel.setFont(infoLabel.getFont().deriveFont(
+ infoLabel.getFont().getStyle()
+ & ~java.awt.Font.BOLD));
+ infoLabel.setText(MessageFormat.format(
+ getMessage(messageKey), messageParams));
+ helpListener.setHelpTopic(HELP_PINPAD);
+ } else {
+ String retryPattern;
+ if (retries == 1) {
+ retryPattern = getMessage(MESSAGE_LAST_RETRY);
+ } else {
+ retryPattern = getMessage(MESSAGE_RETRIES);
+ }
+ infoLabel.setText(MessageFormat.format(retryPattern,
+ new Object[] { String.valueOf(retries) }));
+ infoLabel.getAccessibleContext().setAccessibleName(
+ infoLabel.getText());
+ infoLabel.setFont(infoLabel.getFont()
+ .deriveFont(
+ infoLabel.getFont().getStyle()
+ | java.awt.Font.BOLD));
+ infoLabel.setForeground(ERROR_COLOR);
+ helpListener.setHelpTopic(HELP_RETRY);
+ }
+
+ pinLabel.setFont(pinLabel.getFont().deriveFont(
+ pinLabel.getFont().getStyle() & ~java.awt.Font.BOLD));
+ String pinName = getMessage(LABEL_PIN);
+ pinLabel.setText(MessageFormat.format(pinName,
+ new Object[] { pinSpec.getLocalizedName() }));
+
+ pinpadPINField.setText("");
+ pinpadPINField.setEnabled(false);
+ pinpadPIN = pinpadPINField.getDocument();
+
+ pinsizeLabel.setFont(pinsizeLabel.getFont()
+ .deriveFont(
+ pinsizeLabel.getFont().getStyle()
+ & ~java.awt.Font.BOLD,
+ pinsizeLabel.getFont().getSize() - 2));
+ pinsizeLabel.setText(MessageFormat
+ .format(getMessage(LABEL_PINSIZE), pinSpec
+ .getLocalizedLength()));
+
+ GroupLayout mainPanelLayout = new GroupLayout(mainPanel);
+ mainPanel.setLayout(mainPanelLayout);
+
+ GroupLayout.SequentialGroup infoHorizontal = mainPanelLayout
+ .createSequentialGroup().addComponent(infoLabel);
+ GroupLayout.ParallelGroup infoVertical = mainPanelLayout
+ .createParallelGroup(GroupLayout.Alignment.LEADING)
+ .addComponent(infoLabel);
+
+ if (!renderHeaderPanel) {
+
+ if (helpListener.implementsListener()) {
+ infoHorizontal.addPreferredGap(
+ LayoutStyle.ComponentPlacement.UNRELATED, 0,
+ Short.MAX_VALUE).addComponent(helpLabel);
+ infoVertical.addComponent(helpLabel);
+ }
+ infoHorizontal.addComponent(switchFocusDummyLabel);
+ infoVertical.addComponent(switchFocusDummyLabel);
+
+ }
+
+ // align pinfield and pinsize to the right
+ GroupLayout.Group pinHorizontal = mainPanelLayout
+ .createParallelGroup(GroupLayout.Alignment.TRAILING);
+ GroupLayout.SequentialGroup pinVertical = mainPanelLayout
+ .createSequentialGroup();
+
+ if (pinLabelPos == PinLabelPosition.ABOVE) {
+ pinHorizontal.addGroup(
+ mainPanelLayout.createParallelGroup(
+ GroupLayout.Alignment.LEADING)
+ .addComponent(pinLabel,
+ GroupLayout.PREFERRED_SIZE,
+ GroupLayout.DEFAULT_SIZE,
+ GroupLayout.PREFERRED_SIZE)
+ .addComponent(pinpadPINField,
+ GroupLayout.PREFERRED_SIZE,
+ GroupLayout.DEFAULT_SIZE,
+ Short.MAX_VALUE)).addComponent(
+ pinsizeLabel, GroupLayout.PREFERRED_SIZE,
+ GroupLayout.DEFAULT_SIZE,
+ GroupLayout.PREFERRED_SIZE);
+ pinVertical.addComponent(pinLabel).addPreferredGap(
+ LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(pinpadPINField,
+ GroupLayout.PREFERRED_SIZE,
+ GroupLayout.DEFAULT_SIZE,
+ GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(
+ LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(pinsizeLabel);
+ } else { // PinLabelPosition.LEFT
+ pinHorizontal
+ .addGroup(
+ mainPanelLayout
+ .createSequentialGroup()
+ .addComponent(pinLabel,
+ GroupLayout.PREFERRED_SIZE,
+ GroupLayout.DEFAULT_SIZE,
+ GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(
+ LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(pinpadPINField,
+ GroupLayout.PREFERRED_SIZE,
+ GroupLayout.DEFAULT_SIZE,
+ Short.MAX_VALUE))
+ .addComponent(pinsizeLabel,
+ GroupLayout.PREFERRED_SIZE,
+ GroupLayout.DEFAULT_SIZE,
+ GroupLayout.PREFERRED_SIZE);
+ pinVertical.addGroup(
+ mainPanelLayout.createParallelGroup(
+ GroupLayout.Alignment.BASELINE)
+ .addComponent(pinLabel).addComponent(
+ pinpadPINField)).addPreferredGap(
+ LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(pinsizeLabel);
+ }
+
+ mainPanelLayout.setHorizontalGroup(mainPanelLayout
+ .createParallelGroup(GroupLayout.Alignment.LEADING)
+ .addGroup(infoHorizontal).addGroup(pinHorizontal));
+
+ mainPanelLayout
+ .setVerticalGroup(mainPanelLayout
+ .createSequentialGroup().addGroup(infoVertical)
+ .addPreferredGap(
+ LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(pinVertical));
+
+ infoLabel.setFocusable(true);
+
+ infoLabel.addFocusListener(new FocusAdapter() {
+
+ @Override
+ public void focusGained(FocusEvent e) {
+
+ // focus has been set accordingly - re-enable dummy
+ // label
+ switchFocusDummyLabel.setFocusable(true);
+ }
+
+ });
+
+ String accessibleData = cutOffHTMLTags(infoLabel.getText())
+ + cutOffHTMLTags(pinLabel.getText())
+ + cutOffHTMLTags(pinsizeLabel.getText());
+
+ infoLabel.getAccessibleContext().setAccessibleName(
+ accessibleData);
+ infoLabel.getAccessibleContext().setAccessibleDescription(
+ accessibleData);
+
+ primaryFocusHolder = infoLabel;
+
+ // delete potentially stored method to be run as nothing has to
+ // be re-rendered
+ methodToRunAtResize = null;
+
+ infoLabel.requestFocus();
+
+ contentPanel.validate();
+
+ resize();
+ }
+ });
+ }
+
+ // simple utility method to retrieve plain text from HTML
+ protected String cutOffHTMLTags(String str) {
+
+ char[] arr = str.toCharArray();
+ StringBuffer result = new StringBuffer();
+ boolean inTag = false;
- mainPanelLayout.setHorizontalGroup(
- mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addGroup(infoHorizontal)
- .addGroup(pinHorizontal));
+ for (int i = 0; i < arr.length; i++) {
- mainPanelLayout.setVerticalGroup(
- mainPanelLayout.createSequentialGroup()
- .addGroup(infoVertical)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addGroup(pinVertical));
+ char c = arr[i];
- contentPanel.validate();
- }
- });
- }
+ if (c == '<') {
+ inTag = true;
+ }
+
+ if (!inTag) {
+
+ result.append(c);
+ }
+
+ if (c == '>') {
+
+ inTag = false;
+ }
+ }
+
+ return result.toString();
+ }
@Override
- public void showSignatureDataDialog(PINSpec spec,
+ public void showSignatureDataDialog(PinInfo spec,
final ActionListener enterPINListener, final String enterPINCommand,
final ActionListener cancelListener, final String cancelCommand,
final ActionListener hashdataListener, final String hashdataCommand) {
- log.debug("scheduling signature-data dialog");
+ log.debug("Scheduling signature-data dialog.");
- SwingUtilities.invokeLater(new Runnable() {
+ SwingUtilities.invokeLater(new Runnable() {
- @Override
- public void run() {
+ @Override
+ public void run() {
- log.debug("[" + Thread.currentThread().getName() + "] show signature-data dialog");
+ log.debug("[{}] show signature-data dialog.",
+ Thread.currentThread().getName());
- mainPanel.removeAll();
- buttonPanel.removeAll();
+ mainPanel.removeAll();
+ buttonPanel.removeAll();
- if (renderHeaderPanel) {
- titleLabel.setText(getMessage(TITLE_SIGNATURE_DATA));
- }
+ // specify policy to ensure correct focus traversal
+ if (useFocusTraversalPolicy) {
- final JLabel infoLabel = new JLabel();
- infoLabel.setFont(infoLabel.getFont().deriveFont(infoLabel.getFont().getStyle() & ~java.awt.Font.BOLD));
- if (shortText) {
- infoLabel.setText(getMessage(MESSAGE_HASHDATALINK_TINY));
- } else {
- infoLabel.setText(getMessage(MESSAGE_HASHDATALINK));
- }
- infoLabel.setFocusable(true);
- infoLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
- infoLabel.setForeground(HYPERLINK_COLOR);
- infoLabel.addMouseListener(new MouseAdapter() {
+ contentPanel.setFocusCycleRoot(true);
+ contentPanel
+ .setFocusTraversalPolicy(new AdvancedShowSigDataGUIFocusTraversalPolicy());
+ }
- @Override
- public void mouseClicked(MouseEvent me) {
- ActionEvent e = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, hashdataCommand);
- hashdataListener.actionPerformed(e);
- }
- });
+ // avoid that dummy label gains focus during load
+ switchFocusDummyLabel.setFocusable(false);
- infoLabel.addKeyListener(new KeyAdapter() {
+ if (renderHeaderPanel) {
+ titleLabel.setText(getMessage(TITLE_SIGNATURE_DATA));
+ }
- @Override
- public void keyPressed(KeyEvent e) {
+ infoLabel = new JLabel();
+ infoLabel.setFont(infoLabel.getFont().deriveFont(
+ infoLabel.getFont().getStyle() & ~java.awt.Font.BOLD));
+ if (shortText) {
+ infoLabel.setText(getMessage(MESSAGE_HASHDATALINK_TINY));
+ } else {
+ infoLabel.setText(getMessage(MESSAGE_HASHDATALINK));
+ }
+ infoLabel.getAccessibleContext().setAccessibleName(
+ infoLabel.getText());
+ infoLabel.setFocusable(true);
- if(e.getKeyCode() == KeyEvent.VK_ENTER) {
- ActionEvent e1 = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, hashdataCommand);
- hashdataListener.actionPerformed(e1);
- }
- }
+ infoLabel.setToolTipText(getMessage(SIGDATA_TOOLTIPTEXT));
+ infoLabel.getAccessibleContext().setAccessibleDescription(
+ getMessage(SIGDATA_TOOLTIPTEXT));
+ infoLabel.getAccessibleContext().setAccessibleName(
+ getMessage(SIGDATA_TOOLTIPTEXT));
- });
+ infoLabel.setCursor(Cursor
+ .getPredefinedCursor(Cursor.HAND_CURSOR));
+ infoLabel.setForeground(HYPERLINK_COLOR);
+ infoLabel.addMouseListener(new MouseAdapter() {
- infoLabel.addFocusListener(new FocusAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent me) {
+ ActionEvent e = new ActionEvent(this,
+ ActionEvent.ACTION_PERFORMED, hashdataCommand);
+ hashdataListener.actionPerformed(e);
+ }
+ });
- @Override
- public void focusGained(FocusEvent e) {
+ infoLabel.addKeyListener(new KeyAdapter() {
- if (shortText) {
- infoLabel.setText(getMessage(MESSAGE_HASHDATALINK_TINY_FOCUS));
- } else {
- infoLabel.setText(getMessage(MESSAGE_HASHDATALINK_FOCUS));
- }
- }
+ @Override
+ public void keyPressed(KeyEvent e) {
- @Override
- public void focusLost(FocusEvent e) {
+ if (e.getKeyCode() == KeyEvent.VK_ENTER) {
+ ActionEvent e1 = new ActionEvent(this,
+ ActionEvent.ACTION_PERFORMED,
+ hashdataCommand);
+ hashdataListener.actionPerformed(e1);
+ }
+ }
- if (shortText) {
- infoLabel.setText(getMessage(MESSAGE_HASHDATALINK_TINY));
- } else {
- infoLabel.setText(getMessage(MESSAGE_HASHDATALINK));
- }
+ });
- }
+ infoLabel.addFocusListener(new FocusAdapter() {
- });
+ @Override
+ public void focusGained(FocusEvent e) {
- helpMouseListener.setHelpTopic(HELP_SIGNPIN);
- helpKeyListener.setHelpTopic(HELP_SIGNPIN);
+ infoLabel.setBorder(sigDataFocusBorder);
+ }
- //TODO message panel
+ @Override
+ public void focusLost(FocusEvent e) {
-// String msgPattern = getMessage(MESSAGE_ENTERPIN_PINPAD);
-// String msg = MessageFormat.format(msgPattern, new Object[] {
-// pinSpec.getLocalizedName(), pinSpec.getLocalizedLength() });
-//
-// JLabel msgLabel = new JLabel();
-// msgLabel.setFont(msgLabel.getFont().deriveFont(msgLabel.getFont().getStyle() & ~Font.BOLD));
-// msgLabel.setText(msg);
-
- GroupLayout mainPanelLayout = new GroupLayout(mainPanel);
- mainPanel.setLayout(mainPanelLayout);
-
- GroupLayout.SequentialGroup infoHorizontal = mainPanelLayout.createSequentialGroup()
- .addComponent(infoLabel);
- GroupLayout.ParallelGroup infoVertical = mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addComponent(infoLabel);
-
- if (!renderHeaderPanel) {
- infoHorizontal
- .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED, 0, Short.MAX_VALUE)
- .addComponent(switchFocusDummyLabel)
- .addComponent(helpLabel)
- ;
- infoVertical
- .addComponent(switchFocusDummyLabel)
- .addComponent(helpLabel)
- ;
- }
-
- mainPanelLayout.setHorizontalGroup(
- infoHorizontal);
-// mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
-// .addGroup(infoHorizontal)
-// .addComponent(msgLabel));
-
- mainPanelLayout.setVerticalGroup(
- infoVertical);
-// mainPanelLayout.createSequentialGroup()
-// .addGroup(infoVertical)
-// .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
-// .addComponent(msgLabel));
-
-
- GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel);
- buttonPanel.setLayout(buttonPanelLayout);
-
- GroupLayout.SequentialGroup buttonHorizontal = buttonPanelLayout.createSequentialGroup();
- GroupLayout.Group buttonVertical;
-
- JButton enterPINButton = new JButton();
- enterPINButton.setFont(enterPINButton.getFont().deriveFont(enterPINButton.getFont().getStyle() & ~java.awt.Font.BOLD));
- enterPINButton.setText(getMessage(BUTTON_SIGN));
- enterPINButton.setActionCommand(enterPINCommand);
- enterPINButton.addActionListener(enterPINListener);
-
- if (renderCancelButton) {
- JButton cancelButton = new JButton();
- cancelButton.setFont(cancelButton.getFont().deriveFont(cancelButton.getFont().getStyle() & ~java.awt.Font.BOLD));
- cancelButton.setText(getMessage(BUTTON_CANCEL));
- cancelButton.setActionCommand(cancelCommand);
- cancelButton.addActionListener(cancelListener);
-
- buttonHorizontal
- .addComponent(enterPINButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(cancelButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE)
- ;
- buttonVertical = buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
- .addComponent(enterPINButton)
- .addComponent(cancelButton)
- ;
- } else {
- buttonHorizontal
- .addComponent(enterPINButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE)
- ;
- buttonVertical = buttonPanelLayout.createSequentialGroup()
- .addComponent(enterPINButton)
- ;
- }
-
- buttonPanelLayout.setHorizontalGroup(buttonHorizontal);
- buttonPanelLayout.setVerticalGroup(buttonVertical);
-
- contentPanel.validate();
+ infoLabel.setBorder(BorderFactory.createEmptyBorder());
+ }
+
+ });
+
+ helpListener.setHelpTopic(HELP_SIGNPIN);
+
+ GroupLayout mainPanelLayout = new GroupLayout(mainPanel);
+ mainPanel.setLayout(mainPanelLayout);
+
+ GroupLayout.SequentialGroup infoHorizontal = mainPanelLayout
+ .createSequentialGroup().addComponent(infoLabel);
+ GroupLayout.ParallelGroup infoVertical = mainPanelLayout
+ .createParallelGroup(GroupLayout.Alignment.LEADING)
+ .addComponent(infoLabel);
+
+ if (!renderHeaderPanel) {
+
+ if (helpListener.implementsListener()) {
+ infoHorizontal.addPreferredGap(
+ LayoutStyle.ComponentPlacement.UNRELATED, 0,
+ Short.MAX_VALUE).addComponent(helpLabel);
+ infoVertical.addComponent(helpLabel);
+ }
+ infoHorizontal.addComponent(switchFocusDummyLabel);
+ infoVertical.addComponent(switchFocusDummyLabel);
+
+ }
+
+ mainPanelLayout.setHorizontalGroup(infoHorizontal);
+ mainPanelLayout.setVerticalGroup(infoVertical);
+
+ enterPINButton.setFont(enterPINButton.getFont().deriveFont(
+ enterPINButton.getFont().getStyle()
+ & ~java.awt.Font.BOLD));
+ enterPINButton.setText(getMessage(BUTTON_SIGN));
+ enterPINButton.setActionCommand(enterPINCommand);
+ enterPINButton.addActionListener(enterPINListener);
+
+ enterPINButton.addFocusListener(new FocusAdapter() {
+
+ @Override
+ public void focusGained(FocusEvent e) {
+
+ // focus has been set accordingly - re-enable dummy
+ // label
+ switchFocusDummyLabel.setFocusable(true);
+ }
+
+ });
+
+ if (renderCancelButton) {
+ cancelButton.setFont(cancelButton.getFont().deriveFont(
+ cancelButton.getFont().getStyle()
+ & ~java.awt.Font.BOLD));
+ cancelButton.setText(getMessage(BUTTON_CANCEL));
+ cancelButton.setActionCommand(cancelCommand);
+ cancelButton.addActionListener(cancelListener);
+ }
+
+ updateMethodToRunAtResize("at.gv.egiz.bku.gui.BKUGUIImpl",
+ "renderShowSignatureDataDialogButtonPanel");
+
+ renderShowSignatureDataDialogButtonPanel();
+
+ if (windowCloseAdapter != null) {
+ windowCloseAdapter.registerListener(cancelListener, cancelCommand);
}
- });
- }
- @Override
- public void correctionButtonPressed() {
- log.debug("[" + Thread.currentThread().getName() + "] correction button pressed");
-
- if (pinpadPIN != null) {
- try {
- pinpadPIN.remove(0, 1);
- } catch (BadLocationException ex) {
- }
- }
- }
+ primaryFocusHolder = enterPINButton;
- @Override
- public void allKeysCleared() {
- log.debug("[" + Thread.currentThread().getName() + "] all keys cleared");
-
- if (pinpadPIN != null) {
- try {
- pinpadPIN.remove(0, pinpadPIN.getLength());
- } catch (BadLocationException ex) {
- }
- }
- }
+ enterPINButton.requestFocus();
- @Override
- public void validKeyPressed() {
- log.debug("[" + Thread.currentThread().getName() + "] valid key pressed");
-
- if (pinpadPIN != null) {
- try {
- pinpadPIN.insertString(0, "*", null);
- } catch (BadLocationException ex) {
- }
- }
- }
+ contentPanel.validate();
- @Override
- public void showSignaturePINDialog(final PINSpec pinSpec, final int numRetries,
+ resize();
+ }
+ });
+ }
+
+ public void renderShowSignatureDataDialogButtonPanel() {
+
+ GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel);
+ buttonPanel.setLayout(buttonPanelLayout);
+
+ GroupLayout.SequentialGroup buttonHorizontal = buttonPanelLayout
+ .createSequentialGroup();
+ GroupLayout.Group buttonVertical;
+
+ if (renderCancelButton) {
+
+ buttonHorizontal.addComponent(enterPINButton,
+ GroupLayout.PREFERRED_SIZE, buttonSize,
+ GroupLayout.PREFERRED_SIZE).addPreferredGap(
+ LayoutStyle.ComponentPlacement.RELATED).addComponent(
+ cancelButton, GroupLayout.PREFERRED_SIZE, buttonSize,
+ GroupLayout.PREFERRED_SIZE);
+ buttonVertical = buttonPanelLayout.createParallelGroup(
+ GroupLayout.Alignment.BASELINE)
+ .addComponent(enterPINButton).addComponent(cancelButton);
+ } else {
+ buttonHorizontal.addComponent(enterPINButton,
+ GroupLayout.PREFERRED_SIZE, buttonSize,
+ GroupLayout.PREFERRED_SIZE);
+ buttonVertical = buttonPanelLayout.createSequentialGroup()
+ .addComponent(enterPINButton);
+ }
+
+ buttonPanelLayout.setHorizontalGroup(buttonHorizontal);
+ buttonPanelLayout.setVerticalGroup(buttonVertical);
+
+ }
+
+ @Override
+ public void correctionButtonPressed() {
+ log.debug("[{}] Correction button pressed.", Thread.currentThread().getName());
+
+ if (pinpadPIN != null) {
+ try {
+ pinpadPIN.remove(0, 1);
+ } catch (BadLocationException ex) {
+ }
+ }
+ }
+
+ @Override
+ public void allKeysCleared() {
+ log.debug("[{}] All keys cleared.", Thread.currentThread().getName());
+
+ if (pinpadPIN != null) {
+ try {
+ pinpadPIN.remove(0, pinpadPIN.getLength());
+ } catch (BadLocationException ex) {
+ }
+ }
+ }
+
+ @Override
+ public void validKeyPressed() {
+ log.debug("[{}] Valid key pressed.", Thread.currentThread().getName());
+
+ if (pinpadPIN != null) {
+ try {
+ pinpadPIN.insertString(0, "*", null);
+ } catch (BadLocationException ex) {
+ }
+ }
+ }
+
+ @Override
+ public void showSignaturePINDialog(final PinInfo pinSpec, final int numRetries,
final ActionListener signListener, final String signCommand,
final ActionListener cancelListener, final String cancelCommand,
final ActionListener hashdataListener, final String hashdataCommand) {
- log.debug("scheduling signature-pin dialog");
-
- SwingUtilities.invokeLater(new Runnable() {
-
- @Override
- public void run() {
-
- log.debug("[" + Thread.currentThread().getName() + "] show signature-pin dialog");
-
- mainPanel.removeAll();
- buttonPanel.removeAll();
-
- if (renderHeaderPanel) {
- if (numRetries < 0) {
- titleLabel.setText(getMessage(TITLE_SIGN));
- } else {
- titleLabel.setText(getMessage(TITLE_RETRY));
- }
- }
-
- final JLabel infoLabel = new JLabel();
- if (numRetries < 0) {
- infoLabel.setFont(infoLabel.getFont().deriveFont(infoLabel.getFont().getStyle() & ~java.awt.Font.BOLD));
- if (shortText) {
- infoLabel.setText(getMessage(MESSAGE_HASHDATALINK_TINY));
- } else {
- infoLabel.setText(getMessage(MESSAGE_HASHDATALINK));
- }
- infoLabel.setFocusable(true);
- infoLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
- infoLabel.setForeground(HYPERLINK_COLOR);
- infoLabel.addMouseListener(new MouseAdapter() {
-
- @Override
- public void mouseClicked(MouseEvent me) {
- ActionEvent e = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, hashdataCommand);
- hashdataListener.actionPerformed(e);
- }
- });
-
- infoLabel.addKeyListener(new KeyAdapter() {
-
- @Override
- public void keyPressed(KeyEvent e) {
-
- if(e.getKeyCode() == KeyEvent.VK_ENTER) {
- ActionEvent e1 = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, hashdataCommand);
- hashdataListener.actionPerformed(e1);
- }
- }
-
- });
-
- infoLabel.addFocusListener(new FocusAdapter() {
-
- @Override
- public void focusGained(FocusEvent e) {
-
-
- if (shortText) {
- infoLabel.setText(getMessage(MESSAGE_HASHDATALINK_TINY_FOCUS));
- } else {
- infoLabel.setText(getMessage(MESSAGE_HASHDATALINK_FOCUS));
- }
- }
-
- @Override
- public void focusLost(FocusEvent e) {
-
-
- if (shortText) {
- infoLabel.setText(getMessage(MESSAGE_HASHDATALINK_TINY));
- } else {
- infoLabel.setText(getMessage(MESSAGE_HASHDATALINK));
- }
-
- }
-
- });
-
- helpMouseListener.setHelpTopic(HELP_SIGNPIN);
- helpKeyListener.setHelpTopic(HELP_SIGNPIN);
- } else {
- String retryPattern;
- if (numRetries < 2) {
- retryPattern = getMessage(MESSAGE_LAST_RETRY);
- } else {
- retryPattern = getMessage(MESSAGE_RETRIES);
- }
- infoLabel.setFocusable(true);
- infoLabel.setText(MessageFormat.format(retryPattern, new Object[]{String.valueOf(numRetries)}));
- infoLabel.setFont(infoLabel.getFont().deriveFont(infoLabel.getFont().getStyle() | java.awt.Font.BOLD));
- infoLabel.setForeground(ERROR_COLOR);
- helpMouseListener.setHelpTopic(HELP_RETRY);
- helpKeyListener.setHelpTopic(HELP_RETRY);
- }
-
- JButton signButton = new JButton();
- signButton.setFont(signButton.getFont().deriveFont(signButton.getFont().getStyle() & ~java.awt.Font.BOLD));
- signButton.setText(getMessage(BUTTON_SIGN));
- signButton.setEnabled(pinSpec.getMinLength() <= 0);
- signButton.setActionCommand(signCommand);
- signButton.addActionListener(signListener);
-
- JLabel signPinLabel = new JLabel();
- signPinLabel.setFont(signPinLabel.getFont().deriveFont(signPinLabel.getFont().getStyle() & ~java.awt.Font.BOLD));
- String pinLabel = getMessage(LABEL_PIN);
- signPinLabel.setText(MessageFormat.format(pinLabel, new Object[]{pinSpec.getLocalizedName()}));
-
- pinField = new JPasswordField();
- pinField.setText("");
- pinField.setDocument(new PINDocument(pinSpec.getMinLength(), pinSpec.getMaxLength(), pinSpec.getRexepPattern(), signButton));
- pinField.setActionCommand(signCommand);
- pinField.addActionListener(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- if (pinField.getPassword().length >= pinSpec.getMinLength()) {
- signListener.actionPerformed(e);
- }
- }
- });
-
-
- JLabel pinsizeLabel = new JLabel();
- pinsizeLabel.setFont(pinsizeLabel.getFont().deriveFont(pinsizeLabel.getFont().getStyle() & ~java.awt.Font.BOLD, pinsizeLabel.getFont().getSize()-2));
- pinsizeLabel.setText(MessageFormat.format(getMessage(LABEL_PINSIZE), pinSpec.getLocalizedLength()));
-
- GroupLayout mainPanelLayout = new GroupLayout(mainPanel);
- mainPanel.setLayout(mainPanelLayout);
-
- GroupLayout.SequentialGroup infoHorizontal = mainPanelLayout.createSequentialGroup()
- .addComponent(infoLabel);
- GroupLayout.ParallelGroup infoVertical = mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addComponent(infoLabel);
-
- if (!renderHeaderPanel) {
- infoHorizontal
- .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED, 0, Short.MAX_VALUE)
- .addComponent(switchFocusDummyLabel)
- .addComponent(helpLabel)
- ;
- infoVertical
- .addComponent(switchFocusDummyLabel)
- .addComponent(helpLabel)
- ;
- }
-
- // align pinfield and pinsize to the right
- GroupLayout.Group pinHorizontal = mainPanelLayout.createParallelGroup(GroupLayout.Alignment.TRAILING);
- GroupLayout.SequentialGroup pinVertical = mainPanelLayout.createSequentialGroup();
-
- if (pinLabelPos == PinLabelPosition.ABOVE) {
- pinHorizontal
- .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addComponent(signPinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
- .addComponent(pinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
- .addComponent(pinsizeLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE);
- pinVertical
- .addComponent(signPinLabel)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(pinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(pinsizeLabel);
- } else { // PinLabelPosition.LEFT
- pinHorizontal
- .addGroup(mainPanelLayout.createSequentialGroup()
- .addComponent(signPinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(pinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
- .addComponent(pinsizeLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE);
- pinVertical
- .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
- .addComponent(signPinLabel)
- .addComponent(pinField))
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(pinsizeLabel);
- }
-
- mainPanelLayout.setHorizontalGroup(
- mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addGroup(infoHorizontal)
- .addGroup(pinHorizontal));
-
- mainPanelLayout.setVerticalGroup(
- mainPanelLayout.createSequentialGroup()
- .addGroup(infoVertical)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addGroup(pinVertical));
-
- GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel);
- buttonPanel.setLayout(buttonPanelLayout);
-
- GroupLayout.SequentialGroup buttonHorizontal = buttonPanelLayout.createSequentialGroup();
- GroupLayout.Group buttonVertical;
-
- if (renderCancelButton) {
- JButton cancelButton = new JButton();
- cancelButton.setFont(cancelButton.getFont().deriveFont(cancelButton.getFont().getStyle() & ~java.awt.Font.BOLD));
- cancelButton.setText(getMessage(BUTTON_CANCEL));
- cancelButton.setActionCommand(cancelCommand);
- cancelButton.addActionListener(cancelListener);
-
- buttonHorizontal
- .addComponent(signButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(cancelButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE)
- ;
- buttonVertical = buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
- .addComponent(signButton)
- .addComponent(cancelButton)
- ;
- } else {
- buttonHorizontal
- .addComponent(signButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE)
- ;
- buttonVertical = buttonPanelLayout.createSequentialGroup()
- .addComponent(signButton)
- ;
- }
-
- buttonPanelLayout.setHorizontalGroup(buttonHorizontal);
- buttonPanelLayout.setVerticalGroup(buttonVertical);
-
-// pinField.requestFocusInWindow();
-// helpLabel.requestFocus();
- pinField.requestFocus();
- contentPanel.validate();
-
- }
- });
- }
+ log.debug("Scheduling signature-pin dialog.");
+
+ SwingUtilities.invokeLater(new Runnable() {
+
+ @Override
+ public void run() {
+
+ log.debug("[{}] Show signature-pin dialog.", Thread.currentThread().getName());
+
+ mainPanel.removeAll();
+ buttonPanel.removeAll();
+
+ // specify policy to ensure correct focus traversal
+ if (useFocusTraversalPolicy) {
+
+ contentPanel.setFocusCycleRoot(true);
+ contentPanel
+ .setFocusTraversalPolicy(new AdvancedSigPinGUIFocusTraversalPolicy());
+ }
+
+ // avoid that dummy label gains focus during load
+ switchFocusDummyLabel.setFocusable(false);
+
+ if (renderHeaderPanel) {
+ if (numRetries < 0) {
+ titleLabel.setText(getMessage(TITLE_SIGN));
+ } else {
+ titleLabel.setText(getMessage(TITLE_RETRY));
+ }
+ }
+
+ infoLabel = new JLabel();
+ if (numRetries < 0) {
+ infoLabel.setFont(infoLabel.getFont().deriveFont(
+ infoLabel.getFont().getStyle()
+ & ~java.awt.Font.BOLD));
+ if (shortText) {
+ infoLabel
+ .setText(getMessage(MESSAGE_HASHDATALINK_TINY));
+ } else {
+ infoLabel.setText(getMessage(MESSAGE_HASHDATALINK));
+ }
+
+ infoLabel.setToolTipText(getMessage(SIGDATA_TOOLTIPTEXT));
+ infoLabel.getAccessibleContext().setAccessibleDescription(
+ getMessage(SIGDATA_TOOLTIPTEXT));
+ infoLabel.getAccessibleContext().setAccessibleName(
+ getMessage(SIGDATA_TOOLTIPTEXT));
+
+ infoLabel.setFocusable(true);
+ infoLabel.setCursor(Cursor
+ .getPredefinedCursor(Cursor.HAND_CURSOR));
+ infoLabel.setForeground(HYPERLINK_COLOR);
+ infoLabel.addMouseListener(new MouseAdapter() {
+
+ @Override
+ public void mouseClicked(MouseEvent me) {
+ ActionEvent e = new ActionEvent(this,
+ ActionEvent.ACTION_PERFORMED,
+ hashdataCommand);
+ hashdataListener.actionPerformed(e);
+ }
+ });
+
+ infoLabel.addKeyListener(new KeyAdapter() {
+
+ @Override
+ public void keyPressed(KeyEvent e) {
+
+ if (e.getKeyCode() == KeyEvent.VK_ENTER) {
+ ActionEvent e1 = new ActionEvent(this,
+ ActionEvent.ACTION_PERFORMED,
+ hashdataCommand);
+ hashdataListener.actionPerformed(e1);
+ }
+ }
+
+ });
+
+ infoLabel.addFocusListener(new FocusAdapter() {
+
+ @Override
+ public void focusGained(FocusEvent e) {
+
+ infoLabel.setBorder(sigDataFocusBorder);
+ }
+
+ @Override
+ public void focusLost(FocusEvent e) {
+
+ infoLabel.setBorder(BorderFactory
+ .createEmptyBorder());
+ }
+
+ });
+
+ helpListener.setHelpTopic(HELP_SIGNPIN);
+ } else {
+ String retryPattern;
+ if (numRetries < 2) {
+ retryPattern = getMessage(MESSAGE_LAST_RETRY);
+ } else {
+ retryPattern = getMessage(MESSAGE_RETRIES);
+ }
+ infoLabel.setFocusable(true);
+ infoLabel.setText(MessageFormat.format(retryPattern,
+ new Object[] { String.valueOf(numRetries) }));
+
+ infoLabel.setToolTipText(getMessage(SIGDATA_TOOLTIPTEXT));
+ infoLabel.getAccessibleContext().setAccessibleDescription(
+ getMessage(SIGDATA_TOOLTIPTEXT));
+ infoLabel.getAccessibleContext().setAccessibleName(
+ getMessage(SIGDATA_TOOLTIPTEXT));
+
+ infoLabel.setFont(infoLabel.getFont()
+ .deriveFont(
+ infoLabel.getFont().getStyle()
+ | java.awt.Font.BOLD));
+ infoLabel.setForeground(ERROR_COLOR);
+ helpListener.setHelpTopic(HELP_RETRY);
+ }
+
+ signButton.setFont(signButton.getFont().deriveFont(
+ signButton.getFont().getStyle() & ~java.awt.Font.BOLD));
+ signButton.setText(getMessage(BUTTON_SIGN));
+ signButton.setEnabled(pinSpec.getMinLength() <= 0);
+ signButton.setActionCommand(signCommand);
+ signButton.addActionListener(signListener);
+
+ signPinLabel.setFont(signPinLabel.getFont()
+ .deriveFont(
+ signPinLabel.getFont().getStyle()
+ & ~java.awt.Font.BOLD));
+ String pinLabel = getMessage(LABEL_PIN);
+ signPinLabel.setText(MessageFormat.format(pinLabel,
+ new Object[] { pinSpec.getLocalizedName() }));
+
+ pinField = new JPasswordField();
+ pinField.setText("");
+ pinField.setName("PINField");
+ pinField.setDocument(new PINDocument(pinSpec.getMinLength(),
+ pinSpec.getMaxLength(), pinSpec.getRexepPattern(),
+ signButton));
+ pinField.setActionCommand(signCommand);
+ pinField.addActionListener(new ActionListener() {
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ if (pinField.getPassword().length >= pinSpec
+ .getMinLength()) {
+ signListener.actionPerformed(e);
+ }
+ }
+ });
+
+ // FIXME: For some reason, the switchFocusDummyLabel obtains the
+ // focus even
+ // if the pinField requests the focus. Therefore, the
+ // switchFocusDummyLabel is
+ // deactivated first and enabled only after the pinField has
+ // obtained the focus
+ pinField.addFocusListener(new FocusAdapter() {
+
+ @Override
+ public void focusGained(FocusEvent e) {
+
+ // focus has been set accordingly - re-enable dummy
+ // label
+ switchFocusDummyLabel.setFocusable(true);
+ }
+
+ });
+
+ pinsizeLabel.setFont(pinsizeLabel.getFont()
+ .deriveFont(
+ pinsizeLabel.getFont().getStyle()
+ & ~java.awt.Font.BOLD,
+ pinsizeLabel.getFont().getSize() - 2));
+ pinsizeLabel.setText(MessageFormat
+ .format(getMessage(LABEL_PINSIZE), pinSpec
+ .getLocalizedLength()));
+
+ pinField.getAccessibleContext().setAccessibleDescription(
+ infoLabel.getText() + signPinLabel.getText()
+ + pinsizeLabel.getText());
+
+ GroupLayout mainPanelLayout = new GroupLayout(mainPanel);
+ mainPanel.setLayout(mainPanelLayout);
+
+ GroupLayout.SequentialGroup infoHorizontal = mainPanelLayout
+ .createSequentialGroup().addComponent(infoLabel);
+ GroupLayout.ParallelGroup infoVertical = mainPanelLayout
+ .createParallelGroup(GroupLayout.Alignment.LEADING)
+ .addComponent(infoLabel);
+
+ if (!renderHeaderPanel) {
+
+ if (helpListener.implementsListener()) {
+ infoHorizontal.addPreferredGap(
+ LayoutStyle.ComponentPlacement.UNRELATED, 0,
+ Short.MAX_VALUE).addComponent(helpLabel);
+ infoVertical.addComponent(helpLabel);
+ }
+ infoHorizontal.addComponent(switchFocusDummyLabel);
+ infoVertical.addComponent(switchFocusDummyLabel);
+
+ }
+
+ // align pinfield and pinsize to the right
+ GroupLayout.Group pinHorizontal = mainPanelLayout
+ .createParallelGroup(GroupLayout.Alignment.TRAILING);
+ GroupLayout.SequentialGroup pinVertical = mainPanelLayout
+ .createSequentialGroup();
+
+ if (pinLabelPos == PinLabelPosition.ABOVE) {
+ pinHorizontal.addGroup(
+ mainPanelLayout.createParallelGroup(
+ GroupLayout.Alignment.LEADING)
+ .addComponent(signPinLabel,
+ GroupLayout.PREFERRED_SIZE,
+ GroupLayout.DEFAULT_SIZE,
+ GroupLayout.PREFERRED_SIZE)
+ .addComponent(pinField,
+ GroupLayout.PREFERRED_SIZE,
+ GroupLayout.DEFAULT_SIZE,
+ Short.MAX_VALUE)).addComponent(
+ pinsizeLabel, GroupLayout.PREFERRED_SIZE,
+ GroupLayout.DEFAULT_SIZE,
+ GroupLayout.PREFERRED_SIZE);
+ pinVertical.addComponent(signPinLabel).addPreferredGap(
+ LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(pinField, GroupLayout.PREFERRED_SIZE,
+ GroupLayout.DEFAULT_SIZE,
+ GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(
+ LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(pinsizeLabel);
+ } else { // PinLabelPosition.LEFT
+ pinHorizontal
+ .addGroup(
+ mainPanelLayout
+ .createSequentialGroup()
+ .addComponent(signPinLabel,
+ GroupLayout.PREFERRED_SIZE,
+ GroupLayout.DEFAULT_SIZE,
+ GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(
+ LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(pinField,
+ GroupLayout.PREFERRED_SIZE,
+ GroupLayout.DEFAULT_SIZE,
+ Short.MAX_VALUE))
+ .addComponent(pinsizeLabel,
+ GroupLayout.PREFERRED_SIZE,
+ GroupLayout.DEFAULT_SIZE,
+ GroupLayout.PREFERRED_SIZE);
+ pinVertical.addGroup(
+ mainPanelLayout.createParallelGroup(
+ GroupLayout.Alignment.BASELINE)
+ .addComponent(signPinLabel).addComponent(
+ pinField)).addPreferredGap(
+ LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(pinsizeLabel);
+ }
+
+ mainPanelLayout.setHorizontalGroup(mainPanelLayout
+ .createParallelGroup(GroupLayout.Alignment.LEADING)
+ .addGroup(infoHorizontal).addGroup(pinHorizontal));
+
+ mainPanelLayout
+ .setVerticalGroup(mainPanelLayout
+ .createSequentialGroup().addGroup(infoVertical)
+ .addPreferredGap(
+ LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(pinVertical));
+
+ if (renderCancelButton) {
+ cancelButton.setFont(cancelButton.getFont().deriveFont(
+ cancelButton.getFont().getStyle()
+ & ~java.awt.Font.BOLD));
+ cancelButton.setText(getMessage(BUTTON_CANCEL));
+ cancelButton.setActionCommand(cancelCommand);
+ cancelButton.addActionListener(cancelListener);
+ }
+
+ updateMethodToRunAtResize("at.gv.egiz.bku.gui.BKUGUIImpl",
+ "renderSignaturePINDialogueButtonPanel");
+
+ renderSignaturePINDialogueButtonPanel();
+
+ if (windowCloseAdapter != null) {
+ windowCloseAdapter.registerListener(cancelListener, cancelCommand);
+ }
- @Override
- public void showErrorDialog(
- final String errorMsgKey, final Object[] errorMsgParams,
- final ActionListener okListener, final String okCommand) {
-
- showMessageDialog(TITLE_ERROR, ERROR_COLOR,
- errorMsgKey, errorMsgParams, BUTTON_OK, okListener, okCommand);
- }
+ primaryFocusHolder = pinField;
- @Override
- public void showErrorDialog(
- final String errorMsgKey, final Object[] errorMsgParams) {
+ pinField.requestFocus();
- showMessageDialog(TITLE_ERROR, ERROR_COLOR,
- errorMsgKey, errorMsgParams, null, null, null);
- }
+ contentPanel.validate();
- @Override
- public void showMessageDialog(
- final String titleKey,
- final String msgKey, final Object[] msgParams,
- final String buttonKey,
- final ActionListener okListener, final String okCommand) {
-
- showMessageDialog(titleKey, null,
- msgKey, msgParams, buttonKey, okListener, okCommand);
- }
+ resize();
+ }
+ });
+ }
- @Override
- public void showMessageDialog(
- final String titleKey,
- final String msgKey, final Object[] msgParams) {
+ public void renderSignaturePINDialogueButtonPanel() {
+
+ GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel);
+ buttonPanel.setLayout(buttonPanelLayout);
+
+ GroupLayout.SequentialGroup buttonHorizontal = buttonPanelLayout
+ .createSequentialGroup();
+ GroupLayout.Group buttonVertical;
+
+ if (renderCancelButton) {
+
+ buttonHorizontal.addComponent(signButton,
+ GroupLayout.PREFERRED_SIZE, buttonSize,
+ GroupLayout.PREFERRED_SIZE).addPreferredGap(
+ LayoutStyle.ComponentPlacement.RELATED).addComponent(
+ cancelButton, GroupLayout.PREFERRED_SIZE, buttonSize,
+ GroupLayout.PREFERRED_SIZE);
+ buttonVertical = buttonPanelLayout.createParallelGroup(
+ GroupLayout.Alignment.BASELINE).addComponent(signButton)
+ .addComponent(cancelButton);
+ } else {
+ buttonHorizontal.addComponent(signButton,
+ GroupLayout.PREFERRED_SIZE, buttonSize,
+ GroupLayout.PREFERRED_SIZE);
+ buttonVertical = buttonPanelLayout.createSequentialGroup()
+ .addComponent(signButton);
+ }
+
+ buttonPanelLayout.setHorizontalGroup(buttonHorizontal);
+ buttonPanelLayout.setVerticalGroup(buttonVertical);
- showMessageDialog(titleKey, null,
- msgKey, msgParams, null, null, null);
- }
+ }
- @Override
- public void showMessageDialog(
- final String titleKey, final String msgKey) {
+ @Override
+ public void showErrorDialog(final String errorMsgKey,
+ final Object[] errorMsgParams, final ActionListener okListener,
+ final String okCommand) {
- showMessageDialog(titleKey, null,
- msgKey, null, null, null, null);
- }
+ showMessageDialog(TITLE_ERROR, ERROR_COLOR, errorMsgKey,
+ errorMsgParams, BUTTON_OK, okListener, okCommand);
+ }
- /**
- *
- * @param buttonKey if null defaults to BUTTON_OK
- */
- private void showMessageDialog(
- final String titleKey, final Color titleColor,
- final String msgKey, final Object[] msgParams,
- final String buttonKey,
- final ActionListener okListener, final String okCommand) {
-
- log.debug("scheduling message dialog");
-
- SwingUtilities.invokeLater(new Runnable() {
-
- @Override
- public void run() {
-
- log.debug("[" + Thread.currentThread().getName() + "] show message dialog");
-
- mainPanel.removeAll();
- buttonPanel.removeAll();
-
- if (renderHeaderPanel) {
- titleLabel.setText(getMessage(titleKey));
- }
-
- helpMouseListener.setHelpTopic(msgKey);
- helpKeyListener.setHelpTopic(msgKey);
-
- String msgPattern = getMessage(msgKey);
- String msg = MessageFormat.format(msgPattern, msgParams);
-
- JLabel msgLabel = new JLabel();
- msgLabel.setFont(msgLabel.getFont().deriveFont(msgLabel.getFont().getStyle() & ~Font.BOLD));
- msgLabel.setText(msg);
-
- GroupLayout mainPanelLayout = new GroupLayout(mainPanel);
- mainPanel.setLayout(mainPanelLayout);
-
- GroupLayout.ParallelGroup mainHorizontal = mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING);
- GroupLayout.SequentialGroup mainVertical = mainPanelLayout.createSequentialGroup();
-
- log.debug("focus to contentPanel");
- contentPanel.requestFocus();
-
- if (!renderHeaderPanel) {
- JLabel titleLabel = new JLabel();
- titleLabel.setFont(titleLabel.getFont().deriveFont(titleLabel.getFont().getStyle() | Font.BOLD));
- titleLabel.setText(getMessage(titleKey));
- if (titleColor != null) {
- titleLabel.setForeground(titleColor);
- }
-
- mainHorizontal
- .addGroup(mainPanelLayout.createSequentialGroup()
- .addComponent(titleLabel)
- .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED, 0, Short.MAX_VALUE)
- .addComponent(switchFocusDummyLabel)
- .addComponent(helpLabel)
- );
- mainVertical
- .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addComponent(titleLabel)
- .addComponent(switchFocusDummyLabel)
- .addComponent(helpLabel)
- );
-
- log.debug("focus to helpLabel");
- helpLabel.requestFocus();
- }
-
- mainPanelLayout.setHorizontalGroup(mainHorizontal
- .addComponent(msgLabel));
- mainPanelLayout.setVerticalGroup(mainVertical
- .addComponent(msgLabel));
-
- if (okListener != null) {
-
- JButton okButton = new JButton();
- okButton.setFont(okButton.getFont().deriveFont(okButton.getFont().getStyle() & ~java.awt.Font.BOLD));
- okButton.setText(getMessage((buttonKey != null) ? buttonKey : BUTTON_OK));
- okButton.setActionCommand(okCommand);
- okButton.addActionListener(okListener);
-
- GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel);
- buttonPanel.setLayout(buttonPanelLayout);
-
- buttonPanelLayout.setHorizontalGroup(
- buttonPanelLayout.createSequentialGroup()
- .addComponent(okButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE));
- buttonPanelLayout.setVerticalGroup(
- buttonPanelLayout.createSequentialGroup()
- .addComponent(okButton));
-
- log.debug("focus to ok-button");
- okButton.requestFocus();
- }
-
- contentPanel.validate();
- }
- });
- }
+ @Override
+ public void showErrorDialog(final String errorMsgKey,
+ final Object[] errorMsgParams) {
+ showMessageDialog(TITLE_ERROR, ERROR_COLOR, errorMsgKey,
+ errorMsgParams, null, null, null);
+ }
- @Override
- public char[] getPin() {
- if (pinField != null) {
- char[] pin = pinField.getPassword(); //returns a copy
- pinField = null; //garbage collect original pin (make sure to clear char[] after use)
- return pin;
- }
- return null;
- }
+ @Override
+ public void showMessageDialog(final String titleKey, final String msgKey,
+ final Object[] msgParams, final String buttonKey,
+ final ActionListener okListener, final String okCommand) {
+ showMessageDialog(titleKey, null, msgKey, msgParams, buttonKey,
+ okListener, okCommand);
+ }
- ////////////////////////////////////////////////////////////////////////////
- // SECURE VIEWER
- ////////////////////////////////////////////////////////////////////////////
+ @Override
+ public void showMessageDialog(final String titleKey, final String msgKey,
+ final Object[] msgParams) {
-
- /**
- * @param signedReferences
- * @param backListener gets notified if pin-dialog has to be redrawn
- * (signedRefencesList returns via BACK button)
- * @param okCommand
- */
- @Override
- public void showSecureViewer(final List<HashDataInput> dataToBeSigned,
- final ActionListener backListener, final String backCommand) {
-
- if (dataToBeSigned == null) {
- showErrorDialog(getMessage(ERR_NO_HASHDATA),
- new Object[] {"no signature data provided"},
- backListener, backCommand);
- } else if (dataToBeSigned.size() == 1) {
- //TODO pull out (see also SignedReferencesSelectionListener)
- if (SecureViewerDialog.SUPPORTED_MIME_TYPES.contains(dataToBeSigned.get(0).getMimeType())) {
- try {
- log.debug("[" + Thread.currentThread().getName() + "] scheduling secure viewer");
-
- SwingUtilities.invokeLater(new Runnable() {
-
- @Override
- public void run() {
- try {
- showMessageDialog(TITLE_SIGNATURE_DATA, MESSAGE_HASHDATA_VIEWER);
- showSecureViewer(dataToBeSigned.get(0), backListener, backCommand);
- } catch (FontProviderException ex) {
- log.error("failed to display secure viewer", ex);
- showErrorDialog(ERR_VIEWER, new Object[] {ex.getMessage()}, backListener, backCommand);
- }
- }
- });
-
- } catch (Exception ex) { //InterruptedException InvocationTargetException
- log.error("Failed to display secure viewer: " + ex.getMessage());
- log.trace(ex);
- showErrorDialog(ERR_UNKNOWN, null, backListener, backCommand);
- }
- } else {
- log.debug("[" + Thread.currentThread().getName() + "] mime-type not supported by secure viewer, scheduling save dialog");
- showMessageDialog(TITLE_SIGNATURE_DATA, MESSAGE_UNSUPPORTED_MIMETYPE);
- SecureViewerSaveDialog.showSaveDialog(dataToBeSigned.get(0), messages, backListener, backCommand);
- }
- } else {
- showSignedReferencesListDialog(dataToBeSigned, backListener, backCommand);
- }
- }
-
- /**
- * has to be called from event dispatcher thread
- */
- private void showSecureViewer(HashDataInput dataToBeSigned, ActionListener closeListener, String closeCommand) throws FontProviderException {
-
- log.debug("[" + Thread.currentThread().getName() + "] show secure viewer");
- SecureViewerDialog secureViewer = new SecureViewerDialog(null, messages,
- closeListener, closeCommand,
- fontProvider, helpMouseListener.getActionListener());
-
- // workaround for [#439]
- // avoid AlwaysOnTop at least in applet, otherwise make secureViewer AlwaysOnTop since MOCCA Dialog (JFrame created in LocalSTALFactory) is always on top.
- Window window = SwingUtilities.getWindowAncestor(contentPane);
- if (window != null && window.isAlwaysOnTop()) {
- log.debug("make secureViewer alwaysOnTop");
- secureViewer.setAlwaysOnTop(true);
- }
- secureViewer.setContent(dataToBeSigned);
- log.trace("viewer setContent returned");
- }
-
-
-
- private void showSignedReferencesListDialog(final List<HashDataInput> signedReferences,
- final ActionListener backListener, final String backCommand) {
-
- log.debug("[" + Thread.currentThread().getName() + "] scheduling signed references list dialog");
-
- SwingUtilities.invokeLater(new Runnable() {
-
- @Override
- public void run() {
-
- log.debug("[" + Thread.currentThread().getName() + "] show signed references list dialog");
-
- mainPanel.removeAll();
- buttonPanel.removeAll();
-
- if (renderHeaderPanel) {
- titleLabel.setText(getMessage(TITLE_SIGNATURE_DATA));
- }
-
- helpMouseListener.setHelpTopic(HELP_HASHDATALIST);
- helpKeyListener.setHelpTopic(HELP_HASHDATALIST);
-
- JLabel refIdLabel = new JLabel();
- refIdLabel.setFont(refIdLabel.getFont().deriveFont(refIdLabel.getFont().getStyle() & ~java.awt.Font.BOLD));
- String refIdLabelPattern = getMessage(MESSAGE_HASHDATALIST);
- refIdLabel.setText(MessageFormat.format(refIdLabelPattern, new Object[]{signedReferences.size()}));
-
- HashDataTableModel tableModel = new HashDataTableModel(signedReferences, renderRefId);
- final JTable hashDataTable = new JTable(tableModel);
- hashDataTable.setDefaultRenderer(HashDataInput.class, new HyperlinkRenderer(renderRefId));
- hashDataTable.setTableHeader(null);
-
- hashDataTable.addMouseMotionListener(new SignedReferencesMouseMotionListener(hashDataTable));
-
- hashDataTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
- hashDataTable.getSelectionModel().addListSelectionListener(new SignedReferencesSelectionListener(signedReferences, backListener, backCommand));
-
- JScrollPane hashDataScrollPane = new JScrollPane(hashDataTable);
-
- GroupLayout mainPanelLayout = new GroupLayout(mainPanel);
- mainPanel.setLayout(mainPanelLayout);
-
- GroupLayout.SequentialGroup messageHorizontal = mainPanelLayout.createSequentialGroup()
- .addComponent(refIdLabel);
-
- GroupLayout.ParallelGroup messageVertical = mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addComponent(refIdLabel);
-
- if (!renderHeaderPanel) {
- messageHorizontal
- .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED, 0, Short.MAX_VALUE)
- .addComponent(switchFocusDummyLabel)
- .addComponent(helpLabel)
- ;
- messageVertical
- .addComponent(switchFocusDummyLabel)
- .addComponent(helpLabel)
- ;
- }
-
- mainPanelLayout.setHorizontalGroup(
- mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
- .addGroup(messageHorizontal)
- .addComponent(hashDataScrollPane, 0, 0, Short.MAX_VALUE));
-
- mainPanelLayout.setVerticalGroup(
- mainPanelLayout.createSequentialGroup()
- .addGroup(messageVertical)
- .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(hashDataScrollPane, 0, 0, hashDataTable.getPreferredSize().height+3));
-
- JButton backButton = new JButton();
- backButton.setFont(backButton.getFont().deriveFont(backButton.getFont().getStyle() & ~java.awt.Font.BOLD));
- backButton.setText(getMessage(BUTTON_BACK));
- backButton.setActionCommand(backCommand);
- backButton.addActionListener(backListener);
-
- GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel);
- buttonPanel.setLayout(buttonPanelLayout);
-
- buttonPanelLayout.setHorizontalGroup(buttonPanelLayout.createSequentialGroup()
- .addComponent(backButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE));
- buttonPanelLayout.setVerticalGroup(buttonPanelLayout.createSequentialGroup()
- .addComponent(backButton));
-
- contentPanel.validate();
- }
- });
- }
-
-
-
- /**
- * not possible to add mouse listener to TableCellRenderer
- * to change cursor on specific columns only, use table.columnAtPoint(e.getPoint())
- *
- */
- private class SignedReferencesMouseMotionListener extends MouseMotionAdapter {
-
- JTable hashDataTable;
-
- public SignedReferencesMouseMotionListener(JTable table) {
- this.hashDataTable = table;
- }
-
- @Override
- public void mouseMoved(MouseEvent e) {
-// if (hashDataTable.columnAtPoint(e.getPoint()) == 0) {
- hashDataTable.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
- }
- }
-
- ///////////
- // SignedReferencesList (TODO pull out)
-
- public class SignedReferencesSelectionListener implements ListSelectionListener {
-
- List<HashDataInput> signedReferences;
- ActionListener backListener;
- String backCommand;
-
- public SignedReferencesSelectionListener(List<HashDataInput> signedReferences, ActionListener backListener, String backCommand) {
- this.signedReferences = signedReferences;
- this.backListener = backListener;
- this.backCommand = backCommand;
- }
-
- @Override
- public void valueChanged(ListSelectionEvent event) {
-
- if (event.getValueIsAdjusting()) {
- return;
- }
-
- ListSelectionModel lsm = (ListSelectionModel) event.getSource();
- int selectionIdx = lsm.getMinSelectionIndex();
-
- log.debug("[" + Thread.currentThread().getName() + "] reference " + selectionIdx + " selected");
-
- if (selectionIdx >= 0) {
- final HashDataInput selection = signedReferences.get(selectionIdx);
- final SignedReferencesListDisplayer backToListListener = new SignedReferencesListDisplayer(signedReferences, backListener, backCommand);
-
- if (SecureViewerDialog.SUPPORTED_MIME_TYPES.contains(selection.getMimeType())) {
- log.debug("[" + Thread.currentThread().getName() + "] scheduling secure viewer dialog");
- SwingUtilities.invokeLater(new Runnable() {
-
- @Override
- public void run() {
- try {
- showMessageDialog(TITLE_SIGNATURE_DATA, MESSAGE_HASHDATA_VIEWER);
- showSecureViewer(selection, backToListListener, null);
-// SecureViewerDialog.showSecureViewer(selection, messages, fontProvider, helpMouseListener.getActionListener(), false);
- } catch (FontProviderException ex) {
- log.error("failed to display secure viewer", ex);
- showErrorDialog(BKUGUIFacade.ERR_VIEWER, new Object[] {ex.getMessage()}, backToListListener, null);
- }
-
- }
- });
- } else {
- log.debug("[" + Thread.currentThread().getName() + "] mime-type not supported by secure viewer, scheduling save dialog");
- showMessageDialog(BKUGUIFacade.TITLE_SIGNATURE_DATA, BKUGUIFacade.MESSAGE_UNSUPPORTED_MIMETYPE);
- SecureViewerSaveDialog.showSaveDialog(selection, messages, backToListListener, null);
- }
- }
- }
-
- /**
- * ActionListener that returns to signed references list
- */
- private class SignedReferencesListDisplayer implements ActionListener {
- List<HashDataInput> sr;
- ActionListener bl;
- String bc;
-
- public SignedReferencesListDisplayer(List<HashDataInput> signedReferences, ActionListener backListener, String backCommand) {
- sr = signedReferences;
- bl = backListener;
- bc = backCommand;
- }
-
- @Override
- public void actionPerformed(ActionEvent e) {
-// log.debug("[" + Thread.currentThread().getName() + "] displaying signed references list");
- showSignedReferencesListDialog(sr, bl, bc);
- }
- }
- }
+ showMessageDialog(titleKey, null, msgKey, msgParams, null, null, null);
+ }
+ @Override
+ public void showMessageDialog(final String titleKey, final String msgKey) {
- ////////////////////////////////////////////////////////////////////////////
- // UTILITY METHODS
- ////////////////////////////////////////////////////////////////////////////
-
- private void registerHelpListener(ActionListener helpListener) {
- if (helpListener != null) {
- this.helpMouseListener = new HelpMouseListener(helpListener);
- this.helpKeyListener = new HelpKeyListener(helpListener);
- } else {
- log.error("no help listener provided, will not be able to display help");
- this.helpMouseListener = new HelpMouseListener(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- log.error("no help listener registered (requested help topic: " + e.getActionCommand() + ")");
- }
- });
- this.helpKeyListener = new HelpKeyListener(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- log.error("no help listener registered (requested help topic: " + e.getActionCommand() + ")");
- }
- });
- }
- }
+ showMessageDialog(titleKey, null, msgKey, null, null, null, null);
+ }
+
+ /**
+ *
+ * @param buttonKey
+ * if null defaults to BUTTON_OK
+ */
+ private void showMessageDialog(final String titleKey,
+ final Color titleColor, final String msgKey,
+ final Object[] msgParams, final String buttonKey,
+ final ActionListener okListener, final String okCommand) {
+
+ log.debug("Scheduling message dialog.");
+
+ SwingUtilities.invokeLater(new Runnable() {
+
+ @Override
+ public void run() {
+
+ log.debug("[{}] Show message dialog.", Thread.currentThread().getName());
+
+ log.debug("ButtonKey: {}.", buttonKey);
+
+ mainPanel.removeAll();
+ buttonPanel.removeAll();
+
+ // avoid that dummy label gains focus during load
+ switchFocusDummyLabel.setFocusable(false);
+
+ if (renderHeaderPanel) {
+ titleLabel.setText(getMessage(titleKey));
+ }
- private void registerSwitchFocusListener(ActionListener switchFocusListener) {
- if (switchFocusListener != null) {
- this.switchFocusKeyListener = new SwitchFocusFocusListener(switchFocusListener);
-
- } else {
-
- this.switchFocusKeyListener = new SwitchFocusFocusListener(new ActionListener() {
-
- @Override
- public void actionPerformed(ActionEvent e) {
- log.warn("no switch focus listener registered");
- }
- });
+ helpListener.setHelpTopic(msgKey);
+
+ String msgPattern = getMessage(msgKey);
+ String msg = MessageFormat.format(msgPattern, msgParams);
+
+ // we need to create a new JLabel object every time in order to
+ // ensure
+ // that screen reading software will read each updated label
+ msgLabel = new JLabel();
+
+ msgLabel.setFocusable(true);
+
+ msgLabel.setFont(msgLabel.getFont().deriveFont(
+ msgLabel.getFont().getStyle() & ~Font.BOLD));
+ msgLabel.setText(msg);
+
+ GroupLayout mainPanelLayout = new GroupLayout(mainPanel);
+ mainPanel.setLayout(mainPanelLayout);
+
+ GroupLayout.ParallelGroup mainHorizontal = mainPanelLayout
+ .createParallelGroup(GroupLayout.Alignment.LEADING);
+ GroupLayout.SequentialGroup mainVertical = mainPanelLayout
+ .createSequentialGroup();
+
+ String accessibleData = "";
+
+ if (!renderHeaderPanel) {
+ msgTitleLabel = new JLabel();
+ msgTitleLabel.setFont(msgTitleLabel.getFont().deriveFont(
+ msgTitleLabel.getFont().getStyle() | Font.BOLD));
+ msgTitleLabel.setText(getMessage(titleKey));
+
+ if (titleColor != null) {
+ msgTitleLabel.setForeground(titleColor);
+ }
+
+ accessibleData = accessibleData + getMessage(titleKey);
+
+ GroupLayout.SequentialGroup titleHorizontal = mainPanelLayout
+ .createSequentialGroup()
+ .addComponent(msgTitleLabel);
+
+ GroupLayout.ParallelGroup titleVertical = mainPanelLayout
+ .createParallelGroup(GroupLayout.Alignment.LEADING)
+ .addComponent(msgTitleLabel);
+
+ if (helpListener.implementsListener()) {
+ titleHorizontal.addPreferredGap(
+ LayoutStyle.ComponentPlacement.UNRELATED, 0,
+ Short.MAX_VALUE).addComponent(helpLabel);
+ titleVertical.addComponent(helpLabel);
+ }
+ titleHorizontal.addComponent(switchFocusDummyLabel);
+ titleVertical.addComponent(switchFocusDummyLabel);
+
+ mainHorizontal.addGroup(titleHorizontal);
+ mainVertical.addGroup(titleVertical);
+
+ } else {
+
+ accessibleData = accessibleData + titleLabel.getText();
+ }
+
+ msgLabel.getAccessibleContext().setAccessibleName(
+ accessibleData + msgLabel.getText());
+ msgLabel.getAccessibleContext().setAccessibleDescription(
+ accessibleData + msgLabel.getText());
+
+ msgLabel.addFocusListener(new FocusAdapter() {
+
+ @Override
+ public void focusGained(FocusEvent e) {
+
+ // focus has been set accordingly - re-enable dummy
+ // label
+ switchFocusDummyLabel.setFocusable(true);
+ }
+
+ });
+
+ mainPanelLayout.setHorizontalGroup(mainHorizontal
+ .addComponent(msgLabel));
+ mainPanelLayout.setVerticalGroup(mainVertical
+ .addComponent(msgLabel));
+
+ if (okListener != null) {
+
+ showMessageOKButton = true;
+
+ okButton.setFont(okButton.getFont()
+ .deriveFont(
+ okButton.getFont().getStyle()
+ & ~java.awt.Font.BOLD));
+ okButton.setText(getMessage((buttonKey != null) ? buttonKey
+ : BUTTON_OK));
+ okButton.setActionCommand(okCommand);
+ okButton.addActionListener(okListener);
+
+ renderShowMessageDialogueButtonPanel();
+
+ primaryFocusHolder = msgLabel;
+
+ } else {
+ log.debug("No okListener configured.");
+ showMessageOKButton = false;
+ }
+
+ // okListener might be null (up to windowCloseAdapter what to do)
+ if (windowCloseAdapter != null) {
+ windowCloseAdapter.registerListener(okListener, okCommand);
}
- }
-
- ////////////////////////////////////////////////////////////////////////////
- // INITIALIZERS (MAY BE OVERRIDDEN BY SUBCLASSES)
- ////////////////////////////////////////////////////////////////////////////
-
- /**
- * Load applet messages bundle. Note that getBundle looks for classes based
- * on the default Locale before it selects the base class!
- *
- * Called from constructor.
- * Subclasses may override this method to ensure the message bundle is loaded
- * once initButtonSize (called from constructor as well) is called.
- * (Only relevant if initButtonSize is overridden as well)
- * @param locale
- */
- protected void loadMessageBundle(Locale locale) {
- if (locale != null) {
- // see [#378] Ignoring post parameter 'locale': bundle resolve-order not correct?!
- Locale lang = new Locale(locale.getLanguage().substring(0, 2));
- log.debug("loading applet resources for language: " + lang.toString());
- messages = ResourceBundle.getBundle(MESSAGES_BUNDLE, lang);
- } else {
- log.debug("loading default language applet resources");
- messages = ResourceBundle.getBundle(MESSAGES_BUNDLE);
- }
- // how the f*** you know the default Messages.properties is de?!
- log.debug("applet messages loaded: " + messages.getLocale());
- }
- protected int initButtonSize() {
- int bs = 0;
-
- JButton b = new JButton();
- b.setText(getMessage(BUTTON_OK));
- if (b.getPreferredSize().width > bs) {
- bs = b.getPreferredSize().width;
- }
- // need cancel button for message dialog,
- // even if renderCancelButton == false
- b.setText(getMessage(BUTTON_CANCEL));
- if (b.getPreferredSize().width > bs) {
- bs = b.getPreferredSize().width;
- }
- b.setText(getMessage(BUTTON_SIGN));
- if (b.getPreferredSize().width > bs) {
- bs = b.getPreferredSize().width;
- }
- b.setText(getMessage(BUTTON_BACK));
- if (b.getPreferredSize().width > bs) {
- bs = b.getPreferredSize().width;
- }
- b.setText(getMessage(BUTTON_SAVE));
- if (b.getPreferredSize().width > bs) {
- bs = b.getPreferredSize().width;
- }
- return bs;
- }
+ updateMethodToRunAtResize("at.gv.egiz.bku.gui.BKUGUIImpl",
+ "renderShowMessageDialogueButtonPanel");
+
+ // put focus to msgLabel to guarantee that label is read by
+ // screen reader upon loading
+ msgLabel.requestFocus();
+
+ contentPanel.validate();
+
+ resize();
+ }
+ });
+ }
+
+ public void renderShowMessageDialogueButtonPanel() {
+
+ if (showMessageOKButton) {
+ GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel);
+ buttonPanel.setLayout(buttonPanelLayout);
+
+ buttonPanelLayout.setHorizontalGroup(buttonPanelLayout
+ .createSequentialGroup().addComponent(okButton,
+ GroupLayout.PREFERRED_SIZE, buttonSize,
+ GroupLayout.PREFERRED_SIZE));
+ buttonPanelLayout.setVerticalGroup(buttonPanelLayout
+ .createSequentialGroup().addComponent(okButton));
+ }
+ }
+
+ @Override
+ public char[] getPin() {
+ if (pinField != null) {
+ char[] pin = pinField.getPassword(); // returns a copy
+ pinField = null; // garbage collect original pin (make sure to clear
+ // char[] after use)
+ return pin;
+ }
+ return null;
+ }
+
+ // //////////////////////////////////////////////////////////////////////////
+ // SECURE VIEWER
+ // //////////////////////////////////////////////////////////////////////////
+
+ /**
+ * @param signedReferences
+ * @param backListener
+ * gets notified if pin-dialog has to be redrawn
+ * (signedRefencesList returns via BACK button)
+ * @param okCommand
+ */
+ @Override
+ public void showSecureViewer(final List<HashDataInput> dataToBeSigned,
+ final ActionListener backListener, final String backCommand) {
+
+ if (dataToBeSigned == null) {
+ showErrorDialog(getMessage(ERR_NO_HASHDATA),
+ new Object[] { "no signature data provided" },
+ backListener, backCommand);
+ } else if (dataToBeSigned.size() == 1) {
+ // TODO pull out (see also SignedReferencesSelectionListener)
+ if (SecureViewerDialog.SUPPORTED_MIME_TYPES.contains(dataToBeSigned
+ .get(0).getMimeType())) {
+ try {
+ log.debug("[{}] Scheduling secure viewer.", Thread.currentThread().getName());
+
+ showMessageDialog(TITLE_SIGNATURE_DATA,
+ MESSAGE_HASHDATA_VIEWER);
+
+ SwingUtilities.invokeLater(new Runnable() {
+
+ @Override
+ public void run() {
+ try {
+ showSecureViewer(dataToBeSigned.get(0),
+ backListener, backCommand);
+ } catch (FontProviderException ex) {
+ log.error("Failed to display secure viewer.", ex);
+ showErrorDialog(ERR_VIEWER, new Object[] { ex
+ .getMessage() }, backListener,
+ backCommand);
+ }
+ }
+ });
+
+ } catch (Exception ex) { // InterruptedException
+ // InvocationTargetException
+ log.error("Failed to display secure viewer. ", ex);
+ showErrorDialog(ERR_UNKNOWN, null, backListener,
+ backCommand);
+ }
+ } else {
+ log.debug("[{}] mime-type not supported by secure viewer, " +
+ "scheduling save dialog.", Thread.currentThread().getName());
+ showMessageDialog(TITLE_SIGNATURE_DATA,
+ MESSAGE_UNSUPPORTED_MIMETYPE,
+ new Object[] { dataToBeSigned.get(0).getMimeType() });
+ SecureViewerSaveDialog.showSaveDialog(dataToBeSigned.get(0),
+ messages, backListener, backCommand,
+ (int) (baseFontSize * getResizeFactor()));
+ }
+ } else {
+ showSignedReferencesListDialog(dataToBeSigned, backListener,
+ backCommand);
+ }
+ }
+
+ /**
+ * has to be called from event dispatcher thread
+ */
+ private void showSecureViewer(HashDataInput dataToBeSigned,
+ ActionListener closeListener, String closeCommand)
+ throws FontProviderException {
+
+ log.debug("[{}] Show secure viewer.");
+ secureViewer = new SecureViewerDialog(null, messages, closeListener,
+ closeCommand, fontProvider, helpListener, getResizeFactor());
+
+ // workaround for [#439]
+ // avoid AlwaysOnTop at least in applet, otherwise make secureViewer
+ // AlwaysOnTop since MOCCA Dialog (JFrame created in LocalSTALFactory)
+ // is always on top.
+ Window window = SwingUtilities.getWindowAncestor(contentPane);
+ if (window != null && window.isAlwaysOnTop()) {
+ log.debug("Make secureViewer alwaysOnTop.");
+ secureViewer.setAlwaysOnTop(true);
+ }
+
+ secureViewer.setContent(dataToBeSigned);
+ log.trace("Viewer setContent returned.");
+ }
+
+ private void openSecureViewerDialog() {
+
+ final HashDataInput storedSelection = signedReferences.get(referenceIndex);
+
+ if (SecureViewerDialog.SUPPORTED_MIME_TYPES.contains(storedSelection
+ .getMimeType())) {
+ log.debug("[{}] Scheduling secure viewer dialog.", Thread.currentThread().getName());
+
+ showMessageDialog(TITLE_SIGNATURE_DATA,
+ MESSAGE_HASHDATA_VIEWER);
+
+ SwingUtilities.invokeLater(new Runnable() {
+
+ @Override
+ public void run() {
+ try {
+ showSecureViewer(storedSelection, storedBackToListListener,
+ null);
+ // SecureViewerDialog.showSecureViewer(selection,
+ // messages, fontProvider,
+ // helpMouseListener.getActionListener(),
+ // false);
+ } catch (FontProviderException ex) {
+ log.error("Failed to display secure viewer.", ex);
+ showErrorDialog(BKUGUIFacade.ERR_VIEWER,
+ new Object[] { ex.getMessage() },
+ storedBackToListListener, null);
+ }
+
+ }
+ });
+ } else {
+ log.debug("[{}] Mime-type not supported by secure viewer, " +
+ "scheduling save dialog.", Thread.currentThread().getName());
+ showMessageDialog(BKUGUIFacade.TITLE_SIGNATURE_DATA,
+ BKUGUIFacade.MESSAGE_UNSUPPORTED_MIMETYPE,
+ new Object[] { storedSelection.getMimeType() });
+ SecureViewerSaveDialog.showSaveDialog(storedSelection, messages,
+ storedBackToListListener, null,
+ (int) (baseFontSize * getResizeFactor()));
+ }
+
+
+ }
+
+ private void showSignedReferencesListDialog(
+ final List<HashDataInput> signedReferences,
+ final ActionListener backListener, final String backCommand) {
+
+ log.debug("[{}] Scheduling signed references list dialog.", Thread.currentThread().getName());
+
+ SwingUtilities.invokeLater(new Runnable() {
+
+ @Override
+ public void run() {
+
+ log.debug("[{}] Show signed references list dialog.", Thread.currentThread().getName());
+
+ mainPanel.removeAll();
+ buttonPanel.removeAll();
+
+ if (renderHeaderPanel) {
+ titleLabel.setText(getMessage(TITLE_SIGNATURE_DATA));
+ }
+
+ helpListener.setHelpTopic(HELP_HASHDATALIST);
+
+ refIdLabel = new JLabel();
+ refIdLabel.setFont(refIdLabel.getFont().deriveFont(
+ refIdLabel.getFont().getStyle() & ~java.awt.Font.BOLD));
+ String refIdLabelPattern = getMessage(MESSAGE_HASHDATALIST);
+ refIdLabel.setText(MessageFormat.format(refIdLabelPattern,
+ new Object[] { signedReferences.size() }));
+
+ HashDataTableModel tableModel = new HashDataTableModel(
+ signedReferences, renderRefId);
+ hashDataTable = new JTable(tableModel);
+
+ hyperlinkRenderer = new HyperlinkRenderer(renderRefId);
+
+ hashDataTable.setDefaultRenderer(HashDataInput.class,
+ hyperlinkRenderer);
+ hashDataTable.setTableHeader(null);
+
+ hashDataTable
+ .addMouseMotionListener(new SignedReferencesMouseMotionListener(
+ hashDataTable));
+
+ hashDataTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+
+ hashDataTable
+ .setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+ hashDataTable.getSelectionModel().addListSelectionListener(
+ new SignedReferencesSelectionListener(signedReferences,
+ backListener, backCommand));
+
+
+ hashDataTable.addMouseListener(new MouseAdapter() {
+
+ @Override
+ public void mouseClicked(MouseEvent e) {
+
+ openSecureViewerDialog();
+ }
+
+ });
+
+ hashDataTable.addKeyListener(new KeyAdapter() {
+
+ @Override
+ public void keyPressed(KeyEvent e) {
+
+ if(e.getKeyCode() == KeyEvent.VK_ENTER) {
+
+ log.debug("Detected Enter Key.");
+
+ openSecureViewerDialog();
+ }
+
+ }
+
+ });
+
+ hashDataScrollPane = new JScrollPane(hashDataTable);
+
+ backButton.setFont(backButton.getFont().deriveFont(
+ backButton.getFont().getStyle() & ~java.awt.Font.BOLD));
+ backButton.setText(getMessage(BUTTON_BACK));
+ backButton.setActionCommand(backCommand);
+ backButton.addActionListener(backListener);
+
+ primaryFocusHolder = hashDataTable;
+
+ updateMethodToRunAtResize("at.gv.egiz.bku.gui.BKUGUIImpl", "renderSignedReferenceListButtonandTable");
+
+ renderSignedReferenceListButtonandTable();
+
+ hashDataTable.requestFocus();
+
+ contentPanel.validate();
+
+ resize();
+ }
+ });
+ }
+
+ public void renderSignedReferenceListButtonandTable() {
+
+ GroupLayout mainPanelLayout = new GroupLayout(mainPanel);
+ mainPanel.setLayout(mainPanelLayout);
+
+ GroupLayout.SequentialGroup messageHorizontal = mainPanelLayout
+ .createSequentialGroup().addComponent(refIdLabel);
+
+ GroupLayout.ParallelGroup messageVertical = mainPanelLayout
+ .createParallelGroup(GroupLayout.Alignment.LEADING)
+ .addComponent(refIdLabel);
+
+ if (!renderHeaderPanel) {
+
+ if (helpListener.implementsListener()) {
+ messageHorizontal.addPreferredGap(
+ LayoutStyle.ComponentPlacement.UNRELATED, 0,
+ Short.MAX_VALUE).addComponent(helpLabel);
+ messageVertical.addComponent(helpLabel);
+ }
+ messageHorizontal.addComponent(switchFocusDummyLabel);
+ messageVertical.addComponent(switchFocusDummyLabel);
+ }
+
+ mainPanelLayout.setHorizontalGroup(mainPanelLayout
+ .createParallelGroup(GroupLayout.Alignment.LEADING)
+ .addGroup(messageHorizontal).addComponent(
+ hashDataScrollPane, 0, 0, Short.MAX_VALUE));
+
+ mainPanelLayout
+ .setVerticalGroup(mainPanelLayout
+ .createSequentialGroup()
+ .addGroup(messageVertical)
+ .addPreferredGap(
+ LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(
+ hashDataScrollPane,
+ 0,
+ 0,
+ hashDataTable.getPreferredSize().height + 3));
+
+
+
+ GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel);
+ buttonPanel.setLayout(buttonPanelLayout);
+
+ buttonPanelLayout.setHorizontalGroup(buttonPanelLayout
+ .createSequentialGroup().addComponent(backButton,
+ GroupLayout.PREFERRED_SIZE, buttonSize,
+ GroupLayout.PREFERRED_SIZE));
+ buttonPanelLayout.setVerticalGroup(buttonPanelLayout
+ .createSequentialGroup().addComponent(backButton));
+
+ }
+
+ /**
+ * not possible to add mouse listener to TableCellRenderer to change cursor
+ * on specific columns only, use table.columnAtPoint(e.getPoint())
+ *
+ */
+ private class SignedReferencesMouseMotionListener extends
+ MouseMotionAdapter {
+
+ JTable hashDataTable;
+
+ public SignedReferencesMouseMotionListener(JTable table) {
+ this.hashDataTable = table;
+ }
+
+ @Override
+ public void mouseMoved(MouseEvent e) {
+ // if (hashDataTable.columnAtPoint(e.getPoint()) == 0) {
+ hashDataTable.setCursor(Cursor
+ .getPredefinedCursor(Cursor.HAND_CURSOR));
+ }
+ }
+
+ // /////////
+ // SignedReferencesList (TODO pull out)
+
+ public class SignedReferencesSelectionListener implements
+ ListSelectionListener {
+
+// List<HashDataInput> signedReferences;
+ ActionListener backListener;
+ String backCommand;
+
+ public SignedReferencesSelectionListener(
+ List<HashDataInput> signedReferences,
+ ActionListener backListener, String backCommand) {
+// this.signedReferences = signedReferences;
+ BKUGUIImpl.this.signedReferences = signedReferences;
+ this.backListener = backListener;
+ this.backCommand = backCommand;
+ }
+
+ @Override
+ public void valueChanged(ListSelectionEvent event) {
+
+ if (event.getValueIsAdjusting()) {
+ return;
+ }
+
+ ListSelectionModel lsm = (ListSelectionModel) event.getSource();
+ int selectionIdx = lsm.getMinSelectionIndex();
+
+ log.debug("[{}] Reference {} selected.",
+ Thread.currentThread().getName(), selectionIdx);
+
+ if (selectionIdx >= 0) {
+// final HashDataInput selection = signedReferences
+// .get(selectionIdx);
+// final SignedReferencesListDisplayer backToListListener = new SignedReferencesListDisplayer(
+// signedReferences, backListener, backCommand);
+
+ referenceIndex = selectionIdx;
+ storedBackToListListener = new SignedReferencesListDisplayer(
+ signedReferences, backListener, backCommand);
+
+// if (SecureViewerDialog.SUPPORTED_MIME_TYPES.contains(selection
+// .getMimeType())) {
+// log.debug("[" + Thread.currentThread().getName()
+// + "] scheduling secure viewer dialog");
+//
+// showMessageDialog(TITLE_SIGNATURE_DATA,
+// MESSAGE_HASHDATA_VIEWER);
+//
+// SwingUtilities.invokeLater(new Runnable() {
+//
+// @Override
+// public void run() {
+// try {
+// showSecureViewer(selection, backToListListener,
+// null);
+// // SecureViewerDialog.showSecureViewer(selection,
+// // messages, fontProvider,
+// // helpMouseListener.getActionListener(),
+// // false);
+// } catch (FontProviderException ex) {
+// log
+// .error(
+// "failed to display secure viewer",
+// ex);
+// showErrorDialog(BKUGUIFacade.ERR_VIEWER,
+// new Object[] { ex.getMessage() },
+// backToListListener, null);
+// }
+//
+// }
+// });
+// } else {
+// log
+// .debug("["
+// + Thread.currentThread().getName()
+// + "] mime-type not supported by secure viewer, scheduling save dialog");
+// showMessageDialog(BKUGUIFacade.TITLE_SIGNATURE_DATA,
+// BKUGUIFacade.MESSAGE_UNSUPPORTED_MIMETYPE,
+// new Object[] { selection.getMimeType() });
+// SecureViewerSaveDialog.showSaveDialog(selection, messages,
+// backToListListener, null,
+// (int) (baseFontSize * getResizeFactor()));
+// }
+ }
+ }
+
+ /**
+ * ActionListener that returns to signed references list
+ */
+ private class SignedReferencesListDisplayer implements ActionListener {
+ List<HashDataInput> sr;
+ ActionListener bl;
+ String bc;
+
+ public SignedReferencesListDisplayer(
+ List<HashDataInput> signedReferences,
+ ActionListener backListener, String backCommand) {
+ sr = signedReferences;
+ bl = backListener;
+ bc = backCommand;
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ // log.debug("[" + Thread.currentThread().getName() +
+ // "] displaying signed references list");
+ showSignedReferencesListDialog(sr, bl, bc);
+ }
+ }
+ }
+
+ // //////////////////////////////////////////////////////////////////////////
+ // UTILITY METHODS
+ // //////////////////////////////////////////////////////////////////////////
+
+ private void registerSwitchFocusListener(ActionListener switchFocusListener) {
+ if (switchFocusListener != null) {
+ this.switchFocusKeyListener = new SwitchFocusFocusListener(
+ switchFocusListener);
+
+ } else {
+
+ this.switchFocusKeyListener = new SwitchFocusFocusListener(
+ new ActionListener() {
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ log.warn("No switch focus listener registered.");
+ }
+ });
+ }
+ }
+
+ // //////////////////////////////////////////////////////////////////////////
+ // INITIALIZERS (MAY BE OVERRIDDEN BY SUBCLASSES)
+ // //////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Load applet messages bundle. Note that getBundle looks for classes based
+ * on the default Locale before it selects the base class!
+ *
+ * Called from constructor. Subclasses may override this method to ensure
+ * the message bundle is loaded once initButtonSize (called from constructor
+ * as well) is called. (Only relevant if initButtonSize is overridden as
+ * well)
+ *
+ * @param locale
+ */
+ protected void loadMessageBundle(Locale locale) {
+ if (locale != null) {
+ // see [#378] Ignoring post parameter 'locale': bundle resolve-order
+ // not correct?!
+ Locale lang = new Locale(locale.getLanguage().substring(0, 2));
+ log.debug("Loading message bundle for language: {}.", lang.toString());
+ messages = ResourceBundle.getBundle(MESSAGES_BUNDLE, lang);
+ } else {
+ log.debug("Loading default language message bundle.");
+ messages = ResourceBundle.getBundle(MESSAGES_BUNDLE);
+ }
+
+ if (log.isDebugEnabled()) {
+ if (messages.getLocale() == null
+ || "".equals(messages.getLocale().getLanguage())) {
+ log.info("Fallback to default locale message bundle.");
+ } else {
+ log.info("Applet message bundle loaded for {}.",
+ messages.getLocale());
+ }
+ }
+ }
+
+ protected int initButtonSize() {
+ int bs = 0;
+
+ JButton b = new JButton();
+ b.setText(getMessage(BUTTON_OK));
+ if (b.getPreferredSize().width > bs) {
+ bs = b.getPreferredSize().width;
+ }
+ // need cancel button for message dialog,
+ // even if renderCancelButton == false
+ b.setText(getMessage(BUTTON_CANCEL));
+ if (b.getPreferredSize().width > bs) {
+ bs = b.getPreferredSize().width;
+ }
+ b.setText(getMessage(BUTTON_SIGN));
+ if (b.getPreferredSize().width > bs) {
+ bs = b.getPreferredSize().width;
+ }
+ b.setText(getMessage(BUTTON_BACK));
+ if (b.getPreferredSize().width > bs) {
+ bs = b.getPreferredSize().width;
+ }
+ b.setText(getMessage(BUTTON_SAVE));
+ if (b.getPreferredSize().width > bs) {
+ bs = b.getPreferredSize().width;
+ }
+ return bs;
+ }
@Override
public void getFocusFromBrowser() {
+
+ log.debug("Try setting focus to current component ...");
+ if (primaryFocusHolder == null) {
+ log.debug("No stored component - set focus to contentPanel ...");
+
+ primaryFocusHolder = contentPanel;
+
+ }
+ log.debug("Component to obtain focus: {}.", primaryFocusHolder.getName());
+ primaryFocusHolder.requestFocus();
+
+ }
+
+ protected void updateHelpLabelIcon() {
+
+ if (helpListener.implementsListener()) {
+
+ helpLabel.setIcon(new ImageIcon(getClass().getResource(
+ getHelpLabelResourceName())));
+
+ helpLabel.setBorder(helpLabel.hasFocus() ? helpFocusBorder
+ : BorderFactory.createEmptyBorder());
+ }
+
+ }
+
+ protected String getHelpLabelResourceName() {
+
+ double contentPanelWidth = contentPanel.getSize().getWidth();
+ String resourceName = HELP_IMG;
+
+ if (contentPanelWidth > 300) {
+
+ resourceName = HELP_IMG_L;
+ }
+
+ if (contentPanelWidth > 470) {
+
+ resourceName = HELP_IMG_XL;
+ }
+
+ if (contentPanelWidth > 600) {
+
+ resourceName = HELP_IMG_XXL;
+ }
+
+ return resourceName;
+ }
+
+ protected float getResizeFactor() {
+
+ if (baseWidth == null || baseHeight == null || baseWidth == 0
+ || baseHeight == 0) {
+
+ // first call - determine base width and height
+ baseWidth = contentPanel.getWidth();
+ baseHeight = contentPanel.getHeight();
+ }
+
+ float factor = (float) contentPanel.getSize().getWidth()
+ / (float) baseWidth;
+
+ return factor;
+ }
+
+ public void resize() {
+
+ log.debug("Resizing ...");
+ updateHelpLabelIcon();
+
+ float factor = getResizeFactor();
+
+ this.sigDataFocusBorder.setBorderWidthFactor(factor);
+ this.helpFocusBorder.setBorderWidthFactor(factor);
+
+ buttonSize = (int) ((float) baseButtonSize * factor);
+
+ if (renderHeaderPanel) {
+
+ titleLabel.setFont(titleLabel.getFont().deriveFont(
+ (float) ((baseFontSize + 2) * factor)));
+ }
+
+ if (cancelButton != null) {
+
+ cancelButton.setFont(cancelButton.getFont().deriveFont(
+ (float) (baseFontSize * factor)));
+ }
+
+ if (pinField != null) {
+ pinField.setFont(pinField.getFont().deriveFont(
+ (float) (baseFontSize * factor)));
+
+ }
+
+ if (infoLabel != null) {
+ infoLabel.setFont(infoLabel.getFont().deriveFont(
+ (float) (baseFontSize * factor)));
+ }
+
+ if (pinsizeLabel != null) {
+ pinsizeLabel.setFont(pinsizeLabel.getFont().deriveFont(
+ (float) ((baseFontSize * factor) - 2)));
+
+ }
+
+ if (signPinLabel != null) {
+
+ signPinLabel.setFont(signPinLabel.getFont().deriveFont(
+ (float) (baseFontSize * factor)));
+
+ }
+
+ if (signButton != null) {
+
+ signButton.setFont(signButton.getFont().deriveFont(
+ (float) (baseFontSize * factor)));
+
+ }
+
+ if (cardPinLabel != null) {
+
+ cardPinLabel.setFont(cardPinLabel.getFont().deriveFont(
+ (float) (baseFontSize * factor)));
+
+ }
+
+ if (okButton != null) {
+
+ okButton.setFont(okButton.getFont().deriveFont(
+ (float) (baseFontSize * factor)));
+
+ }
+
+ if (pinLabel != null) {
+
+ pinLabel.setFont(pinLabel.getFont().deriveFont(
+ (float) (baseFontSize * factor)));
+
+ }
+
+ if (pinpadPINField != null) {
+
+ pinpadPINField.setFont(pinpadPINField.getFont().deriveFont(
+ (float) (baseFontSize * factor)));
+
+ }
+
+ if (msgTitleLabel != null) {
+
+ msgTitleLabel.setFont(msgTitleLabel.getFont().deriveFont(
+ (float) (baseFontSize * factor)));
+
+ }
+
+ if (msgLabel != null) {
+
+ msgLabel.setFont(msgLabel.getFont().deriveFont(
+ (float) (baseFontSize * factor)));
+
+ }
+
+ if (enterPINButton != null) {
+
+ enterPINButton.setFont(enterPINButton.getFont().deriveFont(
+ (float) (baseFontSize * factor)));
+
+ }
- // This method puts the focus to the helpLabel as this
- // element is supposed to appear in each dialogue.
- helpLabel.requestFocus();
+ if (refIdLabel != null) {
+
+ refIdLabel.setFont(refIdLabel.getFont().deriveFont(
+ (float) (baseFontSize * factor)));
+ }
+
+
+ if (backButton != null) {
+
+ backButton.setFont(backButton.getFont().deriveFont(
+ (float) (baseFontSize * factor)));
+
+ }
+
+ if (hyperlinkRenderer != null) {
+
+ hyperlinkRenderer.setFontSize((int) (baseFontSize * factor));
+ }
+
+ if (hashDataTable != null) {
+
+ hashDataTable.setRowHeight((int) (baseTableRowHeight * factor));
+
+ }
+ if (secureViewer != null && secureViewer.isVisible()) {
+
+ secureViewer.resize(factor);
+ }
+
+ try {
+
+ if (methodToRunAtResize != null) {
+ log.debug("Running required button panel renderer ...");
+ methodToRunAtResize.invoke(this);
+ } else {
+ log.debug("No MethodToRun stored.");
+ }
+
+ } catch (IllegalArgumentException e) {
+ log.error("Cannot invoke rendering method.", e);
+ } catch (IllegalAccessException e) {
+ log.error("Cannot invoke rendering method.", e);
+ } catch (InvocationTargetException e) {
+ log.error("Cannot invoke rendering method.", e);
+ }
+
+ contentPanel.validate();
+
+ log.debug("Resize done.");
+
+ }
+
+ // TODO: Define FocusTraversalPolicies for other GUIs as well, even if
+ // focus order is currently correct by chance for other GUIs
+ public class AdvancedSigPinGUIFocusTraversalPolicy extends
+ FocusTraversalPolicy {
+
+ @Override
+ public Component getComponentAfter(Container container,
+ Component component) {
+
+ if (component.equals(pinField)) {
+
+ if (signButton.isEnabled()) {
+
+ return signButton;
+ } else {
+
+ return cancelButton;
+ }
+ }
+
+ if (component.equals(signButton)) {
+
+ return cancelButton;
+ }
+
+ if (component.equals(cancelButton)) {
+
+ return infoLabel;
+ }
+ if (component.equals(infoLabel)) {
+
+ if (helpLabel != null && helpLabel.isVisible()) {
+
+ return helpLabel;
+ } else {
+
+ return switchFocusDummyLabel;
+ }
+ }
+
+ if (component.equals(helpLabel)) {
+
+ return switchFocusDummyLabel;
+ }
+
+ // should never be the case
+ if (component.equals(switchFocusDummyLabel)) {
+
+ return pinField;
+ }
+
+ // default
+ return pinField;
+ }
+
+ @Override
+ public Component getComponentBefore(Container container,
+ Component component) {
+
+ if (component.equals(pinField)) {
+
+ return switchFocusDummyLabel;
+ }
+
+ if (component.equals(signButton)) {
+
+ return pinField;
+ }
+
+ if (component.equals(cancelButton)) {
+
+ if (signButton != null && signButton.isVisible()
+ && signButton.isEnabled()) {
+
+ return signButton;
+
+ } else {
+
+ return pinField;
+ }
+ }
+
+ if (component.equals(infoLabel)) {
+
+ return cancelButton;
+ }
+
+ if (component.equals(helpLabel)) {
+
+ return infoLabel;
+ }
+
+ // should never be the case
+ if (component.equals(switchFocusDummyLabel)) {
+
+ if (helpLabel != null && helpLabel.isVisible()) {
+
+ return helpLabel;
+ } else {
+
+ return infoLabel;
+ }
+ }
+
+ // default
+ return pinField;
+ }
+
+ @Override
+ public Component getDefaultComponent(Container container) {
+
+ return pinField;
+ }
+
+ @Override
+ public Component getFirstComponent(Container container) {
+
+ return pinField;
+ }
+
+ @Override
+ public Component getLastComponent(Container container) {
+
+ return switchFocusDummyLabel;
+ }
+ }
+
+ public class AdvancedShowSigDataGUIFocusTraversalPolicy extends
+ FocusTraversalPolicy {
+
+ @Override
+ public Component getComponentAfter(Container container,
+ Component component) {
+
+ if (component.equals(enterPINButton)) {
+
+ return cancelButton;
+ }
+
+ if (component.equals(cancelButton)) {
+
+ return infoLabel;
+ }
+ if (component.equals(infoLabel)) {
+
+ if (helpLabel != null && helpLabel.isVisible()) {
+
+ return helpLabel;
+ } else {
+
+ return switchFocusDummyLabel;
+ }
+ }
+
+ if (component.equals(helpLabel)) {
+
+ return switchFocusDummyLabel;
+ }
+
+ // should never be the case
+ if (component.equals(switchFocusDummyLabel)) {
+
+ return enterPINButton;
+ }
+
+ // default
+ return enterPINButton;
+ }
+
+ @Override
+ public Component getComponentBefore(Container container,
+ Component component) {
+
+ if (component.equals(enterPINButton)) {
+
+ return switchFocusDummyLabel;
+ }
+
+ if (component.equals(cancelButton)) {
+
+ return enterPINButton;
+ }
+
+ if (component.equals(infoLabel)) {
+
+ return cancelButton;
+ }
+
+ if (component.equals(helpLabel)) {
+
+ return infoLabel;
+ }
+
+ // should never be the case
+ if (component.equals(switchFocusDummyLabel)) {
+
+ if (helpLabel != null && helpLabel.isVisible()) {
+
+ return helpLabel;
+ } else {
+
+ return infoLabel;
+ }
+ }
+
+ // default
+ return enterPINButton;
+ }
+
+ @Override
+ public Component getDefaultComponent(Container container) {
+
+ return enterPINButton;
+ }
+
+ @Override
+ public Component getFirstComponent(Container container) {
+
+ return enterPINButton;
+ }
+
+ @Override
+ public Component getLastComponent(Container container) {
+
+ return switchFocusDummyLabel;
+ }
}
}
diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUIcons.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUIcons.java
index 92d6897b..b0e43291 100644
--- a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUIcons.java
+++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUIcons.java
@@ -22,8 +22,8 @@ import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import javax.imageio.ImageIO;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
*
@@ -31,24 +31,23 @@ import org.apache.commons.logging.LogFactory;
*/
public class BKUIcons {
- protected static final Log log = LogFactory.getLog(BKUIcons.class);
-
- /** 16x16, 24x24, 32x32, 48x48, 128x128 pixels */
+ /** 128x128, 48x48, 32x32, 24x24, 16x16 pixels */
public static final ArrayList<Image> icons = new ArrayList<Image>();
static {
String[] iconResources = new String[] {
- "/at/gv/egiz/bku/gui/chip16.png",
- "/at/gv/egiz/bku/gui/chip24.png",
- "/at/gv/egiz/bku/gui/chip32.png",
+ "/at/gv/egiz/bku/gui/chip128.png",
"/at/gv/egiz/bku/gui/chip48.png",
- "/at/gv/egiz/bku/gui/chip128.png" };
+ "/at/gv/egiz/bku/gui/chip32.png",
+ "/at/gv/egiz/bku/gui/chip24.png",
+ "/at/gv/egiz/bku/gui/chip16.png"};
for (String ir : iconResources) {
URL resource = BKUIcons.class.getResource(ir);
if (ir != null) {
try {
icons.add(ImageIO.read(resource));
} catch (IOException ex) {
+ Logger log = LoggerFactory.getLogger(BKUIcons.class);
log.warn("failed to load mocca icon " + ir, ex);
}
}
diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/DeafHelpListener.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/DeafHelpListener.java
new file mode 100644
index 00000000..a4ce79b0
--- /dev/null
+++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/DeafHelpListener.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2008 Federal Chancellery Austria and
+ * Graz University of Technology
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package at.gv.egiz.bku.gui;
+
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseEvent;
+import java.util.Locale;
+
+public class DeafHelpListener extends HelpListener {
+
+ // localization in helpListener (pass message bundle, getLocale, add language to helpContext) or outside?
+ public DeafHelpListener(String helpURL, Locale locale) {
+ super(helpURL, locale);
+ }
+
+ @Override
+ public boolean implementsListener() {
+ return false;
+ }
+
+ @Override
+ public void mouseClicked(MouseEvent arg0) {
+ }
+
+ @Override
+ public void keyPressed(KeyEvent arg0) {
+ }
+
+ @Override
+ public void mousePressed(MouseEvent e) {
+ }
+
+ @Override
+ public void mouseReleased(MouseEvent e) {
+ }
+
+ @Override
+ public void mouseEntered(MouseEvent e) {
+ }
+
+ @Override
+ public void mouseExited(MouseEvent e) {
+ }
+
+ @Override
+ public void keyTyped(KeyEvent e) {
+ }
+
+ @Override
+ public void keyReleased(KeyEvent e) {
+ }
+
+}
diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/DefaultHelpListener.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/DefaultHelpListener.java
deleted file mode 100644
index 032c8fe5..00000000
--- a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/DefaultHelpListener.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright 2008 Federal Chancellery Austria and
- * Graz University of Technology
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package at.gv.egiz.bku.gui;
-
-import java.applet.AppletContext;
-import java.net.URL;
-import java.util.Locale;
-import javax.swing.SwingUtilities;
-
-/**
- *
- * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at>
- */
-public class DefaultHelpListener extends AbstractHelpListener {
-
- /**
- * applet context to open external links in help pages,
- * if null, no external links will be opened
- */
- protected AppletContext ctx;
-
- /**
- *
- * @param ctx open external links via applet context
- * @param helpURL
- * @param locale
- */
- public DefaultHelpListener(AppletContext ctx, URL helpURL, Locale locale) {
- super(helpURL, locale);
- this.ctx = ctx;
- }
-
- /**
- * external links in help document are not opened
- * @param helpURL
- * @param locale
- */
- public DefaultHelpListener(URL helpURL, Locale locale) {
- super(helpURL, locale);
- this.ctx = null;
- }
-
- /**
- * blocks until help viewer returns (is closed)
- * @param helpURL
- * @param helpTopic ignored
- */
- @Override
- public void showDocument(final URL helpURL, final String helpTopic) {
- log.debug("schedule help dialog");
-
- SwingUtilities.invokeLater(new Runnable() {
-
- @Override
- public void run() {
-
- log.debug("show help dialog");
-
- if (ctx == null) {
- HelpViewer.showHelpDialog(helpURL, messages);
- } else {
- HelpViewer.showHelpDialog(ctx, helpURL, messages);
- }
- }
- });
- }
-}
diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/FocusBorder.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/FocusBorder.java
new file mode 100644
index 00000000..2c25d46b
--- /dev/null
+++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/FocusBorder.java
@@ -0,0 +1,69 @@
+package at.gv.egiz.bku.gui;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Insets;
+import java.awt.geom.Rectangle2D;
+
+import javax.swing.border.Border;
+
+
+public class FocusBorder implements Border {
+
+ private static final Color DEFAULT_COLOR = Color.BLACK;
+
+ private Color color;
+ private float borderWidthFactor;
+
+ public FocusBorder() {
+
+ this.color = DEFAULT_COLOR;
+ this.borderWidthFactor = 1.0f;
+ }
+
+ public FocusBorder(Color borderColor) {
+
+ this.color = borderColor;
+ this.borderWidthFactor = 1.0f;
+ }
+
+ @Override
+ public Insets getBorderInsets(Component c) {
+
+ return new Insets(3, 3, 6, 6);
+ }
+
+ @Override
+ public boolean isBorderOpaque() {
+
+ return true;
+ }
+
+ @Override
+ public void paintBorder(Component c, Graphics g, int x, int y, int width,
+ int height) {
+ Graphics2D g2 = (Graphics2D) g;
+
+ g2.setPaint(color);
+ float[] dash1 = { 2.0f };
+
+ g2.setStroke(new BasicStroke(1.0f * borderWidthFactor, BasicStroke.CAP_BUTT,
+ BasicStroke.JOIN_MITER, 10.0f, dash1, 0.0f));
+
+ g2.draw(new Rectangle2D.Double(x + 1, y + 1, width - 6, height - 6));
+
+ }
+
+ public void setColor(Color color) {
+ this.color = color;
+ }
+
+ public void setBorderWidthFactor(float borderWidthFactor) {
+
+ this.borderWidthFactor = borderWidthFactor;
+ }
+
+}
diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HashDataTableModel.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HashDataTableModel.java
index 70842102..320c92a9 100644
--- a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HashDataTableModel.java
+++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HashDataTableModel.java
@@ -19,8 +19,6 @@ package at.gv.egiz.bku.gui;
import at.gv.egiz.stal.HashDataInput;
import java.util.List;
import javax.swing.table.DefaultTableModel;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
/**
*
@@ -28,10 +26,10 @@ import org.apache.commons.logging.LogFactory;
*/
class HashDataTableModel extends DefaultTableModel {
- protected static final Log log = LogFactory.getLog(HashDataTableModel.class);
-
+ private static final long serialVersionUID = 1L;
+
/** HashDataInput in first column, register hyperlinkrenderer only here */
- protected Class[] types;
+ protected Class<?>[] types;
protected List<HashDataInput> hashDataInputs;
public HashDataTableModel(List<HashDataInput> hashDataInputs, boolean twoColLayout) {
@@ -52,7 +50,7 @@ class HashDataTableModel extends DefaultTableModel {
}
@Override
- public Class getColumnClass(int columnIndex) {
+ public Class<?> getColumnClass(int columnIndex) {
return types[columnIndex];
}
@@ -60,4 +58,4 @@ class HashDataTableModel extends DefaultTableModel {
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
-} \ No newline at end of file
+}
diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HelpKeyListener.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HelpKeyListener.java
deleted file mode 100644
index 4ca20f7e..00000000
--- a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HelpKeyListener.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package at.gv.egiz.bku.gui;
-
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.KeyAdapter;
-import java.awt.event.KeyEvent;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- *
- * @author Thomas Zefferer <thomas.zefferer@iaik.tugraz.at>
- */
-public class HelpKeyListener extends KeyAdapter {
-
- protected static final Log log = LogFactory.getLog(HelpKeyListener.class);
-
- protected ActionListener helpListener;
- protected String locale;
- protected String topic;
-
- public HelpKeyListener(ActionListener externalHelpListener) {
- super();
- this.helpListener = externalHelpListener;
- }
-
- public void setHelpTopic(String topic) {
- log.trace("setting help topic: " + topic);
- this.topic = topic;
- }
-
- public ActionListener getActionListener() {
- return helpListener;
- }
-
- @Override
- public void keyPressed(KeyEvent arg0) {
-
- if(arg0.getKeyCode() == KeyEvent.VK_ENTER) {
- ActionEvent e = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, topic);
- helpListener.actionPerformed(e);
- }
- }
-
-}
diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HelpListener.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HelpListener.java
new file mode 100644
index 00000000..dc597656
--- /dev/null
+++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HelpListener.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2008 Federal Chancellery Austria and
+ * Graz University of Technology
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package at.gv.egiz.bku.gui;
+
+import java.awt.event.KeyListener;
+import java.awt.event.MouseListener;
+import java.util.Locale;
+import java.util.ResourceBundle;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class HelpListener implements MouseListener, KeyListener, HelpURLProvider {
+
+ public static final String MESSAGE_BUNDLE = "at/gv/egiz/bku/gui/Messages";
+
+ private final Logger log = LoggerFactory.getLogger(HelpListener.class);
+ private String helpURL;
+ protected String helpTopic;
+ protected ResourceBundle messageBundle;
+
+ // localization in helpListener (pass message bundle, getLocale, add language to helpContext) or outside?
+ public HelpListener(String helpURL, Locale locale) {
+// this.codebase = codebase;
+ this.helpURL = helpURL;
+
+ if (locale != null) {
+ log.trace("Check for support of requested help locale {}.", locale.getLanguage().substring(0,2));
+ messageBundle = ResourceBundle.getBundle(MESSAGE_BUNDLE,
+ new Locale(locale.getLanguage().substring(0, 2)));
+ } else {
+ messageBundle = ResourceBundle.getBundle(MESSAGE_BUNDLE);
+ }
+ if (!"".equals(messageBundle.getLocale().getLanguage())) {
+ log.trace("Using help locale '{}'.", messageBundle.getLocale().getLanguage().substring(0,2));
+ helpURL += messageBundle.getLocale().getLanguage().substring(0,2) + '/';
+ } else {
+ log.trace("Using help locale 'default'.");
+ }
+
+ log.debug("Setting help context to {}.", helpURL);
+ }
+
+ @Override
+ public synchronized void setHelpTopic(String topic) {
+ log.trace("Setting help topic: {}.", topic);
+ helpTopic = topic;
+ }
+
+ @Override
+ public synchronized String getHelpURL() {
+ if (helpTopic == null) {
+ log.debug("No help topic set, return index.");
+ return helpURL + "index.html";
+ }
+ String url = helpURL + helpTopic + ".html";
+ log.debug("Return help topic: {}.", url);
+ return url;
+ }
+
+ /**
+ * By default, HelpListener cannot handle action events and acts as (deaf) help context only.
+ * Subclasses may add listener functionality.
+ *
+ * Whether a listener is available so that GUI elements may be included to provide context help.
+ * (whether a help icon shall be included)
+ * @return true if this HelpListener implements the Mouse/KeyListeners
+ */
+ public abstract boolean implementsListener();
+
+}
diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HelpMouseListener.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HelpMouseListener.java
deleted file mode 100644
index b7bbe971..00000000
--- a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HelpMouseListener.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2008 Federal Chancellery Austria and
- * Graz University of Technology
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package at.gv.egiz.bku.gui;
-
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-public class HelpMouseListener extends MouseAdapter {
-
- protected static final Log log = LogFactory.getLog(HelpMouseListener.class);
-
- protected ActionListener helpListener;
- protected String locale;
- protected String topic;
-
- public HelpMouseListener(ActionListener externalHelpListener) {
- super();
- this.helpListener = externalHelpListener;
- }
-
- public void setHelpTopic(String topic) {
- log.trace("setting help topic: " + topic);
- this.topic = topic;
- }
-
- public ActionListener getActionListener() {
- return helpListener;
- }
-
- @Override
- public void mouseClicked(MouseEvent arg0) {
- ActionEvent e = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, topic);
- helpListener.actionPerformed(e);
- }
-}
diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HelpURLProvider.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HelpURLProvider.java
new file mode 100644
index 00000000..f310705c
--- /dev/null
+++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HelpURLProvider.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2008 Federal Chancellery Austria and
+ * Graz University of Technology
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package at.gv.egiz.bku.gui;
+
+/**
+ * Make current context dependent help topic available (outside the applet).
+ * Updated by the GUI whenever the current help topic changes.
+ *
+ * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at>
+ */
+public interface HelpURLProvider {
+
+ void setHelpTopic(String helpTopic);
+
+ String getHelpURL();
+
+}
diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HelpViewer.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HelpViewer.java
index 0f887f78..bfd797e8 100644
--- a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HelpViewer.java
+++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HelpViewer.java
@@ -39,8 +39,8 @@ import javax.swing.LayoutStyle;
import javax.swing.SwingUtilities;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
*
@@ -49,7 +49,10 @@ import org.apache.commons.logging.LogFactory;
public class HelpViewer extends JDialog
implements ActionListener {
- protected static final Log log = LogFactory.getLog(HelpViewer.class);
+ private static final long serialVersionUID = 1L;
+
+ private final Logger log = LoggerFactory.getLogger(HelpViewer.class);
+
private static HelpViewer dialog;
protected ResourceBundle messages;
protected AppletContext ctx;
@@ -128,7 +131,7 @@ public class HelpViewer extends JDialog
}
private JPanel createViewerPanel(URL helpURL) { //String viewerLabelText,
- log.debug("viewer dialog: " + helpURL.toString());
+ log.debug("Viewer dialog: {}.", helpURL.toString());
final JEditorPane viewer = new JEditorPane();
viewer.setEditable(false);
@@ -146,7 +149,7 @@ public class HelpViewer extends JDialog
final URL url = e.getURL();
if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
if (ctx != null) {
- log.debug("open external link in help viewer: " + url);
+ log.debug("Open external link in help viewer: {}.", url);
ctx.showDocument(url, "_blank");
} else {
SwingUtilities.invokeLater(new Runnable() {
diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HyperlinkRenderer.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HyperlinkRenderer.java
index 6af22815..9552bdde 100644
--- a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HyperlinkRenderer.java
+++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/HyperlinkRenderer.java
@@ -26,10 +26,14 @@ import javax.swing.table.DefaultTableCellRenderer;
*/
public class HyperlinkRenderer extends DefaultTableCellRenderer {
+ private static final long serialVersionUID = 1L;
+
protected boolean renderReferenceId;
+ protected int fontSize;
public HyperlinkRenderer(boolean renderReferenceId) {
this.renderReferenceId = renderReferenceId;
+ this.fontSize = super.getFont().getSize();
}
/**
@@ -49,6 +53,13 @@ public class HyperlinkRenderer extends DefaultTableCellRenderer {
}
}
super.setText("<html><u>" + hrefText + "</u></html>");
+ super.setFont(super.getFont().deriveFont((float) (fontSize)));
setForeground(BKUGUIFacade.HYPERLINK_COLOR);
}
+
+ public void setFontSize(int fontSize) {
+
+ this.fontSize = fontSize;
+ }
+
}
diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/ImagePanel.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/ImagePanel.java
index 6a738acb..f18bef6b 100644
--- a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/ImagePanel.java
+++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/ImagePanel.java
@@ -30,6 +30,8 @@ import javax.swing.JPanel;
*/
public class ImagePanel extends JPanel {
+ private static final long serialVersionUID = 1L;
+
protected Image backgroundImg;
public ImagePanel(URL background) {
diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/SecureViewerDialog.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/SecureViewerDialog.java
index b0c8ecd4..f4942a61 100644
--- a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/SecureViewerDialog.java
+++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/SecureViewerDialog.java
@@ -28,10 +28,6 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
-import java.awt.event.KeyAdapter;
-import java.awt.event.KeyEvent;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
@@ -56,8 +52,8 @@ import javax.swing.text.Document;
import javax.swing.text.EditorKit;
import javax.swing.text.StyledEditorKit;
import javax.swing.text.html.HTMLEditorKit;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
*
@@ -65,7 +61,9 @@ import org.apache.commons.logging.LogFactory;
*/
public class SecureViewerDialog extends JDialog {
- /** don't import BKUFonts in order not to load BKUFonts.jar
+ private static final long serialVersionUID = 1L;
+
+/** don't import BKUFonts in order not to load BKUFonts.jar
* BKUApplet includes BKUFonts as runtime dependency only, the jar is copied to the applet dir in BKUOnline with dependency-plugin
* BKUViewer has compile dependency BKUFonts, transitive in BKUOnline and BKULocal
*/
@@ -77,14 +75,25 @@ public class SecureViewerDialog extends JDialog {
SUPPORTED_MIME_TYPES.add("application/xhtml+xml");
SUPPORTED_MIME_TYPES.add("text/html");
}
- protected static final Log log = LogFactory.getLog(SecureViewerDialog.class);
-// private static SecureViewerDialog dialog;
+ private final Logger log = LoggerFactory.getLogger(SecureViewerDialog.class);
protected ResourceBundle messages;
protected JEditorPane viewer;
protected JLabel viewerLabel;
protected JScrollPane scrollPane;
- protected HashDataInput content; //remember for save dialog
+ protected HashDataInput content; //remember for save dialog and for resizing
protected FontProvider fontProvider;
+ protected HelpListener helpListener;
+
+ protected JButton closeButton;
+ protected JButton saveButton;
+
+ protected int baseFontSize;
+ protected int baseButtonSize;
+
+ protected float resizeFactor;
+
+ protected ActionListener closeListener;
+ protected String closeCommand;
/**
* Create and display a modal SecureViewer dialog.
@@ -95,14 +104,25 @@ public class SecureViewerDialog extends JDialog {
*/
public SecureViewerDialog(Frame owner, ResourceBundle messages,
ActionListener closeListener, String closeCommand,
- FontProvider fontProvider, ActionListener helpListener) {
- super(owner, messages.getString(BKUGUIFacade.WINDOWTITLE_VIEWER), true);
+ FontProvider fontProvider,
+ HelpListener helpListener, float resizeFactor) {
+ super(owner, messages.getString(BKUGUIFacade.WINDOWTITLE_VIEWER), false);
this.setIconImages(BKUIcons.icons);
this.messages = messages;
this.fontProvider = fontProvider;
-
+ this.helpListener = helpListener;
+
+ this.baseFontSize = new JLabel().getFont().getSize();
+
+ this.resizeFactor = 1.0f;
+ this.closeListener = closeListener;
+ this.closeCommand = closeCommand;
+
+ this.resizeFactor = resizeFactor;
+
+
initContentPane(VIEWER_DIMENSION,
- createViewerPanel(helpListener),
+ createViewerPanel(),
createButtonPanel(closeListener, closeCommand));
// also leave defaultWindowClosing HIDE_ON_CLOSE
@@ -115,8 +135,28 @@ public class SecureViewerDialog extends JDialog {
} else {
setLocationByPlatform(true);
}
+
+
}
+ public void resize(float resizeFactor) {
+
+ log.debug("Resizing secure viewer ...");
+ this.resizeFactor = resizeFactor;
+
+ getContentPane().removeAll();
+
+ initContentPane(VIEWER_DIMENSION,
+ createViewerPanel(),
+ createButtonPanel(closeListener, closeCommand));
+
+ this.setContent(content);
+
+ getContentPane().validate();
+
+
+ }
+
private void initContentPane(Dimension preferredSize,
JPanel viewerPanel, JPanel buttonPanel) {
Container contentPane = getContentPane();
@@ -135,9 +175,10 @@ public class SecureViewerDialog extends JDialog {
/**
* @param helpListener may be null
*/
- private JPanel createViewerPanel(final ActionListener helpListener) {
+ private JPanel createViewerPanel() {
viewer = new JEditorPane();
viewer.setEditable(false);
+
viewer.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, Boolean.TRUE);
scrollPane = new JScrollPane();
@@ -156,30 +197,13 @@ public class SecureViewerDialog extends JDialog {
infoHorizontal.addComponent(viewerLabel);
infoVertical.addComponent(viewerLabel);
- if (helpListener != null) {
+ if (helpListener.implementsListener()) {
final JLabel helpLabel = new JLabel();
helpLabel.setFocusable(true);
helpLabel.setIcon(new ImageIcon(getClass().getResource(BKUGUIFacade.HELP_IMG)));
helpLabel.getAccessibleContext().setAccessibleName(messages.getString(BKUGUIFacade.ALT_HELP));
- helpLabel.addMouseListener(new MouseAdapter() {
-
- @Override
- public void mouseClicked(MouseEvent arg0) {
- ActionEvent e = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, BKUGUIFacade.HELP_HASHDATAVIEWER);
- helpListener.actionPerformed(e);
- }
- });
- helpLabel.addKeyListener(new KeyAdapter() {
-
- @Override
- public void keyPressed(KeyEvent arg0) {
-
- if (arg0.getKeyCode() == KeyEvent.VK_ENTER) {
- ActionEvent e = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, BKUGUIFacade.HELP_HASHDATAVIEWER);
- helpListener.actionPerformed(e);
- }
- }
- });
+ helpLabel.addMouseListener(helpListener);
+ helpLabel.addKeyListener(helpListener);
helpLabel.addFocusListener(new FocusAdapter() {
@@ -220,7 +244,9 @@ public class SecureViewerDialog extends JDialog {
*/
public void setContent(HashDataInput hashDataInput) { //throws FontProviderException {
- log.debug("[" + Thread.currentThread().getName() + "] set viewer content");
+ log.debug("[{}] set viewer content.", Thread.currentThread().getName());
+
+ helpListener.setHelpTopic(BKUGUIFacade.HELP_HASHDATAVIEWER);
this.content = null;
viewer.setText(null);
@@ -229,7 +255,7 @@ public class SecureViewerDialog extends JDialog {
if (mimeType == null) {
mimeType = "text/plain";
}
- log.debug("secure viewer mime type: " + mimeType);
+ log.debug("Secure viewer mime type: {}.", mimeType);
// loads editorkit for text/plain if unrecognized
viewer.setContentType(mimeType);
@@ -237,11 +263,11 @@ public class SecureViewerDialog extends JDialog {
if ("text/plain".equals(mimeType)) {
viewer.setEditorKit(new StyledEditorKit());
- viewer.setFont(fontProvider.getFont().deriveFont(Font.PLAIN, viewer.getFont().getSize()));
+ viewer.setFont(fontProvider.getFont().deriveFont(Font.PLAIN, viewer.getFont().getSize() * resizeFactor));
} else if ("application/xhtml+xml".equals(mimeType)) {
viewer.setEditorKit(new HTMLEditorKit());
//reset font if fontprovider font was set before (TODO also html font from fontprovider)
- viewer.setFont(new Font("Dialog", Font.PLAIN, viewer.getFont().getSize())); //UIManager.getFont("Label.font"));
+ viewer.setFont(new Font("Dialog", Font.PLAIN, (int)(viewer.getFont().getSize() * resizeFactor))); //UIManager.getFont("Label.font"));
}
EditorKit editorKit = viewer.getEditorKit();
@@ -249,7 +275,7 @@ public class SecureViewerDialog extends JDialog {
// document.putProperty("IgnoreCharsetDirective", new Boolean(true));
Charset cs = (hashDataInput.getEncoding() == null) ? Charset.forName("UTF-8") : Charset.forName(hashDataInput.getEncoding());
- log.debug("secure viewer encoding: " + cs.toString());
+ log.debug("Secure viewer encoding: {}.", cs.toString());
InputStreamReader isr = new InputStreamReader(hashDataInput.getHashDataInput(), cs);
Reader contentReader = new BufferedReader(isr);
@@ -270,6 +296,11 @@ public class SecureViewerDialog extends JDialog {
}
viewer.setCaretPosition(0);
+ if (viewer.getText() != null) {
+ viewer.getAccessibleContext().setAccessibleDescription(
+ viewer.getText());
+ }
+
scrollPane.setViewportView(viewer);
scrollPane.setPreferredSize(viewer.getPreferredSize());
scrollPane.setAlignmentX(LEFT_ALIGNMENT);
@@ -280,21 +311,33 @@ public class SecureViewerDialog extends JDialog {
viewerLabel.setText("");
}
- log.debug("VIEWER FONT: " + viewer.getFont());
+ viewer.setFocusable(Boolean.TRUE);
+
+ log.debug("VIEWER FONT: {}.", viewer.getFont());
setVisible(true);
toFront();
+
+ viewer.requestFocus();
+
}
private JPanel createButtonPanel(ActionListener closeListener, String closeCommand) {
- JButton closeButton = new JButton();
+
+ closeButton = new JButton();
+
closeButton.setText(messages.getString(BKUGUIFacade.BUTTON_CLOSE));
closeButton.setActionCommand(closeCommand);
closeButton.addActionListener(new CloseButtonListener(closeListener));
-
- JButton saveButton = new JButton();
+ closeButton.setFont(closeButton.getFont().deriveFont(
+ (float) (baseFontSize * resizeFactor)));
+
+ saveButton = new JButton();
saveButton.setText(messages.getString(BKUGUIFacade.BUTTON_SAVE));
saveButton.addActionListener(new SaveButtonListener());
+ saveButton.setFont(saveButton.getFont().deriveFont(
+ (float) (baseFontSize * resizeFactor)));
+
int buttonSize = closeButton.getPreferredSize().width;
if (saveButton.getPreferredSize().width > buttonSize) {
buttonSize = saveButton.getPreferredSize().width;
@@ -324,7 +367,7 @@ public class SecureViewerDialog extends JDialog {
@Override
public void windowClosing(WindowEvent e) {
- log.trace("[" + Thread.currentThread().getName() + "] closing secure viewer");
+ log.trace("[{}] closing secure viewer.", Thread.currentThread().getName());
setVisible(false);
if (closeListener != null) {
closeListener.actionPerformed(new ActionEvent(e.getSource(), e.getID(), closeCommand));
@@ -342,7 +385,7 @@ public class SecureViewerDialog extends JDialog {
@Override
public void actionPerformed(ActionEvent e) {
- log.trace("[" + Thread.currentThread().getName() + "] closing secure viewer");
+ log.trace("[{}] closing secure viewer.", Thread.currentThread().getName());
setVisible(false);
if (closeListener != null) {
closeListener.actionPerformed(e);
@@ -354,8 +397,8 @@ public class SecureViewerDialog extends JDialog {
@Override
public void actionPerformed(ActionEvent e) {
- log.trace("[" + Thread.currentThread().getName() + "] display secure viewer save dialog");
- SecureViewerSaveDialog.showSaveDialog(content, messages, null, null);
+ log.trace("[{}] display secure viewer save dialog.", Thread.currentThread().getName());
+ SecureViewerSaveDialog.showSaveDialog(content, messages, null, null, closeButton.getFont().getSize());
}
}
}
diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/SwitchFocusFocusListener.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/SwitchFocusFocusListener.java
index 06e37a89..66679291 100644
--- a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/SwitchFocusFocusListener.java
+++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/SwitchFocusFocusListener.java
@@ -1,38 +1,44 @@
-package at.gv.egiz.bku.gui;
-
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.FocusAdapter;
-import java.awt.event.FocusEvent;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- *
- * @author Thomas Zefferer <thomas.zefferer@iaik.tugraz.at>
- */
-public class SwitchFocusFocusListener extends FocusAdapter {
-
- protected static final Log log = LogFactory.getLog(SwitchFocusFocusListener.class);
-
- protected ActionListener swichFocusListener;
-
- public SwitchFocusFocusListener(ActionListener externalSwitchFocusListener) {
- super();
- this.swichFocusListener = externalSwitchFocusListener;
- }
-
- public ActionListener getActionListener() {
- return swichFocusListener;
- }
-
- @Override
- public void focusGained(FocusEvent arg0) {
-
- ActionEvent e = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, null);
- swichFocusListener.actionPerformed(e);
- }
-
-
-}
+package at.gv.egiz.bku.gui;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.FocusAdapter;
+import java.awt.event.FocusEvent;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ * @author Thomas Zefferer <thomas.zefferer@iaik.tugraz.at>
+ */
+public class SwitchFocusFocusListener extends FocusAdapter {
+
+ private final Logger log = LoggerFactory.getLogger(SwitchFocusFocusListener.class);
+
+ protected ActionListener swichFocusListener;
+
+ public SwitchFocusFocusListener(ActionListener externalSwitchFocusListener) {
+ super();
+ this.swichFocusListener = externalSwitchFocusListener;
+ }
+
+ public ActionListener getActionListener() {
+ return swichFocusListener;
+ }
+
+ @Override
+ public void focusGained(FocusEvent arg0) {
+
+ log.debug("SwitchFocusFocusListener detected focusGained event!");
+ Component comp = arg0.getComponent();
+ log.debug("Component that caused event: {}.", comp.getName());
+ comp.transferFocus();
+
+ ActionEvent e = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, null);
+ swichFocusListener.actionPerformed(e);
+ }
+
+
+}
diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/SwitchFocusListener.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/SwitchFocusListener.java
index 48b641e2..171d24b8 100644
--- a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/SwitchFocusListener.java
+++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/SwitchFocusListener.java
@@ -1,44 +1,54 @@
-package at.gv.egiz.bku.gui;
-
-import java.applet.AppletContext;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- *
- * @author Thomas Zefferer <thomas.zefferer@iaik.tugraz.at>
- */
-public class SwitchFocusListener implements ActionListener {
-
- protected final static Log log = LogFactory.getLog(SwitchFocusListener.class);
-
- protected AppletContext ctx;
- protected String javascriptFunction;
-
- public SwitchFocusListener(AppletContext ctx, String javascriptFunction) {
-
- this.ctx = ctx;
- this.javascriptFunction = javascriptFunction;
- }
-
- @Override
- public void actionPerformed(ActionEvent e) {
-
- try {
- ctx.showDocument
- (new URL("javascript:" + javascriptFunction));
- }
- catch (MalformedURLException me) {
-
- log.warn("Unable to call external javascript function.", me);
- }
-
-
- }
-
-}
+package at.gv.egiz.bku.gui;
+
+import java.applet.AppletContext;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ * @author Thomas Zefferer <thomas.zefferer@iaik.tugraz.at>
+ */
+public class SwitchFocusListener implements ActionListener {
+
+ private final Logger log = LoggerFactory.getLogger(SwitchFocusListener.class);
+
+ protected String functionName;
+ protected AppletContext ctx;
+ protected String javascriptFunction;
+
+ public SwitchFocusListener(AppletContext ctx, String javascriptFunctionName) {
+
+ this.ctx = ctx;
+ this.functionName = javascriptFunctionName;
+ buildJSFunction();
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+
+ log.debug("SwitchFocusListener fires!");
+
+ try {
+ ctx.showDocument
+ (new URL("javascript:" + javascriptFunction));
+ }
+ catch (MalformedURLException me) {
+
+ log.warn("Unable to call external javascript function.", me);
+ }
+
+
+ }
+
+ protected void buildJSFunction() {
+
+ this.javascriptFunction = functionName + "()";
+
+ }
+
+}
diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/ViewerHelpListener.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/ViewerHelpListener.java
new file mode 100644
index 00000000..4860756d
--- /dev/null
+++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/ViewerHelpListener.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2008 Federal Chancellery Austria and
+ * Graz University of Technology
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package at.gv.egiz.bku.gui;
+
+import java.applet.AppletContext;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseEvent;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Locale;
+import javax.swing.SwingUtilities;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ViewerHelpListener extends HelpListener {
+
+ private final Logger log = LoggerFactory.getLogger(ViewerHelpListener.class);
+
+ protected AppletContext appletCtx;
+
+ public ViewerHelpListener(String helpURL, Locale locale) {
+ super(helpURL, locale);
+ }
+
+ public ViewerHelpListener(AppletContext ctx, String helpURL, Locale locale) {
+ super(helpURL, locale);
+ this.appletCtx = ctx;
+ }
+
+ protected void displayHelpViewer(final String helpURL) {
+ log.debug("Schedule help viewer.");
+
+ SwingUtilities.invokeLater(new Runnable() {
+
+ @Override
+ public void run() {
+
+ log.debug("Show help viewer for {}.", helpURL);
+ try {
+ HelpViewer.showHelpDialog(appletCtx, new URL(helpURL), messageBundle);
+ } catch (MalformedURLException ex) {
+ log.error("Failed to construct help context URL.", ex);
+ }
+ }
+ });
+ }
+
+ @Override
+ public boolean implementsListener() {
+ return true;
+ }
+
+ @Override
+ public void mouseClicked(MouseEvent arg0) {
+ displayHelpViewer(getHelpURL());
+ }
+
+ @Override
+ public void keyPressed(KeyEvent arg0) {
+ displayHelpViewer(getHelpURL());
+ }
+
+ @Override
+ public void mousePressed(MouseEvent e) {
+ }
+
+ @Override
+ public void mouseReleased(MouseEvent e) {
+ }
+
+ @Override
+ public void mouseEntered(MouseEvent e) {
+ }
+
+ @Override
+ public void mouseExited(MouseEvent e) {
+ }
+
+ @Override
+ public void keyTyped(KeyEvent e) {
+ }
+
+ @Override
+ public void keyReleased(KeyEvent e) {
+ }
+}
diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/WindowCloseAdapter.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/WindowCloseAdapter.java
new file mode 100644
index 00000000..ad798aed
--- /dev/null
+++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/WindowCloseAdapter.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2008 Federal Chancellery Austria and
+ * Graz University of Technology
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package at.gv.egiz.bku.gui;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at>
+ */
+public class WindowCloseAdapter extends WindowAdapter {
+
+ private final Logger log = LoggerFactory.getLogger(WindowCloseAdapter.class);
+
+ protected ActionListener closeListener;
+ protected String closeCommand;
+
+ void registerListener(ActionListener closeListener, String closeCommand) {
+ log.debug("Register close listener for action command {}.", closeCommand);
+ this.closeListener = closeListener;
+ this.closeCommand = closeCommand;
+ }
+
+ @Override
+ public void windowClosing(WindowEvent e) {
+ log.debug("Received window closing event: {}.", e.paramString());
+
+ if (closeListener != null) {
+ log.debug("Notifying closeListener ...");
+ closeListener.actionPerformed(new ActionEvent(e.getSource(), e.getID(), closeCommand));
+ }
+ }
+
+
+}
diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/html/RestrictedHTMLEditorKit.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/html/RestrictedHTMLEditorKit.java
index 680bf1a4..2ae8f87e 100644
--- a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/html/RestrictedHTMLEditorKit.java
+++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/html/RestrictedHTMLEditorKit.java
@@ -29,7 +29,8 @@ import javax.swing.text.html.HTMLEditorKit;
*/
public class RestrictedHTMLEditorKit extends HTMLEditorKit {
-
+ private static final long serialVersionUID = 1L;
+
public static class RestrictedHTMLFactory extends HTMLFactory {
@Override
diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/viewer/FontProviderException.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/viewer/FontProviderException.java
index 5a6a277e..ee9b05de 100644
--- a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/viewer/FontProviderException.java
+++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/viewer/FontProviderException.java
@@ -23,6 +23,8 @@ package at.gv.egiz.bku.gui.viewer;
*/
public class FontProviderException extends Exception {
+ private static final long serialVersionUID = 1L;
+
public FontProviderException(String msg, Throwable cause) {
super(msg, cause);
}
diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/viewer/SecureViewerSaveDialog.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/viewer/SecureViewerSaveDialog.java
index 3303d4ef..335a8599 100644
--- a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/viewer/SecureViewerSaveDialog.java
+++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/viewer/SecureViewerSaveDialog.java
@@ -1,5 +1,8 @@
package at.gv.egiz.bku.gui.viewer;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedOutputStream;
@@ -8,39 +11,51 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.MessageFormat;
-import java.util.Locale;
import java.util.ResourceBundle;
import javax.swing.JFileChooser;
+import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import at.gv.egiz.bku.gui.BKUGUIFacade;
import at.gv.egiz.stal.HashDataInput;
public class SecureViewerSaveDialog {
- protected static final Log log = LogFactory.getLog(SecureViewerSaveDialog.class);
-
+ private static void setFileChooserFont(Component[] comp, Font font) {
+ for (int i = 0; i < comp.length; i++) {
+ if (comp[i] instanceof Container)
+ setFileChooserFont(((Container) comp[i]).getComponents(), font);
+ try {
+ comp[i].setFont(font);
+ } catch (Exception e) {
+ Logger log = LoggerFactory.getLogger(SecureViewerSaveDialog.class);
+ log.warn("FileChooser component font could not be set");
+ }
+ }
+ }
+
public static void showSaveDialog(final HashDataInput hashDataInput, final ResourceBundle messages,
- final ActionListener okListener, final String okCommand) {
-
- log.debug("[" + Thread.currentThread().getName()
- + "] scheduling save dialog");
+ final ActionListener okListener, final String okCommand, final int fontSize) {
+
+ final Logger log = LoggerFactory.getLogger(SecureViewerSaveDialog.class);
+ log.debug("[{}] Scheduling save dialog.", Thread.currentThread().getName());
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
- log
- .debug("[" + Thread.currentThread().getName()
- + "] show save dialog");
+ log.debug("[{}] Show save dialog.", Thread.currentThread().getName());
String userHome = System.getProperty("user.home");
+
+ UIManager.put("Button.defaultButtonFollowsFocus", Boolean.TRUE);
JFileChooser fileDialog = new JFileChooser(userHome);
fileDialog.setMultiSelectionEnabled(false);
@@ -58,6 +73,9 @@ public class SecureViewerSaveDialog {
+ MimeFilter.getExtension(mimeType);
fileDialog.setSelectedFile(new File(userHome, filename));
+ setFileChooserFont(fileDialog.getComponents(), new JLabel()
+ .getFont().deriveFont((float) fontSize));
+
// parent contentPane -> placed over applet
switch (fileDialog.showSaveDialog(fileDialog)) {
case JFileChooser.APPROVE_OPTION:
@@ -75,8 +93,8 @@ public class SecureViewerSaveDialog {
}
}
if (log.isDebugEnabled()) {
- log.debug("writing hashdata input " + id + " (" + mimeType
- + ") to file " + file);
+ Object[] args = {id, mimeType, file};
+ log.debug("Writing hashdata input {} ({}) to file {}.", args);
}
FileOutputStream fos = null;
try {
@@ -90,8 +108,7 @@ public class SecureViewerSaveDialog {
bos.flush();
bos.close();
} catch (IOException ex) {
- log.error("Failed to write " + file + ": " + ex.getMessage());
- log.debug(ex);
+ log.error("Failed to write.", ex);
String errPattern = messages
.getString(BKUGUIFacade.ERR_WRITE_HASHDATA);
JOptionPane.showMessageDialog(fileDialog, MessageFormat.format(
@@ -108,7 +125,7 @@ public class SecureViewerSaveDialog {
}
break;
case JFileChooser.CANCEL_OPTION:
- log.debug("cancelled save dialog");
+ log.debug("Cancelled save dialog.");
break;
}
if (okListener != null) {
diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/stal/impl/ByteArrayHashDataInput.java b/BKUCommonGUI/src/main/java/at/gv/egiz/stal/impl/ByteArrayHashDataInput.java
index b9416845..7f76619f 100644
--- a/BKUCommonGUI/src/main/java/at/gv/egiz/stal/impl/ByteArrayHashDataInput.java
+++ b/BKUCommonGUI/src/main/java/at/gv/egiz/stal/impl/ByteArrayHashDataInput.java
@@ -21,8 +21,8 @@ import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
*
@@ -30,7 +30,7 @@ import org.apache.commons.logging.LogFactory;
*/
public class ByteArrayHashDataInput implements HashDataInput {
- private static final Log log = LogFactory.getLog(ByteArrayHashDataInput.class);
+ private final Logger log = LoggerFactory.getLogger(ByteArrayHashDataInput.class);
protected byte[] hashData;
protected String id;
@@ -66,7 +66,7 @@ public class ByteArrayHashDataInput implements HashDataInput {
}
this.hashData = baos.toByteArray();
} catch (IOException ex) {
- log.error("Failed to cache provided HashDataInput: " + ex.getMessage(), ex);
+ log.error("Failed to cache provided HashDataInput: {}.", ex.getMessage(), ex);
this.hashData = new byte[0];
}
this.id = hdi.getReferenceId();
diff --git a/BKUCommonGUI/src/main/resources/at/gv/egiz/bku/gui/Messages.properties b/BKUCommonGUI/src/main/resources/at/gv/egiz/bku/gui/Messages.properties
index c09433de..ac8b2777 100644
--- a/BKUCommonGUI/src/main/resources/at/gv/egiz/bku/gui/Messages.properties
+++ b/BKUCommonGUI/src/main/resources/at/gv/egiz/bku/gui/Messages.properties
@@ -49,7 +49,7 @@ hashdatalink.tiny.focus=<html><a href=\"anzeige\">[Signaturdaten]</a></html>
#verwenden sie bitte die von ihrem System zur Verf\u00FCgung gestellte {0} Anwendung.
hashdatalist=<html>{0} Signaturdaten:</html>
hashdata.viewer=<html>Signaturdaten werden im Betrachter angezeigt
-unsupported.mimetype=<html>Signaturdaten k\u00F6nnen nicht angezeigt werden
+unsupported.mimetype=<html>Signaturdaten speichern und mit einem geeigneten {0} Betrachter \u00F6ffnen.
retries.last=<html>Letzter Versuch!</html>
retries=<html>Noch {0} Versuche</html>
retries.pinpad.last=<html>Eingabe wiederholen, letzter Versuch!</html>
@@ -76,6 +76,7 @@ mimetype.desc.doc=Microsoft Word-Dateien (.doc)
mimetype.desc.unknown=Alle Dateien (.*)
save.hashdatainput.prefix=Signaturdaten
alt.help=Hilfe
+dialog.sigpin.infolabel.sigdata.tooltiptext=Signaturdaten in neuem Fenster anzeigen
# Error Messages
error.no.hashdata=<html>Keine Signaturdaten verf\u00FCgbar: {0}</html>
diff --git a/BKUCommonGUI/src/main/resources/at/gv/egiz/bku/gui/Messages_en.properties b/BKUCommonGUI/src/main/resources/at/gv/egiz/bku/gui/Messages_en.properties
index 4d86d21b..6381bdf9 100644
--- a/BKUCommonGUI/src/main/resources/at/gv/egiz/bku/gui/Messages_en.properties
+++ b/BKUCommonGUI/src/main/resources/at/gv/egiz/bku/gui/Messages_en.properties
@@ -47,7 +47,7 @@ hashdatalink.tiny.focus=<html><a href=\"anzeige\">[signature data]</a></html>
#message.hashdata=<html>Remark: This is a preview of the data to-be signed. For standards compliant display see help.</html>
hashdatalist=<html>{0} signature data objects:</html>
hashdata.viewer=<html>Signature data is being displayed in viewer
-unsupported.mimetype=<html>Signature data cannot be displayed
+unsupported.mimetype=<html>Save and open signature data with appropriate {0} viewer.
retries.last=<html>Last try!</html>
retries=<html>{0} tries left</html>
retries.pinpad.last=<html>Re-enter pin, last try!</html>
@@ -74,6 +74,8 @@ mimetype.desc.doc=Microsoft Word-files (.doc)
mimetype.desc.unknown=All files (.*)
save.hashdatainput.prefix=signaturedata
alt.help=help
+dialog.sigpin.infolabel.sigdata.tooltiptext=Show signature data in new window
+
# Error Messages
error.no.hashdata=<html>No signature data available: {0}</html>
diff --git a/BKUCommonGUI/src/test/java/at/gv/egiz/bku/gui/BKUGUIWorker.java b/BKUCommonGUI/src/test/java/at/gv/egiz/bku/gui/BKUGUIWorker.java
index a2a84d6e..373ecaad 100644
--- a/BKUCommonGUI/src/test/java/at/gv/egiz/bku/gui/BKUGUIWorker.java
+++ b/BKUCommonGUI/src/test/java/at/gv/egiz/bku/gui/BKUGUIWorker.java
@@ -20,14 +20,11 @@
*/
package at.gv.egiz.bku.gui;
-import at.gv.egiz.smcc.PINSpec;
-import at.gv.egiz.smcc.STARCOSCard;
+import at.gv.egiz.smcc.PinInfo;
import at.gv.egiz.stal.HashDataInput;
import at.gv.egiz.stal.impl.ByteArrayHashDataInput;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
@@ -47,8 +44,8 @@ public class BKUGUIWorker implements Runnable {
public void run() {
try {
- final PINSpec signPinSpec = new PINSpec(6, 10, "[0-9]", "Test-PIN", (byte) 0x81, null);
- final PINSpec cardPinSpec = new PINSpec(4, 4, "[0-9]", "Test-PIN", (byte) 0x01, null);
+ final PinInfo signPinSpec = new SimplePinInfo(6, 10, "[0-9]", "Test-PIN", (byte) 0x81, null, PinInfo.UNKNOWN_RETRIES);
+ final PinInfo cardPinSpec = new SimplePinInfo(4, 4, "[0-9]", "Test-PIN", (byte) 0x01, null, PinInfo.UNKNOWN_RETRIES);
final ActionListener cancelListener = new ActionListener() {
diff --git a/BKUCommonGUI/src/test/java/at/gv/egiz/bku/gui/DummyFontLoader.java b/BKUCommonGUI/src/test/java/at/gv/egiz/bku/gui/DummyFontLoader.java
index 505c4247..26fc1a5e 100644
--- a/BKUCommonGUI/src/test/java/at/gv/egiz/bku/gui/DummyFontLoader.java
+++ b/BKUCommonGUI/src/test/java/at/gv/egiz/bku/gui/DummyFontLoader.java
@@ -21,8 +21,8 @@ import at.gv.egiz.bku.gui.viewer.FontProviderException;
import at.gv.egiz.bku.gui.viewer.FontProvider;
import java.awt.Font;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
*
@@ -30,11 +30,11 @@ import org.apache.commons.logging.LogFactory;
*/
public class DummyFontLoader implements FontProvider {
- protected final static Log log = LogFactory.getLog(DummyFontLoader.class);
+ private final Logger log = LoggerFactory.getLogger(DummyFontLoader.class);
@Override
public Font getFont() throws FontProviderException {
- log.debug("return font");
+ log.debug("Return font.");
return new Font("monospaced", Font.PLAIN, 10);
}
diff --git a/BKUCommonGUI/src/test/java/at/gv/egiz/bku/gui/SecureViewerDialogTest.java b/BKUCommonGUI/src/test/java/at/gv/egiz/bku/gui/SecureViewerDialogTest.java
index 9bbc1b1a..64f7e744 100644
--- a/BKUCommonGUI/src/test/java/at/gv/egiz/bku/gui/SecureViewerDialogTest.java
+++ b/BKUCommonGUI/src/test/java/at/gv/egiz/bku/gui/SecureViewerDialogTest.java
@@ -7,8 +7,6 @@ package at.gv.egiz.bku.gui;
import at.gv.egiz.stal.impl.ByteArrayHashDataInput;
import java.awt.Font;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@@ -35,7 +33,7 @@ public class SecureViewerDialogTest {
@BeforeClass
public static void setUpClass() throws Exception {
messages = ResourceBundle.getBundle("at/gv/egiz/bku/gui/Messages");
- secureViewer = new SecureViewerDialog(null, messages,null, null, new DummyFontLoader(), null);
+ secureViewer = new SecureViewerDialog(null, messages,null, null, new DummyFontLoader(), new DeafHelpListener("../help", messages.getLocale()), 1f);
}
@AfterClass
diff --git a/BKUCommonGUI/src/test/java/at/gv/egiz/bku/gui/SimplePinInfo.java b/BKUCommonGUI/src/test/java/at/gv/egiz/bku/gui/SimplePinInfo.java
new file mode 100644
index 00000000..3e583118
--- /dev/null
+++ b/BKUCommonGUI/src/test/java/at/gv/egiz/bku/gui/SimplePinInfo.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2008 Federal Chancellery Austria and
+ * Graz University of Technology
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package at.gv.egiz.bku.gui;
+
+import at.gv.egiz.smcc.PinInfo;
+import java.util.Locale;
+
+/**
+ *
+ * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at>
+ */
+public class SimplePinInfo extends PinInfo {
+
+ String name;
+
+ public SimplePinInfo(int minLength, int maxLength, String rexepPattern, String name, byte kid, byte[] contextAID, int maxRetries) {
+ super(minLength, maxLength, rexepPattern, null, null, kid, contextAID, maxRetries);
+ this.name = name;
+ }
+
+ @Override
+ public String getLocalizedName() {
+ return name;
+ }
+
+ @Override
+ public String getLocalizedName(Locale locale) {
+ return name;
+ }
+
+}
diff --git a/BKUCommonGUI/src/test/resources/commons-logging.properties b/BKUCommonGUI/src/test/resources/commons-logging.properties
deleted file mode 100644
index 29292562..00000000
--- a/BKUCommonGUI/src/test/resources/commons-logging.properties
+++ /dev/null
@@ -1 +0,0 @@
-org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger