/*
* 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.
*
* InteractiveState.java
*
* Created on 5. November 2003, 12:55
*/
package interactive;
import geometry.planar.FloatPoint;
import java.awt.Graphics;
/**
* Common base class of all interaction states with the graphical interface
*
* @author Alfons Wirtz
*
*/
public class InteractiveState
{
/** Creates a new instance of InteractiveState */
protected InteractiveState(InteractiveState p_return_state, BoardHandling p_board_handling, Logfile p_logfile)
{
this.return_state = p_return_state;
this.hdlg = p_board_handling;
this.logfile = p_logfile;
this.resources =
java.util.ResourceBundle.getBundle("interactive.resources.InteractiveState", p_board_handling.get_locale());
}
/**
* default draw function to be overwritten in derived classes
*/
public void draw(Graphics p_graphics)
{
}
/**
* Default function to be overwritten in derived classes.
* Returns the return_state of this state, if the state is left
* after the method, or else this state.
*/
public InteractiveState left_button_clicked(FloatPoint p_location)
{
return this;
}
/*
* Actions to be taken when a mouse button is released.
* Default function to be overwritten in derived classes.
* Returns the return_state of this state, if the state is left
* after the method, or else this state.
*/
public InteractiveState button_released()
{
return this;
}
/**
* Actions to be taken, when the location of the mouse pointer changes.
* Default function to be overwritten in derived classes.
* Returns the return_state of this state, if the state ends
* after the method, or else this state.
*/
public InteractiveState mouse_moved()
{
FloatPoint mouse_position =
hdlg.coordinate_transform.board_to_user(hdlg.get_current_mouse_position());
hdlg.screen_messages.set_mouse_position(mouse_position);
return this;
}
/**
* Actions to be taken when the mouse moves with a button pressed down.
* Default function to be overwritten in derived classes.
* Returns the return_state of this state, if the state is left
* after the method, or else this state.
*/
public InteractiveState mouse_dragged(FloatPoint p_point)
{
return this;
}
/**
* Actions to be taken when the left mouse button is pressed down.
* Default function to be overwritten in derived classes.
* Returns the return_state of this state, if the state is left
* after the method, or else this state.
*/
public InteractiveState mouse_pressed(FloatPoint p_point)
{
return this;
}
/**
* Action to be taken, when the mouse wheel was turned..
*/
public InteractiveState mouse_wheel_moved(int p_rotation)
{
java.awt.geom.Point2D screen_mouse_pos =
hdlg.graphics_context.coordinate_transform.board_to_screen(hdlg.get_current_mouse_position());
hdlg.get_panel().zoom_with_mouse_wheel(screen_mouse_pos, p_rotation);
return this;
}
/**
* Default actions when a key shortcut is pressed.
* Overwritten in derived classes for other key shortcut actions.
*/
public InteractiveState key_typed(char p_key_char)
{
InteractiveState result = this;
java.awt.geom.Point2D screen_mouse_pos =
hdlg.graphics_context.coordinate_transform.board_to_screen(hdlg.get_current_mouse_position());
if (p_key_char == 'a')
{
hdlg.get_panel().board_frame.zoom_all();
}
else if (p_key_char == 'c')
{
hdlg.get_panel().center_display(screen_mouse_pos);
}
else if (p_key_char == 'f')
{
result = ZoomRegionState.get_instance(hdlg.get_current_mouse_position(), this, hdlg, logfile);
}
else if (p_key_char =='h')
{
hdlg.get_panel().board_frame.select_previous_snapshot();
}
if (p_key_char == 'j')
{
hdlg.get_panel().board_frame.goto_selected_snapshot();
}
else if (p_key_char =='k')
{
hdlg.get_panel().board_frame.select_next_snapshot();
}
else if (p_key_char == 'o')
{
hdlg.get_panel().zoom_out(screen_mouse_pos);
}
else if (p_key_char == 'z')
{
hdlg.get_panel().zoom_in(screen_mouse_pos);
}
else if (p_key_char == ',')
{
// toggle the crosshair cursor
hdlg.get_panel().set_custom_crosshair_cursor(!hdlg.get_panel().is_custom_cross_hair_cursor());
}
else if (p_key_char == '\n' || p_key_char == ' ')
{
result = this.complete();
}
else if (p_key_char == java.awt.event.KeyEvent.VK_ESCAPE)
{
result = this.cancel();
}
else if (Character.isDigit(p_key_char))
{
// change the current layer to the p_key_char-ths signal layer
board.LayerStructure layer_structure = hdlg.get_routing_board().layer_structure;
int d = Character.digit(p_key_char, 10);
d = Math.min(d, layer_structure.signal_layer_count());
// Board layers start at 0, keyboard input for layers starts at 1.
d = Math.max(d - 1, 0);
d = layer_structure.get_no(layer_structure.get_signal_layer(d));
hdlg.set_current_layer(d);
}
return result;
}
/**
* Action to be taken, when this state is completed and exited.
* Default function to be overwritten in derived classes.
* Returns the return_state of this state.
*/
public InteractiveState complete()
{
if (this.return_state != this &&logfile != null)
{
logfile.start_scope(LogfileScope.COMPLETE_SCOPE);
}
return this.return_state;
}
/**
* Actions to be taken, when this state gets cancelled.
* Default function to be overwritten in derived classes.
* Returns the parent state of this state.
*/
public InteractiveState cancel()
{
if (this.return_state != this && logfile != null)
{
logfile.start_scope(LogfileScope.CANCEL_SCOPE);
}
return this.return_state;
}
/**
* Action to be taken, when the current layer is changed.
* returns false, if the layer could not be changed,
* Default function to be overwritten in derived classes.
*/
public boolean change_layer_action(int p_new_layer)
{
hdlg.set_layer(p_new_layer);
return true;
}
/**
* Used when reading the next point from a logfile.
* Default function to be overwritten in derived classes.
*/
public InteractiveState process_logfile_point(FloatPoint p_point)
{
return this;
}
/**
* The default message displayed, when this state is active.
*/
public void display_default_message()
{
}
/**
* Gets the identifier for displaying help for the user about this state.
*/
public String get_help_id()
{
return "MenuState";
}
/**
* Returns the popup menu from board_panel, which is used in this interactive state.
* Default function to be overwritten in derived classes.
*/
public javax.swing.JPopupMenu get_popup_menu()
{
return null;
}
/**
* A state using toolbar must overwrite this function.
*/
public void set_toolbar()
{
}
/** board setting access handler for the derived classes */
protected final BoardHandling hdlg;
/** The intended state after this state is finished */
protected InteractiveState return_state;
/** if logfile != null, the interactive actions are stored in a logfile */
protected final Logfile logfile;
/** Contains the files with the language dependent messages */
protected final java.util.ResourceBundle resources;
}