diff options
| author | clemenso <clemenso@8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4> | 2008-10-09 07:54:29 +0000 | 
|---|---|---|
| committer | clemenso <clemenso@8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4> | 2008-10-09 07:54:29 +0000 | 
| commit | a8d050168ad30c59087d9b8f7b399f0ffbb671d8 (patch) | |
| tree | e564d2bb64751d54ccdad5c8d5cb5b97e2b03b49 | |
| parent | d7a3b8fdb62c881afb87838f2bb03b4c4b58e16d (diff) | |
| download | mocca-a8d050168ad30c59087d9b8f7b399f0ffbb671d8.tar.gz mocca-a8d050168ad30c59087d9b8f7b399f0ffbb671d8.tar.bz2 mocca-a8d050168ad30c59087d9b8f7b399f0ffbb671d8.zip | |
SimpleGUI (one button)
git-svn-id: https://joinup.ec.europa.eu/svn/mocca/trunk@88 8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4
5 files changed, 1471 insertions, 20 deletions
| diff --git a/BKUApplet/src/test/resources/appletTest.html b/BKUApplet/src/test/resources/appletTest.html index 3b944a40..5b10d6b5 100644 --- a/BKUApplet/src/test/resources/appletTest.html +++ b/BKUApplet/src/test/resources/appletTest.html @@ -19,7 +19,7 @@      <center>        <applet code="at.gv.egiz.bku.online.applet.BKUApplet.class"                archive="../BKUApplet-1.0-SNAPSHOT.jar, ../test-libs/commons-logging-1.1.1.jar , ../test-libs/iaik_jce_me4se-3.04.jar" -              width=210 height=160> +              width=190 height=130>                <param name="WSDL_URL" value="http://localhost:3495/BKUOnline-1.0-SNAPSHOT/stal?wsdl"/>                <param name="SessionId" value="TestSession"/>                <param name="redirectURL" value="http://localhost:3495/BKUOnline-1.0-SNAPSHOT/bkuResult"/> diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUI.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUI.java index 24cc2601..636a9fef 100644 --- a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUI.java +++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUI.java @@ -429,7 +429,7 @@ public class BKUGUI implements BKUGUIFacade {                  JLabel insertCardMsgLabel = new JLabel();                  insertCardMsgLabel.setFont(insertCardMsgLabel.getFont().deriveFont(insertCardMsgLabel.getFont().getStyle() & ~java.awt.Font.BOLD)); -                insertCardMsgLabel.setText(messages.getString(MESSAGE_INSERTCARD)); +                insertCardMsgLabel.setText(messages.getString(TITLE_CARD_NOT_SUPPORTED)); //MESSAGE_INSERTCARD));                  GroupLayout mainPanelLayout = new GroupLayout(mainPanel);                  mainPanel.setLayout(mainPanelLayout); diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUIFactory.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUIFactory.java index 478b949b..5124914a 100644 --- a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUIFactory.java +++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/BKUGUIFactory.java @@ -14,19 +14,19 @@  * See the License for the specific language governing permissions and  * limitations under the License.  */ -package at.gv.egiz.bku.gui;
 -
 -public class BKUGUIFactory {
 -  private static BKUGUIFactory instance = new BKUGUIFactory();
 -
 -  private BKUGUIFactory() {
 -  }
 -
 -  protected BKUGUIFacade createNewGUI() {
 -    return new BKUGUI();
 -  }
 -
 -  public static BKUGUIFacade createGUI() {
 -    return instance.createNewGUI();
 -  }
 -}
 +package at.gv.egiz.bku.gui; + +public class BKUGUIFactory { +  private static BKUGUIFactory instance = new BKUGUIFactory(); + +  private BKUGUIFactory() { +  } + +  protected BKUGUIFacade createNewGUI() { +    return new SimpleGUI(); +  } + +  public static BKUGUIFacade createGUI() { +    return instance.createNewGUI(); +  } +} diff --git a/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/SimpleGUI.java b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/SimpleGUI.java new file mode 100644 index 00000000..b7d86d05 --- /dev/null +++ b/BKUCommonGUI/src/main/java/at/gv/egiz/bku/gui/SimpleGUI.java @@ -0,0 +1,1451 @@ +/* + * 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. + */ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package at.gv.egiz.bku.gui; + +import at.gv.egiz.smcc.PINSpec; +import at.gv.egiz.stal.HashDataInput; +import java.awt.Color; +import java.awt.Container; +import java.awt.Cursor; +import java.awt.Font; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.io.BufferedOutputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.text.MessageFormat; +import java.util.List; +import java.util.Locale; +import java.util.ResourceBundle; +import javax.swing.GroupLayout; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JFileChooser; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.JTextArea; +import javax.swing.LayoutStyle; +import javax.swing.SwingUtilities; +import javax.swing.table.TableColumn; +import javax.swing.table.TableModel; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * + * @author clemens + */ +public class SimpleGUI implements BKUGUIFacade { +     +    private static final Log log = LogFactory.getLog(SimpleGUI.class); +    public static final String MESSAGES_BUNDLE = "at/gv/egiz/bku/gui/Messages"; +    public static final String LOGO_RESOURCE = "/images/logo.png"; +    public static final String HASHDATA_FONT = "Monospaced"; +    public static final Color ERROR_COLOR = Color.RED; +    public static final Color HYPERLINK_COLOR = Color.BLUE; +    private static final String TITLE_WELCOME = "title.welcome"; +    private static final String TITLE_INSERTCARD = "title.insertcard"; +    private static final String TITLE_CARD_NOT_SUPPORTED = "title.cardnotsupported"; +    private static final String TITLE_CARDPIN = "title.cardpin"; +    private static final String TITLE_SIGN = "title.sign"; +    private static final String TITLE_ERROR = "title.error"; +    private static final String TITLE_RETRY = "title.retry"; +    private static final String TITLE_WAIT = "title.wait"; +    private static final String TITLE_HASHDATA = "title.hashdata"; +    private static final String WINDOWTITLE_SAVE = "windowtitle.save"; +    private static final String WINDOWTITLE_SAVEDIR = "windowtitle.savedir"; +    private static final String WINDOWTITLE_OVERWRITE = "windowtitle.overwrite"; +    private static final String MESSAGE_WAIT = "message.wait"; +    private static final String MESSAGE_INSERTCARD = "message.insertcard"; +    private static final String MESSAGE_HASHDATALINK = "message.hashdatalink"; +    private static final String MESSAGE_HASHDATA = "message.hashdata"; +    private static final String MESSAGE_HASHDATALIST = "message.hashdatalist"; +    private static final String MESSAGE_RETRIES = "message.retries"; +    private static final String MESSAGE_OVERWRITE = "message.overwrite"; +    private static final String LABEL_PIN = "label.pin"; +    private static final String LABEL_PINSIZE = "label.pinsize"; +//    private static final String ERROR_NO_HASHDATA = "error.no.hashdata"; +     +    private static final String BUTTON_OK = "button.ok"; +    private static final String BUTTON_CANCEL = "button.cancel"; +    private static final String BUTTON_BACK = "button.back"; +    private static final String BUTTON_SIGN = "button.sign"; +    private static final String BUTTON_SAVE = "button.save"; +    private static final String SAVE_HASHDATAINPUT_PREFIX = "save.hashdatainput.prefix"; +    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; +    /** remember the pinfield to return to worker */ +    protected JPasswordField pinField; + +//    protected JButton okButton; +//    protected JButton cancelButton; +//    protected JButton signButton; +//    protected JButton saveButton; +//    protected JButton backButton; +    protected int buttonSize; +     +    private static final int CHECKBOX_WIDTH = new JCheckBox().getPreferredSize().width; +     +    /** +     * @param contentPane +     * @param localeString may be null +     */ +    @Override +    public void init(final Container contentPane, String localeString) { + +        if (localeString != null) { +            messages = ResourceBundle.getBundle(MESSAGES_BUNDLE, new Locale(localeString)); +        } else { +            messages = ResourceBundle.getBundle(MESSAGES_BUNDLE); +        } + +        this.contentPane = contentPane; + +        try { + +          log.debug("scheduling gui initialization"); +       +            SwingUtilities.invokeAndWait(new Runnable() { + +                @Override +                public void run() { +                   +                  log.debug("initializing gui"); + +//                    initIconPanel(); +                    initContentPanel(); + +                    GroupLayout layout = new GroupLayout(contentPane); +                    contentPane.setLayout(layout); +                    layout.setHorizontalGroup(layout.createSequentialGroup().addComponent(contentPanel)); +                    layout.setVerticalGroup(layout.createSequentialGroup().addComponent(contentPanel)); +//                    layout.setHorizontalGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) +//                      .addGroup(layout.createSequentialGroup() +//                        .addComponent(iconPanel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +//                        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +//                        .addComponent(contentPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))); +//                    layout.setVerticalGroup(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)); +                } +            }); +        } catch (Exception ex) { +            throw new RuntimeException("Failed to init GUI: " + ex.getMessage()); +        } +    } + +//    protected void initIconPanel() { +//        iconPanel = new JPanel(); +//        JLabel iconLabel = new JLabel(); +//        iconLabel.setIcon(new ImageIcon(getClass().getResource(LOGO_RESOURCE))); // NOI18N +// +//        GroupLayout iconPanelLayout = new GroupLayout(iconPanel); +//        iconPanel.setLayout(iconPanelLayout); +//        iconPanelLayout.setHorizontalGroup( +//          iconPanelLayout.createSequentialGroup() +//                .addContainerGap() +//                .addComponent(iconLabel, GroupLayout.PREFERRED_SIZE, iconLabel.getPreferredSize().width, GroupLayout.PREFERRED_SIZE) +//                .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)); //); +//        iconPanelLayout.setVerticalGroup( +//          iconPanelLayout.createSequentialGroup() +//                .addContainerGap() +//                .addComponent(iconLabel, GroupLayout.PREFERRED_SIZE, iconLabel.getPreferredSize().height, GroupLayout.PREFERRED_SIZE) +//                .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)); //); +//    } + +    protected void initContentPanel() { + +        contentPanel = new JPanel(); + +//        headerPanel = new JPanel(); +        mainPanel = new JPanel(); +        buttonPanel = new JPanel(); + +//        headerPanel.setBorder(new TitledBorder("header")); +//        mainPanel.setBorder(new TitledBorder("main")); +//        buttonPanel.setBorder(new TitledBorder("button")); + +//        titleLabel = new JLabel(); +//        titleLabel.setFont(titleLabel.getFont().deriveFont(titleLabel.getFont().getStyle() | +//          java.awt.Font.BOLD, titleLabel.getFont().getSize() + 2)); +         +        JButton b = new JButton(); +//        b.setText(messages.getString(BUTTON_CANCEL)); +//        if (b.getPreferredSize().width > buttonSize) +//            buttonSize = b.getPreferredSize().width; +        b.setText(messages.getString(BUTTON_OK)); +        if (b.getPreferredSize().width > buttonSize) +            buttonSize = b.getPreferredSize().width; +        b.setText(messages.getString(BUTTON_SIGN)); +        if (b.getPreferredSize().width > buttonSize) +            buttonSize = b.getPreferredSize().width; +        b.setText(messages.getString(BUTTON_BACK)); +        if (b.getPreferredSize().width > buttonSize) +            buttonSize = b.getPreferredSize().width; +//        b.setText(messages.getString(BUTTON_SAVE)); +//        if (b.getPreferredSize().width > buttonSize) +//            buttonSize = b.getPreferredSize().width; +         +//        if (cancelButton.getPreferredSize().width > buttonSize) +//            buttonSize = cancelButton.getPreferredSize().width; +//        if (signButton.getPreferredSize().width > buttonSize) +//            buttonSize = signButton.getPreferredSize().width; +//        if (backButton.getPreferredSize().width > buttonSize) +//            buttonSize = backButton.getPreferredSize().width; +//        if (saveButton.getPreferredSize().width > buttonSize) +//            buttonSize = saveButton.getPreferredSize().width; + +         +//        GroupLayout headerPanelLayout = new GroupLayout(headerPanel); +//        headerPanel.setLayout(headerPanelLayout); +// +//        headerPanelLayout.setHorizontalGroup( +//          headerPanelLayout.createSequentialGroup() +//            .addComponent(titleLabel, 0, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE) +//            .addContainerGap()); +//        headerPanelLayout.setVerticalGroup( +//          headerPanelLayout.createSequentialGroup() +//            .addComponent(titleLabel, 0, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE)); + + +        GroupLayout contentPanelLayout = new GroupLayout(contentPanel); +        contentPanel.setLayout(contentPanelLayout); +//        contentPanelLayout.setHorizontalGroup( +//          contentPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +//            .addComponent(headerPanel, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +//            .addComponent(mainPanel, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +//            .addComponent(buttonPanel, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)); //)); +        contentPanelLayout.setHorizontalGroup( +          contentPanelLayout.createSequentialGroup() +            .addContainerGap() +            .addGroup( +              contentPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                .addComponent(mainPanel, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +                .addComponent(buttonPanel, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) +            .addContainerGap()); +        contentPanelLayout.setVerticalGroup( +          contentPanelLayout.createSequentialGroup() +            .addContainerGap() +//            .addComponent(headerPanel, 0, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +//            .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +            .addComponent(mainPanel, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)  +            .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED) //, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +            .addComponent(buttonPanel, 0, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +            .addContainerGap()); //); +    } + +    @Override +    public void showLoginDialog(ActionListener loginListener, String actionCommand) { +       +      log.debug("scheduling login dialog"); +         +      SwingUtilities.invokeLater(new Runnable() { + +            @Override +            public void run() { +               +              log.debug("show login dialog"); +               +                mainPanel.removeAll(); +                buttonPanel.removeAll(); + +//                titleLabel.setText(messages.getString(TITLE_ERROR)); + +                JLabel waitMsgLabel = new JLabel(); +                waitMsgLabel.setFont(waitMsgLabel.getFont().deriveFont(waitMsgLabel.getFont().getStyle() & ~java.awt.Font.BOLD)); +                waitMsgLabel.setText("<html>LoginDialog not supported yet.</html>"); +                waitMsgLabel.setForeground(ERROR_COLOR); + +                GroupLayout mainPanelLayout = new GroupLayout(mainPanel); +                mainPanel.setLayout(mainPanelLayout); + +                mainPanelLayout.setHorizontalGroup( +                  mainPanelLayout.createSequentialGroup() +//                  mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                  .addComponent(waitMsgLabel)); +                mainPanelLayout.setVerticalGroup( +                  mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                  .addComponent(waitMsgLabel)); + +                contentPanel.validate(); +            } +        }); +    } + +    @Override +    public void showWelcomeDialog() { +       +      log.debug("scheduling welcome dialog"); +       +        SwingUtilities.invokeLater(new Runnable() { + +            @Override +            public void run() { +               +              log.debug("show welcome dialog"); +               +                mainPanel.removeAll(); +                buttonPanel.removeAll(); + +//                titleLabel.setText(messages.getString(TITLE_WELCOME)); + +                JLabel welcomeMsgLabel = new JLabel(); +                welcomeMsgLabel.setFont(welcomeMsgLabel.getFont().deriveFont(welcomeMsgLabel.getFont().getStyle() & ~java.awt.Font.BOLD)); +                welcomeMsgLabel.setText(messages.getString(TITLE_WELCOME)); //MESSAGE_WAIT)); + +                GroupLayout mainPanelLayout = new GroupLayout(mainPanel); +                mainPanel.setLayout(mainPanelLayout); + +                mainPanelLayout.setHorizontalGroup( +                  mainPanelLayout.createSequentialGroup() +//                  mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                  .addComponent(welcomeMsgLabel)); +                mainPanelLayout.setVerticalGroup( +                  mainPanelLayout.createSequentialGroup() +//                  mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                  .addComponent(welcomeMsgLabel)); + +                contentPanel.validate(); + +            } +        }); +    } + +    @Override +    public void showInsertCardDialog(final ActionListener cancelListener, final String cancelCommand) { +       +      log.debug("scheduling insert card dialog"); +       +      SwingUtilities.invokeLater(new Runnable() { + +            @Override +            public void run() { +               +              log.debug("show insert card dialog"); +       +                mainPanel.removeAll(); +                buttonPanel.removeAll(); + +//                titleLabel.setText(messages.getString(TITLE_INSERTCARD)); + +                JLabel insertCardMsgLabel = new JLabel(); +                insertCardMsgLabel.setFont(insertCardMsgLabel.getFont().deriveFont(insertCardMsgLabel.getFont().getStyle() & ~java.awt.Font.BOLD)); +                insertCardMsgLabel.setText(messages.getString(MESSAGE_INSERTCARD)); + +                GroupLayout mainPanelLayout = new GroupLayout(mainPanel); +                mainPanel.setLayout(mainPanelLayout); + +                mainPanelLayout.setHorizontalGroup( +                  mainPanelLayout.createSequentialGroup() +//                  mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                    .addComponent(insertCardMsgLabel)); +                mainPanelLayout.setVerticalGroup( +                  mainPanelLayout.createSequentialGroup() +//                  mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                    .addComponent(insertCardMsgLabel)); +                 +//                JButton cancelButton = new JButton(); +//                cancelButton.setText(messages.getString(BUTTON_CANCEL)); +//                cancelButton.addActionListener(cancelListener); +//                cancelButton.setActionCommand(cancelCommand); +// +//                GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel); +//                buttonPanel.setLayout(buttonPanelLayout); +// +//                buttonPanelLayout.setHorizontalGroup( +//                  buttonPanelLayout.createSequentialGroup() +//                        .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +//                        .addComponent(cancelButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE)); +//                buttonPanelLayout.setVerticalGroup( +//                  buttonPanelLayout.createSequentialGroup() +//                    .addComponent(cancelButton)); + +                contentPanel.validate(); +            } +        }); +    } + +    /** +     * only difference to showInsertCard: title text: card not supported +     * @param cancelListener +     * @param cancelCommand +     */ +    @Override +    public void showCardNotSupportedDialog(final ActionListener cancelListener, final String cancelCommand) { +         +      log.debug("scheduling card not supported dialog"); +       +      SwingUtilities.invokeLater(new Runnable() { + +            @Override +            public void run() { +                 +              log.debug("show card not supported dialog"); +                 +              mainPanel.removeAll(); +              buttonPanel.removeAll(); + +//                titleLabel.setText(messages.getString(TITLE_CARD_NOT_SUPPORTED)); + +                JLabel insertCardMsgLabel = new JLabel(); +                insertCardMsgLabel.setFont(insertCardMsgLabel.getFont().deriveFont(insertCardMsgLabel.getFont().getStyle() & ~java.awt.Font.BOLD)); +                insertCardMsgLabel.setText(messages.getString(TITLE_CARD_NOT_SUPPORTED)); //MESSAGE_INSERTCARD)); + +                GroupLayout mainPanelLayout = new GroupLayout(mainPanel); +                mainPanel.setLayout(mainPanelLayout); + +                mainPanelLayout.setHorizontalGroup( +                  mainPanelLayout.createSequentialGroup() +//                  mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                    .addComponent(insertCardMsgLabel)); +                mainPanelLayout.setVerticalGroup( +                  mainPanelLayout.createSequentialGroup() +//                  mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                    .addComponent(insertCardMsgLabel)); + +//                JButton cancelButton = new JButton(); +//                cancelButton.setText(messages.getString(BUTTON_CANCEL)); +//                cancelButton.addActionListener(cancelListener); +//                cancelButton.setActionCommand(cancelCommand); +// +//                GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel); +//                buttonPanel.setLayout(buttonPanelLayout); +// +//                buttonPanelLayout.setHorizontalGroup( +//                  buttonPanelLayout.createSequentialGroup() +//                        .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +//                        .addComponent(cancelButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE)); +//                buttonPanelLayout.setVerticalGroup( +//                  buttonPanelLayout.createSequentialGroup() +//                    .addComponent(cancelButton)); +                 +                contentPanel.validate(); +            } +        }); +    } + +    private void showCardPINDialog(final PINSpec pinSpec, final int numRetries, final ActionListener okListener, final String okCommand, final ActionListener cancelListener, final String cancelCommand) { +         +      log.debug("scheduling card-pin dialog"); +       +      SwingUtilities.invokeLater(new Runnable() { + +            @Override +            public void run() { + +              log.debug("show card-pin dialog"); +       +                mainPanel.removeAll(); +                buttonPanel.removeAll(); + +//                if (numRetries < 0) { +//                    String cardpinTitle = messages.getString(TITLE_CARDPIN); +//                    titleLabel.setText(MessageFormat.format(cardpinTitle, new Object[]{pinSpec.getLocalizedName()})); +//                } else { +//                    titleLabel.setText(messages.getString(TITLE_RETRY)); +//                } + +//                JButton cancelButton = new JButton(); +//                cancelButton.setText(messages.getString(BUTTON_CANCEL)); +//                cancelButton.setActionCommand(cancelCommand); +//                cancelButton.addActionListener(cancelListener); + +                JButton okButton = new JButton(); +                okButton.setText(messages.getString(BUTTON_OK)); +                okButton.setEnabled(false); +                okButton.setActionCommand(okCommand); +                okButton.addActionListener(okListener); + +                JLabel cardPinLabel = new JLabel(); +                cardPinLabel.setFont(cardPinLabel.getFont().deriveFont(cardPinLabel.getFont().getStyle() | java.awt.Font.BOLD)); +                String pinLabel = messages.getString(LABEL_PIN); +                cardPinLabel.setText(MessageFormat.format(pinLabel, new Object[]{pinSpec.getLocalizedName()})); + +//                JPasswordField cardPINField = new JPasswordField(); +                pinField = new JPasswordField(); +                pinField.setText(""); +                pinField.setDocument(new PINDocument(pinSpec, 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 pinsizePattern = messages.getString(LABEL_PINSIZE); +                    String pinSize = String.valueOf(pinSpec.getMinLength()); +                    if (pinSpec.getMinLength() != pinSpec.getMaxLength()) { +                        pinSize += "-" + pinSpec.getMaxLength(); +                    } +                    infoLabel.setText(MessageFormat.format(pinsizePattern, new Object[]{pinSize})); +                } else { +                    infoLabel.setText(MessageFormat.format(messages.getString(MESSAGE_RETRIES), new Object[]{String.valueOf(numRetries)})); +                    infoLabel.setForeground(ERROR_COLOR); +                } + +//                GroupLayout mainPanelLayout = new GroupLayout(mainPanel); +//                mainPanel.setLayout(mainPanelLayout); +// +//                mainPanelLayout.setHorizontalGroup( +//                  mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +//                  .addGroup(mainPanelLayout.createSequentialGroup() //                  .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +//                  //                  .addComponent(hashDataLabel) +//                  //                  .addGroup(GroupLayout.Alignment.TRAILING, mainPanelLayout.createSequentialGroup() +//                  .addComponent(cardPinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) //RELATED) +//                  .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) //TRAILING) +//                  .addComponent(infoLabel) //, GroupLayout.DEFAULT_SIZE, PREF_SIZE_PINFIELD, Short.MAX_VALUE) +//                  .addComponent(pinField, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE)) //)) +//                  .addContainerGap())); +// +//                mainPanelLayout.setVerticalGroup( +//                  mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(mainPanelLayout.createSequentialGroup().addContainerGap() //                  .addComponent(hashDataLabel).addGap(14, 14, 14) +//                  .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) //, false) +//                  .addComponent(cardPinLabel) //, GroupLayout.PREFERRED_SIZE, 17, GroupLayout.PREFERRED_SIZE) +//                  .addComponent(pinField)) //, GroupLayout.PREFERRED_SIZE, 19, GroupLayout.PREFERRED_SIZE)) +//                  .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED).addComponent(infoLabel).addGap(cardPinLabel.getFont().getSize()))); //10, 10, 10))); +// +//                GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel); +//                buttonPanel.setLayout(buttonPanelLayout); +// +//                buttonPanelLayout.setHorizontalGroup( +//                  buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(GroupLayout.Alignment.TRAILING, buttonPanelLayout.createSequentialGroup().addContainerGap(15, Short.MAX_VALUE).addComponent(okButton).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED).addComponent(cancelButton).addContainerGap())); +//                buttonPanelLayout.setVerticalGroup( +//                  buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(okButton).addComponent(cancelButton))); + +                 +                GroupLayout mainPanelLayout = new GroupLayout(mainPanel); +                mainPanel.setLayout(mainPanelLayout); + +                mainPanelLayout.setHorizontalGroup( +                  mainPanelLayout.createParallelGroup(GroupLayout.Alignment.TRAILING) +                    .addGroup(mainPanelLayout.createSequentialGroup() +                        .addComponent(cardPinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +                        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +//                        .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.TRAILING) +                        .addComponent(pinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) //)) +                    .addComponent(infoLabel)); + +                mainPanelLayout.setVerticalGroup( +                  mainPanelLayout.createSequentialGroup() +//                        .addComponent(hashDataLabel) +//                        .addGap(hashDataLabel.getFont().getSize()) +                        .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) +                            .addComponent(cardPinLabel) +                            .addComponent(pinField)) +                        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                        .addComponent(infoLabel)); +//                        .addGap(signPinLabel.getFont().getSize()));  + +                 +                GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel); +                buttonPanel.setLayout(buttonPanelLayout); + +                buttonPanelLayout.setHorizontalGroup( +                  buttonPanelLayout.createSequentialGroup() +                        .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +                        .addComponent(okButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE)); +                buttonPanelLayout.setVerticalGroup( +                  buttonPanelLayout.createSequentialGroup() +                    .addComponent(okButton)); + +//                GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel); +//                buttonPanel.setLayout(buttonPanelLayout); +// +//                buttonPanelLayout.setHorizontalGroup( +//                  buttonPanelLayout.createSequentialGroup() +//                        .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +//                        .addComponent(okButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE) +//                        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +//                        .addComponent(cancelButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE)); +//                buttonPanelLayout.setVerticalGroup( +//                  buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)  +//                        .addComponent(okButton) +//                        .addComponent(cancelButton));  + +                pinField.requestFocusInWindow(); +                contentPanel.validate(); + +            } +        }); +    } + +    @Override +    public void showCardPINDialog(PINSpec pinSpec, ActionListener okListener, String okCommand, ActionListener cancelListener, String cancelCommand) { +        showCardPINDialog(pinSpec, -1, okListener, okCommand, cancelListener, cancelCommand); +    } + +    @Override +    public void showCardPINRetryDialog(PINSpec pinSpec, int numRetries, ActionListener okListener, String okCommand, ActionListener cancelListener, String cancelCommand) { +        showCardPINDialog(pinSpec, numRetries, okListener, okCommand, cancelListener, cancelCommand); +    } + +    @Override +    public void showSignaturePINDialog(PINSpec pinSpec, ActionListener signListener, String signCommand, ActionListener cancelListener, String cancelCommand, ActionListener hashdataListener, String hashdataCommand) { +        showSignaturePINDialog(pinSpec, -1, signListener, signCommand, cancelListener, cancelCommand, hashdataListener, hashdataCommand); +    } + +    @Override +    public void showSignaturePINRetryDialog(PINSpec pinSpec, int numRetries, ActionListener okListener, String okCommand, ActionListener cancelListener, String cancelCommand, ActionListener hashdataListener, String hashdataCommand) { +        showSignaturePINDialog(pinSpec, numRetries, okListener, okCommand, cancelListener, cancelCommand, hashdataListener, hashdataCommand); +    } + +    private void showSignaturePINDialog(final PINSpec 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("show signature-pin dialog"); +       +                mainPanel.removeAll(); +                buttonPanel.removeAll(); + +//                if (numRetries < 0) { +//                    titleLabel.setText(messages.getString(TITLE_SIGN)); +//                } else { +//                    titleLabel.setText(messages.getString(TITLE_RETRY)); +//                } + +//                JButton cancelButton = new JButton(); +//                cancelButton.setText(messages.getString(BUTTON_CANCEL)); +//                cancelButton.setActionCommand(cancelCommand); +//                cancelButton.addActionListener(cancelListener); + +                JButton signButton = new JButton(); +                signButton.setText(messages.getString(BUTTON_SIGN)); +                signButton.setEnabled(false); +                signButton.setActionCommand(signCommand); +                signButton.addActionListener(signListener); + +                JLabel signPinLabel = new JLabel(); +                signPinLabel.setFont(signPinLabel.getFont().deriveFont(signPinLabel.getFont().getStyle() | java.awt.Font.BOLD)); +                String pinLabel = messages.getString(LABEL_PIN); +                signPinLabel.setText(MessageFormat.format(pinLabel, new Object[]{pinSpec.getLocalizedName()})); + +                pinField = new JPasswordField(); +                pinField.setText(""); +                pinField.setDocument(new PINDocument(pinSpec, signButton)); +                pinField.setActionCommand(signCommand); +                pinField.addActionListener(new ActionListener() { + +                    @Override +                    public void actionPerformed(ActionEvent e) { +                        if (pinField.getPassword().length >= pinSpec.getMinLength()) { +                            signListener.actionPerformed(e); +                        } +                    } +                }); + +                //pinsize or error label +                JLabel infoLabel = new JLabel(); +                infoLabel.setFont(infoLabel.getFont().deriveFont(infoLabel.getFont().getStyle() & ~java.awt.Font.BOLD)); +                if (numRetries < 0) { +                    String pinsizePattern = messages.getString(LABEL_PINSIZE); +                    String pinSize = String.valueOf(pinSpec.getMinLength()); +                    if (pinSpec.getMinLength() != pinSpec.getMaxLength()) { +                        pinSize += "-" + pinSpec.getMaxLength(); +                    } +                    infoLabel.setText(MessageFormat.format(pinsizePattern, new Object[]{pinSize})); +                } else { +                    infoLabel.setText(MessageFormat.format(messages.getString(MESSAGE_RETRIES), new Object[]{String.valueOf(numRetries)})); +                    infoLabel.setForeground(ERROR_COLOR); +                } + +                JLabel hashDataLabel = new JLabel(); +                hashDataLabel.setFont(hashDataLabel.getFont().deriveFont(hashDataLabel.getFont().getStyle() & ~java.awt.Font.BOLD)); +                hashDataLabel.setText(messages.getString(MESSAGE_HASHDATALINK)); +                hashDataLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); +                hashDataLabel.setForeground(HYPERLINK_COLOR); +                hashDataLabel.addMouseListener(new MouseAdapter() { + +                    @Override +                    public void mouseClicked(MouseEvent me) { +                        ActionEvent e = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, hashdataCommand); +                        hashdataListener.actionPerformed(e); +                    } +                }); + +                GroupLayout mainPanelLayout = new GroupLayout(mainPanel); +                mainPanel.setLayout(mainPanelLayout); + +                mainPanelLayout.setHorizontalGroup( +                  mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                      .addComponent(hashDataLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +                      .addGroup(GroupLayout.Alignment.TRAILING, mainPanelLayout.createSequentialGroup() +                          .addComponent(signPinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +                          .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +//                          .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.TRAILING) +                          .addComponent(pinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) +                      .addComponent(infoLabel)); + +                mainPanelLayout.setVerticalGroup( +                  mainPanelLayout.createSequentialGroup() +                        .addComponent(hashDataLabel) +                        .addGap(hashDataLabel.getFont().getSize()) +                        .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) +                            .addComponent(signPinLabel) +                            .addComponent(pinField)) +                        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                        .addComponent(infoLabel)); +//                        .addGap(signPinLabel.getFont().getSize()));  + +                GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel); +                buttonPanel.setLayout(buttonPanelLayout); + +                buttonPanelLayout.setHorizontalGroup( +                  buttonPanelLayout.createSequentialGroup() +                        .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +                        .addComponent(signButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE)); +                buttonPanelLayout.setVerticalGroup( +                  buttonPanelLayout.createSequentialGroup() +                    .addComponent(signButton)); + +//                GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel); +//                buttonPanel.setLayout(buttonPanelLayout); +// +//                buttonPanelLayout.setHorizontalGroup( +//                  buttonPanelLayout.createSequentialGroup() +//                        .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +//                        .addComponent(signButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE) +//                        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +//                        .addComponent(cancelButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE)); +//                buttonPanelLayout.setVerticalGroup( +//                  buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)  +//                        .addComponent(signButton) +//                        .addComponent(cancelButton));  + +                pinField.requestFocusInWindow(); +                contentPanel.validate(); + +            }//            private ParallelGroup createMainGroup(GroupLayout mainPanelLayout, JLabel hashDataLabel, JLabel signPinLabel, JLabel pinSizeLabel, JLabel errorLabel) { +//                ParallelGroup mainGroup = mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING); +//                mainGroup.addComponent(hashDataLabel); +//                if (errorLabel != null) { +//                    mainGroup.addComponent(errorLabel); +//                } +//                mainGroup.addGroup(GroupLayout.Alignment.TRAILING, mainPanelLayout.createSequentialGroup() +//                                                                    .addComponent(signPinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE) +//                                                                    .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +//                                                                    .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.TRAILING) +//                                                                                                .addComponent(pinSizeLabel) +//                                                                                                .addComponent(pinField, GroupLayout.DEFAULT_SIZE, PREF_SIZE_PINFIELD, Short.MAX_VALUE))); +//                return mainGroup; +//            } +//            private GroupLayout.SequentialGroup createVerticalMainGroup(GroupLayout mainPanelLayout, JLabel hashDataLabel, JLabel signPinLabel, JLabel pinSizeLabel, JLabel errorLabel) { +//                GroupLayout.SequentialGroup mainGroup = mainPanelLayout.createSequentialGroup(); +//                mainGroup.addComponent(hashDataLabel) +//                    .addGap(hashDataLabel.getFont().getSize()); //14, 14, 14) +//                     +//                if (errorLabel != null) { +//                    mainGroup.addComponent(errorLabel) +//                      .addGap(errorLabel.getFont().getSize()); +//                } +//                mainGroup.addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE, false) +//                        .addComponent(signPinLabel) //, GroupLayout.PREFERRED_SIZE, 17, GroupLayout.PREFERRED_SIZE) +//                        .addComponent(pinField)) //, GroupLayout.PREFERRED_SIZE, 19, GroupLayout.PREFERRED_SIZE)) +//                    .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +//                    .addComponent(pinSizeLabel) +//                    .addGap(signPinLabel.getFont().getSize()); +//                 +//                return mainGroup; +////                mainPanelLayout.createSequentialGroup() +////                    .addComponent(hashDataLabel) +////                    .addGap(hashDataLabel.getFont().getSize()) //14, 14, 14) +////                    .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE, false) +////                        .addComponent(signPinLabel) //, GroupLayout.PREFERRED_SIZE, 17, GroupLayout.PREFERRED_SIZE) +////                        .addComponent(pinField)) //, GroupLayout.PREFERRED_SIZE, 19, GroupLayout.PREFERRED_SIZE)) +////                    .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +////                    .addComponent(pinSizeLabel) +////                    .addGap(signPinLabel.getFont().getSize()) +////                     +////                     +//            } +        }); +    } + +    @Override +    public void showErrorDialog(final String errorMsgKey, final Object[] errorMsgParams, final ActionListener okListener, final String okCommand) { +         +      log.debug("scheduling error dialog"); +       +      SwingUtilities.invokeLater(new Runnable() { + +          @Override +            public void run() { + +                log.debug("show error dialog"); +                 +                mainPanel.removeAll(); +                buttonPanel.removeAll(); + +//                titleLabel.setText(messages.getString(TITLE_ERROR)); + +                String errorMsgPattern = messages.getString(errorMsgKey); +                String errorMsg = MessageFormat.format(errorMsgPattern, errorMsgParams); +                 +                JLabel errorMsgLabel = new JLabel(); +                errorMsgLabel.setFont(errorMsgLabel.getFont().deriveFont(errorMsgLabel.getFont().getStyle() & ~java.awt.Font.BOLD)); +                errorMsgLabel.setText(errorMsg); +                errorMsgLabel.setForeground(ERROR_COLOR); + +                GroupLayout mainPanelLayout = new GroupLayout(mainPanel); +                mainPanel.setLayout(mainPanelLayout); + +                mainPanelLayout.setHorizontalGroup( +                  mainPanelLayout.createSequentialGroup() +//                  mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                  .addComponent(errorMsgLabel)); +                mainPanelLayout.setVerticalGroup( +                  mainPanelLayout.createSequentialGroup() +//                  mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                  .addComponent(errorMsgLabel)); + +                JButton okButton = new JButton(); +                okButton.setText(messages.getString(BUTTON_OK)); +                okButton.setActionCommand(okCommand); +                okButton.addActionListener(okListener); + +                GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel); +                buttonPanel.setLayout(buttonPanelLayout); + +                buttonPanelLayout.setHorizontalGroup( +                  buttonPanelLayout.createSequentialGroup() +                        .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +                        .addComponent(okButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE)); +                buttonPanelLayout.setVerticalGroup( +                  buttonPanelLayout.createSequentialGroup() +                    .addComponent(okButton)); + +                contentPanel.validate(); +            } +        }); +    } + +    @Override +    public void showErrorDialog(final String errorMsgKey, final Object[] errorMsgParams) { +       +      log.debug("scheduling error  dialog"); +       +      SwingUtilities.invokeLater(new Runnable() { + +        @Override +        public void run() { +           +          log.debug("show error dialog"); +       +          mainPanel.removeAll(); +          buttonPanel.removeAll(); + +//          titleLabel.setText(messages.getString(TITLE_ERROR)); + +          String errorMsgPattern = messages.getString(errorMsgKey); +          String errorMsg = MessageFormat.format(errorMsgPattern, errorMsgParams); + +          JLabel errorMsgLabel = new JLabel(); +          errorMsgLabel.setFont(errorMsgLabel.getFont().deriveFont(errorMsgLabel.getFont().getStyle() & ~java.awt.Font.BOLD)); +          errorMsgLabel.setText(errorMsg); +          errorMsgLabel.setForeground(ERROR_COLOR); + +          GroupLayout mainPanelLayout = new GroupLayout(mainPanel); +          mainPanel.setLayout(mainPanelLayout); + +          mainPanelLayout.setHorizontalGroup( +            mainPanelLayout.createSequentialGroup() +//                  mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +            .addComponent(errorMsgLabel)); +          mainPanelLayout.setVerticalGroup( +            mainPanelLayout.createSequentialGroup() +//            mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +            .addComponent(errorMsgLabel)); + +          contentPanel.validate(); +        } +      }); +    } + +    @Override +    public void showWaitDialog(final String waitMessage) { +         +      log.debug("scheduling wait dialog"); +       +      SwingUtilities.invokeLater(new Runnable() { + +            @Override +            public void run() { +         +              log.debug("show wait dialog"); +               +                mainPanel.removeAll(); +                buttonPanel.removeAll(); + +//                titleLabel.setText(messages.getString(TITLE_WAIT)); + +                JLabel waitMsgLabel = new JLabel(); +                waitMsgLabel.setFont(waitMsgLabel.getFont().deriveFont(waitMsgLabel.getFont().getStyle() & ~java.awt.Font.BOLD)); +                if (waitMessage != null) { +                    waitMsgLabel.setText("<html>" + waitMessage + "</html>"); +                } else { +                    waitMsgLabel.setText(messages.getString(MESSAGE_WAIT)); +                } + +                GroupLayout mainPanelLayout = new GroupLayout(mainPanel); +                mainPanel.setLayout(mainPanelLayout); + +                mainPanelLayout.setHorizontalGroup( +                  mainPanelLayout.createSequentialGroup() +//                  mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                  .addComponent(waitMsgLabel)); +                mainPanelLayout.setVerticalGroup( +                  mainPanelLayout.createSequentialGroup() +//                  mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                  .addComponent(waitMsgLabel)); + +                contentPanel.validate(); +            } +        }); +    } + +    @Override +    public char[] getPin() { +        if (pinField != null) { +            return pinField.getPassword(); +        } +        return null; +    } +     +    @Override +    public void showHashDataInputDialog(final List<HashDataInput> signedReferences, final ActionListener okListener, final String okCommand) { +       +      if (signedReferences == null) { +        showErrorDialog(messages.getString(ERR_NO_HASHDATA), new Object[] {"No SignedReferences provided"}, okListener, okCommand); +      } +       +      if (signedReferences.size() == 1) { + +//          final HashDataInput signedRef = signedReferences.get(0); +           +          if ("text/plain".equals(signedReferences.get(0).getMimeType())) { +             +            ActionListener saveHashDataListener = new ActionListener() { + +                @Override +                public void actionPerformed(ActionEvent e) { +                    showSaveHashDataInputDialog(signedReferences, okListener, okCommand); +                } +            }; +             +            try { +              String hashDataText = getText(signedReferences.get(0)); +              showPlainTextHashDataInputDialog(hashDataText, saveHashDataListener, "save", okListener, okCommand); +            } catch (IOException ex) { +              showErrorDialog(messages.getString(ERR_NO_HASHDATA), new Object[] {ex.getMessage()}, okListener, okCommand); +            } +           +          } else { +            showSaveHashDataInputDialog(signedReferences, okListener, okCommand); +          } +           +      } else { + +        final HashDataTableModel tableModel = new HashDataTableModel(signedReferences); + +        ActionListener saveHashDataListener = new ActionListener() { + +            @Override +            public void actionPerformed(ActionEvent e) { +              showSaveHashDataInputDialog(tableModel.getSelectedHashData(), okListener, okCommand); +            } +        }; +        showMultipleHashDataInputDialog(tableModel, okListener, okCommand, saveHashDataListener, "save"); +      } +    } +     +    private void showPlainTextHashDataInputDialog(final String hashDataText, final ActionListener saveListener, final String saveCommand, final ActionListener cancelListener, final String cancelCommand) { +       +      log.debug("scheduling plaintext hashdatainput dialog"); +       +      SwingUtilities.invokeLater(new Runnable() { + +        @Override +        public void run() { +           +          log.debug("show plaintext hashdatainput dialog"); +       +          mainPanel.removeAll(); +          buttonPanel.removeAll(); + +//          titleLabel.setText(messages.getString(TITLE_HASHDATA)); + +          JLabel refIdLabel = new JLabel(); +          refIdLabel.setFont(refIdLabel.getFont().deriveFont(refIdLabel.getFont().getStyle() & ~java.awt.Font.BOLD)); +          refIdLabel.setText(messages.getString(MESSAGE_HASHDATA)); //MessageFormat.format(refIdLabelPattern, new Object[]{refId})); + +          JTextArea hashDataTextArea = new JTextArea(hashDataText); +          hashDataTextArea.setEditable(false); +//          hashDataTextArea.setColumns(1); +//          hashDataTextArea.setRows(1); +          hashDataTextArea.setFont(new Font(HASHDATA_FONT, hashDataTextArea.getFont().getStyle(), hashDataTextArea.getFont().getSize())); +//          hashDataScrollPane.setViewportView(hashDataTextArea); +//          hashDataScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); //HORIZONTAL_SCROLLBAR_NEVER); +          hashDataTextArea.setLineWrap(true); +          hashDataTextArea.setWrapStyleWord(true); + +          JScrollPane hashDataScrollPane = new JScrollPane(hashDataTextArea); + +          GroupLayout mainPanelLayout = new GroupLayout(mainPanel); +          mainPanel.setLayout(mainPanelLayout); + +          mainPanelLayout.setHorizontalGroup( +             mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                      .addComponent(refIdLabel) +                      .addComponent(hashDataScrollPane, 0, 0, Short.MAX_VALUE)); + +          mainPanelLayout.setVerticalGroup( +            mainPanelLayout.createSequentialGroup() +                  .addComponent(refIdLabel) +                  .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                  .addComponent(hashDataScrollPane, 0, 0, Short.MAX_VALUE)); + +  //        GroupLayout mainPanelLayout = new GroupLayout(mainPanel); +  //        mainPanel.setLayout(mainPanelLayout); +  // +  //        mainPanelLayout.setHorizontalGroup( +  //          mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(mainPanelLayout.createSequentialGroup().addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addComponent(refIdLabel).addComponent(hashDataScrollPane, GroupLayout.PREFERRED_SIZE, PREF_SIZE_PINFIELD, Short.MAX_VALUE)).addContainerGap())); +  // +  //        mainPanelLayout.setVerticalGroup( +  //          mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(mainPanelLayout.createSequentialGroup().addComponent(refIdLabel).addGap(refIdLabel.getFont().getSize()).addComponent(hashDataScrollPane).addGap(refIdLabel.getFont().getSize()))); + +          JButton backButton = new JButton(); +          backButton.setText(messages.getString(BUTTON_BACK)); +          backButton.setActionCommand(cancelCommand); +          backButton.addActionListener(cancelListener); + +//          JButton saveButton = new JButton(); +//          saveButton.setText(messages.getString(BUTTON_SAVE)); +//          saveButton.setActionCommand(saveCommand); +//          saveButton.addActionListener(saveListener); + +                GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel); +                buttonPanel.setLayout(buttonPanelLayout); + +                buttonPanelLayout.setHorizontalGroup( +                  buttonPanelLayout.createSequentialGroup() +                        .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +                        .addComponent(backButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE)); +                buttonPanelLayout.setVerticalGroup( +                  buttonPanelLayout.createSequentialGroup() +                    .addComponent(backButton)); + +//          GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel); +//          buttonPanel.setLayout(buttonPanelLayout); +// +//          buttonPanelLayout.setHorizontalGroup( +//            buttonPanelLayout.createSequentialGroup() +//                  .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +//                  .addComponent(saveButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE) +//                  .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +//                  .addComponent(backButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE)); +//          buttonPanelLayout.setVerticalGroup( +//            buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)  +//                  .addComponent(saveButton) +//                  .addComponent(backButton));  + + +  //        GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel); +  //        buttonPanel.setLayout(buttonPanelLayout); +  // +  //        buttonPanelLayout.setHorizontalGroup( +  //          buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(GroupLayout.Alignment.TRAILING, buttonPanelLayout.createSequentialGroup().addContainerGap(15, Short.MAX_VALUE).addComponent(saveButton).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED).addComponent(cancelButton).addContainerGap())); +  //        buttonPanelLayout.setVerticalGroup( +  //          buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(saveButton).addComponent(cancelButton))); + +          contentPanel.validate(); +        } +      }); +    } + +    private void showMultipleHashDataInputDialog(final TableModel signedReferences, final ActionListener cancelListener, final String cancelCommand, final ActionListener saveListener, final String saveCommand) { +       +      log.debug("scheduling multiple hashdatainput dialog"); +       +      SwingUtilities.invokeLater(new Runnable() { + +        @Override +        public void run() { +           +          log.debug("show multiple hashdatainput dialog"); +           +          mainPanel.removeAll(); +          buttonPanel.removeAll(); + +//          titleLabel.setText(messages.getString(TITLE_HASHDATA)); + +          JLabel refIdLabel = new JLabel(); +          refIdLabel.setFont(refIdLabel.getFont().deriveFont(refIdLabel.getFont().getStyle() & ~java.awt.Font.BOLD)); +          String refIdLabelPattern = messages.getString(MESSAGE_HASHDATALIST); +          refIdLabel.setText(MessageFormat.format(refIdLabelPattern, new Object[]{signedReferences.getRowCount()})); + +          JTable hashDataTable = new JTable(); +          hashDataTable.setModel(signedReferences); +          hashDataTable.setTableHeader(null); +  //        hashDataTable.setShowVerticalLines(false); +  //        hashDataTable.setRowSelectionAllowed(false); +          TableColumn selectCol = hashDataTable.getColumnModel().getColumn(1); +          selectCol.setMinWidth(CHECKBOX_WIDTH); +          selectCol.setMaxWidth(CHECKBOX_WIDTH); + + +//          hashDataTable.setPreferredScrollableViewportSize(mainPanel.getPreferredSize()); + +          JScrollPane hashDataScrollPane = new JScrollPane(hashDataTable); + +          GroupLayout mainPanelLayout = new GroupLayout(mainPanel); +          mainPanel.setLayout(mainPanelLayout); + +          mainPanelLayout.setHorizontalGroup( +            mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                      .addComponent(refIdLabel) +                      .addComponent(hashDataScrollPane, 0, 0, Short.MAX_VALUE)); + +          mainPanelLayout.setVerticalGroup( +            mainPanelLayout.createSequentialGroup() +                  .addComponent(refIdLabel) +                  .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                  .addComponent(hashDataScrollPane, 0, 0, hashDataTable.getPreferredSize().height+3)); +  //                .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)); + + + +  //         +  //        GroupLayout mainPanelLayout = new GroupLayout(mainPanel); +  //        mainPanel.setLayout(mainPanelLayout); +  // +  //        mainPanelLayout.setHorizontalGroup( +  //          mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +  //            .addGroup(mainPanelLayout.createSequentialGroup() +  //                .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +  //                    .addComponent(refIdLabel) +  //                    .addComponent(hashDataScrollPane, GroupLayout.PREFERRED_SIZE, PREF_SIZE_PINFIELD, Short.MAX_VALUE)) +  //                    .addContainerGap())); +  // +  //        mainPanelLayout.setVerticalGroup( +  //          mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +  //          .addGroup(mainPanelLayout.createSequentialGroup() +  //            .addComponent(refIdLabel) +  //            .addGap(refIdLabel.getFont().getSize()) +  //            .addComponent(hashDataScrollPane) +  //            .addGap(refIdLabel.getFont().getSize()))); + + + + + + + + + + + + +  //        GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel); +  //        buttonPanel.setLayout(buttonPanelLayout); +  // +  //        buttonPanelLayout.setHorizontalGroup( +  //          buttonPanelLayout.createSequentialGroup() +  ////          buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +  ////            .addGroup(GroupLayout.Alignment.TRAILING, buttonPanelLayout.createSequentialGroup() +  //                .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +  //                .addComponent(saveButton) +  //                .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +  //                .addComponent(cancelButton) +  //                .addContainerGap()); //); +  //        buttonPanelLayout.setVerticalGroup( +  //          buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +  //          .addGroup(GroupLayout.Alignment.TRAILING, buttonPanelLayout.createSequentialGroup() +  //            .addGroup(buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) +  //                .addComponent(saveButton) +  //                .addComponent(cancelButton)) +  //            .addContainerGap())); + + +          JButton backButton = new JButton(); +          backButton.setText(messages.getString(BUTTON_BACK)); +          backButton.setActionCommand(cancelCommand); +          backButton.addActionListener(cancelListener); + +//          JButton saveButton = new JButton(); +//          saveButton.setText(messages.getString(BUTTON_SAVE)); +//          saveButton.setActionCommand(saveCommand); +//          saveButton.addActionListener(saveListener); + +                GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel); +                buttonPanel.setLayout(buttonPanelLayout); + +                buttonPanelLayout.setHorizontalGroup( +                  buttonPanelLayout.createSequentialGroup() +                        .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +                        .addComponent(backButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE)); +                buttonPanelLayout.setVerticalGroup( +                  buttonPanelLayout.createSequentialGroup() +                    .addComponent(backButton)); +           +           +//          GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel); +//          buttonPanel.setLayout(buttonPanelLayout); +// +//          buttonPanelLayout.setHorizontalGroup( +//            buttonPanelLayout.createSequentialGroup() +//                  .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +//                  .addComponent(saveButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE) +//                  .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +//                  .addComponent(backButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE)); +//          buttonPanelLayout.setVerticalGroup( +//            buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)  +//                  .addComponent(saveButton) +//                  .addComponent(backButton));  + +          contentPanel.validate(); +        } +      }); +    } + +//    private DisposableFileChooser fileDialog; +     +    private void showSaveHashDataInputDialog(final List<HashDataInput> signedRefs, final ActionListener okListener, final String okCommand) { +       +      log.debug("scheduling save hashdatainput dialog"); +       +      SwingUtilities.invokeLater(new Runnable() { + +        @Override +        public void run() { +           +          log.debug("show save hashdatainput dialog"); +       +          String userHome = System.getProperty("user.home"); +           +          JFileChooser fileDialog = new JFileChooser(userHome);  +          fileDialog.setMultiSelectionEnabled(false); +          fileDialog.setDialogType(JFileChooser.SAVE_DIALOG); +          fileDialog.setFileHidingEnabled(true); +          if (signedRefs.size() == 1) { +            fileDialog.setDialogTitle(messages.getString(WINDOWTITLE_SAVE)); +            fileDialog.setFileSelectionMode(JFileChooser.FILES_ONLY); +            String mimeType = signedRefs.get(0).getMimeType(); +            MimeFilter mimeFilter = new MimeFilter(mimeType, messages); +            fileDialog.setFileFilter(mimeFilter); +            String filename = messages.getString(SAVE_HASHDATAINPUT_PREFIX) + MimeFilter.getExtension(mimeType); +            fileDialog.setSelectedFile(new File(userHome, filename)); +          } else { +            fileDialog.setDialogTitle(messages.getString(WINDOWTITLE_SAVEDIR)); +            fileDialog.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); +          } +           +          //parent contentPane -> placed over applet +          switch (fileDialog.showSaveDialog(fileDialog)) { +            case JFileChooser.APPROVE_OPTION: +              File f = fileDialog.getSelectedFile(); +              for (HashDataInput hashDataInput : signedRefs) { +                String mimeType = hashDataInput.getMimeType(); +                String id = hashDataInput.getReferenceId(); +                File file; +                if (f.isDirectory()) { +                  String filename = messages.getString(SAVE_HASHDATAINPUT_PREFIX) + '_' + id + MimeFilter.getExtension(mimeType); +                  file = new File(f, filename); +                } else { +                  file = f; +                } +                if (file.exists()) { +                  String ovrwrt = messages.getString(MESSAGE_OVERWRITE); +                  int overwrite = JOptionPane.showConfirmDialog(fileDialog, MessageFormat.format(ovrwrt, file), messages.getString(WINDOWTITLE_OVERWRITE), JOptionPane.OK_CANCEL_OPTION); +                  if (overwrite != JOptionPane.OK_OPTION) { +                    continue; +                  } +                } +                if (log.isDebugEnabled()) { +                    log.debug("Writing HashDataInput " + id + " (" + mimeType + ") to file " + file); +                } +                FileOutputStream fos = null; +                try { +                    fos = new FileOutputStream(file); +                    BufferedOutputStream bos = new BufferedOutputStream(fos); +                    InputStream hdi = hashDataInput.getHashDataInput(); +                    int b; +                    while ((b = hdi.read()) != -1) { +                        bos.write(b); +                    } +                    bos.flush(); +                    bos.close(); +                } catch (IOException ex) { +                    log.error("Failed to write HashDataInput to file " + file + ": " + ex.getMessage()); +                    showErrorDialog(ERR_WRITE_HASHDATA, new Object[] {ex.getMessage()}, null, null); +                    ex.printStackTrace(); +                } finally { +                    try { +                        fos.close(); +                    } catch (IOException ex) { +                    } +                }     +              }   +          } +          log.debug("done saving hashdatainput"); +          okListener.actionPerformed(new ActionEvent(fileDialog, ActionEvent.ACTION_PERFORMED, okCommand)); +        } +      }); +    } +     +    private static String getText(HashDataInput hdi) throws IOException { +      ByteArrayOutputStream baos = null; +      try { +        InputStream hashDataIS = hdi.getHashDataInput(); +        if (hashDataIS == null) { +          log.error("No HashDataInput stream for reference " + hdi.getReferenceId()); +          return null; +        } else { +          baos = new ByteArrayOutputStream(hashDataIS.available()); +          int c; +          while ((c = hashDataIS.read()) != -1) { +              baos.write(c); +          } +          String encoding = hdi.getEncoding(); +          if (encoding == null) { +            //default for URL-encoded +            encoding = "UTF-8"; +          } +          return baos.toString(encoding); +        } +      } catch (IOException ex) { +          log.error("Failed to read HashDataInput for reference " + hdi.getReferenceId() + ": " + ex.getMessage()); +          throw ex;  +      } finally { +          try { +              baos.close(); +          } catch (IOException ex) { +          } +      } +    } +     +//    private String parseToken(final char[] terminators) { +//        char ch; +//        i1 = pos; +//        i2 = pos; +//        while (hasChar()) { +//            ch = chars[pos]; +//            if (isOneOf(ch, terminators)) { +//                break; +//            } +//            i2++; +//            pos++; +//        } +//        return getToken(false); +//    } +     +//     private static String getCharset(String contentType) { +//        +//       StringTokenizer t = new StringTokenizer +//        +//       if (contentType == null) { +//         return "UTF-8"; +//       } +//        +//       int pos = 0; +//       int len = contentType.length(); +//        +//       while (pos < len) { +//         pos++; +//         String paramName = parseToken(new char[] { +//                    '=', separator }); +//       } +//        +//        HashMap params = new HashMap(); +//        this.chars = chars; +//        this.pos = offset; +//        this.len = length; +// +//        String paramName = null; +//        String paramValue = null; +//        while (hasChar()) { +//            paramName = parseToken(new char[] { +//                    '=', separator }); +//            paramValue = null; +//            if (hasChar() && (chars[pos] == '=')) { +//                pos++; // skip '=' +//                paramValue = parseQuotedToken(new char[] { +//                        separator }); +//            } +//            if (hasChar() && (chars[pos] == separator)) { +//                pos++; // skip separator +//            } +//            if ((paramName != null) && (paramName.length() > 0)) { +//                if (this.lowerCaseNames) { +//                    paramName = paramName.toLowerCase(); +//                } +//                params.put(paramName, paramValue); +//            } +//        } +//        return params; +//        +//        +//        +//       Parser +//      ParameterParser pf = new ParameterParser(); +//    pf.setLowerCaseNames(true); +//    Map map = pf.parse(contentType, SEPERATOR); +//    String retVal = (String) map.get(CHAR_SET); +//    if ((retVal == null) && (replaceNullWithDefault)) { +//      if (map.containsKey(APPLICATION_URL_ENCODED)) { +//        // default charset for url encoded data +//        return "UTF-8"; +//      } +//      retVal = getDefaultCharset(); +//    } +//    return retVal; +//  } +     +} 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 79e23859..a2b5e0df 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 @@ -28,10 +28,10 @@ windowtitle.overwrite=Datei \u00FCberschreiben?  message.wait=<html>Bitte warten...</html>  message.insertcard=<html>Bitte B\u00FCrgerkarte in den Kartenleser stecken</html>  message.hashdatalink=<html><a href=\"anzeige\">Signaturdaten anzeigen...</a></html> -message.hashdata=<html>Ein textuelles Signaturdatenobjekt:</html>  +message.hashdata=<html>Ein Signaturdatenobjekt:</html>   #message.hashdata=<html>Referenz Id: {0}</html>  message.hashdatalist=<html>{0} Signaturdatenobjekte:</html> -message.retries=<html>Noch {0} Versuche</html> +message.retries=<html>Noch {0} Versuch(e)</html>  message.overwrite=<html>M\u00F6chten Sie das existierende Dokument {0} \u00FCberschreiben?</html>  label.pin=<html>{0}:</html>  label.pinsize=<html>({0} stellig)</html> | 
