package open.dolphin.system; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ComponentListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.util.concurrent.ExecutionException; import javax.swing.*; import open.dolphin.client.ClientContext; import open.dolphin.client.GUIFactory; import open.dolphin.client.ServerInfo; import open.dolphin.infomodel.UserModel; import open.dolphin.util.HashUtil; /** * 医療機関と管理責任者を登録するクラス。 * * @Author Kazushi Minagawa, Digital Globe, Inc. * */ public class AddFacilityDialog extends JDialog implements ComponentListener, Runnable { public static final String ACCOUNT_INFO = "accountInfo"; private enum AccountState {COM_TEST, AGREEMENT, ACCOUNT_INFO}; private JPanel cardPanel; private CardLayout cardLayout; private JButton okBtn; private JButton cancelBtn; private JButton nextBtn; private JButton backBtn; private final PropertyChangeSupport boundSupport; private ServerInfo serverInfo; private OIDGetter oidGetter; private AgreementPanel agreement; private AccountInfoPanel accountInfo; private AccountState state = AccountState.COM_TEST; private boolean comTestOk; private boolean agreementOk; private boolean accountInfoOk; private AddFacilityTask task; private PropertyChangeListener pl; private JProgressBar bar; private JDialog progressDialog; public AddFacilityDialog() { super((Frame)null, null, true); boundSupport = new PropertyChangeSupport(this); } @Override public void addPropertyChangeListener(String prop, PropertyChangeListener l) { boundSupport.addPropertyChangeListener(prop, l); } @Override public void removePropertyChangeListener(String prop, PropertyChangeListener l) { boundSupport.addPropertyChangeListener(prop, l); } @Override public void run() { initialize(); connect(); cardLayout.show(cardPanel, "comTest"); this.setVisible(true); } public void setServerInfo(ServerInfo info) { serverInfo = info; boundSupport.firePropertyChange(ACCOUNT_INFO, null, serverInfo); } /** * GUIコンポーネントを初期化する。 */ private void initialize() { // ResourceBundle java.util.ResourceBundle bundle = ClientContext.getMyBundle(AddFacilityDialog.class); // Title String windowTitleitle = bundle.getString("title.window"); // Window size int windowWidth = 741; int windowHeight = 613; // Button Text String backBtnText = bundle.getString("actionText.back"); String nextBtnText = bundle.getString("actionText.next"); String cancelBtnText = (String)UIManager.get("OptionPane.cancelButtonText"); String addBtnText = bundle.getString("actionText.add"); // Creates communication test panel oidGetter = new OIDGetter(); // Creates agreement panel AgreementModel agreeModel = new AgreementModel(); try { // Read the agreement text InputStream ir = this.getClass().getResourceAsStream("/open/dolphin/system/asp-agreement.txt"); StringBuilder sb; try (BufferedReader reader = new BufferedReader(new InputStreamReader(ir, "UTF-8"))) { String line; sb = new StringBuilder(); while ((line = reader.readLine()) != null) { sb.append(line).append("\n"); } } agreeModel.setAgreeText(sb.toString()); } catch (Exception e) { e.printStackTrace(System.err); return; } agreement = new AgreementPanel(agreeModel); // Creates account information panel accountInfo = new AccountInfoPanel(); // Put them into card layout cardPanel = new JPanel(); cardLayout = new CardLayout(); cardPanel.setLayout(cardLayout); cardLayout.addLayoutComponent(oidGetter, "comTest"); cardLayout.addLayoutComponent(agreement, "agreement"); cardLayout.addLayoutComponent(accountInfo, "accountInfo"); cardPanel.add(oidGetter, "comTest"); cardPanel.add(agreement, "agreement"); cardPanel.add(accountInfo, "accountInfo"); // Create Return Button backBtn = new JButton(backBtnText); backBtn.setEnabled(false); // Creates Next Button nextBtn = new JButton(nextBtnText); nextBtn.setEnabled(false); // Creates Add Button okBtn = new JButton(addBtnText); okBtn.setEnabled(false); // Creates Cancel Button cancelBtn = new JButton(cancelBtnText); // Creates a panel contains buttons JPanel btnPanel; if (ClientContext.isMac()) { btnPanel = GUIFactory.createCommandButtonPanel( new JButton[]{backBtn, nextBtn, cancelBtn, okBtn}); } else { btnPanel = GUIFactory.createCommandButtonPanel( new JButton[]{backBtn, nextBtn, okBtn, cancelBtn}); } // Layout all JPanel content = new JPanel(new BorderLayout(0, 17)); content.add(cardPanel, BorderLayout.CENTER); content.add(btnPanel,BorderLayout.SOUTH); content.setBorder(BorderFactory.createEmptyBorder(12, 12, 11, 11)); // Add content panel this.getContentPane().add(content, BorderLayout.CENTER); // Locate the window this.setTitle(ClientContext.getFrameTitle(windowTitleitle)); this.setSize(new Dimension(windowWidth, windowHeight)); Dimension size = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); int top = (size.height - windowHeight) / 3; int left = (size.width - windowWidth) / 2; this.setLocation(left, top); } /** * イベント接続を行う。 */ private void connect() { oidGetter.addOidPropertyListener(new OidListener()); agreement.addAgreePropertyListener(new AgreementListener()); accountInfo.addValidInfoPropertyListener(new AccountInfoListener()); backBtn.addActionListener((ActionEvent e) -> { if (state == AccountState.AGREEMENT) { setState(AccountState.COM_TEST); cardLayout.show(cardPanel, "comTest"); } else if (state == AccountState.ACCOUNT_INFO) { setState(AccountState.AGREEMENT); cardLayout.show(cardPanel, "agreement"); } }); nextBtn.addActionListener((ActionEvent e) -> { if (state == AccountState.COM_TEST) { setState(AccountState.AGREEMENT); cardLayout.show(cardPanel, "agreement"); } else if (state == AccountState.AGREEMENT) { setState(AccountState.ACCOUNT_INFO); cardLayout.show(cardPanel, "accountInfo"); } }); okBtn.addActionListener((ActionEvent e) -> { addFacilityAdmin(); }); cancelBtn.addActionListener((ActionEvent e) -> { close(); }); this.addComponentListener(this); } class OidListener implements PropertyChangeListener { @Override public void propertyChange(PropertyChangeEvent e) { String oid = (String)e.getNewValue(); comTestOk = (oid != null && (!oid.equals("")) ); controlButton(); } } class AgreementListener implements PropertyChangeListener { @Override public void propertyChange(PropertyChangeEvent e) { boolean agree = ((Boolean)e.getNewValue()); agreementOk = agree; controlButton(); } } class AccountInfoListener implements PropertyChangeListener { @Override public void propertyChange(PropertyChangeEvent e) { boolean account = ((Boolean)e.getNewValue()); accountInfoOk = account; controlButton(); } } private void setState(AccountState s) { state = s; controlButton(); } private void controlButton() { backBtn.setEnabled(false); nextBtn.setEnabled(false); okBtn.setEnabled(false); switch (state) { case COM_TEST: nextBtn.setEnabled(comTestOk); break; case AGREEMENT: backBtn.setEnabled(true); nextBtn.setEnabled(agreementOk); break; case ACCOUNT_INFO: backBtn.setEnabled(true); okBtn.setEnabled(accountInfoOk); break; } } private void close() { setVisible(false); dispose(); } /** * 施設及び管理者アカウントを登録する。 */ private void addFacilityAdmin() { // 登録するユーザモデルを得る UserModel model = accountInfo.getModel(); // Password の hash化を行う String hashPass = HashUtil.MD5(model.getPassword()); model.setPassword(hashPass); task = new AddFacilityTask(model); pl = (PropertyChangeEvent evt) -> { if ("state".equals(evt.getPropertyName())) { if (SwingWorker.StateValue.DONE==evt.getNewValue()) { stopProgress2(); } else if (SwingWorker.StateValue.STARTED==evt.getNewValue()) { startProgress2(); } } }; task.addPropertyChangeListener(pl); task.execute(); } private void startProgress2() { java.util.ResourceBundle bundle = ClientContext.getMyBundle(AddFacilityDialog.class); String note = bundle.getString("note.progress.AddingAccount"); bar = new JProgressBar(0, 100); Object[] message = new Object[]{note, bar}; JButton cancel = new JButton((String)UIManager.get("OptionPane.cancelButtonText")); cancel.setEnabled(false); JOptionPane pane = new JOptionPane( message, JOptionPane.INFORMATION_MESSAGE, JOptionPane.DEFAULT_OPTION, null, new Object[]{cancel}); String title = ClientContext.getFrameTitle(bundle.getString("title.optionPane")); Component c = SwingUtilities.getWindowAncestor(this); progressDialog = pane.createDialog(c, title); progressDialog.setModal(false); bar.setIndeterminate(true); progressDialog.setVisible(true); } private void stopProgress2() { task.removePropertyChangeListener(pl); } /** * AddFacilityTask */ class AddFacilityTask extends SwingWorker<String, Void> { private final UserModel user; public AddFacilityTask(UserModel user) { this.user = user; } @Override protected String doInBackground() throws Exception { SystemDelegater sdl = new SystemDelegater(); String result = sdl.addFacilityUser(user); return result; } @Override protected void done() { bar.setIndeterminate(false); progressDialog.setVisible(false); if (isCancelled()) { return; } try { String result = get(); succeeded(result); } catch (InterruptedException ex) { interrupted(ex); } catch (ExecutionException ex) { failed(ex); } } protected void succeeded(String result) { okBtn.setEnabled(false); // 成功メッセージを表示する String thanks = ClientContext.getMyBundle(AddFacilityDialog.class).getString("message.thanks"); JOptionPane.showMessageDialog( AddFacilityDialog.this, thanks, AddFacilityDialog.this.getTitle(), JOptionPane.INFORMATION_MESSAGE); // サーバアカウント情報を通知する // rsult = fid:uid String[] spec = result.split(":"); ServerInfo info = new ServerInfo(); info.setFacilityId(spec[0]); info.setAdminId(spec[1]); // 通知する setServerInfo(info); AddFacilityDialog.this.setVisible(false); AddFacilityDialog.this.dispose(); } protected void failed(java.lang.Throwable cause) { java.util.logging.Logger.getLogger(this.getClass().getName()).warning(cause.getMessage()); String errMsg = cause.getMessage(); String title = AddFacilityDialog.this.getTitle(); JOptionPane.showMessageDialog(AddFacilityDialog.this, errMsg, title, JOptionPane.WARNING_MESSAGE); } protected void interrupted(java.lang.InterruptedException e) { java.util.logging.Logger.getLogger(this.getClass().getName()).warning(e.getMessage()); } } @Override public void componentMoved(java.awt.event.ComponentEvent componentEvent) { Point loc = getLocation(); //System.out.println(getTitle() + " : x=" + loc.x+ " y=" + loc.y); } @Override public void componentResized(java.awt.event.ComponentEvent componentEvent) { int width = getWidth(); int height = getHeight(); //System.out.println(getTitle() + " : width=" + width + " height=" + height); } @Override public void componentShown(java.awt.event.ComponentEvent componentEvent) { } @Override public void componentHidden(java.awt.event.ComponentEvent componentEvent) { } }