All Downloads are FREE. Search and download functionalities are using the official Maven repository.

se.wfh.libs.common.gui.widgets.AbstractWPicker Maven / Gradle / Ivy

There is a newer version: 0.17
Show newest version
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