/* * This file is part of WebLookAndFeel library. * * WebLookAndFeel library is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * WebLookAndFeel library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with WebLookAndFeel library. If not, see <http://www.gnu.org/licenses/>. */ package com.alee.examples.content; import com.alee.extended.layout.SlidingLayout; import com.alee.extended.layout.TableLayout; import com.alee.extended.painter.NinePatchIconPainter; import com.alee.laf.panel.WebPanel; import com.alee.laf.text.WebTextField; import com.alee.managers.hotkey.Hotkey; import com.alee.managers.hotkey.HotkeyManager; import com.alee.managers.hotkey.HotkeyRunnable; import com.alee.managers.language.data.TooltipWay; import com.alee.managers.tooltip.TooltipManager; import com.alee.managers.tooltip.WebCustomTooltipStyle; import com.alee.utils.GraphicsUtils; import com.alee.utils.ImageUtils; import com.alee.utils.SwingUtils; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.geom.GeneralPath; import java.awt.geom.Line2D; import java.awt.image.BufferedImage; /** * User: mgarin Date: 14.02.12 Time: 16:01 */ public class SlidingSearch { public static final ImageIcon searchIcon = new ImageIcon ( SlidingSearch.class.getResource ( "icons/search.png" ) ); private boolean searchShown = false; private final int contentSpacing = 4; private final int shadeWidth = 5; private final int topRound = 16; private final int bottomRound = 6; private final boolean connected = true; private final WebPanel searchPanel; private final SlidingLayout slideLayout; private final WebPanel searchPlate; private final UpperLine leftLine; private final UpperLine rightLine; private final WebTextField searchField; public SlidingSearch ( final JLayeredPane layeredPane ) { super (); final WebPanel topPanel = new WebPanel (); topPanel.setLayout ( new TableLayout ( new double[][]{ { TableLayout.FILL, TableLayout.PREFERRED, TableLayout.FILL }, { TableLayout.PREFERRED } } ) ); topPanel.setOpaque ( false ); searchPanel = new WebPanel () { @Override public boolean contains ( final int x, final int y ) { return topPanel.getBounds ().contains ( x, y ) && super.contains ( x, y ); } }; searchPanel.setOpaque ( false ); slideLayout = new SlidingLayout ( searchPanel ); searchPanel.setLayout ( slideLayout ); searchPanel.add ( topPanel ); searchPlate = new WebPanel () { private final BufferedImage bi = ImageUtils.getBufferedImage ( SlidingSearch.class.getResource ( "icons/searchBg.png" ) ); private final Paint bg = new TexturePaint ( bi, new Rectangle ( 0, 0, bi.getWidth (), bi.getHeight () ) ); @Override protected void paintComponent ( final Graphics g ) { super.paintComponent ( g ); final Graphics2D g2d = ( Graphics2D ) g; final Object aa = GraphicsUtils.setupAntialias ( g2d ); final Shape border = createBorderShape (); GraphicsUtils.drawShade ( g2d, border, WebCustomTooltipStyle.shadeColor, shadeWidth ); g2d.setPaint ( bg ); g2d.fill ( border ); g2d.setPaint ( Color.WHITE ); g2d.draw ( border ); GraphicsUtils.restoreAntialias ( g2d, aa ); } private Shape createBorderShape () { final int leftSpace = connected ? 0 : shadeWidth; final int rightSpace = connected ? 0 : shadeWidth; final int shear = connected ? 0 : -1; final GeneralPath gp = new GeneralPath (); gp.moveTo ( leftSpace, shear ); gp.quadTo ( leftSpace + topRound, shear, leftSpace + topRound, topRound ); gp.lineTo ( leftSpace + topRound, getHeight () - shadeWidth - bottomRound ); gp.quadTo ( leftSpace + topRound, getHeight () - shadeWidth, leftSpace + topRound + bottomRound, getHeight () - shadeWidth ); gp.lineTo ( getWidth () - rightSpace - topRound - bottomRound, getHeight () - shadeWidth ); gp.quadTo ( getWidth () - rightSpace - topRound, getHeight () - shadeWidth, getWidth () - rightSpace - topRound, getHeight () - shadeWidth - bottomRound ); gp.lineTo ( getWidth () - rightSpace - topRound, topRound ); gp.quadTo ( getWidth () - rightSpace - topRound, shear, getWidth () - rightSpace, shear ); return gp; } }; searchPlate.setMargin ( contentSpacing - 1, ( connected ? 0 : shadeWidth ) + topRound + contentSpacing + 1, shadeWidth + contentSpacing, ( connected ? 0 : shadeWidth ) + topRound + contentSpacing ); searchPlate.setOpaque ( false ); searchPlate.setLayout ( new BorderLayout () ); searchPlate.setVisible ( false ); leftLine = new UpperLine (); leftLine.setVisible ( false ); rightLine = new UpperLine (); rightLine.setVisible ( false ); topPanel.add ( leftLine, "0,0" ); topPanel.add ( searchPlate, "1,0" ); topPanel.add ( rightLine, "2,0" ); searchField = new WebTextField ( 15 ); TooltipManager.setTooltip ( searchField, searchIcon, "Quick components search", TooltipWay.down ); searchField.setPainter ( new NinePatchIconPainter ( SlidingSearch.class.getResource ( "icons/searchField.png" ) ) ); searchField.setForeground ( Color.WHITE ); searchField.setCaretColor ( Color.LIGHT_GRAY ); searchField.setHorizontalAlignment ( WebTextField.CENTER ); searchField.addKeyListener ( new KeyAdapter () { @Override public void keyPressed ( final KeyEvent e ) { if ( Hotkey.ENTER.isTriggered ( e ) ) { toggleSearch (); } } } ); searchPlate.add ( searchField ); HotkeyManager.registerHotkey ( layeredPane, Hotkey.CTRL_F, new HotkeyRunnable () { @Override public void run ( final KeyEvent e ) { toggleSearch (); } } ); HotkeyManager.registerHotkey ( layeredPane, Hotkey.ESCAPE, new HotkeyRunnable () { @Override public void run ( final KeyEvent e ) { if ( searchField.getText ().length () > 0 ) { searchField.setText ( "" ); } else if ( searchField.isFocusOwner () ) { searchField.transferFocus (); } } } ); searchField.addFocusListener ( new FocusAdapter () { @Override public void focusLost ( final FocusEvent e ) { hideSearch (); } } ); layeredPane.add ( searchPanel, JLayeredPane.DRAG_LAYER ); layeredPane.addComponentListener ( new ComponentAdapter () { @Override public void componentResized ( final ComponentEvent e ) { searchPanel.setBounds ( 0, 0, layeredPane.getWidth (), layeredPane.getHeight () ); } } ); } public WebTextField getSearchField () { return searchField; } public void toggleSearch () { if ( searchShown ) { hideSearch (); } else { showSearch (); } } public void showSearch () { if ( searchShown || !isSearchEnabled () ) { return; } searchShown = true; leftLine.setVisible ( true ); searchPlate.setVisible ( true ); rightLine.setVisible ( true ); slideLayout.slideIn (); searchField.requestFocusInWindow (); } protected boolean isSearchEnabled () { return true; } public void hideSearch () { if ( searchShown ) { searchShown = false; searchField.setText ( "" ); searchField.transferFocus (); slideLayout.slideOut (); } } private class UpperLine extends JComponent { public UpperLine () { super (); SwingUtils.setOrientation ( this ); } @Override protected void paintComponent ( final Graphics g ) { final Graphics2D g2d = ( Graphics2D ) g; final Object aa = GraphicsUtils.setupAntialias ( g2d ); final Shape border = new Line2D.Double ( 0, 0, getWidth (), 0 ); GraphicsUtils.drawShade ( g2d, border, WebCustomTooltipStyle.shadeColor, shadeWidth ); g2d.setPaint ( Color.WHITE ); g2d.draw ( border ); GraphicsUtils.restoreAntialias ( g2d, aa ); } } }