/*
* #%L
* gitools-ui-platform
* %%
* Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
package org.gitools.ui.platform.imageviewer;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
/**
* The default popup menu for image viewers. The contents of the menu are unspecified and may change between library
* versions.
*
* @author Kazó Csaba
*/
public class DefaultViewerPopup extends JPopupMenu {
private final ImageViewer viewer;
/**
* Creates a popup menu for use with the specified viewer.
*
* @param imageViewer the viewer this popup menu belongs to
*/
public DefaultViewerPopup(ImageViewer imageViewer) {
viewer = imageViewer;
/** Zoom menu **/
final JRadioButtonMenuItem zoomOriginalSize = new JRadioButtonMenuItem("Original size", viewer.getResizeStrategy() == ResizeStrategy.NO_RESIZE);
zoomOriginalSize.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
viewer.setResizeStrategy(ResizeStrategy.NO_RESIZE);
}
});
final JRadioButtonMenuItem zoomShrinkToFit = new JRadioButtonMenuItem("Shrink to fit", viewer.getResizeStrategy() == ResizeStrategy.SHRINK_TO_FIT);
zoomShrinkToFit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
viewer.setResizeStrategy(ResizeStrategy.SHRINK_TO_FIT);
}
});
final JRadioButtonMenuItem zoomResizeToFit = new JRadioButtonMenuItem("Resize to fit", viewer.getResizeStrategy() == ResizeStrategy.RESIZE_TO_FIT);
zoomResizeToFit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
viewer.setResizeStrategy(ResizeStrategy.RESIZE_TO_FIT);
}
});
class CustomZoomEntry {
String label;
double value;
JRadioButtonMenuItem menuItem;
private CustomZoomEntry(String label, double value) {
this.label = label;
this.value = value;
menuItem = new JRadioButtonMenuItem(label, viewer.getResizeStrategy() == ResizeStrategy.CUSTOM_ZOOM && viewer.getZoomFactor() == value);
menuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
viewer.setResizeStrategy(ResizeStrategy.CUSTOM_ZOOM);
viewer.setZoomFactor(CustomZoomEntry.this.value);
}
});
}
}
final CustomZoomEntry[] customZoomEntries = {
new CustomZoomEntry("25%", .25),
new CustomZoomEntry("50%", .50),
new CustomZoomEntry("75%", .75),
new CustomZoomEntry("100%", 1),
new CustomZoomEntry("150%", 1.5),
new CustomZoomEntry("200%", 2),
new CustomZoomEntry("300%", 3),
new CustomZoomEntry("500%", 5),
new CustomZoomEntry("1000%", 10),
new CustomZoomEntry("2000%", 20),
new CustomZoomEntry("5000%", 50)
};
final ButtonGroup group = new ButtonGroup();
group.add(zoomOriginalSize);
group.add(zoomShrinkToFit);
group.add(zoomResizeToFit);
add(zoomOriginalSize);
add(zoomShrinkToFit);
add(zoomResizeToFit);
add(new JSeparator());
for (CustomZoomEntry cze : customZoomEntries) {
add(cze.menuItem);
group.add(cze.menuItem);
}
viewer.addPropertyChangeListener("resizeStrategy", new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
switch ((ResizeStrategy) evt.getNewValue()) {
case NO_RESIZE:
zoomOriginalSize.setSelected(true);
break;
case RESIZE_TO_FIT:
zoomResizeToFit.setSelected(true);
break;
case SHRINK_TO_FIT:
zoomShrinkToFit.setSelected(true);
break;
case CUSTOM_ZOOM:
group.clearSelection();
for (CustomZoomEntry cze : customZoomEntries) {
if (cze.value == viewer.getZoomFactor()) {
cze.menuItem.setSelected(true);
break;
}
}
break;
default:
throw new AssertionError("Unknown resize strategy: " + evt.getNewValue());
}
}
});
viewer.addPropertyChangeListener("zoomFactor", new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (viewer.getResizeStrategy() == ResizeStrategy.CUSTOM_ZOOM) {
group.clearSelection();
for (CustomZoomEntry cze : customZoomEntries) {
if (cze.value == viewer.getZoomFactor()) {
cze.menuItem.setSelected(true);
break;
}
}
}
}
});
}
}