/* * Copyright (c) 2008, 2009, 2010 Denis Tulskiy * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * version 3 along with this work. If not, see <http://www.gnu.org/licenses/>. */ package com.tulskiy.musique.gui.components; import com.tulskiy.musique.images.Images; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; /** * Author: Denis Tulskiy * Date: 12/23/10 */ public class SearchField extends JTextField { private ArrayList<ChangeListener> listeners = new ArrayList<ChangeListener>(); private AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.7f); private boolean isLabelFocused = false; public SearchField() { super(); setLayout(new BorderLayout()); final JLabel clear = new JLabel(Images.loadIcon("clear.png")) { @Override protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g; if (!isLabelFocused) g2d.setComposite(alpha); super.paintComponent(g2d); } }; clear.setCursor(Cursor.getDefaultCursor()); clear.addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent e) { isLabelFocused = true; clear.repaint(); } @Override public void mouseExited(MouseEvent e) { isLabelFocused = false; clear.repaint(); } @Override public void mouseClicked(MouseEvent e) { setText(""); } }); // setMargin(new Insets(0, 0, 0, 20)); getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { fireStateChanged(); } @Override public void removeUpdate(DocumentEvent e) { fireStateChanged(); } @Override public void changedUpdate(DocumentEvent e) { fireStateChanged(); } }); add(clear, BorderLayout.LINE_END); } private void fireStateChanged() { ChangeEvent e = new ChangeEvent(this); for (ChangeListener listener : listeners) { listener.stateChanged(e); } } public void addChangeListener(ChangeListener listener) { listeners.add(listener); } }