001    /*
002     * Copyright 2002-2004 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.preference;
017    
018    import javax.swing.JComponent;
019    
020    import org.springframework.richclient.command.ActionCommand;
021    import org.springframework.richclient.command.CommandGroup;
022    import org.springframework.richclient.dialog.AbstractDialogPage;
023    import org.springframework.richclient.layout.GridBagLayoutBuilder;
024    import org.springframework.richclient.settings.Settings;
025    import org.springframework.richclient.util.GuiStandardUtils;
026    import org.springframework.util.Assert;
027    
028    public abstract class PreferencePage extends AbstractDialogPage {
029    
030            private boolean createApplyAndDefaultButtons = true;
031    
032            private PreferencePage parent;
033    
034            private PreferenceDialog preferenceDialog;
035    
036            private ActionCommand restoreDefaultsCommand;
037    
038            private ActionCommand applyCommand;
039    
040            public PreferencePage(String id) {
041                    super(id);
042            }
043    
044        public PreferencePage(String id, boolean autoconfigure) {
045            super(id, autoconfigure);
046        }
047    
048        /**
049             * @return array containing "Restore defaults" and "Apply" commands
050             */
051            protected ActionCommand[] getCommands() {
052                    return new ActionCommand[] { getRestoreDefaultsCommand(), getApplyCommand() };
053            }
054    
055        /**
056         * Will create "Apply" command if it doesn't exist yet
057         * 
058         * @return apply command.
059         */
060        protected ActionCommand getApplyCommand()
061        {
062            if (applyCommand == null) {
063                applyCommand = new ActionCommand("applyCommand") {
064                            public void doExecuteCommand() {
065                                    onApply();
066                            }
067                    };
068            }
069            return applyCommand;
070        }
071    
072        /**
073         * Will create "Restore Defaults" command if it doesn't exist yet
074         * 
075         * @return restore defaults command.
076         */
077        protected ActionCommand getRestoreDefaultsCommand()
078        {
079            if (restoreDefaultsCommand == null){
080                restoreDefaultsCommand = new ActionCommand("restoreDefaultsCommand") {
081                            public void doExecuteCommand() {
082                                    onDefaults();
083                            }
084                    };
085            }
086            return restoreDefaultsCommand;
087        }
088    
089            /**
090             * Creates two commands "Restore defaults" and "Apply" for this page,
091             * layouts them on the panel.
092             * 
093             * @return panel containing "Restore defaults" and "Apply" commands
094             */
095            protected JComponent createButtons() {
096                    CommandGroup commandGroup = CommandGroup.createCommandGroup(null,
097                                    getCommands());
098                    JComponent buttonBar = commandGroup.createButtonBar();
099                    GuiStandardUtils.attachDialogBorder(buttonBar);
100    
101                    return buttonBar;
102            }
103    
104            protected abstract JComponent createContents();
105    
106            protected JComponent createControl() {
107                    GridBagLayoutBuilder builder = new GridBagLayoutBuilder();
108    
109                    JComponent buttonPanel = null;
110                    if (createApplyAndDefaultButtons) {
111                            buttonPanel = createButtons();
112                    }
113    
114                    JComponent contents = createContents();
115                    Assert.notNull(contents, "Contents cannot be null.");
116                    builder.append(contents, 1, 1, true, true);
117    
118                    if (createApplyAndDefaultButtons) {
119                            builder.nextLine();
120                            builder.append(buttonPanel);
121                    }
122    
123                    return builder.getPanel();
124            }
125    
126            public PreferencePage getParent() {
127                    return parent;
128            }
129    
130            protected Settings getSettings() {
131                    return preferenceDialog.getSettings();
132            }
133    
134            /**
135             * Must store the preference values in the PreferenceStore. Does not save
136             * the PreferenceStore. Subclasses should override this method.
137             */
138            protected void onApply() {
139                    onFinish();
140            }
141    
142            protected void onDefaults() {
143            }
144    
145            /**
146             * Notification that the user clicked the OK button on the PreferenceDialog.
147             */
148            protected boolean onFinish() {
149                    return true;
150            }
151    
152            public void setCreateApplyAndDefaultButtons(boolean create) {
153                    createApplyAndDefaultButtons = create;
154            }
155    
156            public boolean getCreateApplyAndDefaultButtons() {
157                    return createApplyAndDefaultButtons;
158            }
159    
160            public void setParent(PreferencePage parent) {
161                    this.parent = parent;
162            }
163    
164            public void setPreferenceDialog(PreferenceDialog dialog) {
165                    Assert.notNull(dialog);
166                    preferenceDialog = dialog;
167            }
168    
169            public void setPageComplete(boolean pageComplete) {
170                    if (applyCommand != null) {
171                            applyCommand.setEnabled(pageComplete);
172                    }
173    
174                    super.setPageComplete(pageComplete);
175            }
176    }