/*
* PComponent.java
*
* Created on 9. Juni 2007, 14:16
*
* @author Felix Pultar
*
* @param name: Name of the component
* @param componentRight: Component connected at right
* @param componentLeft: Component connected at left
* @param hitComponent: Represents the pressed component
* @param parent: Container of the component
* @param components: All components which are not connected
* @param usable: Is the component usable?
* @param x, y: X- and Y-Position of the component
* @param iconPath: Path of the showed icon
* @param totalComponents: Total of all components
*/
/**
* This is a real abstract
* physical component
*/
import com.illu.physis.components.interfaces.IPComponent;
import javax.swing.JLabel;
import javax.swing.JPopupMenu;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.ImageIcon;
import java.awt.Container;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseEvent;
public class PComponent extends JLabel implements IPComponent {
public String name;
private PComponent componentRight, componentLeft, hitComponent;
private PTable parent;
private boolean usable;
private int x, y, deltaX, deltaY, height, width;
private String iconPath;
/*
* Builds new instances of PComponent while usable is always true
*/
public PComponent( PTable parent, String name, String iconPath, int x, int y, int height, int width ) {
super( new ImageIcon( iconPath ) );
this.parent = parent;
this.name = name;
this.iconPath = iconPath;
this.x = x;
this.y = y;
this.height = height;
this.width = width;
this.usable = true;
setBounds( x, y, height, width );
parent.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(final MouseEvent evt) {
move( evt );
}
});
parent.addMouseListener(new MouseAdapter() {
public void mousePressed(final MouseEvent evt) {
enableDragging( evt );
}
public void mouseReleased(final MouseEvent evt) {
disableDragging( evt );
}
});
}
/*
* Builds new instances of PComponent while usable is the wished state
*/
public PComponent( PTable parent, String name, String iconPath, int x, int y, int height, int width, boolean usable ) {
super( new ImageIcon( iconPath ) );
this.parent = parent;
this.name = name;
this.iconPath = iconPath;
this.x = x;
this.y = y;
this.height = height;
this.width = width;
this.usable = usable;
setBounds( x, y, height, width );
parent.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(final MouseEvent evt) {
move( evt );
}
});
parent.addMouseListener(new MouseAdapter() {
public void mousePressed(final MouseEvent evt) {
enableDragging( evt );
}
public void mouseReleased(final MouseEvent evt) {
if( evt.isPopupTrigger() ) {;
createMenu().show( evt.getComponent(), evt.getX(), evt.getY() );
}
else {
disableDragging( evt );
}
}
});
}
public void enableDragging( MouseEvent evt ) {
if( evt.isPopupTrigger() ) {
createMenu().show( evt.getComponent(), evt.getX(), evt.getY() );
}
else {
Component c = parent.getComponentAt(evt.getPoint());
if ( c instanceof PComponent ) {
hitComponent = (PComponent) c;
deltaX = evt.getX() - hitComponent.getX();
deltaY = evt.getY() - hitComponent.getY();
}
}
}
public void disableDragging( MouseEvent evt ) {
if( evt.isPopupTrigger() ) {
createMenu().show( evt.getComponent(), evt.getX(), evt.getY() );
}
else {
if( hitComponent != null ){
parent.repaint();
hitComponent = null;
}
}
}
public void move( MouseEvent evt ) {
if ( hitComponent != null ) {
int x = evt.getX() - deltaX;
int y = evt.getY() - deltaY;
hitComponent.setLocation( x, y );
parent.setComponentZOrder( hitComponent, 0 );
parent.repaint();
}
}
/*
* Creates a new PopupMenu, when it is needed
*/
private JPopupMenu createMenu() {
JPopupMenu popUpMenu = new JPopupMenu();
JMenu connectTo = new JMenu( "Verbinden zu" );
JMenu disconnectTo = new JMenu( "Trennen von" );
JMenuItem showDialog = new JMenuItem( "Eigenschaften" );
JMenuItem[] components = new JMenuItem[ parent.totalComponents ];
for( int i = 0; i < parent.totalComponents; i++ ) {
components[ i ] = new JMenuItem( parent.components[ i ].name );
connectTo.add( components[ i ] );
}
if( componentLeft == null ) {
disconnectTo.add( new JMenuItem( "Keine Angabe" ) );
}
else {
disconnectTo.add( new JMenuItem( componentLeft.name ) );
}
if( componentRight == null ) {
disconnectTo.add( new JMenuItem( "Keine Angabe" ) );
}
else {
disconnectTo.add( new JMenuItem( componentRight.name ) );
}
popUpMenu.add( connectTo );
popUpMenu.add( disconnectTo );
popUpMenu.add( showDialog );
return popUpMenu;
}
}