diff options
Diffstat (limited to 'BKUGuiExt/src/main/java')
8 files changed, 1301 insertions, 0 deletions
| diff --git a/BKUGuiExt/src/main/java/at/gv/egiz/bku/gui/ActivationGUI.java b/BKUGuiExt/src/main/java/at/gv/egiz/bku/gui/ActivationGUI.java new file mode 100644 index 00000000..c8927e1e --- /dev/null +++ b/BKUGuiExt/src/main/java/at/gv/egiz/bku/gui/ActivationGUI.java @@ -0,0 +1,250 @@ +/* + * 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.bku.gui.*; +import java.awt.Container; +import java.awt.Cursor; +import java.awt.event.ActionListener; +import java.net.URL; +import java.text.MessageFormat; +import java.util.Locale; +import java.util.ResourceBundle; +import javax.swing.GroupLayout; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JProgressBar; +import javax.swing.LayoutStyle; +import javax.swing.SwingUtilities; + +/** + * + * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at> + */ +public class ActivationGUI extends CardMgmtGUI implements ActivationGUIFacade { + +  public static final String TITLE_ACTIVATION = "title.activation"; +  public static final String LABEL_ACTIVATION = "label.activation"; +  public static final String LABEL_ACTIVATION_STEP = "label.activation.step"; +  public static final String LABEL_ACTIVATION_IDLE = "label.activation.idle"; + +  public static final String HELP_ACTIVATION = "help.activation"; +   +  protected JProgressBar progressBar; +   +  public ActivationGUI(Container contentPane, +          Locale locale, +          Style guiStyle, +          URL backgroundImgURL, +          AbstractHelpListener helpListener) { +    super(contentPane, locale, guiStyle, backgroundImgURL, helpListener); + +    progressBar = new JProgressBar(); +  } + +  @Override +  public void showActivationProgressDialog(final int currentStep, final int maxProgress, final ActionListener cancelListener, final String cancelCommand) { + +    log.debug("scheduling activation progress dialog (step " + currentStep + ")"); + +    SwingUtilities.invokeLater(new Runnable() { +       +      @Override +      public void run() { + +        log.debug("show activation progress dialog (step " + currentStep + ")"); + +        mainPanel.removeAll(); +        buttonPanel.removeAll(); + +        mainPanel.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + + +        JLabel infoLabel = new JLabel(); +        infoLabel.setFont(infoLabel.getFont().deriveFont(infoLabel.getFont().getStyle() & ~java.awt.Font.BOLD)); + +        if (renderHeaderPanel) { +          titleLabel.setText(cardmgmtMessages.getString(TITLE_ACTIVATION)); +          infoLabel.setText(cardmgmtMessages.getString(LABEL_ACTIVATION)); +        } else { +          infoLabel.setText(cardmgmtMessages.getString(TITLE_ACTIVATION)); +        } + +        helpListener.setHelpTopic(HELP_ACTIVATION); + +        progressBar.setIndeterminate(false); +        progressBar.setStringPainted(true); +        progressBar.setString(null); //reset to percentage +        progressBar.setMinimum(0); +        progressBar.setMaximum(maxProgress); + +        JLabel stepLabel = new JLabel(); +        stepLabel.setFont(stepLabel.getFont().deriveFont(stepLabel.getFont().getStyle() & ~java.awt.Font.BOLD, stepLabel.getFont().getSize()-2)); +        String stepPattern = cardmgmtMessages.getString(LABEL_ACTIVATION_STEP); +        stepLabel.setText(MessageFormat.format(stepPattern, new Object[]{ currentStep })); + +        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(helpLabel); +          infoVertical.addComponent(helpLabel); +        } + +        mainPanelLayout.setHorizontalGroup( +                mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                  .addGroup(infoHorizontal) +                  .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                    .addComponent(stepLabel) +                    .addComponent(progressBar))); + +        mainPanelLayout.setVerticalGroup( +                mainPanelLayout.createSequentialGroup() +                  .addGroup(infoVertical) +                  .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                  .addGroup(mainPanelLayout.createSequentialGroup() +                    .addComponent(stepLabel) +                    .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                    .addComponent(progressBar))); + +          JButton cancelButton = new JButton(); +          cancelButton.setFont(cancelButton.getFont().deriveFont(cancelButton.getFont().getStyle() & ~java.awt.Font.BOLD)); +          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(); + +      } +    }); + +  } + +  @Override +  public void incrementProgress() { +    SwingUtilities.invokeLater(new Runnable() { + +      @Override +      public void run() { +        progressBar.setValue(progressBar.getValue() + 1); +      } +    }); +     +  } + +  @Override +  public void showIdleDialog(final ActionListener cancelListener, final String cancelCommand) { +    log.debug("scheduling idle dialog"); + +    SwingUtilities.invokeLater(new Runnable() { + +      @Override +      public void run() { + +        log.debug("show idle dialog"); + +        mainPanel.removeAll(); +        buttonPanel.removeAll(); + +        mainPanel.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + + +        JLabel infoLabel = new JLabel(); +        infoLabel.setFont(infoLabel.getFont().deriveFont(infoLabel.getFont().getStyle() & ~java.awt.Font.BOLD)); + +        if (renderHeaderPanel) { +          titleLabel.setText(cardmgmtMessages.getString(TITLE_ACTIVATION)); +          infoLabel.setText(cardmgmtMessages.getString(LABEL_ACTIVATION)); +        } else { +          infoLabel.setText(cardmgmtMessages.getString(TITLE_ACTIVATION)); +        } + +        helpListener.setHelpTopic(HELP_ACTIVATION); + +        progressBar.setIndeterminate(true); +        progressBar.setStringPainted(true); +        progressBar.setString(""); //not string painted progressbar is smaller + +        JLabel stepLabel = new JLabel(); +        stepLabel.setFont(stepLabel.getFont().deriveFont(stepLabel.getFont().getStyle() & ~java.awt.Font.BOLD, stepLabel.getFont().getSize()-2)); +        stepLabel.setText(cardmgmtMessages.getString(LABEL_ACTIVATION_IDLE)); + +        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(helpLabel); +          infoVertical.addComponent(helpLabel); +        } + +        mainPanelLayout.setHorizontalGroup( +                mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                  .addGroup(infoHorizontal) +                  .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                    .addComponent(stepLabel) +                    .addComponent(progressBar))); + +        mainPanelLayout.setVerticalGroup( +                mainPanelLayout.createSequentialGroup() +                  .addGroup(infoVertical) +                  .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                  .addGroup(mainPanelLayout.createSequentialGroup() +                    .addComponent(stepLabel) +                    .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                    .addComponent(progressBar))); + +          JButton cancelButton = new JButton(); +          cancelButton.setFont(cancelButton.getFont().deriveFont(cancelButton.getFont().getStyle() & ~java.awt.Font.BOLD)); +          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(); + +      } +    }); + +  } +} diff --git a/BKUGuiExt/src/main/java/at/gv/egiz/bku/gui/ActivationGUIFacade.java b/BKUGuiExt/src/main/java/at/gv/egiz/bku/gui/ActivationGUIFacade.java new file mode 100644 index 00000000..3fc14d04 --- /dev/null +++ b/BKUGuiExt/src/main/java/at/gv/egiz/bku/gui/ActivationGUIFacade.java @@ -0,0 +1,34 @@ +/* + * 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.bku.gui.*; +import java.awt.event.ActionListener; + +/** + * + * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at> + */ +public interface ActivationGUIFacade extends BKUGUIFacade { + +  public void showActivationProgressDialog(int currentStep, int maxProgress, ActionListener cancelListener, String cancelCommand); + +  public void incrementProgress(); + +  public void showIdleDialog(ActionListener cancelListener, String cancelCommand); + +} diff --git a/BKUGuiExt/src/main/java/at/gv/egiz/bku/gui/CardMgmtGUI.java b/BKUGuiExt/src/main/java/at/gv/egiz/bku/gui/CardMgmtGUI.java new file mode 100644 index 00000000..c8e1826c --- /dev/null +++ b/BKUGuiExt/src/main/java/at/gv/egiz/bku/gui/CardMgmtGUI.java @@ -0,0 +1,71 @@ +/* + * 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.bku.gui.*; +import java.awt.Container; +import java.net.URL; +import java.util.Locale; +import java.util.ResourceBundle; + +/** + * Common superclass for Activation and PinManagement GUIs + *  + * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at> + */ +public class CardMgmtGUI extends BKUGUIImpl { + +  public static final String CARDMGMT_MESSAGES_BUNDLE = "at/gv/egiz/bku/gui/ActivationMessages"; + +  protected ResourceBundle cardmgmtMessages; + +  public CardMgmtGUI(Container contentPane, +          Locale locale, +          Style guiStyle, +          URL backgroundImgURL, +          AbstractHelpListener helpListener) { +    super(contentPane, locale, guiStyle, backgroundImgURL, helpListener); + +  } + +  @Override +  protected void loadMessageBundle(Locale locale) { +    super.loadMessageBundle(locale); + +    if (locale != null) { +        Locale lang = new Locale(locale.getLanguage().substring(0,2)); +        log.debug("loading applet resources for language: " + lang.toString()); +        cardmgmtMessages = ResourceBundle.getBundle(CARDMGMT_MESSAGES_BUNDLE, lang); +    } else { +        cardmgmtMessages = ResourceBundle.getBundle(CARDMGMT_MESSAGES_BUNDLE); +    } +  } + +  @Override +  protected String getMessage(String key) { +    if (super.hasMessage(key)) { +      return super.getMessage(key); +    } +    return cardmgmtMessages.getString(key); +  } + +  @Override +  protected boolean hasMessage(String key) { +    return (cardmgmtMessages.containsKey(key) || super.hasMessage(key)); +  } +} diff --git a/BKUGuiExt/src/main/java/at/gv/egiz/bku/gui/PINManagementGUI.java b/BKUGuiExt/src/main/java/at/gv/egiz/bku/gui/PINManagementGUI.java new file mode 100644 index 00000000..3d503510 --- /dev/null +++ b/BKUGuiExt/src/main/java/at/gv/egiz/bku/gui/PINManagementGUI.java @@ -0,0 +1,670 @@ +/* + * 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.bku.gui.*; +import at.gv.egiz.smcc.PINSpec; +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.MouseEvent; +import java.awt.event.MouseMotionAdapter; +import java.net.URL; +import java.text.MessageFormat; +import java.util.Locale; +import java.util.Map; +import javax.swing.GroupLayout; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPasswordField; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.LayoutStyle; +import javax.swing.ListSelectionModel; +import javax.swing.SwingUtilities; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * TODO pull out ResourceBundle to common superclass for activationGUI and pinMgmtGUI + * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at> + */ +public class PINManagementGUI extends CardMgmtGUI implements PINManagementGUIFacade { + +  protected static final Log log = LogFactory.getLog(PINManagementGUI.class); +   +  /** remember the pinfield to return to worker */ +  protected JPasswordField oldPinField; +  /** remember the pinSpec to return to worker */ +  protected PINSpec pinSpec; + +  public PINManagementGUI(Container contentPane, +          Locale locale, +          Style guiStyle, +          URL backgroundImgURL, +          AbstractHelpListener helpListener) { +    super(contentPane, locale, guiStyle, backgroundImgURL, helpListener); +  } + +  @Override +  public char[] getOldPin() { +    if (oldPinField != null) { +      char[] pin = oldPinField.getPassword(); +      oldPinField = null; +      return pin; +    } +    return null; +  } + +  @Override +  public PINSpec getSelectedPINSpec() { +    return pinSpec; +  } + +  @Override +  public void showPINManagementDialog(final Map<PINSpec, STATUS> pins,  +          final ActionListener activateListener, +          final String activateCmd, +          final String changeCmd, +          final String unblockCmd, +          final String verifyCmd, +          final ActionListener cancelListener, +          final String cancelCmd) { + +      log.debug("scheduling PIN managment dialog"); +     +      SwingUtilities.invokeLater(new Runnable() { + +        @Override +        public void run() { +          log.debug("show PIN management dialog"); + +                mainPanel.removeAll(); +                buttonPanel.removeAll(); + +                helpListener.setHelpTopic(HELP_PINMGMT); + +                JLabel mgmtLabel = new JLabel(); +                mgmtLabel.setFont(mgmtLabel.getFont().deriveFont(mgmtLabel.getFont().getStyle() & ~java.awt.Font.BOLD)); + +                if (renderHeaderPanel) { +                  titleLabel.setText(getMessage(TITLE_PINMGMT)); +                  String infoPattern = getMessage(MESSAGE_PINMGMT); +                  mgmtLabel.setText(MessageFormat.format(infoPattern, pins.size())); +                } else { +                  mgmtLabel.setText(getMessage(TITLE_PINMGMT)); +                } + +                final PINStatusTableModel tableModel = new PINStatusTableModel(pins); +                final JTable pinStatusTable = new JTable(tableModel); +                pinStatusTable.setDefaultRenderer(PINSpec.class, new PINSpecRenderer()); +                pinStatusTable.setDefaultRenderer(STATUS.class, new PINStatusRenderer(cardmgmtMessages)); +                pinStatusTable.setTableHeader(null); +                pinStatusTable.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); +//                pinStatusTable.addMouseMotionListener(new MouseMotionAdapter() { +// +//                  @Override +//                  public void mouseMoved(MouseEvent e) { +//                    if (pinStatusTable.columnAtPoint(e.getPoint()) == 0) { +//                      pinStatusTable.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); +//                    } else { +//                      pinStatusTable.setCursor(Cursor.getDefaultCursor()); +//                    } +//                  } +//                }); + +                final JButton activateButton = new JButton(); +                activateButton.setFont(activateButton.getFont().deriveFont(activateButton.getFont().getStyle() & ~java.awt.Font.BOLD)); +                activateButton.addActionListener(activateListener); + +                pinStatusTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); +                pinStatusTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { + +                  @Override +                  public void valueChanged(final ListSelectionEvent e) { +                    //invoke later to allow thread to paint selection background +                    SwingUtilities.invokeLater(new Runnable() { + +                      @Override +                      public void run() { +                        ListSelectionModel lsm = (ListSelectionModel) e.getSource(); +                        int selectionIdx = lsm.getMinSelectionIndex(); +                        if (selectionIdx >= 0) { +                          pinSpec = (PINSpec) tableModel.getValueAt(selectionIdx, 0); +                          STATUS status = (STATUS) tableModel.getValueAt(selectionIdx, 1); + +                          if (status == STATUS.NOT_ACTIV) { +                            activateButton.setText(getMessage(BUTTON_ACTIVATE)); +                            activateButton.setEnabled(true); +                            activateButton.setActionCommand(activateCmd); +                          } else if (status == STATUS.BLOCKED) { +                            activateButton.setText(getMessage(BUTTON_UNBLOCK)); +                            activateButton.setEnabled(true); +                            activateButton.setActionCommand(unblockCmd); +                          } else if (status == STATUS.ACTIV) { +                            activateButton.setText(getMessage(BUTTON_CHANGE)); +                            activateButton.setEnabled(true); +                            activateButton.setActionCommand(changeCmd); +                          } else if (status == STATUS.UNKNOWN) { +                            activateButton.setText(getMessage(BUTTON_VERIFY)); +                            activateButton.setEnabled(true); +                            activateButton.setActionCommand(verifyCmd); +                          } +                        } +                      } +                    }); +                  } +                }); + +                //select first entry +                pinStatusTable.getSelectionModel().setSelectionInterval(0, 0); + +                JScrollPane pinStatusScrollPane = new JScrollPane(pinStatusTable); + +                GroupLayout mainPanelLayout = new GroupLayout(mainPanel); +                mainPanel.setLayout(mainPanelLayout); + +                GroupLayout.SequentialGroup messageHorizontal = mainPanelLayout.createSequentialGroup() +                        .addComponent(mgmtLabel); +                GroupLayout.Group messageVertical = mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                        .addComponent(mgmtLabel); +                if (!renderHeaderPanel) { +                  messageHorizontal +                          .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED, 0, Short.MAX_VALUE) +                          .addComponent(helpLabel); +                  messageVertical +                          .addComponent(helpLabel); +                } + +                mainPanelLayout.setHorizontalGroup( +                mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                  .addGroup(messageHorizontal) +                  .addComponent(pinStatusScrollPane, 0, 0, Short.MAX_VALUE)); + +                mainPanelLayout.setVerticalGroup( +                  mainPanelLayout.createSequentialGroup() +                    .addGroup(messageVertical) +                    .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                    .addComponent(pinStatusScrollPane, 0, 0, pinStatusTable.getPreferredSize().height+3)); + +                JButton cancelButton = new JButton(); +                cancelButton.setFont(cancelButton.getFont().deriveFont(cancelButton.getFont().getStyle() & ~java.awt.Font.BOLD)); +                cancelButton.setText(getMessage(BUTTON_CLOSE)); +                cancelButton.setActionCommand(cancelCmd); +                cancelButton.addActionListener(cancelListener); + +                GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel); +                buttonPanel.setLayout(buttonPanelLayout); + +                GroupLayout.SequentialGroup buttonHorizontal = buttonPanelLayout.createSequentialGroup() +                        .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +                        .addComponent(activateButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE) +                        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                        .addComponent(cancelButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE); + +                GroupLayout.Group buttonVertical = buttonPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) +                          .addComponent(activateButton) +                          .addComponent(cancelButton); + +                buttonPanelLayout.setHorizontalGroup(buttonHorizontal); +                buttonPanelLayout.setVerticalGroup(buttonVertical); + +                contentPanel.validate(); +        } +      }); +  } + +  @Override +  public void showPINDialog(DIALOG type, PINSpec pinSpec, +          ActionListener okListener, String okCommand, +          ActionListener cancelListener, String cancelCommand) { +    showPINDialog(type, pinSpec, -1, false, +            okListener, okCommand, cancelListener, cancelCommand); +  } + +  @Override +  public void showPINDialog(DIALOG type, PINSpec pinSpec, int retries, +          ActionListener okListener, String okCommand, +          ActionListener cancelListener, String cancelCommand) { +    showPINDialog(type, pinSpec, retries, false, +            okListener, okCommand, cancelListener, cancelCommand); +  } + +  @Override +  public void showPinpadPINDialog(DIALOG type, PINSpec pinSpec, int retries) { +    String title, msg; +    Object[] params; +    if (retries < 0) { +      params = new Object[2]; +      if (shortText) { +        params[0] = "PIN"; +      } else { +        params[0] = pinSpec.getLocalizedName(); +      } +      params[1] = pinSpec.getLocalizedLength(); +      if (type == DIALOG.CHANGE) { +        log.debug("show change pin dialog"); +        title = TITLE_CHANGE_PIN; +        msg = MESSAGE_CHANGEPIN_PINPAD; +      } else if (type == DIALOG.ACTIVATE) { +        log.debug("show activate pin dialog"); +        title = TITLE_ACTIVATE_PIN; +        msg = MESSAGE_ENTERPIN_PINPAD; +      } else if (type == DIALOG.VERIFY) { +        log.debug("show verify pin dialog"); +        title = TITLE_VERIFY_PIN; +        msg = MESSAGE_ENTERPIN_PINPAD; +      } else { +        log.debug("show unblock pin dialog"); +        title = TITLE_UNBLOCK_PIN; +        msg = MESSAGE_ENTERPIN_PINPAD; +      } + +    } else { +      log.debug("show retry pin dialog"); +      title = TITLE_RETRY; +      msg = (retries < 2) ? +        MESSAGE_LAST_RETRY : MESSAGE_RETRIES; +      params = new Object[] {String.valueOf(retries)}; +    } +    showMessageDialog(title, msg, params); +  } + +  private void showPINDialog(final DIALOG type, final PINSpec pinSpec, +          final int retries, final boolean pinpad, +          final ActionListener okListener, final String okCommand, +          final ActionListener cancelListener, final String cancelCommand) { + +    log.debug("scheduling pin dialog"); + +      SwingUtilities.invokeLater(new Runnable() { + +            @Override +            public void run() { + +              String HELP_TOPIC, TITLE, MESSAGE_MGMT, MESSAGE_MGMT_PARAM, PINSIZE; +              HELP_TOPIC = HELP_PINMGMT; + +              PINSIZE = (pinSpec.getMaxLength() > pinSpec.getMinLength()) ? +                pinSpec.getMinLength() + "-" + pinSpec.getMaxLength() : +                String.valueOf(pinSpec.getMinLength()); + +              if (retries < 0) { +                if (type == DIALOG.CHANGE) { +                  log.debug("show change pin dialog"); +                  TITLE = TITLE_CHANGE_PIN; +                  MESSAGE_MGMT = MESSAGE_CHANGE_PIN; +                } else if (type == DIALOG.ACTIVATE) { +                  log.debug("show activate pin dialog"); +                  TITLE = TITLE_ACTIVATE_PIN; +                  MESSAGE_MGMT = MESSAGE_ACTIVATE_PIN; +                  oldPinField = null; +                  PINSIZE = pinSpec.getLocalizedLength(); +                } else if (type == DIALOG.VERIFY) { +                  log.debug("show verify pin dialog"); +                  TITLE = TITLE_VERIFY_PIN; +                  MESSAGE_MGMT = MESSAGE_VERIFY_PIN; +                } else { +                  log.debug("show unblock pin dialog"); +                  TITLE = TITLE_UNBLOCK_PIN; +                  MESSAGE_MGMT = MESSAGE_UNBLOCK_PIN; +                } +                if (shortText) { +                  MESSAGE_MGMT_PARAM = "PIN"; +                } else { +                  MESSAGE_MGMT_PARAM = pinSpec.getLocalizedName(); +                } +              } else { +                log.debug("show retry pin dialog"); +                TITLE = TITLE_RETRY; +                MESSAGE_MGMT = (retries < 2) ? +                  MESSAGE_LAST_RETRY : MESSAGE_RETRIES; +                MESSAGE_MGMT_PARAM = String.valueOf(retries); +              } + +                mainPanel.removeAll(); +                buttonPanel.removeAll(); + +                helpListener.setHelpTopic(HELP_TOPIC); + +                JLabel mgmtLabel = new JLabel(); +                if (retries < 0) { +                  mgmtLabel.setFont(mgmtLabel.getFont().deriveFont(mgmtLabel.getFont().getStyle() & ~Font.BOLD)); +                } else { +                  mgmtLabel.setFont(mgmtLabel.getFont().deriveFont(mgmtLabel.getFont().getStyle() | Font.BOLD)); +                  mgmtLabel.setForeground(ERROR_COLOR); +                  helpListener.setHelpTopic(HELP_RETRY); +                } + +                if (renderHeaderPanel) { +                  titleLabel.setText(getMessage(TITLE)); +                  String mgmtPattern = getMessage(MESSAGE_MGMT); +                  mgmtLabel.setText(MessageFormat.format(mgmtPattern, MESSAGE_MGMT_PARAM)); +                } else { +                  mgmtLabel.setText(getMessage(TITLE)); +                } + +                //////////////////////////////////////////////////////////////// +                // COMMON LAYOUT SECTION +                //////////////////////////////////////////////////////////////// + +                GroupLayout mainPanelLayout = new GroupLayout(mainPanel); +                mainPanel.setLayout(mainPanelLayout); + +                GroupLayout.SequentialGroup infoHorizontal = mainPanelLayout.createSequentialGroup() +                          .addComponent(mgmtLabel); +                GroupLayout.ParallelGroup infoVertical = mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                          .addComponent(mgmtLabel); + +                if (!renderHeaderPanel) { +                  infoHorizontal +                          .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED, 0, Short.MAX_VALUE) +                          .addComponent(helpLabel); +                  infoVertical +                          .addComponent(helpLabel); +                } + +                GroupLayout.ParallelGroup pinHorizontal; +                GroupLayout.SequentialGroup pinVertical; + +                if (pinpad) { +                  JLabel pinpadLabel = new JLabel(); +                  pinpadLabel.setFont(mgmtLabel.getFont().deriveFont(mgmtLabel.getFont().getStyle() & ~Font.BOLD)); +                  String pinpadPattern = getMessage(MESSAGE_VERIFYPIN_PINPAD); +                  pinpadLabel.setText(MessageFormat.format(pinpadPattern, +                          new Object[] { pinSpec.getLocalizedName(), PINSIZE })); +                   +                  pinHorizontal = mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                          .addComponent(pinpadLabel); +                  pinVertical = mainPanelLayout.createSequentialGroup() +                          .addComponent(pinpadLabel); +                } else { + +                JButton okButton = new JButton(); +                okButton.setFont(okButton.getFont().deriveFont(okButton.getFont().getStyle() & ~Font.BOLD)); +                okButton.setText(getMessage(BUTTON_OK)); +                okButton.setEnabled(pinSpec.getMinLength() <= 0); +                okButton.setActionCommand(okCommand); +                okButton.addActionListener(okListener); + +                JLabel oldPinLabel = null; +                JLabel repeatPinLabel = null; +                JLabel pinLabel = new JLabel(); +                pinLabel.setFont(pinLabel.getFont().deriveFont(pinLabel.getFont().getStyle() & ~Font.BOLD)); +                String pinLabelPattern = (type == DIALOG.CHANGE) ? getMessage(LABEL_NEW_PIN) : getMessage(LABEL_PIN); +                pinLabel.setText(MessageFormat.format(pinLabelPattern, new Object[]{pinSpec.getLocalizedName()})); + +                final JPasswordField repeatPinField = new JPasswordField(); +                pinField = new JPasswordField(); +                pinField.setText(""); +                pinField.setActionCommand(okCommand); +                pinField.addActionListener(new ActionListener() { + +                    @Override +                    public void actionPerformed(ActionEvent e) { +                        if (pinField.getPassword().length >= pinSpec.getMinLength()) { +                          if (type == DIALOG.VERIFY) { +                            okListener.actionPerformed(e); +                          } else { +                            repeatPinField.requestFocusInWindow(); +                          } +                        } +                    } +                }); + +                if (type != DIALOG.VERIFY) { +                  pinField.setDocument(new PINDocument(pinSpec, null)); +                  repeatPinLabel = new JLabel(); +                  repeatPinLabel.setFont(pinLabel.getFont()); +                  String repeatPinLabelPattern = getMessage(LABEL_REPEAT_PIN); +                  repeatPinLabel.setText(MessageFormat.format(repeatPinLabelPattern, new Object[]{pinSpec.getLocalizedName()})); + +                  repeatPinField.setText(""); +//                  repeatPinField.setDocument(new PINDocument(pinSpec, okButton, pinField.getDocument())); +                  repeatPinField.setActionCommand(okCommand); +                  repeatPinField.addActionListener(new ActionListener() { + +                      @Override +                      public void actionPerformed(ActionEvent e) { +                          if (pinField.getPassword().length >= pinSpec.getMinLength()) { +                              okListener.actionPerformed(e); +                          } +                      } +                  }); + +                  if (type == DIALOG.CHANGE) { +                    oldPinLabel = new JLabel(); +                    oldPinLabel.setFont(oldPinLabel.getFont().deriveFont(oldPinLabel.getFont().getStyle() & ~java.awt.Font.BOLD)); +                    String oldPinLabelPattern = getMessage(LABEL_OLD_PIN); +                    oldPinLabel.setText(MessageFormat.format(oldPinLabelPattern, new Object[]{pinSpec.getLocalizedName()})); + +                    oldPinField = new JPasswordField(); +                    oldPinField.setText(""); +                    oldPinField.setDocument(new PINDocument(pinSpec, null)); +                    oldPinField.setActionCommand(okCommand); +                    oldPinField.addActionListener(new ActionListener() { + +                        @Override +                        public void actionPerformed(ActionEvent e) { +                            if (oldPinField.getPassword().length >= pinSpec.getMinLength()) { +                              pinField.requestFocusInWindow(); +                            } +                        } +                    }); + +                    repeatPinField.setDocument(new PINDocument( +                            pinSpec, okButton, +                            pinField.getDocument(), oldPinField.getDocument())); +                  } else { +                    // else -> ACTIVATE (not verify, not change) +                    repeatPinField.setDocument(new PINDocument( +                            pinSpec, okButton, pinField.getDocument())); +                  } +                } else { +                  pinField.setDocument(new PINDocument(pinSpec, okButton)); +                } + +                JLabel pinsizeLabel = new JLabel(); +                pinsizeLabel.setFont(pinsizeLabel.getFont().deriveFont(pinsizeLabel.getFont().getStyle() & ~Font.BOLD, pinsizeLabel.getFont().getSize()-2)); +                String pinsizePattern = getMessage(LABEL_PINSIZE); +                pinsizeLabel.setText(MessageFormat.format(pinsizePattern, new Object[]{PINSIZE})); + +                //////////////////////////////////////////////////////////////// +                // NON-PINPAD SPECIFIC LAYOUT SECTION +                //////////////////////////////////////////////////////////////// + +                pinHorizontal = mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING); +                pinVertical = mainPanelLayout.createSequentialGroup(); + +//                if (pinLabelPos == PinLabelPosition.ABOVE) { +//                  if (changePin) { +//                      pinHorizontal +//                              .addComponent(oldPinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +//                              .addComponent(oldPinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE); +//                      pinVertical +//                              .addComponent(oldPinLabel) +//                              .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +//                              .addComponent(oldPinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +//                              .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED); +//                  } +//                  pinHorizontal +//                          .addComponent(pinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +//                          .addComponent(pinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +//                          .addComponent(repeatPinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +//                          .addComponent(repeatPinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +//                          .addGroup(mainPanelLayout.createSequentialGroup() +//                            .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED, 0, Short.MAX_VALUE) +//                            .addComponent(pinsizeLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)); +//                  pinVertical +//                          .addComponent(pinLabel) +//                          .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +//                          .addComponent(pinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +//                          .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +//                          .addComponent(repeatPinLabel) +//                          .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +//                          .addComponent(repeatPinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +//                          .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +//                          .addComponent(pinsizeLabel); +//                } else { + + +                  if (type == DIALOG.CHANGE) { +                    pinHorizontal +                          .addGroup(mainPanelLayout.createSequentialGroup() +                            .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                              .addComponent(oldPinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +                              .addComponent(pinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +                              .addComponent(repeatPinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) +                            .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                            .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                              .addComponent(oldPinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +                              .addComponent(pinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +                              .addComponent(repeatPinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))); + +                    pinVertical +                          .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) +                            .addComponent(oldPinLabel) +                            .addComponent(oldPinField)) +                          .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                          .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) +                            .addComponent(pinLabel) +                            .addComponent(pinField)) +                          .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                          .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) +                            .addComponent(repeatPinLabel) +                            .addComponent(repeatPinField)) +                          .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED); +                  } else if (type == DIALOG.ACTIVATE) { +                    pinHorizontal +                          .addGroup(mainPanelLayout.createSequentialGroup() +                            .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                              .addComponent(pinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +                              .addComponent(repeatPinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) +                            .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                            .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                              .addComponent(pinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +                              .addComponent(repeatPinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))); + +                    pinVertical +                          .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) +                            .addComponent(pinLabel) +                            .addComponent(pinField)) +                          .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                          .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) +                            .addComponent(repeatPinLabel) +                            .addComponent(repeatPinField)) +                          .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED); +                  } else { // VERIFY +                    pinHorizontal +                          .addGroup(mainPanelLayout.createSequentialGroup() +                            .addComponent(pinLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) +                            .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                            .addComponent(pinField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)); + +                    pinVertical +                          .addGroup(mainPanelLayout.createParallelGroup(GroupLayout.Alignment.BASELINE) +                            .addComponent(pinLabel) +                            .addComponent(pinField)) +                          .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED); +                  } +                  pinHorizontal +                          .addGroup(mainPanelLayout.createSequentialGroup() +                            .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED, 0, Short.MAX_VALUE) +                            .addComponent(pinsizeLabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)); +                  pinVertical +                          .addComponent(pinsizeLabel); + +                  GroupLayout buttonPanelLayout = new GroupLayout(buttonPanel); +                  buttonPanel.setLayout(buttonPanelLayout); + +                  GroupLayout.SequentialGroup buttonHorizontal = buttonPanelLayout.createSequentialGroup() +                          .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) +                          .addComponent(okButton, GroupLayout.PREFERRED_SIZE, buttonSize, GroupLayout.PREFERRED_SIZE); +                  GroupLayout.Group buttonVertical; + +                  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); + +                  buttonPanelLayout.setHorizontalGroup(buttonHorizontal); +                  buttonPanelLayout.setVerticalGroup(buttonVertical); + +                  if (oldPinField != null) { +                    oldPinField.requestFocusInWindow(); +                  } else { +                    pinField.requestFocusInWindow(); +                  } + +                } // END NON-PINPAD SECTION + +                mainPanelLayout.setHorizontalGroup( +                  mainPanelLayout.createParallelGroup(GroupLayout.Alignment.LEADING) +                    .addGroup(infoHorizontal) +                    .addGroup(pinHorizontal)); + +                mainPanelLayout.setVerticalGroup( +                  mainPanelLayout.createSequentialGroup() +                    .addGroup(infoVertical) +                    .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) +                    .addGroup(pinVertical)); + +                contentPanel.validate(); + +            } +        }); +  } + +  @Override +  protected int initButtonSize() { +    int bs = super.initButtonSize(); + +    JButton b = new JButton(); +    b.setText(getMessage(BUTTON_ACTIVATE)); +    if (b.getPreferredSize().width > bs) { +      bs = b.getPreferredSize().width; +    } +    b.setText(getMessage(BUTTON_CHANGE)); +    if (b.getPreferredSize().width > bs) { +      bs = b.getPreferredSize().width; +    } +    b.setText(getMessage(BUTTON_UNBLOCK)); +    if (b.getPreferredSize().width > bs) { +      bs = b.getPreferredSize().width; +    } +    b.setText(getMessage(BUTTON_CANCEL)); +    if (b.getPreferredSize().width > bs) { +      bs = b.getPreferredSize().width; +    } + +    return bs; +  } + +} diff --git a/BKUGuiExt/src/main/java/at/gv/egiz/bku/gui/PINManagementGUIFacade.java b/BKUGuiExt/src/main/java/at/gv/egiz/bku/gui/PINManagementGUIFacade.java new file mode 100644 index 00000000..297173d9 --- /dev/null +++ b/BKUGuiExt/src/main/java/at/gv/egiz/bku/gui/PINManagementGUIFacade.java @@ -0,0 +1,118 @@ +/* + * 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.bku.gui.*; +import at.gv.egiz.smcc.PINSpec; +import java.awt.event.ActionListener; +import java.util.Map; + +/** + * + * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at> + */ +public interface PINManagementGUIFacade extends BKUGUIFacade { + +  public static final String HELP_PINMGMT = "help.pin.mgmt"; +//  public static final String HELP_VERIFY_PIN = "help.pin.verify"; +  public static final String TITLE_PINMGMT = "title.pin.mgmt"; +  public static final String TITLE_ACTIVATE_PIN = "title.activate.pin"; +  public static final String TITLE_CHANGE_PIN = "title.change.pin"; +  public static final String TITLE_VERIFY_PIN = "title.verify.pin"; +  public static final String TITLE_UNBLOCK_PIN = "title.unblock.pin"; +  public static final String TITLE_ACTIVATE_SUCCESS = "title.activate.success"; +  public static final String TITLE_CHANGE_SUCCESS = "title.change.success"; + +  // removed message.* prefix to reuse keys as help keys +  public static final String MESSAGE_ACTIVATE_SUCCESS = "activate.success"; +  public static final String MESSAGE_CHANGE_SUCCESS = "change.success"; +  public static final String MESSAGE_PINMGMT = "pin.mgmt"; +//  public static final String MESSAGE_PINPAD = "pinpad"; +  public static final String MESSAGE_ACTIVATE_PIN = "activate.pin"; +  public static final String MESSAGE_CHANGE_PIN = "change.pin"; +  public static final String MESSAGE_VERIFY_PIN = "verify.pin"; +  public static final String MESSAGE_UNBLOCK_PIN = "unblock.pin"; +  public static final String MESSAGE_ACTIVATEPIN_PINPAD = "activate.pinpad"; +  public static final String MESSAGE_CHANGEPIN_PINPAD = "change.pinpad"; +  public static final String MESSAGE_VERIFYPIN_PINPAD = "verify.pinpad"; +  public static final String MESSAGE_UNBLOCKPIN_PINPAD = "unblock.pinpad"; + +  public static final String LABEL_OLD_PIN = "label.old.pin"; +  public static final String LABEL_NEW_PIN = "label.new.pin"; +  public static final String LABEL_REPEAT_PIN = "label.repeat.pin"; + +  public static final String ERR_STATUS = "err.status"; +  public static final String ERR_ACTIVATE = "err.activate"; +  public static final String ERR_CHANGE = "err.change"; +  public static final String ERR_UNBLOCK = "err.unblock"; +  public static final String ERR_VERIFY = "err.verify"; +  public static final String ERR_RETRIES = "err.retries"; +  public static final String ERR_LOCKED = "err.locked"; +  public static final String ERR_NOT_ACTIVE = "err.not.active"; +  public static final String ERR_PIN_FORMAT = "err.pin.format"; +  public static final String ERR_PIN_CONFIRMATION = "err.pin.confirmation"; +  public static final String ERR_PIN_OPERATION_ABORTED = "err.pin.operation.aborted"; +  public static final String ERR_UNSUPPORTED_CARD = "err.unsupported.card"; + +  public static final String BUTTON_ACTIVATE = "button.activate"; +  public static final String BUTTON_UNBLOCK = "button.unblock"; +  public static final String BUTTON_CHANGE = "button.change"; +  public static final String BUTTON_VERIFY = "button.verify"; + +  public static final String STATUS_ACTIVE = "status.active"; +  public static final String STATUS_BLOCKED = "status.blocked"; +  public static final String STATUS_NOT_ACTIVE = "status.not.active"; +  public static final String STATUS_UNKNOWN = "status.unknown"; + +  public enum STATUS { ACTIV, NOT_ACTIV, BLOCKED, UNKNOWN }; +  public enum DIALOG { VERIFY, ACTIVATE, CHANGE, UNBLOCK }; + +  public void showPINManagementDialog(Map<PINSpec, STATUS> pins, +          ActionListener activateListener, String activateCmd, String changeCmd, String unblockCmd, String verifyCmd, +          ActionListener cancelListener, String cancelCmd); + +  public void showPINDialog(DIALOG type, PINSpec pin, +          ActionListener okListener, String okCmd, +          ActionListener cancelListener, String cancelCmd); + +  public void showPINDialog(DIALOG type, PINSpec pin, int retries, +          ActionListener okListener, String okCmd, +          ActionListener cancelListener, String cancelCmd); + +  public void showPinpadPINDialog(DIALOG type, PINSpec pin, int retries); + +//  public void showActivatePINDialog(PINSpec pin, +//          ActionListener okListener, String okCmd, +//          ActionListener cancelListener, String cancelCmd); +// +//  public void showChangePINDialog(PINSpec pin, +//          ActionListener okListener, String okCmd, +//          ActionListener cancelListener, String cancelCmd); +// +//  public void showUnblockPINDialog(PINSpec pin, +//          ActionListener okListener, String okCmd, +//          ActionListener cancelListener, String cancelCmd); +// +//  public void showVerifyPINDialog(PINSpec pin, +//          ActionListener okListener, String okCmd, +//          ActionListener cancelListener, String cancelCmd); + +  public char[] getOldPin(); + +  public PINSpec getSelectedPINSpec(); +} diff --git a/BKUGuiExt/src/main/java/at/gv/egiz/bku/gui/PINSpecRenderer.java b/BKUGuiExt/src/main/java/at/gv/egiz/bku/gui/PINSpecRenderer.java new file mode 100644 index 00000000..e3d73e1f --- /dev/null +++ b/BKUGuiExt/src/main/java/at/gv/egiz/bku/gui/PINSpecRenderer.java @@ -0,0 +1,39 @@ +/* + * 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.PINSpec; +import javax.swing.table.DefaultTableCellRenderer; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * + * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at> + */ +public class PINSpecRenderer extends DefaultTableCellRenderer { + +  private static final Log log = LogFactory.getLog(PINSpecRenderer.class); + +  @Override +  protected void setValue(Object value) { +    PINSpec pinSpec = (PINSpec) value; +    super.setText(pinSpec.getLocalizedName()); +  } + +} diff --git a/BKUGuiExt/src/main/java/at/gv/egiz/bku/gui/PINStatusRenderer.java b/BKUGuiExt/src/main/java/at/gv/egiz/bku/gui/PINStatusRenderer.java new file mode 100644 index 00000000..83ff74f2 --- /dev/null +++ b/BKUGuiExt/src/main/java/at/gv/egiz/bku/gui/PINStatusRenderer.java @@ -0,0 +1,61 @@ +/* + * 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.bku.gui.PINManagementGUIFacade.STATUS; +import java.awt.Color; +import java.awt.Font; +import java.util.ResourceBundle; +import javax.swing.table.DefaultTableCellRenderer; + +/** + * + * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at> + */ +public class PINStatusRenderer extends DefaultTableCellRenderer { +   +//  private static final Log log = LogFactory.getLog(PINStatusRenderer.class); + +  public static final Color RED = new Color(0.9f, 0.0f, 0.0f); +  public static final Color GREEN = new Color(0.0f, 0.8f, 0.0f); +  protected ResourceBundle messages; + +  public PINStatusRenderer(ResourceBundle messages) { +    this.messages = messages; +  } + +  @Override +  protected void setValue(Object value) { +    STATUS pinStatus = (STATUS) value; +    super.setFont(super.getFont().deriveFont(super.getFont().getStyle() | Font.BOLD)); +       +    if (pinStatus == STATUS.NOT_ACTIV) { +      super.setForeground(RED); +      super.setText("<html>" + messages.getString(PINManagementGUIFacade.STATUS_NOT_ACTIVE) + "</html>"); +    } else if (pinStatus == STATUS.ACTIV) { +      super.setForeground(GREEN); +      super.setText("<html>" + messages.getString(PINManagementGUIFacade.STATUS_ACTIVE) + "</html>"); +    } else if (pinStatus == STATUS.BLOCKED) { +      super.setForeground(RED); +      super.setText("<html>" + messages.getString(PINManagementGUIFacade.STATUS_BLOCKED) + "</html>"); +    } else { +      super.setForeground(Color.BLACK); +      super.setText("<html>" + messages.getString(PINManagementGUIFacade.STATUS_UNKNOWN) + "</html>"); +    } +  } +} diff --git a/BKUGuiExt/src/main/java/at/gv/egiz/bku/gui/PINStatusTableModel.java b/BKUGuiExt/src/main/java/at/gv/egiz/bku/gui/PINStatusTableModel.java new file mode 100644 index 00000000..052c13b2 --- /dev/null +++ b/BKUGuiExt/src/main/java/at/gv/egiz/bku/gui/PINStatusTableModel.java @@ -0,0 +1,58 @@ +/* + * 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.bku.gui.PINManagementGUIFacade.STATUS; +import at.gv.egiz.smcc.PINSpec; +import java.util.Map; +import javax.swing.table.DefaultTableModel; + +/** + * + * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at> + */ +public class PINStatusTableModel extends DefaultTableModel { + +//  protected static final Log log = LogFactory.getLog(PINStatusTableModel.class); +  protected Class[] types; + +  public PINStatusTableModel(Map<PINSpec, STATUS> pinStatuses) { +    super(0, 2); +    if (pinStatuses == null) { +      throw new RuntimeException("pinStatuses must not be null"); +    } +//    log.trace(pinStatuses.size() + " PINs"); +    types = new Class[] { PINSpec.class, STATUS.class }; +    for (PINSpec pinSpec : pinStatuses.keySet()) { +      addRow(new Object[] { pinSpec, pinStatuses.get(pinSpec) }); +    } +//    PINSpec activePIN = new PINSpec(0, 1, null, "active-PIN", (byte) 0x01); +//    PINSpec blockedPIN = new PINSpec(0, 1, null, "blocked-PIN", (byte) 0x01); +//    addRow(new Object[] { activePIN, PINStatusProvider.STATUS.ACTIV }); +//    addRow(new Object[] { blockedPIN, PINStatusProvider.STATUS.BLOCKED }); +  } + +  @Override +  public Class getColumnClass(int columnIndex) { +    return types[columnIndex]; +  } + +  @Override +  public boolean isCellEditable(int rowIndex, int columnIndex) { +    return false; +  } +} | 
