/**
*
*/
package icy.canvas;
import icy.gui.component.button.ColorChooserButton;
import icy.gui.component.button.ColorChooserButton.ColorChangeListener;
import icy.gui.component.button.IcyButton;
import icy.gui.util.ComponentUtil;
import icy.resource.ResourceUtil;
import icy.resource.icon.IcyIcon;
import icy.util.EventUtil;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
/**
* Setting panel for Canvas2D
*
* @author Stephane
*/
public class Canvas2DSettingPanel extends JPanel
{
/**
*
*/
private static final long serialVersionUID = -6747952036222386920L;
final Canvas2D canvas2D;
/**
* gui
*/
JComboBox zoomComboBox;
JComboBox rotationComboBox;
private IcyButton zoomFitImageButton;
private IcyButton centerImageButton;
private IcyButton zoomPlus;
private IcyButton zoomMinus;
private IcyButton rotateUnclock;
private IcyButton rotateClock;
ColorChooserButton bgColorButton;
public Canvas2DSettingPanel(Canvas2D cnv)
{
super();
this.canvas2D = cnv;
initialize();
// as scale isn't necessary changed (if already 100%)
zoomComboBox.setSelectedItem(Integer.toString((int) (canvas2D.getScaleX() * 100)));
bgColorButton.setColor(new Color(canvas2D.preferences.getInt(Canvas2D.ID_BG_COLOR, 0xFFFFFF)));
bgColorButton.setSelected(canvas2D.preferences.getBoolean(Canvas2D.ID_BG_COLOR_ENABLED, false));
zoomComboBox.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
if (!canvas2D.modifyingZoom)
{
try
{
final double scale = Double.parseDouble((String) zoomComboBox.getSelectedItem()) / 100;
// set mouse position on view center
canvas2D.centerMouseOnView();
// set new scale
canvas2D.setScale(scale, scale, true, true);
}
catch (NumberFormatException E)
{
// ignore change
}
}
}
});
rotationComboBox.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
if (!canvas2D.modifyingRotation)
{
try
{
final double angle = Double.parseDouble((String) rotationComboBox.getSelectedItem());
// we first apply modulo
canvas2D.setRotation(canvas2D.getRotation(), false);
// then set new angle
canvas2D.setRotation((angle * Math.PI) / 180d, true);
}
catch (NumberFormatException E)
{
// ignore change
}
}
}
});
zoomPlus.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
final double scale = canvas2D.smoothTransform.getDestValue(Canvas2D.SCALE_X) * 1.25;
// set mouse position on view center
canvas2D.centerMouseOnView();
// apply scale
canvas2D.setScale(scale, scale, true, true);
}
});
zoomMinus.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
final double scale = canvas2D.smoothTransform.getDestValue(Canvas2D.SCALE_X) * 0.8;
// set mouse position on view center
canvas2D.centerMouseOnView();
// apply scale
canvas2D.setScale(scale, scale, true, true);
}
});
rotateUnclock.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
canvas2D.setRotation(canvas2D.smoothTransform.getDestValue(Canvas2D.ROT) + (Math.PI / 8), true);
}
});
rotateClock.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
canvas2D.setRotation(canvas2D.smoothTransform.getDestValue(Canvas2D.ROT) - (Math.PI / 8), true);
}
});
zoomFitImageButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
canvas2D.fitCanvasToImage();
}
});
centerImageButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
canvas2D.centerImage();
}
});
bgColorButton.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent e)
{
if (EventUtil.isRightMouseButton(e))
{
bgColorButton.setSelected(!bgColorButton.isSelected());
canvas2D.backgroundColorEnabledChanged();
}
};
});
bgColorButton.addColorChangeListener(new ColorChangeListener()
{
@Override
public void colorChanged(ColorChooserButton source)
{
canvas2D.backgroundColorChanged();
}
});
}
private void initialize()
{
// subPanel.add(GuiUtil.createLineBoxPanel(Box.createHorizontalStrut(4),
// GuiUtil.createFixedWidthBoldLabel("Zoom", 70), zoomComboBox,
// GuiUtil.createFixedWidthBoldLabel("%", 20), Box.createHorizontalGlue(), zoomMinus,
// Box.createHorizontalStrut(4), zoomPlus, Box.createHorizontalStrut(4)));
// subPanel.add(Box.createVerticalStrut(4));
// subPanel.add(GuiUtil.createLineBoxPanel(Box.createHorizontalStrut(4),
// GuiUtil.createFixedWidthBoldLabel("Rotation", 70), rotationComboBox,
// GuiUtil.createFixedWidthBoldLabel("�", 20), Box.createHorizontalGlue(), rotateUnclock,
// Box.createHorizontalStrut(4), rotateClock, Box.createHorizontalStrut(4)));
setLayout(new BorderLayout());
JPanel panel = new JPanel();
add(panel, BorderLayout.SOUTH);
GridBagLayout gbl_panel = new GridBagLayout();
gbl_panel.columnWidths = new int[] {60, 0, 20, 0, 0, 8, 0, 0};
gbl_panel.rowHeights = new int[] {0, 0, 0};
gbl_panel.columnWeights = new double[] {0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0};
gbl_panel.rowWeights = new double[] {0.0, 0.0, Double.MIN_VALUE};
panel.setLayout(gbl_panel);
JLabel label_1 = new JLabel("Zoom");
label_1.setFont(new Font("Tahoma", Font.BOLD, 11));
GridBagConstraints gbc_label_1 = new GridBagConstraints();
gbc_label_1.anchor = GridBagConstraints.EAST;
gbc_label_1.insets = new Insets(0, 0, 5, 5);
gbc_label_1.gridx = 0;
gbc_label_1.gridy = 0;
panel.add(label_1, gbc_label_1);
zoomComboBox = new JComboBox(new String[] {"10", "50", "100", "200", "400", "1000"});
zoomComboBox.setEditable(true);
zoomComboBox.setToolTipText("Select zoom factor");
zoomComboBox.setSelectedIndex(2);
ComponentUtil.setFixedWidth(zoomComboBox, 64);
GridBagConstraints gbc_zoomComboBox = new GridBagConstraints();
gbc_zoomComboBox.fill = GridBagConstraints.HORIZONTAL;
gbc_zoomComboBox.insets = new Insets(0, 0, 5, 1);
gbc_zoomComboBox.gridx = 1;
gbc_zoomComboBox.gridy = 0;
panel.add(zoomComboBox, gbc_zoomComboBox);
JLabel label_2 = new JLabel("%");
label_2.setFont(new Font("Tahoma", Font.BOLD, 11));
GridBagConstraints gbc_label_2 = new GridBagConstraints();
gbc_label_2.anchor = GridBagConstraints.WEST;
gbc_label_2.insets = new Insets(0, 0, 5, 5);
gbc_label_2.gridx = 2;
gbc_label_2.gridy = 0;
panel.add(label_2, gbc_label_2);
zoomMinus = new IcyButton(new IcyIcon(ResourceUtil.ICON_MINUS, Canvas2D.ICON_SIZE));
zoomMinus.setFlat(true);
zoomMinus.setToolTipText("Reduce zoom factor");
GridBagConstraints gbc_zoomMinus_1 = new GridBagConstraints();
gbc_zoomMinus_1.insets = new Insets(0, 0, 5, 1);
gbc_zoomMinus_1.gridx = 3;
gbc_zoomMinus_1.gridy = 0;
panel.add(zoomMinus, gbc_zoomMinus_1);
zoomPlus = new IcyButton(new IcyIcon(ResourceUtil.ICON_PLUS, Canvas2D.ICON_SIZE));
zoomPlus.setFlat(true);
zoomPlus.setToolTipText("Increase zoom factor");
GridBagConstraints gbc_zoomPlus_1 = new GridBagConstraints();
gbc_zoomPlus_1.insets = new Insets(0, 0, 5, 5);
gbc_zoomPlus_1.gridx = 4;
gbc_zoomPlus_1.gridy = 0;
panel.add(zoomPlus, gbc_zoomPlus_1);
JLabel label_3 = new JLabel("Rotation");
label_3.setFont(new Font("Tahoma", Font.BOLD, 11));
GridBagConstraints gbc_label_3 = new GridBagConstraints();
gbc_label_3.anchor = GridBagConstraints.EAST;
gbc_label_3.insets = new Insets(0, 0, 0, 5);
gbc_label_3.gridx = 0;
gbc_label_3.gridy = 1;
panel.add(label_3, gbc_label_3);
rotationComboBox = new JComboBox(new String[] {"0", "45", "90", "135", "180", "225", "270", "315"});
ComponentUtil.setFixedWidth(rotationComboBox, 64);
rotationComboBox.setEditable(true);
rotationComboBox.setToolTipText("Select rotation angle");
rotationComboBox.setSelectedIndex(0);
GridBagConstraints gbc_rotationComboBox = new GridBagConstraints();
gbc_rotationComboBox.fill = GridBagConstraints.HORIZONTAL;
gbc_rotationComboBox.insets = new Insets(0, 0, 0, 1);
gbc_rotationComboBox.gridx = 1;
gbc_rotationComboBox.gridy = 1;
panel.add(rotationComboBox, gbc_rotationComboBox);
JLabel label_4 = new JLabel("�");
label_4.setFont(new Font("Tahoma", Font.BOLD, 11));
GridBagConstraints gbc_label_4 = new GridBagConstraints();
gbc_label_4.anchor = GridBagConstraints.WEST;
gbc_label_4.insets = new Insets(0, 0, 0, 5);
gbc_label_4.gridx = 2;
gbc_label_4.gridy = 1;
panel.add(label_4, gbc_label_4);
rotateUnclock = new IcyButton(new IcyIcon(ResourceUtil.ICON_ROTATE_UNCLOCK, Canvas2D.ICON_SIZE));
rotateUnclock.setFlat(true);
rotateUnclock.setToolTipText("Rotate counter clockwise");
GridBagConstraints gbc_rotateUnclock_1 = new GridBagConstraints();
gbc_rotateUnclock_1.insets = new Insets(0, 0, 0, 1);
gbc_rotateUnclock_1.gridx = 3;
gbc_rotateUnclock_1.gridy = 1;
panel.add(rotateUnclock, gbc_rotateUnclock_1);
rotateClock = new IcyButton(new IcyIcon(ResourceUtil.ICON_ROTATE_CLOCK, Canvas2D.ICON_SIZE));
rotateClock.setFlat(true);
rotateClock.setToolTipText("Rotate clockwise");
GridBagConstraints gbc_rotateClock_1 = new GridBagConstraints();
gbc_rotateClock_1.insets = new Insets(0, 0, 0, 5);
gbc_rotateClock_1.gridx = 4;
gbc_rotateClock_1.gridy = 1;
panel.add(rotateClock, gbc_rotateClock_1);
zoomFitImageButton = new IcyButton(new IcyIcon(Canvas2D.ICON_FIT_IMAGE));
zoomFitImageButton.setFlat(true);
zoomFitImageButton.setToolTipText("Fit window to image size");
GridBagConstraints gbc_zoomFitImage = new GridBagConstraints();
gbc_zoomFitImage.insets = new Insets(0, 0, 0, 5);
gbc_zoomFitImage.gridx = 6;
gbc_zoomFitImage.gridy = 1;
panel.add(zoomFitImageButton, gbc_zoomFitImage);
centerImageButton = new IcyButton(new IcyIcon(Canvas2D.ICON_CENTER_IMAGE));
centerImageButton.setFlat(true);
centerImageButton.setToolTipText("Center image in window");
GridBagConstraints gbc_centerImageButton = new GridBagConstraints();
gbc_centerImageButton.gridx = 7;
gbc_centerImageButton.gridy = 1;
panel.add(centerImageButton, gbc_centerImageButton);
bgColorButton = new ColorChooserButton();
bgColorButton
.setToolTipText("Left click to change background color, right click to enable/disable background color");
GridBagConstraints gbc_bgColorButton = new GridBagConstraints();
gbc_bgColorButton.gridwidth = 2;
gbc_bgColorButton.fill = GridBagConstraints.HORIZONTAL;
gbc_bgColorButton.insets = new Insets(0, 0, 5, 0);
gbc_bgColorButton.gridx = 6;
gbc_bgColorButton.gridy = 0;
panel.add(bgColorButton, gbc_bgColorButton);
}
public void updateZoomState(String zoom)
{
// try to select current zoom level
zoomComboBox.setSelectedItem(zoom);
}
public void updateRotationState(String rotInfo)
{
// try to select current rotation angle
rotationComboBox.setSelectedItem(rotInfo);
}
public boolean isBackgroundColorEnabled()
{
return bgColorButton.isSelected();
}
public void setBackgroundColorEnabled(boolean value)
{
bgColorButton.setSelected(value);
}
public Color getBackgroundColor()
{
return bgColorButton.getColor();
}
public void setBackgroundColor(Color color)
{
bgColorButton.setColor(color);
}
}