001    /*
002     * Copyright 2002-2006 the original author or authors.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005     * use this file except in compliance with the License. You may obtain a copy of
006     * the License at
007     *
008     * http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012     * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013     * License for the specific language governing permissions and limitations under
014     * the License.
015     */
016    package org.springframework.richclient.dialog;
017    
018    import java.awt.Window;
019    
020    import javax.swing.Icon;
021    import javax.swing.JComponent;
022    import javax.swing.KeyStroke;
023    import javax.swing.UIManager;
024    
025    import org.springframework.richclient.core.DefaultMessage;
026    import org.springframework.util.Assert;
027    
028    /**
029     * Dialog for asking confirmation to the user. The <code>onConfirm</code> is
030     * called when the user presses the yes button.
031     */
032    public abstract class ConfirmationDialog extends ApplicationDialog {
033    
034        private static final String YES_FACE_DESCRIPTOR_ID = "yesCommand";
035    
036        private static final String NO_FACE_DESCRIPTOR_ID = "noCommand";
037    
038        private static final String CONFIRMATION_DIALOG_ICON = "confirmationDialog.icon";
039    
040        private DefaultMessageAreaPane messageAreaPane;
041    
042        private String confirmationMessage;
043    
044        public ConfirmationDialog() {
045            this("Confirmation Required", null, "Are you sure you wish to perform this action?");
046        }
047    
048        public ConfirmationDialog(String title, String message) {
049            this(title, null, message);
050        }
051    
052        public ConfirmationDialog(String title, Window parent, String message) {
053            super(title, parent);
054            setConfirmationMessage(message);
055        }
056    
057        public void setConfirmationMessage(String message) {
058            Assert.hasText(message, "The confirmation message is required");
059            this.confirmationMessage = message;
060            if(this.messageAreaPane != null) {
061                messageAreaPane.setMessage(new DefaultMessage(message));
062            }
063        }
064    
065        protected String getFinishCommandId() {
066            return YES_FACE_DESCRIPTOR_ID;
067        }
068    
069        protected String getCancelCommandId() {
070            return NO_FACE_DESCRIPTOR_ID;
071        }
072    
073        protected void registerDefaultCommand() {
074            registerCancelCommandAsDefault();
075        }
076    
077        protected void onInitialized() {
078            setupKeyBindings();
079        }
080    
081        private void setupKeyBindings() {
082            addActionKeyBinding(KeyStroke.getKeyStroke(getYesKey(), 0), getFinishCommand().getId());
083            addActionKeyBinding(KeyStroke.getKeyStroke(getNoKey(), 0), getCancelCommand().getId());
084        }
085    
086        protected int getYesKey() {
087            return getFinishCommand().getMnemonic();
088        }
089    
090        protected int getNoKey() {
091            return getCancelCommand().getMnemonic();
092        }
093    
094        protected JComponent createDialogContentPane() {
095            this.messageAreaPane = new DefaultMessageAreaPane();
096            Icon icon = getIconSource().getIcon(CONFIRMATION_DIALOG_ICON);
097            if (icon == null) {
098                icon = UIManager.getIcon("OptionPane.questionIcon");
099            }
100            this.messageAreaPane.setDefaultIcon(icon);
101            this.messageAreaPane.setMessage(new DefaultMessage(confirmationMessage));
102            return messageAreaPane.getControl();
103        }
104    
105        protected void disposeDialogContentPane() {
106            messageAreaPane = null;
107        }
108    
109        protected final boolean onFinish() {
110            onConfirm();
111            return true;
112        }
113    
114        protected abstract void onConfirm();
115    
116    }