2727import java .awt .Point ;
2828import java .awt .Rectangle ;
2929import java .awt .event .MouseEvent ;
30+ import java .util .ArrayList ;
31+ import java .util .List ;
3032import javax .swing .BorderFactory ;
3133import javax .swing .DefaultButtonModel ;
3234import javax .swing .Icon ;
@@ -77,10 +79,8 @@ public DocumentSwitcherTable( Controller controller, SwitcherTableItem[] items,
7779 }
7880
7981 @ Override
80- public SwitcherTableItem getSelectedItem () {
82+ public Item getSelectedItem () {
8183 Item res = ( Item ) getValueAt (getSelectedRow (), getSelectedColumn ());
82- if ( null != res && res .isSeparator )
83- return null ; //don't hide the popup when a project separator is selected
8484 return res ;
8585 }
8686
@@ -90,7 +90,7 @@ public Component prepareRenderer( TableCellRenderer renderer, int row, int colum
9090
9191 boolean selected = row == getSelectedRow () &&
9292 column == getSelectedColumn () && item != null ;
93- boolean separator = null != item && item .isSeparator ;
93+ boolean separator = null != item && item .isSeparator () ;
9494
9595 ITEM_BORDER .color = null ;
9696 Component renComponent = super .prepareRenderer ( renderer , row , column );
@@ -105,10 +105,10 @@ public Component prepareRenderer( TableCellRenderer renderer, int row, int colum
105105 lbl .setBorder ( ITEM_BORDER );
106106 }
107107 }
108- if ( selected && ! separator ) {
108+ if ( selected ) {
109109 JPanel res = new JPanel ( new BorderLayout (5 , 0 ) );
110110 res .add ( renComponent , BorderLayout .CENTER );
111- if ( TabDataRenderer .isClosable ( item .getTabData () ) ) {
111+ if ( separator || TabDataRenderer .isClosable ( item .getTabData () )) {
112112 res .add ( btnClose , BorderLayout .EAST );
113113 }
114114 res .setBackground ( renComponent .getBackground () );
@@ -127,31 +127,39 @@ public Component prepareRenderer( TableCellRenderer renderer, int row, int colum
127127 private int lastCol = -1 ;
128128 private boolean inCloseButtonRect = false ;
129129
130+ /**
131+ *
132+ * @return True if popup window should be closed. (e.g. when no more
133+ * tabs are left opened)
134+ */
130135 boolean onMouseEvent ( MouseEvent e ) {
131136 Point p = e .getPoint ();
132137 p = SwingUtilities .convertPoint ((Component ) e .getSource (), p , this );
133138 int selRow = getSelectedRow ();
134139 int selCol = getSelectedColumn ();
135- if ( selRow < 0 || selCol < 0 )
140+ if ( selRow < 0 || selCol < 0 )
136141 return false ;
137142 Rectangle rect = getCellRect ( selRow , selCol , false );
138- if ( rect .contains ( p ) ) {
143+ if ( rect .contains ( p ) ) {
139144 Dimension size = btnClose .getPreferredSize ();
140145 int x = rect .x +rect .width -size .width ;
141146 int y = rect .y + (rect .height -size .height )/2 ;
142147 Rectangle btnRect = new Rectangle ( x , y , size .width , size .height );
143148 boolean inButton = btnRect .contains ( p );
144149 boolean mustRepaint = inCloseButtonRect != inButton ;
145150 inCloseButtonRect = inButton ;
146- if ( inButton ) {
147- if ( e .getID () == MouseEvent .MOUSE_PRESSED ) {
151+ if ( inButton ) {
152+ if ( e .getID () == MouseEvent .MOUSE_PRESSED ) {
148153 Item item = ( Item ) getModel ().getValueAt ( selRow , selCol );
149154 TabData tab = item .getTabData ();
155+ int tabSize = controller .getTabModel ().size ();
150156 int tabIndex = controller .getTabModel ().indexOf ( tab );
151157 if ( tabIndex >= 0 ) {
152158 TabActionEvent tae = new TabActionEvent ( this , TabbedContainer .COMMAND_CLOSE , tabIndex );
153159 controller .postActionEvent ( tae );
154- return true ;
160+ return tabSize == 1 ;
161+ } else if ( item .isSeparator () ) {
162+ return closeSelectedDocumentList ();
155163 }
156164 }
157165 }
@@ -174,7 +182,30 @@ public String getToolTipText( MouseEvent event ) {
174182 }
175183 return null ;
176184 }
177-
185+ /**
186+ * Method closes tabs in selected document list
187+ *
188+ * @return True if there are no more tabs left opened in other projects
189+ */
190+ boolean closeSelectedDocumentList () {
191+ List <TabData > tabs = new ArrayList <>(controller .getTabModel ().getTabs ());
192+ Item item = ( Item ) getModel ().getValueAt ( getSelectedRow (), getSelectedColumn ());
193+ ProjectProxy project = item .getProject ();
194+ ProjectSupport projectSupport = ProjectSupport .getDefault ();
195+ int numOfOtherTabs = 0 ;
196+ for ( TabData tab : tabs ) {
197+ ProjectProxy projectForTab = projectSupport .getProjectForTab ( tab );
198+ if (( project == null && projectForTab == null ) || ( projectForTab != null && projectForTab .equals ( project ))) {
199+ int tabIndex = controller .getTabModel ().indexOf ( tab );
200+ TabActionEvent tae = new TabActionEvent ( this , TabbedContainer .COMMAND_CLOSE , tabIndex );
201+ controller .postActionEvent ( tae );
202+ } else {
203+ numOfOtherTabs ++;
204+ }
205+ }
206+ return numOfOtherTabs == 0 ;
207+ }
208+
178209 private JButton createCloseButton () {
179210 JButton res = CloseButtonFactory .createBigCloseButton ();
180211 res .setModel ( new DefaultButtonModel () {
@@ -223,6 +254,10 @@ private Item( String name, String htmlName, String tooltip, ProjectProxy project
223254 public TabData getTabData () {
224255 return tabData ;
225256 }
257+
258+ public boolean isSeparator () {
259+ return isSeparator ;
260+ }
226261
227262 @ Override
228263 public int compareTo ( Object o ) {
0 commit comments