
se.wfh.libs.common.gui.widgets.AbstractWPicker Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of gui Show documentation
Show all versions of gui Show documentation
Some helper classes i needed for several projects (GUI / Swing parts)
package se.wfh.libs.common.gui.widgets;
import java.awt.Color;
import java.awt.Point;
import java.awt.event.HierarchyBoundsListener;
import java.awt.event.HierarchyEvent;
import java.text.DateFormat;
import java.time.temporal.Temporal;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.Popup;
import javax.swing.PopupFactory;
import se.wfh.libs.common.gui.widgets.datepicker.ColorTheme;
import se.wfh.libs.common.gui.widgets.datepicker.DateConverterHelper;
import se.wfh.libs.common.gui.widgets.datepicker.DefaultColorTheme;
import se.wfh.libs.common.gui.widgets.events.DataChangedEvent;
import se.wfh.libs.common.gui.widgets.events.DataChangedEvent.ChangeType;
import se.wfh.libs.common.gui.widgets.icons.BrowseIcon;
abstract class AbstractWPicker extends
AbstractWTextField {
private static final long serialVersionUID = 1L;
// the color theme to use
private ColorTheme theme = new DefaultColorTheme();
// components
private final JButton btnPopup;
protected final AbstractWPickerPanel pnlPopup;
private Popup popup;
public AbstractWPicker(DateFormat format, AbstractWPickerPanel pnlPopup,
T defval, int columns) {
super(format, defval, columns);
this.pnlPopup = pnlPopup;
pnlPopup.setBorder(BorderFactory.createLineBorder(Color.BLACK));
pnlPopup.addDataChangedListener(event -> handlePopupEvent(event));
btnPopup = new JButton(new BrowseIcon());
btnPopup.addActionListener(event -> togglePopup());
add(btnPopup);
addHierarchyListener(event -> hidePopup());
addHierarchyBoundsListener(new HierarchyBoundsListener() {
@Override
public void ancestorMoved(HierarchyEvent event) {
hidePopup();
}
@Override
public void ancestorResized(HierarchyEvent event) {
hidePopup();
}
});
}
public ColorTheme getTheme() {
return theme;
}
@SuppressWarnings("unchecked")
private void handlePopupEvent(DataChangedEvent event) {
getComponent()
.setValue(DateConverterHelper.toDate((T) event.getNewValue()));
if (!ChangeType.CHANGING.equals(event.getWhy())) {
hidePopup();
setValue((T) event.getNewValue());
}
}
public void hidePopup() {
synchronized (AbstractWPicker.this) {
if (popup != null) {
popup.hide();
popup = null;
pnlPopup.rollbackChanges();
}
}
}
@Override
public boolean isReadonly() {
return !btnPopup.isEnabled();
}
@Override
public void setReadonly(boolean readonly) {
btnPopup.setEnabled(!readonly);
getComponent().setEnabled(!readonly);
hidePopup();
}
public void setTheme(ColorTheme theme) {
this.theme = theme;
pnlPopup.setTheme(theme);
}
private void showPopup() {
synchronized (AbstractWPicker.this) {
if (popup == null) {
Point pos = getLocationOnScreen();
popup = PopupFactory.getSharedInstance().getPopup(null, pnlPopup,
pos.x, pos.y + getHeight());
popup.show();
}
}
}
public void togglePopup() {
synchronized (AbstractWPicker.this) {
if (popup == null) {
showPopup();
} else {
hidePopup();
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy