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

jdplus.toolkit.desktop.plugin.components.parts.HasCrosshairSupport Maven / Gradle / Ivy

package jdplus.toolkit.desktop.plugin.components.parts;

import jdplus.toolkit.desktop.plugin.DemetraIcons;
import jdplus.toolkit.desktop.plugin.beans.PropertyChangeBroadcaster;
import ec.util.various.swing.FontAwesome;
import ec.util.various.swing.JCommand;
import org.checkerframework.checker.nullness.qual.NonNull;

import javax.swing.*;
import java.awt.*;

/**
 *
 */
@lombok.experimental.UtilityClass
public class HasCrosshairSupport {

    @NonNull
    public static HasCrosshair of(@NonNull PropertyChangeBroadcaster broadcaster) {
        return new HasCrosshairImpl(broadcaster);
    }

    public static  JMenuItem newToggleCrosshairVisibilityMenu(C component) {
        JCommand.ActionAdapter action = ToggleCrosshairVisibilityCommand.INSTANCE.toAction(component);
        JCheckBoxMenuItem result = new JCheckBoxMenuItem(action);
        result.setText("Show crosshair");
        result.setIcon(DemetraIcons.getPopupMenuIcon(FontAwesome.FA_CROSSHAIRS));
        return result;
    }

    private static final class ToggleCrosshairVisibilityCommand extends JCommand {

        public static final ToggleCrosshairVisibilityCommand INSTANCE = new ToggleCrosshairVisibilityCommand();

        @Override
        public void execute(HasCrosshair component) throws Exception {
            component.setCrosshairVisible(!component.isCrosshairVisible());
        }

        @Override
        public boolean isSelected(HasCrosshair component) {
            return component.isCrosshairVisible();
        }

        @Override
        public JCommand.ActionAdapter toAction(HasCrosshair c) {
            JCommand.ActionAdapter result = super.toAction(c);
            return c instanceof Component ? result.withWeakPropertyChangeListener((Component) c, HasCrosshair.CROSSHAIR_VISIBLE_PROPERTY) : result;
        }
    }

    @lombok.RequiredArgsConstructor
    private static final class HasCrosshairImpl implements HasCrosshair {

        @lombok.NonNull
        private final PropertyChangeBroadcaster broadcaster;

        private static final boolean DEFAULT_CROSSHAIR_VISIBLE = false;
        private boolean crosshairVisible = DEFAULT_CROSSHAIR_VISIBLE;

        @Override
        public boolean isCrosshairVisible() {
            return crosshairVisible;
        }

        @Override
        public void setCrosshairVisible(boolean crosshairVisible) {
            boolean old = this.crosshairVisible;
            this.crosshairVisible = crosshairVisible;
            broadcaster.firePropertyChange(CROSSHAIR_VISIBLE_PROPERTY, old, this.crosshairVisible);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy