001 package org.shiftone.jrat.desktop;
002
003 import org.shiftone.jrat.util.Assert;
004
005 import javax.swing.*;
006 import java.awt.*;
007 import java.awt.event.*;
008
009 /**
010 * @author jeff@shiftone.org (Jeff Drost)
011 */
012 public class TabMouseListener extends MouseAdapter implements ActionListener {
013
014 private JMenuItem newWindowMenuItem = new JMenuItem("New Window");
015 private JMenuItem closeMenuItem = new JMenuItem("Close");
016 private JMenuItem closeAllButMenuItem = new JMenuItem("Close All But This");
017 private JMenuItem closeAllMenuItem = new JMenuItem("Close All");
018
019 protected JPopupMenu popup = new JPopupMenu();
020 protected JTabbedPane tabPane = null;
021 protected int index = -1;
022
023
024 public TabMouseListener(JTabbedPane tabPane) {
025 Assert.assertNotNull(tabPane);
026 this.tabPane = tabPane;
027
028 popup.add(newWindowMenuItem);
029 popup.add(closeMenuItem);
030 popup.add(closeAllButMenuItem);
031 popup.add(closeAllMenuItem);
032
033 newWindowMenuItem.addActionListener(this);
034 closeMenuItem.addActionListener(this);
035 closeAllButMenuItem.addActionListener(this);
036 closeAllMenuItem.addActionListener(this);
037
038 }
039
040
041 public void mousePressed(MouseEvent e) {
042 maybeShowPopup(e);
043 }
044
045
046 public void mouseReleased(MouseEvent e) {
047 maybeShowPopup(e);
048 }
049
050
051 private void maybeShowPopup(MouseEvent e) {
052
053 if (e.isPopupTrigger()) {
054 index = tabPane.indexAtLocation(e.getX(), e.getY());
055
056 if (index != -1) {
057 tabPane.setSelectedIndex(index);
058 preShow();
059 popup.show(e.getComponent(), e.getX(), e.getY());
060 }
061 }
062 }
063
064 protected void preShow() {
065
066 closeMenuItem.setEnabled(true);
067 closeAllMenuItem.setEnabled(true);
068 newWindowMenuItem.setEnabled(true);
069
070 if (tabPane.getTabCount() == 1) {
071 closeAllButMenuItem.setEnabled(false);
072 } else {
073 closeAllButMenuItem.setEnabled(true);
074 }
075 }
076
077
078 public void actionPerformed(ActionEvent e) {
079
080 if (e.getSource() == closeMenuItem) {
081 tabPane.remove(index);
082 } else if (e.getSource() == closeAllButMenuItem) {
083 closeAll(false);
084 } else if (e.getSource() == closeAllMenuItem) {
085 closeAll(true);
086 } else if (e.getSource() == newWindowMenuItem) {
087 spawn();
088 }
089 }
090
091 public void spawn() {
092
093 Component component = tabPane.getComponentAt(index);
094 String title = tabPane.getTitleAt(index);
095 tabPane.remove(component);
096
097 JFrame frame = new SpawnedFrame(title, component);
098 // put it right on top
099 frame.setSize(tabPane.getSize());
100 frame.setLocation(tabPane.getLocationOnScreen());
101
102 frame.setVisible(true);
103 }
104
105 public void closeAll(boolean includeIndex) {
106
107 for (int i = tabPane.getTabCount() - 1; i >= 0; i--) {
108 if ((includeIndex) || (i != index)) {
109 tabPane.remove(i);
110 }
111 }
112 }
113
114 private class SpawnedFrame extends JFrame {
115
116 private final String title;
117 private final Component component;
118
119 public SpawnedFrame(String title, Component component) throws HeadlessException {
120 super(title);
121 this.title = title;
122 this.component = component;
123
124 getContentPane().setLayout(new BorderLayout());
125 getContentPane().add(component, BorderLayout.CENTER);
126
127 // when the window is closed, put the component back in a tab
128 addWindowListener(new CloseAdapter());
129 }
130
131 private class CloseAdapter extends WindowAdapter {
132 public void windowClosing(WindowEvent windowEvent) {
133 getContentPane().removeAll();
134 tabPane.addTab(title, component);
135 }
136 }
137 }
138 }