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 }