Skip to content

Commit 8539677

Browse files
Richard7111eirikbakke
authored andcommitted
implemented closing of a whole document
fixed code according to review added missing condition, refactored code extracted method to close document list removed unused code and variable renamed closing method fixed bug where popup was closing when only one tab was remaining in other project Made changes based on review
1 parent 4a697ab commit 8539677

File tree

2 files changed

+55
-17
lines changed

2 files changed

+55
-17
lines changed

platform/core.multitabs/src/org/netbeans/core/multitabs/impl/ButtonPopupSwitcher.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -205,8 +205,7 @@ public void mouseMoved(MouseEvent e) {
205205

206206
@Override
207207
public void mousePressed(MouseEvent e) {
208-
int tabCount = controller.getTabModel().size();
209-
if( pTable.onMouseEvent(e) && tabCount == 1 ) {
208+
if( pTable.onMouseEvent(e) ) {
210209
hideCurrentPopup();
211210
}
212211
e.consume();
@@ -230,8 +229,8 @@ public void mouseClicked(MouseEvent e) {
230229
p = SwingUtilities.convertPoint((Component) e.getSource(), p, pTable);
231230
if (pTable.contains(p)) {
232231
if( !pTable.onMouseEvent(e) ) {
233-
final SwitcherTableItem item = pTable.getSelectedItem();
234-
if (item != null) {
232+
final DocumentSwitcherTable.Item item = pTable.getSelectedItem();
233+
if (item != null && !item.isSeparator()) {
235234
hideCurrentPopup();
236235
item.activate();
237236
}
@@ -343,7 +342,7 @@ private boolean changeSelection( KeyEvent event ) {
343342
break;
344343
case KeyEvent.VK_DELETE: {
345344
final Item item = ( Item ) pTable.getSelectedItem();
346-
if (item != null && TabDataRenderer.isClosable( item.getTabData() )) {
345+
if (item != null) {
347346
TabData tab = item.getTabData();
348347
int tabIndex = controller.getTabModel().indexOf( tab );
349348
if( tabIndex >= 0 ) {
@@ -355,6 +354,10 @@ private boolean changeSelection( KeyEvent event ) {
355354
selRow = Math.min( pTable.getModel().getRowCount()-1, selRow );
356355
selCol = Math.min( pTable.getModel().getColumnCount()-1, selCol );
357356
switched = true;
357+
} else if ( item.isSeparator() ){
358+
if( pTable.closeSelectedDocumentList() ) {
359+
SwingUtilities.invokeLater(this::hideCurrentPopup);
360+
}
358361
}
359362
}
360363
break;

platform/core.multitabs/src/org/netbeans/core/multitabs/impl/DocumentSwitcherTable.java

Lines changed: 47 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import java.awt.Point;
2828
import java.awt.Rectangle;
2929
import java.awt.event.MouseEvent;
30+
import java.util.ArrayList;
31+
import java.util.List;
3032
import javax.swing.BorderFactory;
3133
import javax.swing.DefaultButtonModel;
3234
import 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

Comments
 (0)