/*
* Copyright (C) 2014 Alfons Wirtz
* website www.freerouting.net
*
* 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 at <http://www.gnu.org/licenses/>
* for more details.
*
* DisplayMiscWindow.java
*
* Created on 20. Dezember 2004, 08:23
*/
package gui;
/**
* Window for interactive changing of miscellanious display properties.
*
* @author Alfons Wirtz
*/
public class WindowDisplayMisc extends BoardSavableSubWindow
{
/** Creates a new instance of DisplayMiscWindow */
public WindowDisplayMisc(BoardFrame p_board_frame)
{
this.panel = p_board_frame.board_panel;
java.util.ResourceBundle resources =
java.util.ResourceBundle.getBundle("gui.resources.DisplayMisc", p_board_frame.get_locale());
this.setTitle(resources.getString("title"));
// Create main panel
final javax.swing.JPanel main_panel = new javax.swing.JPanel();
getContentPane().add(main_panel);
// Initialize gridbag layout.
java.awt.GridBagLayout gridbag = new java.awt.GridBagLayout();
main_panel.setLayout(gridbag);
java.awt.GridBagConstraints gridbag_constraints = new java.awt.GridBagConstraints();
gridbag_constraints.anchor = java.awt.GridBagConstraints.WEST;
gridbag_constraints.gridwidth = java.awt.GridBagConstraints.RELATIVE;
// add label and buttongroup for the apearance of the cross hair cursor.
javax.swing.JLabel cursor_label = new javax.swing.JLabel(" " + resources.getString("cross_hair_cursor"));
gridbag_constraints.gridwidth = java.awt.GridBagConstraints.RELATIVE;
gridbag_constraints.gridheight = 2;
gridbag.setConstraints(cursor_label, gridbag_constraints);
main_panel.add(cursor_label, gridbag_constraints);
gridbag_constraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridbag_constraints.gridheight = 1;
small_cursor_checkbox = new javax.swing.JRadioButton(resources.getString("small"));
small_cursor_checkbox.setToolTipText(resources.getString("cursor_checkbox_tooltip"));
small_cursor_checkbox.addActionListener(new SmallCursorListener());
gridbag.setConstraints(small_cursor_checkbox, gridbag_constraints);
main_panel.add(small_cursor_checkbox, gridbag_constraints);
big_cursor_checkbox = new javax.swing.JRadioButton(resources.getString("big"));
big_cursor_checkbox.addActionListener(new BigCursorListener());
big_cursor_checkbox.setToolTipText(resources.getString("cursor_checkbox_tooltip"));
gridbag.setConstraints(big_cursor_checkbox, gridbag_constraints);
main_panel.add(big_cursor_checkbox, gridbag_constraints);
javax.swing.ButtonGroup cursor_button_group = new javax.swing.ButtonGroup();
cursor_button_group.add(small_cursor_checkbox);
cursor_button_group.add(big_cursor_checkbox);
javax.swing.JLabel separator = new javax.swing.JLabel(" ---------------------------------------- ");
gridbag.setConstraints(separator, gridbag_constraints);
main_panel.add(separator, gridbag_constraints);
// Add label and buttongroup for the rotation of the board.
javax.swing.JLabel rotation_label = new javax.swing.JLabel(" " + resources.getString("rotation"));
gridbag_constraints.gridwidth = java.awt.GridBagConstraints.RELATIVE;
gridbag_constraints.gridheight = 4;
gridbag.setConstraints(rotation_label, gridbag_constraints);
main_panel.add(rotation_label, gridbag_constraints);
gridbag_constraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridbag_constraints.gridheight = 1;
rotation_none_checkbox = new javax.swing.JRadioButton(resources.getString("none"));
gridbag.setConstraints(rotation_none_checkbox, gridbag_constraints);
main_panel.add(rotation_none_checkbox, gridbag_constraints);
rotation_90_degree_checkbox = new javax.swing.JRadioButton(resources.getString("90_degree"));
gridbag.setConstraints(rotation_90_degree_checkbox, gridbag_constraints);
main_panel.add(rotation_90_degree_checkbox, gridbag_constraints);
rotation_180_degree_checkbox = new javax.swing.JRadioButton(resources.getString("180_degree"));
gridbag.setConstraints(rotation_180_degree_checkbox, gridbag_constraints);
main_panel.add(rotation_180_degree_checkbox, gridbag_constraints);
rotation_270_degree_checkbox = new javax.swing.JRadioButton(resources.getString("-90_degree"));
gridbag.setConstraints(rotation_270_degree_checkbox, gridbag_constraints);
main_panel.add(rotation_270_degree_checkbox, gridbag_constraints);
javax.swing.ButtonGroup rotation_button_group = new javax.swing.ButtonGroup();
rotation_button_group.add(rotation_none_checkbox);
rotation_button_group.add(rotation_90_degree_checkbox);
rotation_button_group.add(rotation_180_degree_checkbox);
rotation_button_group.add(rotation_270_degree_checkbox);
rotation_none_checkbox.addActionListener(new RotationNoneListener());
rotation_90_degree_checkbox.addActionListener(new Rotation90Listener());
rotation_180_degree_checkbox.addActionListener(new Rotation180Listener());
rotation_270_degree_checkbox.addActionListener(new Rotation270Listener());
separator = new javax.swing.JLabel(" ---------------------------------------- ");
gridbag.setConstraints(separator, gridbag_constraints);
main_panel.add(separator, gridbag_constraints);
// add label and buttongroup for the mirroring of the board.
javax.swing.JLabel mirroring_label = new javax.swing.JLabel(" " + resources.getString("board_mirroring"));
gridbag_constraints.gridwidth = java.awt.GridBagConstraints.RELATIVE;
gridbag_constraints.gridheight = 3;
gridbag.setConstraints(mirroring_label, gridbag_constraints);
main_panel.add(mirroring_label, gridbag_constraints);
gridbag_constraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridbag_constraints.gridheight = 1;
mirror_none_checkbox = new javax.swing.JRadioButton(resources.getString("none"));
mirror_none_checkbox.addActionListener(new MirrorNoneListener());
gridbag.setConstraints(mirror_none_checkbox, gridbag_constraints);
main_panel.add(mirror_none_checkbox, gridbag_constraints);
vertical_mirror_checkbox = new javax.swing.JRadioButton(resources.getString("left_right"));
vertical_mirror_checkbox.addActionListener(new VerticalMirrorListener());
gridbag.setConstraints(vertical_mirror_checkbox, gridbag_constraints);
main_panel.add(vertical_mirror_checkbox, gridbag_constraints);
horizontal_mirror_checkbox = new javax.swing.JRadioButton(resources.getString("top_bottom"));
horizontal_mirror_checkbox.addActionListener(new HorizontalMirrorListener());
gridbag.setConstraints(horizontal_mirror_checkbox, gridbag_constraints);
main_panel.add(horizontal_mirror_checkbox, gridbag_constraints);
javax.swing.ButtonGroup mirroring_button_group = new javax.swing.ButtonGroup();
mirroring_button_group.add(mirror_none_checkbox);
mirroring_button_group.add(vertical_mirror_checkbox);
mirroring_button_group.add(horizontal_mirror_checkbox);
separator = new javax.swing.JLabel(" ---------------------------------------- ");
gridbag.setConstraints(separator, gridbag_constraints);
main_panel.add(separator, gridbag_constraints);
// add slider for automatic layer dimming
gridbag_constraints.insets = new java.awt.Insets(5, 10, 5, 10);
javax.swing.JLabel auto_layer_dim_label = new javax.swing.JLabel(resources.getString("layer_dimming"));
auto_layer_dim_label.setToolTipText(resources.getString("layer_dimming_tooltip"));
gridbag.setConstraints(auto_layer_dim_label, gridbag_constraints);
main_panel.add(auto_layer_dim_label);
this.auto_layer_dim_slider = new javax.swing.JSlider(0, MAX_SLIDER_VALUE);
gridbag.setConstraints(auto_layer_dim_slider, gridbag_constraints);
main_panel.add(auto_layer_dim_slider);
this.auto_layer_dim_slider.addChangeListener(new SliderChangeListener());
p_board_frame.set_context_sensitive_help(this, "WindowDisplay_Miscellanious");
this.refresh();
this.pack();
this.setResizable(false);
}
/**
* Refreshs the displayed values in this window.
*/
public void refresh()
{
small_cursor_checkbox.setSelected(!panel.is_custom_cross_hair_cursor());
big_cursor_checkbox.setSelected(panel.is_custom_cross_hair_cursor());
int ninety_degree_rotation =
panel.board_handling.graphics_context.coordinate_transform.get_90_degree_rotation();
if (ninety_degree_rotation == 0)
{
rotation_none_checkbox.setSelected(true);
}
else if (ninety_degree_rotation == 1)
{
rotation_90_degree_checkbox.setSelected(true);
}
else if (ninety_degree_rotation == 2)
{
rotation_180_degree_checkbox.setSelected(true);
}
else if (ninety_degree_rotation == 3)
{
rotation_270_degree_checkbox.setSelected(true);
}
else
{
System.out.println("DisplayMiscWindow: unexpected ninety_degree_rotation");
rotation_none_checkbox.setSelected(true);
}
boolean is_mirror_left_right = panel.board_handling.graphics_context.coordinate_transform.is_mirror_left_right();
boolean is_mirror_top_button = panel.board_handling.graphics_context.coordinate_transform.is_mirror_top_bottom();
mirror_none_checkbox.setSelected(!(is_mirror_left_right || is_mirror_top_button));
vertical_mirror_checkbox.setSelected(
panel.board_handling.graphics_context.coordinate_transform.is_mirror_left_right());
horizontal_mirror_checkbox.setSelected(
panel.board_handling.graphics_context.coordinate_transform.is_mirror_top_bottom());
int curr_slider_value =
(int) Math.round(MAX_SLIDER_VALUE * ( 1 - panel.board_handling.graphics_context.get_auto_layer_dim_factor()));
auto_layer_dim_slider.setValue(curr_slider_value);
}
private final BoardPanel panel;
private final javax.swing.JRadioButton small_cursor_checkbox;
private final javax.swing.JRadioButton big_cursor_checkbox;
private final javax.swing.JRadioButton rotation_none_checkbox;
private final javax.swing.JRadioButton rotation_90_degree_checkbox;
private final javax.swing.JRadioButton rotation_180_degree_checkbox;
private final javax.swing.JRadioButton rotation_270_degree_checkbox;
private final javax.swing.JRadioButton mirror_none_checkbox;
private final javax.swing.JRadioButton vertical_mirror_checkbox;
private final javax.swing.JRadioButton horizontal_mirror_checkbox;
private final javax.swing.JSlider auto_layer_dim_slider;
private static final int MAX_SLIDER_VALUE = 100;
private class SmallCursorListener implements java.awt.event.ActionListener
{
public void actionPerformed(java.awt.event.ActionEvent p_evt)
{
panel.set_custom_crosshair_cursor(false);
}
}
private class BigCursorListener implements java.awt.event.ActionListener
{
public void actionPerformed(java.awt.event.ActionEvent p_evt)
{
panel.set_custom_crosshair_cursor(true);
}
}
private class RotationNoneListener implements java.awt.event.ActionListener
{
public void actionPerformed(java.awt.event.ActionEvent p_evt)
{
boardgraphics.CoordinateTransform coordinate_transform
= panel.board_handling.graphics_context.coordinate_transform;
coordinate_transform.set_rotation(0);
panel.repaint();
}
}
private class Rotation90Listener implements java.awt.event.ActionListener
{
public void actionPerformed(java.awt.event.ActionEvent p_evt)
{
boardgraphics.CoordinateTransform coordinate_transform
= panel.board_handling.graphics_context.coordinate_transform;
coordinate_transform.set_rotation(0.5 * Math.PI);
panel.repaint();
}
}
private class Rotation180Listener implements java.awt.event.ActionListener
{
public void actionPerformed(java.awt.event.ActionEvent p_evt)
{
boardgraphics.CoordinateTransform coordinate_transform
= panel.board_handling.graphics_context.coordinate_transform;
coordinate_transform.set_rotation(Math.PI);
panel.repaint();
}
}
private class Rotation270Listener implements java.awt.event.ActionListener
{
public void actionPerformed(java.awt.event.ActionEvent p_evt)
{
boardgraphics.CoordinateTransform coordinate_transform
= panel.board_handling.graphics_context.coordinate_transform;
coordinate_transform.set_rotation(1.5 * Math.PI);
panel.repaint();
}
}
private class MirrorNoneListener implements java.awt.event.ActionListener
{
public void actionPerformed(java.awt.event.ActionEvent p_evt)
{
boardgraphics.CoordinateTransform coordinate_transform
= panel.board_handling.graphics_context.coordinate_transform;
if(!(coordinate_transform.is_mirror_left_right() || coordinate_transform.is_mirror_top_bottom()))
{
return; // mirroring already switched off
}
// remember the old viewort center to retain the displayed section of the board.
geometry.planar.FloatPoint old_viewport_center =
coordinate_transform.screen_to_board(panel.get_viewport_center());
coordinate_transform.set_mirror_left_right(false);
coordinate_transform.set_mirror_top_bottom(false);
panel.set_viewport_center(coordinate_transform.board_to_screen(old_viewport_center));
panel.repaint();
}
}
private class VerticalMirrorListener implements java.awt.event.ActionListener
{
public void actionPerformed(java.awt.event.ActionEvent p_evt)
{
boardgraphics.CoordinateTransform coordinate_transform
= panel.board_handling.graphics_context.coordinate_transform;
if (coordinate_transform.is_mirror_left_right())
{
return; // already mirrored
}
// remember the old viewort center to retain the displayed section of the board.
geometry.planar.FloatPoint old_viewport_center =
coordinate_transform.screen_to_board(panel.get_viewport_center());
coordinate_transform.set_mirror_left_right(true);
coordinate_transform.set_mirror_top_bottom(false);
panel.set_viewport_center(coordinate_transform.board_to_screen(old_viewport_center));
panel.repaint();
}
}
private class HorizontalMirrorListener implements java.awt.event.ActionListener
{
public void actionPerformed(java.awt.event.ActionEvent p_evt)
{
boardgraphics.CoordinateTransform coordinate_transform
= panel.board_handling.graphics_context.coordinate_transform;
if (coordinate_transform.is_mirror_top_bottom())
{
return; // already mirrored
}
// remember the old viewort center to retain the displayed section of the board.
geometry.planar.FloatPoint old_viewport_center =
coordinate_transform.screen_to_board(panel.get_viewport_center());
coordinate_transform.set_mirror_top_bottom(true);
coordinate_transform.set_mirror_left_right(false);
panel.set_viewport_center(coordinate_transform.board_to_screen(old_viewport_center));
panel.repaint();
}
}
private class SliderChangeListener implements javax.swing.event.ChangeListener
{
public void stateChanged(javax.swing.event.ChangeEvent evt)
{
double new_value = 1 - (double) auto_layer_dim_slider.getValue()/(double) MAX_SLIDER_VALUE;
panel.board_handling.graphics_context.set_auto_layer_dim_factor(new_value);
panel.repaint();
}
}
}