/******************************************************************************* * Copyright (c) 2016 Weasis Team and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Nicolas Roduit - initial API and implementation *******************************************************************************/ package org.weasis.core.ui.editor.image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Objects; import javax.swing.ButtonGroup; import javax.swing.JCheckBoxMenuItem; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.JRadioButtonMenuItem; import org.weasis.core.api.gui.util.ActionState; import org.weasis.core.api.gui.util.ActionW; import org.weasis.core.api.gui.util.SliderChangeListener; import org.weasis.core.ui.Messages; import org.weasis.core.ui.editor.image.ZoomWin.SyncType; /** * The Class PopUpMenuOnZoom. * * @author Nicolas Roduit */ public class PopUpMenuOnZoom extends JPopupMenu { private static final int[] magnify = { 1, 2, 3, 4, 6 }; /** The display image zone */ private final ZoomWin zoomWin; private final JMenuItem jMenuItemZoom = new JMenuItem(); private final ButtonGroup buttonMagnify = new ButtonGroup(); private JRadioButtonMenuItem[] jRadioButtonMenuItemMagnify; private final JMenu jMenuMagnify = new JMenu(); private final JMenu jMenuImage = new JMenu(); private final JRadioButtonMenuItem jMenuItemMagnifyOther = new JRadioButtonMenuItem(); private final JCheckBoxMenuItem jCheckBoxMenuItemDraw = new JCheckBoxMenuItem(); private final JCheckBoxMenuItem jCheckBoxMenutemSychronize = new JCheckBoxMenuItem(); private final JMenuItem resetFreeze = new JMenuItem(Messages.getString("PopUpMenuOnZoom.reset")); //$NON-NLS-1$ private final ActionListener magnifyListener; public PopUpMenuOnZoom(ZoomWin zoomWin) { this.zoomWin = Objects.requireNonNull(zoomWin); magnifyListener = this::magnifyActionPerformed; init(); } private void init() { jMenuItemZoom.setText(Messages.getString("PopUpMenuOnZoom.hide")); //$NON-NLS-1$ jMenuItemZoom.addActionListener(e -> zoomWin.hideZoom()); jCheckBoxMenuItemDraw.setText(Messages.getString("PopUpMenuOnZoom.showDraw")); //$NON-NLS-1$ jCheckBoxMenuItemDraw.addActionListener(e -> { zoomWin.setActionInView(ActionW.DRAWINGS.cmd(), jCheckBoxMenuItemDraw.isSelected()); zoomWin.repaint(); }); jMenuImage.setText(Messages.getString("PopUpMenuOnZoom.image")); //$NON-NLS-1$ final JMenuItem freezParams = new JMenuItem(Messages.getString("PopUpMenuOnZoom.freeze")); //$NON-NLS-1$ freezParams.addActionListener(e -> zoomWin.setFreezeImage(SyncType.PARENT_PARAMETERS)); jMenuImage.add(freezParams); final JMenuItem freeze = new JMenuItem(Messages.getString("PopUpMenuOnZoom.freezeImg")); //$NON-NLS-1$ freeze.addActionListener(e -> zoomWin.setFreezeImage(SyncType.PARENT_IMAGE)); jMenuImage.add(freeze); jMenuImage.addSeparator(); resetFreeze.addActionListener(e -> zoomWin.setFreezeImage(null)); jMenuImage.add(resetFreeze); jMenuMagnify.setText(Messages.getString("PopUpMenuOnZoom.magnify")); //$NON-NLS-1$ jCheckBoxMenutemSychronize.setText(Messages.getString("PopUpMenuOnZoom.synch")); //$NON-NLS-1$ jCheckBoxMenutemSychronize.addActionListener(e -> { zoomWin.setActionInView(ZoomWin.SYNCH_CMD, jCheckBoxMenutemSychronize.isSelected()); zoomWin.updateZoom(); }); this.add(jMenuItemZoom); this.addSeparator(); this.add(jCheckBoxMenuItemDraw); this.add(jCheckBoxMenutemSychronize); this.add(jMenuMagnify); iniMenuItemZoomMagnify(); this.add(jMenuImage); } public void iniMenuItemZoomMagnify() { jRadioButtonMenuItemMagnify = new JRadioButtonMenuItem[magnify.length]; for (int i = 0; i < jRadioButtonMenuItemMagnify.length; i++) { JRadioButtonMenuItem item = new JRadioButtonMenuItem(); item.setText(magnify[i] + "X"); //$NON-NLS-1$ buttonMagnify.add(item); item.addActionListener(magnifyListener); jMenuMagnify.add(item); jRadioButtonMenuItemMagnify[i] = item; } } public void enableMenuItem() { // Do not trigger actionLinstener jCheckBoxMenutemSychronize.setSelected((Boolean) zoomWin.getActionValue(ZoomWin.SYNCH_CMD)); jCheckBoxMenuItemDraw.setSelected((Boolean) zoomWin.getActionValue(ActionW.DRAWINGS.cmd())); Object type = zoomWin.getActionValue(ZoomWin.FREEZE_CMD); resetFreeze.setEnabled(SyncType.PARENT_PARAMETERS.equals(type) || SyncType.PARENT_IMAGE.equals(type)); // Get current zoom magnitude boolean noselection = true; if (jRadioButtonMenuItemMagnify.length < jMenuMagnify.getItemCount()) { jMenuMagnify.remove(jMenuItemMagnifyOther); } Double ratio = (Double) zoomWin.getActionValue(ActionW.ZOOM.cmd()); if (ratio == null) { ratio = 1.0; } int currentZoomRatio = (int) (ratio * 100.0); for (int i = 0; i < jRadioButtonMenuItemMagnify.length; i++) { if ((magnify[i] * 100) == currentZoomRatio) { JRadioButtonMenuItem item3 = jRadioButtonMenuItemMagnify[i]; item3.setSelected(true); noselection = false; break; } } if (noselection) { ratio = Math.abs(ratio); jMenuItemMagnifyOther.setText(ratio + "X"); //$NON-NLS-1$ buttonMagnify.add(jMenuItemMagnifyOther); if ((magnify[magnify.length - 1]) < ratio) { jMenuMagnify.add(jMenuItemMagnifyOther); } else { int k = 0; for (int i = 0; i < magnify.length; i++) { if ((magnify[i]) > ratio) { k = i; break; } } jMenuMagnify.add(jMenuItemMagnifyOther, k); } jMenuItemMagnifyOther.setSelected(true); } } private void magnifyActionPerformed(ActionEvent e) { if (e.getSource() instanceof JRadioButtonMenuItem) { JRadioButtonMenuItem item = (JRadioButtonMenuItem) e.getSource(); for (int i = 0; i < jRadioButtonMenuItemMagnify.length; i++) { if (item.equals(jRadioButtonMenuItemMagnify[i])) { ImageViewerEventManager<?> manager = zoomWin.getView2d().getEventManager(); ActionState zoomAction = manager.getAction(ActionW.LENSZOOM); if (zoomAction instanceof SliderChangeListener) { ((SliderChangeListener) zoomAction).setRealValue(magnify[i]); } break; } } } } }