package org.freehep.application.mdi; import java.awt.Component; import java.awt.Point; import java.util.Iterator; import java.util.List; import javax.swing.Icon; import javax.swing.JPopupMenu; import javax.swing.JTabbedPane; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; /** * * @author Tony Johnson (tonyj@slac.stanford.edu) * @version $Id: TabbedPageManager.java 8584 2006-08-10 23:06:37Z duns $ */ public class TabbedPageManager extends PageManager { /** Creates new TabbedPageManager */ public TabbedPageManager() { setPageManagerType("Tab"); } public void setTabPlacement(int placement) { tabPlacement = placement; if (tabs != null) tabs.setTabPlacement(placement); } public int getTabPlacement() { return tabPlacement; } protected void show(PageContext page) { tabs.setSelectedComponent(page.getPage()); } protected Component getEmbodiment() { return tabs; } protected boolean close(PageContext page) { boolean ok = super.close(page); if (ok) tabs.removeTabAt(indexOfPage(page)); cl.stateChanged( new ChangeEvent( this )); return ok; } private String hackedTitle(String title) { return title == null ? CloseButtonTabbedPane.TAB_NAME_TRAILING_SPACE : title+CloseButtonTabbedPane.TAB_NAME_TRAILING_SPACE; } protected void titleChanged(PageContext page) { tabs.setTitleAt(indexOfPage(page),hackedTitle(page.getTitle())); } protected void iconChanged(PageContext page) { tabs.setIconAt(indexOfPage(page),page.getIcon()); } protected int indexOfPage(PageContext page) { return tabs.indexOfComponent(page.getPage()); } public PageContext openPage(Component c,String title,Icon icon, String type) { PageContext context = super.openPage(c, title, icon, type); tabs.addTab(hackedTitle(title),icon,c); // Should the open event be before or after the selection event? For the first page it's after, for all the other ones is before. // This is due to the fact that when adding the first tab, the tab is automatically selected, while when adding other tabs they are not // selected automatically. super.firePageOpened(context); tabs.setSelectedComponent(c); return context; } protected void init(List pages, PageContext selected) { tabs.removeChangeListener(cl); Iterator i = pages.iterator(); while (i.hasNext()) { PageContext context = (PageContext) i.next(); tabs.addTab(hackedTitle(context.getTitle()),context.getIcon(),context.getPage()); if (context == selected) tabs.setSelectedComponent(context.getPage()); } super.init(pages,selected); tabs.addChangeListener(cl); if (selected == null && pages.size()>0) fireSelectionChanged((PageContext) pages().get(tabs.getSelectedIndex())); } public PageContext getSelectedPage() { PageContext selected = super.getSelectedPage(); if ( selected != null ) return selected; int selectedIndex = tabs.getSelectedIndex(); if ( selectedIndex < 0 ) return null; return (PageContext) pages().get(selectedIndex); } protected void setActive(boolean active) { if (active) { tabs = new CloseButtonTabbedPane() { protected void fireCloseTabAt(final int index) { close((PageContext) pages().get(index)); } public JPopupMenu modifyPopupMenu(JPopupMenu menu,Component source,Point p) { return TabbedPageManager.this.modifyPopupMenu(menu, source, p); } }; tabs.setTabPlacement(tabPlacement); cl = new ChangeListener() { public void stateChanged(ChangeEvent e) { int index = tabs.getSelectedIndex(); if ( index != -1 ) fireSelectionChanged((PageContext) pages().get(index)); } }; tabs.addChangeListener(cl); } else { tabs.removeAll(); tabs.removeChangeListener(cl); tabs = null; } } protected JTabbedPane tabs; private ChangeListener cl; private int tabPlacement = JTabbedPane.TOP; }