package org.japura.gui;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
/**
* <P>
* Copyright (C) 2012 Carlos Eduardo Leite de Andrade
* <P>
* This library 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.
* <P>
* 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.
* <P>
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <A
* HREF="www.gnu.org/licenses/">www.gnu.org/licenses/</A>
* <P>
* For more information, contact: <A HREF="www.japura.org">www.japura.org</A>
* <P>
*
* @author Carlos Eduardo Leite de Andrade
*/
class WrapperComponent extends JLayeredPane implements MouseListener{
private static final long serialVersionUID = 2895107538779323011L;
private JComponent component;
private JPanel filterPanel;
private MouseListener mouseHandler;
public WrapperComponent(JComboBox component) {
this(component, null);
}
public WrapperComponent(JComboBox component, MouseListener mouseListener) {
filterPanel = new JPanel();
filterPanel.setOpaque(false);
this.mouseHandler = mouseListener;
this.component = component;
add(component, Integer.valueOf(JLayeredPane.DEFAULT_LAYER));
add(filterPanel, Integer.valueOf(JLayeredPane.DEFAULT_LAYER + 1));
filterPanel.addMouseListener(this);
}
@Override
public Dimension getPreferredSize() {
return component.getPreferredSize();
}
@Override
public Dimension getMinimumSize() {
return component.getMinimumSize();
}
@Override
public Dimension getMaximumSize() {
return component.getMaximumSize();
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
component.setEnabled(enabled);
filterPanel.setEnabled(enabled);
}
@Override
public void doLayout() {
// the main layouting is inspired from the BorderLayout
Insets insets = getInsets();
int top = insets.top;
int bottom = this.getHeight() - insets.bottom;
int left = insets.left;
int right = this.getWidth() - insets.right;
component.setBounds(left, top, right - left, bottom - top);
filterPanel.setBounds(left, top, right - left, bottom - top);
}
@Override
public void mouseReleased(MouseEvent e) {
if (isEnabled()) {
if (mouseHandler != null) {
e.setSource(component);
mouseHandler.mouseReleased(e);
}
}
}
@Override
public void mousePressed(MouseEvent e) {
if (isEnabled()) {
component.requestFocusInWindow();
if (mouseHandler != null) {
e.setSource(component);
mouseHandler.mousePressed(e);
}
}
}
@Override
public void mouseExited(MouseEvent e) {
if (isEnabled()) {
e.setSource(component);
component.dispatchEvent(e);
if (mouseHandler != null) {
mouseHandler.mouseExited(e);
}
}
}
@Override
public void mouseEntered(MouseEvent e) {
if (isEnabled()) {
e.setSource(component);
component.dispatchEvent(e);
if (mouseHandler != null) {
mouseHandler.mouseEntered(e);
}
}
}
@Override
public void mouseClicked(MouseEvent e) {
if (isEnabled()) {
if (mouseHandler != null) {
e.setSource(component);
mouseHandler.mouseClicked(e);
}
}
}
}