package org.jdesktop.swingx; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import java.awt.Component; import java.awt.Font; import java.awt.Graphics; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JPopupMenu; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.plaf.InsetsUIResource; import javax.swing.plaf.UIResource; import org.jdesktop.swingx.JXSearchField.ClearAction; import org.jdesktop.swingx.JXSearchField.FindAction; import org.jdesktop.swingx.JXSearchField.LayoutStyle; import org.jdesktop.swingx.JXSearchField.SearchMode; import org.jdesktop.swingx.plaf.SearchFieldUI; import org.jdesktop.swingx.plaf.UIManagerExt; import org.jdesktop.swingx.search.NativeSearchFieldSupport; import org.jdesktop.swingx.search.RecentSearches; import org.jdesktop.swingx.search.RecentSearches.RecentSearchesPopup; import org.junit.Assert; import org.junit.Before; import org.junit.Test; public class JXSearchFieldTest { boolean focused; boolean eventReceived; JXSearchField searchField; @Before public void setUp() throws Exception { searchField = new JXSearchField() { @Override public boolean isFocusOwner() { return focused; } }; searchField.setInstantSearchDelay(0); // make tests work under leopard searchField.setUseNativeSearchFieldIfPossible(false); } @Test public void testSearchPopupPropertyChange() throws Exception { final JPopupMenu popupMenu = new JPopupMenu(); searchField.addPropertyChangeListener("findPopupMenu", new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { assertNull(evt.getOldValue()); assertSame(evt.getNewValue(), popupMenu); eventReceived = true; } }); NativeSearchFieldSupport.setFindPopupMenu(searchField, popupMenu); assertTrue(eventReceived); } @Test public void testCancelAction() throws Exception { assertSame(ClearAction.class, searchField.getCancelAction().getClass()); ActionListener a = new ActionListener() { public void actionPerformed(ActionEvent e) { eventReceived = true; } }; searchField.setCancelAction(a); assertSame(a, searchField.getCancelAction()); eventReceived = false; searchField.getCancelButton().doClick(0); assertTrue(eventReceived); NativeSearchFieldSupport.setCancelAction(searchField, null); assertSame(ClearAction.class, searchField.getCancelAction().getClass()); } @Test public void testFindAction() throws Exception { assertSame(FindAction.class, searchField.getFindAction().getClass()); ActionListener a = new ActionListener() { public void actionPerformed(ActionEvent e) { eventReceived = true; } }; searchField.setFindAction(a); assertSame(a, searchField.getFindAction()); eventReceived = false; searchField.getFindButton().doClick(0); assertTrue(eventReceived); NativeSearchFieldSupport.setFindAction(searchField, null); assertSame(FindAction.class, searchField.getFindAction().getClass()); } @Test public void testCancelActionPropertyChange() throws Exception { final ActionListener action = new ActionListener() { public void actionPerformed(ActionEvent e) { } }; searchField.addPropertyChangeListener("cancelAction", new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { assertSame(evt.getOldValue().getClass(), ClearAction.class); assertSame(evt.getNewValue(), action); eventReceived = true; } }); NativeSearchFieldSupport.setCancelAction(searchField, action); assertTrue(eventReceived); assertSame(searchField.getCancelAction(), action); } @Test public void testFindActionPropertyChange() throws Exception { final ActionListener action = new ActionListener() { public void actionPerformed(ActionEvent e) { } }; searchField.addPropertyChangeListener("findAction", new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { assertSame(evt.getOldValue().getClass(), FindAction.class); assertSame(evt.getNewValue(), action); eventReceived = true; } }); NativeSearchFieldSupport.setFindAction(searchField, action); assertTrue(eventReceived); assertSame(searchField.getFindAction(), action); } @Test public void testDefaultPrompt() throws Exception { JXSearchField sf = new JXSearchField(); assertSame(UIManagerExt.getString("SearchField.prompt"), sf.getPrompt()); sf = new JXSearchField("prompt"); assertEquals("prompt", sf.getPrompt()); } @Test public void testDefaultSearchMode() throws Exception { JXSearchField sf = new JXSearchField(); assertTrue(sf.isInstantSearchMode()); assertSame(SearchMode.INSTANT, sf.getSearchMode()); } @Test public void testFireAction() throws Exception { searchField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.err.println(e); eventReceived = true; } }); eventReceived = false; searchField.setInstantSearchDelay(0); searchField.setSearchMode(SearchMode.INSTANT); searchField.setText("search"); Assert.assertTrue(eventReceived); eventReceived = false; searchField.setSearchMode(SearchMode.REGULAR); searchField.setText("search2"); assertFalse(eventReceived); } @Test public void testInstantSearchDelay() throws Exception { searchField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.err.println(e); eventReceived = true; } }); eventReceived = false; searchField.setSearchMode(SearchMode.INSTANT); searchField.setText("search"); Assert.assertTrue(eventReceived); eventReceived = false; searchField.setInstantSearchDelay(100); assertSame(100, searchField.getInstantSearchDelay()); searchField.setText("search2"); assertFalse(eventReceived); } @Test public void testButtonVisibility() throws Exception { assertTrue(searchField.getFindButton().isVisible()); assertFalse(searchField.getCancelButton().isVisible()); assertTrue(searchField.isMacLayoutStyle()); assertTrue(searchField.isInstantSearchMode()); searchField.setText("text"); assertTrue(searchField.getFindButton().isVisible()); assertTrue(searchField.getCancelButton().isVisible()); searchField.setLayoutStyle(LayoutStyle.VISTA); assertFalse(searchField.getFindButton().isVisible()); assertTrue(searchField.getCancelButton().isVisible()); searchField.setSearchMode(SearchMode.REGULAR); assertTrue(searchField.getFindButton().isVisible()); assertFalse(searchField.getCancelButton().isVisible()); searchField.setFindPopupMenu(new JPopupMenu()); searchField.setUseSeperatePopupButton(false); assertFalse(searchField.getFindButton().isVisible()); assertTrue(searchField.getPopupButton().isVisible()); searchField.setUseSeperatePopupButton(true); assertTrue(searchField.getFindButton().isVisible()); assertTrue(searchField.getPopupButton().isVisible()); } @Test public void testSearchMode() throws Exception { searchField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.err.println(e); eventReceived = true; } }); assertTrue(searchField.isInstantSearchMode()); assertSame(UIManager.getIcon("SearchField.icon"), searchField .getFindButton().getIcon()); assertNull(searchField.getFindButton().getRolloverIcon()); assertNull(searchField.getFindButton().getPressedIcon()); eventReceived = false; searchField.getFindButton().doClick(); assertFalse(eventReceived); searchField.setText("test"); assertTrue(eventReceived); eventReceived = false; searchField.setSearchMode(SearchMode.REGULAR); assertTrue(searchField.isRegularSearchMode()); assertSame(UIManager.getIcon("SearchField.rolloverIcon"), searchField .getFindButton().getRolloverIcon()); assertSame(UIManager.getIcon("SearchField.pressedIcon"), searchField .getFindButton().getPressedIcon()); focused = true; searchField.getFindButton().doClick(); assertTrue(eventReceived); } @Test public void testEditableEnabled() throws Exception { searchField.setEditable(false); searchField.setEnabled(true); // assertFalse(searchField.getCancelAction().isEnabled()); assertFalse(searchField.getCancelButton().isEnabled()); // assertTrue(searchField.getSearchAction().isEnabled()); assertTrue(searchField.getFindButton().isEnabled()); assertTrue(searchField.getPopupButton().isEnabled()); searchField.setEditable(true); searchField.setEnabled(false); // assertFalse(searchField.getCancelAction().isEnabled()); assertFalse(searchField.getCancelButton().isEnabled()); // assertFalse(searchField.getSearchAction().isEnabled()); assertFalse(searchField.getFindButton().isEnabled()); assertFalse(searchField.getPopupButton().isEnabled()); searchField.setEditable(false); searchField.setEnabled(false); // assertFalse(searchField.getCancelAction().isEnabled()); assertFalse(searchField.getCancelButton().isEnabled()); // assertFalse(searchField.getSearchAction().isEnabled()); assertFalse(searchField.getFindButton().isEnabled()); assertFalse(searchField.getPopupButton().isEnabled()); searchField.setEditable(true); searchField.setEnabled(true); // assertTrue(searchField.getCancelAction().isEnabled()); assertTrue(searchField.getCancelButton().isEnabled()); // assertTrue(searchField.getSearchAction().isEnabled()); assertTrue(searchField.getFindButton().isEnabled()); assertTrue(searchField.getPopupButton().isEnabled()); } @Test public void testSetLayoutStyle() throws Exception { assertSame(LayoutStyle.MAC, searchField.getLayoutStyle()); assertTrue(searchField.isMacLayoutStyle()); assertFalse(searchField.getCancelButton().isVisible()); assertTrue(searchField.getFindButton().isVisible()); searchField.setText("test"); assertTrue(searchField.getCancelButton().isVisible()); assertTrue(searchField.getFindButton().isVisible()); searchField.setLayoutStyle(LayoutStyle.VISTA); assertTrue(searchField.isVistaLayoutStyle()); assertTrue(searchField.getCancelButton().isVisible()); assertFalse(searchField.getFindButton().isVisible()); } @Test public void testSearchButtonIcons() throws Exception { UIManager.put("SearchField.icon", new TestIconUI("SearchField.icon")); UIManager.put("SearchField.rolloverIcon", new TestIconUI( "SearchField.rolloverIcon")); UIManager.put("SearchField.pressedIcon", new TestIconUI( "SearchField.pressedIcon")); UIManager.put("SearchField.clearIcon", new TestIconUI( "SearchField.clearIcon")); UIManager.put("SearchField.clearRolloverIcon", new TestIconUI( "SearchField.clearRolloverIcon")); UIManager.put("SearchField.clearPressedIcon", new TestIconUI( "SearchField.clearPressedIcon")); searchField.updateUI(); assertSame(UIManager.getIcon("SearchField.icon"), searchField .getFindButton().getIcon()); assertFalse(searchField.isRegularSearchMode()); assertNull(searchField.getFindButton().getRolloverIcon()); assertNull(searchField.getFindButton().getPressedIcon()); searchField.setSearchMode(SearchMode.REGULAR); assertSame(UIManager.getIcon("SearchField.icon"), searchField .getFindButton().getIcon()); assertSame(UIManager.getIcon("SearchField.rolloverIcon"), searchField .getFindButton().getRolloverIcon()); assertSame(UIManager.getIcon("SearchField.pressedIcon"), searchField .getFindButton().getPressedIcon()); TestIcon diff = new TestIcon("different"); searchField.getFindButton().setRolloverIcon(diff); searchField.updateUI(); assertSame(diff, searchField.getFindButton().getRolloverIcon()); searchField.getFindButton().setPressedIcon(diff); searchField.updateUI(); assertSame(diff, searchField.getFindButton().getPressedIcon()); searchField.getFindButton().setIcon(diff); searchField.updateUI(); assertSame(diff, searchField.getFindButton().getIcon()); } @Test public void testPopupIcons() throws Exception { UIManager.put("SearchField.popupIcon", new TestIconUI( "SearchField.popupIcon")); UIManager.put("SearchField.popupRolloverIcon", new TestIconUI( "SearchField.popupRolloverIcon")); UIManager.put("SearchField.popupPressedIcon", new TestIconUI( "SearchField.popupPressedIcon")); searchField.updateUI(); assertNotSame(UIManager.getIcon("SearchField.popupIcon"), searchField .getFindButton().getIcon()); assertNotSame(UIManager.getIcon("SearchField.popupRolloverIcon"), searchField.getFindButton().getRolloverIcon()); assertNotSame(UIManager.getIcon("SearchField.popupPressedIcon"), searchField.getFindButton().getPressedIcon()); searchField.setUseSeperatePopupButton(true); assertSame(UIManager.getIcon("SearchField.icon"), searchField .getFindButton().getIcon()); searchField.setSearchMode(SearchMode.REGULAR); assertSame(UIManager.getIcon("SearchField.rolloverIcon"), searchField .getFindButton().getRolloverIcon()); assertSame(UIManager.getIcon("SearchField.pressedIcon"), searchField .getFindButton().getPressedIcon()); assertSame(UIManager.getIcon("SearchField.popupIcon"), searchField .getPopupButton().getIcon()); assertSame(UIManager.getIcon("SearchField.popupRolloverIcon"), searchField.getPopupButton().getRolloverIcon()); assertSame(UIManager.getIcon("SearchField.popupPressedIcon"), searchField.getPopupButton().getPressedIcon()); } @Test public void testPopupButton() throws Exception { searchField.setFindPopupMenu(new JPopupMenu()); assertFalse(searchField.getFindButton().isVisible()); assertTrue(searchField.getPopupButton().isVisible()); assertFalse(searchField.isUseSeperatePopupButton()); searchField.addPropertyChangeListener("useSeperatePopupButton", new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { eventReceived = true; } }); searchField.setUseSeperatePopupButton(true); assertTrue(eventReceived); assertTrue(searchField.getFindButton().isVisible()); assertTrue(searchField.getPopupButton().isVisible()); searchField.setFindPopupMenu(null); assertFalse(searchField.getPopupButton().isVisible()); assertTrue(searchField.getFindButton().isVisible()); } @Test public void testSearchOnClick() throws Exception { searchField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { eventReceived = true; } }); assertFalse(searchField.isRegularSearchMode()); searchField.getFindAction().actionPerformed(null); assertFalse(eventReceived); searchField.setSearchMode(SearchMode.REGULAR); focused = false; searchField.getFindAction().actionPerformed(null); assertFalse(eventReceived); focused = true; searchField.getFindAction().actionPerformed(null); assertTrue(eventReceived); eventReceived = false; searchField.setUseSeperatePopupButton(true); searchField.getFindAction().actionPerformed(null); assertTrue(eventReceived); } @Test public void testSeperatePopupDefault() throws Exception { UIManager.put("SearchField.useSeperatePopupButton", Boolean.FALSE); searchField.updateUI(); assertFalse(searchField.isUseSeperatePopupButton()); UIManager.put("SearchField.useSeperatePopupButton", Boolean.TRUE); searchField.updateUI(); assertTrue(searchField.isUseSeperatePopupButton()); UIManager.put("SearchField.useSeperatePopupButton", Boolean.TRUE); searchField.setUseSeperatePopupButton(false); searchField.updateUI(); assertFalse(searchField.isUseSeperatePopupButton()); } @Test public void testLayoutDefault() throws Exception { UIManager.put("SearchField.layoutStyle", LayoutStyle.VISTA); searchField.updateUI(); assertFalse(searchField.isMacLayoutStyle()); UIManager.put("SearchField.layoutStyle", LayoutStyle.MAC); searchField.updateUI(); assertFalse(searchField.isVistaLayoutStyle()); UIManager.put("SearchField.layoutStyle", LayoutStyle.MAC); searchField.setLayoutStyle(LayoutStyle.VISTA); searchField.updateUI(); assertTrue(searchField.isVistaLayoutStyle()); } @Test public void testPromptFontStyleDefault() throws Exception { UIManager.put("SearchField.promptFontStyle", Font.ITALIC); searchField.updateUI(); assertSame(Font.ITALIC, searchField.getPromptFontStyle()); UIManager.put("SearchField.promptFontStyle", null); searchField.updateUI(); assertNull(searchField.getPromptFontStyle()); UIManager.put("SearchField.promptFontStyle", Font.BOLD); searchField.setPromptFontStyle(null); searchField.updateUI(); assertNull(searchField.getPromptFontStyle()); } @Test public void testButtonMarginDefault() throws Exception { UIManager.put("SearchField.buttonMargin", new InsetsUIResource(5, 5, 5, 5)); searchField.updateUI(); assertSame(UIManager.get("SearchField.buttonMargin"), searchField .getOuterMargin()); UIManager.put("SearchField.buttonMargin", new InsetsUIResource(5, 5, 5, 5)); searchField.setOuterMargin(new Insets(0, 0, 0, 0)); searchField.updateUI(); assertNotSame(UIManager.get("SearchField.buttonMargin"), searchField .getOuterMargin()); } @Test public void testBorder() throws Exception { Border newBorder = BorderFactory.createEmptyBorder(); searchField.setBorder(newBorder); assertNotSame("Border should have been wrapped.", newBorder, searchField.getBorder()); } @Test public void testUseNativeSearchFieldIfPossible() throws Exception { SearchFieldUI ui = (SearchFieldUI) searchField.getUI(); searchField.setUseNativeSearchFieldIfPossible(true); assertTrue(searchField.isUseNativeSearchFieldIfPossible()); assertTrue(NativeSearchFieldSupport.isSearchField(searchField)); assertNotSame(ui, searchField.getUI()); searchField.setUseNativeSearchFieldIfPossible(false); assertFalse(searchField.isUseNativeSearchFieldIfPossible()); assertFalse(NativeSearchFieldSupport.isSearchField(searchField)); } @Test public void testManageRecentSearches() throws Exception { assertNull(searchField.getRecentSearches()); assertFalse(searchField.isManagingRecentSearches()); searchField.addPropertyChangeListener("recentSearchesSaveKey", new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { eventReceived = true; } }); searchField.setRecentSearchesSaveKey("test"); assertTrue(eventReceived); assertTrue(searchField.isManagingRecentSearches()); assertSame("test", searchField.getRecentSearchesSaveKey()); assertSame(RecentSearchesPopup.class, searchField.getFindPopupMenu() .getClass()); eventReceived = false; searchField.setRecentSearchesSaveKey(null); assertTrue(eventReceived); assertFalse(searchField.isManagingRecentSearches()); assertNull(searchField.getRecentSearchesSaveKey()); assertNull(searchField.getFindPopupMenu()); assertNull(searchField.getRecentSearches()); } @Test public void testChangeRecentSearchesName() throws Exception { searchField.setRecentSearchesSaveKey("test"); RecentSearches rs = searchField.getRecentSearches(); rs.removeAll(); rs.put("test1"); searchField.setRecentSearchesSaveKey("test2"); searchField.setRecentSearchesSaveKey("test"); rs = searchField.getRecentSearches(); assertSame(1, rs.getLength()); assertEquals("test1", rs.getRecentSearches()[0]); } @Test public void testManageRecentSearchesAndSetPopup() throws Exception { searchField.setRecentSearchesSaveKey("test"); JPopupMenu pm = new JPopupMenu(); searchField.setFindPopupMenu(pm); assertNotSame(pm, searchField.getFindPopupMenu()); } class TestIcon implements Icon { private String name; public TestIcon(String name) { this.name = name; } public int getIconHeight() { return 0; } public int getIconWidth() { return 0; } public void paintIcon(Component c, Graphics g, int x, int y) { } @Override public boolean equals(Object obj) { if (!(obj instanceof TestIcon)) { return false; } return name.equals(((TestIcon) obj).name); } @Override public int hashCode() { return name.hashCode(); } @Override public String toString() { return name; } } class TestIconUI extends TestIcon implements UIResource { public TestIconUI(String name) { super(name); } } }