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 }