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    }