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

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

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

import jdplus.toolkit.desktop.plugin.beans.PropertyChangeBroadcaster;
import jdplus.toolkit.desktop.plugin.components.ComponentCommand;
import org.checkerframework.checker.nullness.qual.NonNull;

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

@lombok.experimental.UtilityClass
public class HasZoomRatioSupport {

    @NonNull
    public static HasZoomRatio of(@NonNull PropertyChangeBroadcaster broadcaster) {
        return new HasZoomRatioImpl(broadcaster);
    }

    public static  JMenu newZoomRatioMenu(C component) {
        JMenu zoom = new JMenu("Zoom");
        final JSlider slider = new JSlider(25, 200, 100);
        {
            slider.setPreferredSize(new Dimension(50, slider.getPreferredSize().height));
            slider.addChangeListener(event -> component.setZoomRatio(slider.getValue()));
            component.addPropertyChangeListener(HasZoomRatio.ZOOM_RATIO_PROPERTY, evt -> slider.setValue(component.getZoomRatio()));
        }
        zoom.add(slider);
        for (int o : new int[]{200, 100, 75, 50, 25}) {
            zoom.add(new JCheckBoxMenuItem((new ZoomRatioCommand(o).toAction(component)))).setText(o + "%");
        }
        return zoom;
    }

    private static final class ZoomRatioCommand extends ComponentCommand {

        private final int zoomRatio;

        public ZoomRatioCommand(int zoomRatio) {
            super(HasZoomRatio.ZOOM_RATIO_PROPERTY);
            this.zoomRatio = zoomRatio;
        }

        @Override
        public boolean isSelected(HasZoomRatio component) {
            return zoomRatio == component.getZoomRatio();
        }

        @Override
        public void execute(HasZoomRatio component) throws Exception {
            component.setZoomRatio(zoomRatio);
        }
    }

    @lombok.RequiredArgsConstructor
    private static final class HasZoomRatioImpl implements HasZoomRatio {

        @lombok.NonNull
        private final PropertyChangeBroadcaster broadcaster;

        private static final int DEFAULT_ZOOM_RATIO = 100;
        private int zoomRatio = DEFAULT_ZOOM_RATIO;

        @Override
        public int getZoomRatio() {
            return zoomRatio;
        }

        @Override
        public void setZoomRatio(int zoomRatio) {
            int old = this.zoomRatio;
            this.zoomRatio = zoomRatio >= 10 && zoomRatio <= 200 ? zoomRatio : DEFAULT_ZOOM_RATIO;
            broadcaster.firePropertyChange(ZOOM_RATIO_PROPERTY, old, this.zoomRatio);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy