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.util.HashMap;
019 import java.util.List;
020 import java.util.Map;
021
022 import javax.swing.JComponent;
023 import javax.swing.JTabbedPane;
024 import javax.swing.event.ChangeEvent;
025 import javax.swing.event.ChangeListener;
026
027 import org.springframework.richclient.core.LabeledObjectSupport;
028 import org.springframework.richclient.dialog.control.ExtTabbedPane;
029 import org.springframework.richclient.dialog.control.Tab;
030 import org.springframework.richclient.dialog.control.VetoableSingleSelectionModel;
031
032 /**
033 * A concrete implementation of <code>CompositeDialogPage</code> that presents
034 * the child pages in a <code>JTabbedPane</code>.
035 * <p>
036 * Each child page is placed into a separate tab of the <code>JTabbedPane</code>.
037 * This class also decorates the tab titles to indicate the page completed
038 * status.
039 * <p>
040 * Has support for hiding/showing <code>DialogPage</code>s; on
041 * <code>DialogPage.setVisible(false)</code> the tab for the page is removed
042 * from the ui, on <code>DialogPage.setVisible(true)</code> it is shown again.
043 *
044 * @author Oliver Hutchison
045 * @author Peter De Bruycker
046 */
047 public class TabbedDialogPage extends CompositeDialogPage {
048 private ExtTabbedPane tabbedPaneView;
049
050 private Map page2tab = new HashMap();
051
052 private Map tab2Page = new HashMap();
053
054 private boolean settingSelection;
055
056 public TabbedDialogPage(String pageId) {
057 super(pageId);
058 }
059
060 public TabbedDialogPage(String pageId, boolean autoConfigure) {
061 super(pageId, autoConfigure);
062 }
063
064 protected JComponent createControl() {
065 createPageControls();
066 final JTabbedPane tabbedPane = getComponentFactory().createTabbedPane();
067 tabbedPaneView = new ExtTabbedPane(tabbedPane);
068
069 List pages = getPages();
070 for (int i = 0; i < pages.size(); i++) {
071 final DialogPage page = (DialogPage) pages.get(i);
072 final Tab tab = new Tab();
073
074 JComponent control = page.getControl();
075 control.setPreferredSize(getLargestPageSize());
076
077 tab.setComponent(control);
078 tab.setVisible(page.isVisible());
079 tab.setEnabled(page.isEnabled());
080 decorateTab(tab, page);
081
082 page2tab.put(page, tab);
083 tab2Page.put(tab, page);
084 tabbedPaneView.addTab(tab);
085 }
086
087 tabbedPane.setModel(new VetoableSingleSelectionModel() {
088 protected boolean selectionAllowed(int index) {
089 return canChangeTabs();
090 }
091 });
092
093 tabbedPaneView.addChangeListener(new ChangeListener() {
094 public void stateChanged(ChangeEvent e) {
095 int index = tabbedPane.getSelectedIndex();
096
097 if (index >= 0) {
098 index = tabbedPaneView.convertUIIndexToModelIndex(index);
099 Tab tab = tabbedPaneView.getTab(index);
100 setActivePage((DialogPage) tab2Page.get(tab));
101 }
102 else {
103 setActivePage(null);
104 }
105 }
106 });
107
108 // show first visible tab
109 setActivePage((DialogPage) pages.get(tabbedPaneView.convertUIIndexToModelIndex(0)));
110 return tabbedPane;
111 }
112
113 /**
114 * Sets the active page of this TabbedDialogPage. This method will also
115 * select the tab wich displays the new active page.
116 *
117 * @param activePage the page to be made active. Must be one of the child
118 * pages.
119 */
120 public void setActivePage(DialogPage page) {
121 if (settingSelection) {
122 return;
123 }
124
125 try {
126 settingSelection = true;
127
128 super.setActivePage(page);
129 if (page != null) {
130 Tab tab = (Tab) page2tab.get(page);
131 tabbedPaneView.selectTab(tab);
132 }
133 }
134 finally {
135 settingSelection = false;
136 }
137 }
138
139 protected boolean canChangeTabs() {
140 return true;
141 }
142
143 protected void updatePageComplete(DialogPage page) {
144 super.updatePageComplete(page);
145
146 if (tabbedPaneView != null) {
147 Tab tab = (Tab) page2tab.get(page);
148 decorateTab(tab, page);
149 }
150 }
151
152 protected void decorateTab(Tab tab, DialogPage page) {
153 tab.setTitle(getDecoratedPageTitle(page));
154 tab.setTooltip(page.getDescription());
155 if (page instanceof LabeledObjectSupport) {
156 tab.setMnemonic(((LabeledObjectSupport) page).getMnemonic());
157 }
158 tab.setIcon(page.getIcon());
159 }
160
161 protected void updatePageVisibility(DialogPage page) {
162 Tab tab = getTab(page);
163 tab.setVisible(page.isVisible());
164 }
165
166 protected void updatePageEnabled(DialogPage page) {
167 Tab tab = getTab(page);
168 tab.setEnabled(page.isEnabled());
169 }
170
171 protected void updatePageLabels(DialogPage page) {
172 Tab tab = getTab(page);
173 tab.setTitle(getDecoratedPageTitle(page));
174 }
175
176 protected final Tab getTab(final DialogPage page) {
177 return (Tab) page2tab.get(page);
178 }
179 }