001 /*
002 * Copyright 2002-2008 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.application.support;
017
018 import java.awt.event.ActionEvent;
019 import java.awt.event.ActionListener;
020
021 import javax.swing.JComponent;
022 import javax.swing.JMenuItem;
023 import javax.swing.JPopupMenu;
024 import javax.swing.JTabbedPane;
025 import javax.swing.event.ChangeEvent;
026 import javax.swing.event.ChangeListener;
027
028 import org.springframework.richclient.application.PageComponent;
029 import org.springframework.richclient.application.PageLayoutBuilder;
030 import org.springframework.richclient.util.PopupMenuMouseListener;
031
032 /**
033 * <code>ApplicationPage</code> implementation that puts the <code>PageComponent</code>s in a <code>JTabbedPane</code>.
034 *
035 * @author Peter De Bruycker
036 */
037 public class TabbedApplicationPage extends AbstractApplicationPage implements PageLayoutBuilder {
038
039 private JTabbedPane tabbedPane;
040 private int tabPlacement = -1;
041 private int tabLayoutPolicy = -1;
042
043 private boolean addingComponent;
044
045 protected JComponent createControl() {
046 tabbedPane = new JTabbedPane();
047 if (tabPlacement != -1) {
048 tabbedPane.setTabPlacement(tabPlacement);
049 }
050 if (tabLayoutPolicy != -1) {
051 tabbedPane.setTabLayoutPolicy(tabLayoutPolicy);
052 }
053
054 tabbedPane.addChangeListener(new ChangeListener() {
055 public void stateChanged(ChangeEvent e) {
056 // if we're adding a component, ignore change of active component
057 if (!addingComponent && tabbedPane.getSelectedIndex() >= 0) {
058 setActiveComponent(getComponent(tabbedPane.getSelectedIndex()));
059 }
060 }
061 });
062 JPopupMenu popup = new JPopupMenu();
063 JMenuItem close = new JMenuItem("Close");
064 close.addActionListener(new ActionListener() {
065 public void actionPerformed(ActionEvent e) {
066 close(getComponent(tabbedPane.getSelectedIndex()));
067 }
068 });
069 popup.add(close);
070 tabbedPane.addMouseListener(new PopupMenuMouseListener(popup));
071
072 this.getPageDescriptor().buildInitialLayout(this);
073
074 return tabbedPane;
075 }
076
077 protected void updatePageComponentProperties(PageComponent pageComponent) {
078 int index = indexOf(pageComponent);
079
080 tabbedPane.setIconAt(index, pageComponent.getIcon());
081 tabbedPane.setTitleAt(index, pageComponent.getDisplayName());
082 tabbedPane.setToolTipTextAt(index, pageComponent.getCaption());
083 }
084
085 public void addView(String viewDescriptorId) {
086 showView(viewDescriptorId);
087 }
088
089 protected void doAddPageComponent(PageComponent pageComponent) {
090 try {
091 addingComponent = true;
092 tabbedPane.addTab(pageComponent.getDisplayName(), pageComponent.getIcon(), pageComponent.getContext()
093 .getPane().getControl(), pageComponent.getCaption());
094 } finally {
095 addingComponent = false;
096 }
097 }
098
099 protected void doRemovePageComponent(PageComponent pageComponent) {
100 tabbedPane.removeTabAt(indexOf(pageComponent));
101 }
102
103 protected boolean giveFocusTo(PageComponent pageComponent) {
104 int componentIndex = indexOf(pageComponent);
105 if (componentIndex < 0) {
106 return false;
107 }
108
109 tabbedPane.setSelectedIndex(componentIndex);
110 return true;
111 }
112
113 private int indexOf(PageComponent component) {
114 return getPageComponents().indexOf(component);
115 }
116
117 private PageComponent getComponent(int index) {
118 return (PageComponent) getPageComponents().get(index);
119 }
120
121 public void setTabPlacement(int tabPlacement) {
122 this.tabPlacement = tabPlacement;
123 }
124
125 public void setTabLayoutPolicy(int tabLayoutPolicy) {
126 this.tabLayoutPolicy = tabLayoutPolicy;
127 }
128 }