View Javadoc
1   package fr.ifremer.tutti.ui.swing.util;
2   
3   /*
4    * #%L
5    * Tutti :: UI
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2012 - 2016 Ifremer
10   * %%
11   * This program is free software: you can redistribute it and/or modify
12   * it under the terms of the GNU General Public License as
13   * published by the Free Software Foundation, either version 3 of the
14   * License, or (at your option) any later version.
15   * 
16   * This program is distributed in the hope that it will be useful,
17   * but WITHOUT ANY WARRANTY; without even the implied warranty of
18   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19   * GNU General Public License for more details.
20   * 
21   * You should have received a copy of the GNU General Public
22   * License along with this program.  If not, see
23   * <http://www.gnu.org/licenses/gpl-3.0.html>.
24   * #L%
25   */
26  
27  import javax.swing.ListSelectionModel;
28  import javax.swing.plaf.basic.BasicComboPopup;
29  import javax.swing.plaf.basic.ComboPopup;
30  import javax.swing.plaf.synth.SynthComboBoxUI;
31  import java.awt.Dimension;
32  import java.awt.Rectangle;
33  
34  /**
35   * ComboBox ui pour les listes déroulantes dont la popup est très large alors qu'on n'a pas trop la place pour une liste large.
36   *
37   * @author Kevin Morin (Code Lutin)
38   * @since 4.5
39   */
40  public class WideDataComboBoxUI extends SynthComboBoxUI {
41  
42      private Dimension popupSize;
43  
44      public WideDataComboBoxUI(Dimension popupSize) {
45          this.popupSize = popupSize;
46      }
47  
48      protected ComboPopup createPopup() {
49          BasicComboPopup popup = new BasicComboPopup(comboBox) {
50  
51              /**
52               * Configures the list which is used to hold the combo box items in the
53               * popup. This method is called when the UI class
54               * is created.
55               *
56               * @see #createList
57               */
58              @Override
59              protected void configureList() {
60                  list.setFont( comboBox.getFont() );
61                  list.setCellRenderer( comboBox.getRenderer() );
62                  list.setFocusable( false );
63                  list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION );
64                  int selectedIndex = comboBox.getSelectedIndex();
65                  if ( selectedIndex == -1 ) {
66                      list.clearSelection();
67                  }
68                  else {
69                      list.setSelectedIndex( selectedIndex );
70                      list.ensureIndexIsVisible( selectedIndex );
71                  }
72                  installListListeners();
73              }
74  
75              /**
76               * @inheritDoc
77               *
78               * Overridden to take into account any popup insets specified in
79               * SynthComboBoxUI
80               */
81              @Override
82              protected Rectangle computePopupBounds(int px, int py, int pw, int ph) {
83                  int width = Math.max(popupSize.width, comboBox.getPreferredSize().width);
84                  popupSize.setSize(width, getPopupHeightForRowCount(comboBox.getMaximumRowCount()));
85                  Rectangle popupBounds = super.computePopupBounds(0, comboBox.getBounds().height, width, popupSize.height);
86                  scroller.setMaximumSize(popupBounds.getSize());
87                  scroller.setPreferredSize(popupBounds.getSize());
88                  scroller.setMinimumSize(popupBounds.getSize());
89                  list.invalidate();
90                  return popupBounds;
91              }
92  
93          };
94          popup.getAccessibleContext().setAccessibleParent(comboBox);
95          return popup;
96      }
97  }