package org.incha.core.jswingripples.eig;
import java.util.ArrayList;
import java.util.EventObject;
import java.util.LinkedList;
import java.util.List;
/**
* JRipplesEIGEvent represent an {@link JSwingRipplesEIG} event that encapsulates various events of nodes and edges lifecyle, and content.
* Event may contain any number of {@link JSwingRipplesEIGNodeEvent} and {@link JSwingRipplesEIGEdgeEvent} events of any particular type, that happened in the same time (i.e. between calls of
* {@link JSwingRipplesEIG#doLock(Object)} and {@link JSwingRipplesEIG#doUnLock(Object)} methods).
* @author Maksym Petrenko
*
*/
public class JSwingRipplesEIGEvent extends EventObject {
private static final long serialVersionUID = 596785116755112817L;
private final JSwingRipplesEvent[] events;
private final JSwingRipplesEIGNodeEvent[] nodeEvents;
private final JSwingRipplesEIGEdgeEvent[] edgeEvents;
public JSwingRipplesEIGEvent(final JSwingRipplesEIG EIG, final JSwingRipplesEvent[] events) {
super(EIG);
this.events = events;
final List<JSwingRipplesEIGEdgeEvent> edgeEvents = new LinkedList<JSwingRipplesEIGEdgeEvent>();
final List<JSwingRipplesEIGNodeEvent> nodeEvents = new LinkedList<JSwingRipplesEIGNodeEvent>();
for (final JSwingRipplesEvent e : events) {
if (e instanceof JSwingRipplesEIGNodeEvent) {
nodeEvents.add((JSwingRipplesEIGNodeEvent) e);
} else {
edgeEvents.add((JSwingRipplesEIGEdgeEvent) e);
}
}
this.nodeEvents = nodeEvents.toArray(new JSwingRipplesEIGNodeEvent[nodeEvents.size()]);
this.edgeEvents = edgeEvents.toArray(new JSwingRipplesEIGEdgeEvent[edgeEvents.size()]);
}
/**
* Returns {@link JSwingRipplesEIG} object in which this event happened. As JRipplesEIG stores its data in a static way, this method is likely to have no specific use.
* @return
* {@link JSwingRipplesEIG} object in which this event happened. As JRipplesEIG stores its data in a static way, this method is likely to have no specific use.
*/
@Override
public JSwingRipplesEIG getSource() {
return (JSwingRipplesEIG) super.getSource();
}
/**
* Tells whether the event has any node events.
* @return
* <code>true</code> if this event has any node events, <code>false</code> otherwise
*/
public boolean hasNodeEvents() {
return (nodeEvents.length>0);
}
/**
* Tells whether the event has any edge events.
* @return
* <code>true</code> if this event has any edge events, <code>false</code> otherwise
*/
public boolean hasEdgeEvents() {
return (edgeEvents.length>0);
}
/**
* Returns the array of all node events related to this event.
* @return
* Array of all node events related to this event. If there is no node events registered with this event, empty array will be returned.
*/
public JSwingRipplesEIGNodeEvent[] getNodeEvents() {
return nodeEvents;
}
/**
* Returns specific node events.
* @param types
* desired types of event, where types are one or more of constants defined in {@link JSwingRipplesEIGNodeEvent}
* @return
* Array of node events of the requested types related to this event. If there is no node events of requested types registered with this event, empty array will be returned.
*/
public JSwingRipplesEIGNodeEvent[] getNodeTypedEvents(final int[] types) {
final ArrayList<JSwingRipplesEIGNodeEvent> tmpEventsSet=new ArrayList<JSwingRipplesEIGNodeEvent>();
final ArrayList<Integer> tmpTypesSet=new ArrayList<Integer>();
for (int i=0;i<types.length;i++)
{
tmpTypesSet.add(Integer.valueOf(types[i]));
}
for (int i=0;i<nodeEvents.length;i++) {
if (tmpTypesSet.contains(Integer.valueOf(nodeEvents[i].getEventType())))
tmpEventsSet.add(nodeEvents[i]);
}
return tmpEventsSet.toArray(new JSwingRipplesEIGNodeEvent[tmpEventsSet.size()]);
}
/**
* Returns specific node events.
* @param type
* desired type of event, where type is one of a constants defined in {@link JSwingRipplesEIGNodeEvent}
* @return
* Array of node events of the requested type related to this event. If there is no node events of requested type registered with this event, empty array will be returned.
*/
public JSwingRipplesEIGNodeEvent[] getNodeTypedEvents(final int type) {
final ArrayList<JSwingRipplesEIGNodeEvent> tmpEventsSet=new ArrayList<JSwingRipplesEIGNodeEvent>();
for (int i=0;i<nodeEvents.length;i++) {
if (type==nodeEvents[i].getEventType())
tmpEventsSet.add(nodeEvents[i]);
}
return tmpEventsSet.toArray(new JSwingRipplesEIGNodeEvent[tmpEventsSet.size()]);
}
/**
* Returns all edge events.
* @return
* Array of all edge events related to this event. If there is no edge events registered with this event, empty array will be returned.
*/
public JSwingRipplesEIGEdgeEvent[] getEdgeEvents() {
return edgeEvents;
}
/**
* Returns specific edge events.
* @param types
* desired types of event, where types are one or more of constants defined in {@link JSwingRipplesEIGEdgeEvent}
* @return
* Array of edge events of the requested types related to this event. If there is no edge events of requested types registered with this event, empty array will be returned.
*/
public JSwingRipplesEIGEdgeEvent[] getEdgeTypedEvents(final int[] types) {
final ArrayList<Integer> tmpTypesSet=new ArrayList<Integer>();
for (int i=0;i<types.length;i++)
{
tmpTypesSet.add(Integer.valueOf(types[i]));
}
final ArrayList<JSwingRipplesEIGEdgeEvent> tmpEventsSet=new ArrayList<JSwingRipplesEIGEdgeEvent>();
for (int i=0;i<edgeEvents.length;i++) {
if (tmpTypesSet.contains(Integer.valueOf(edgeEvents[i].getEventType())))
tmpEventsSet.add(edgeEvents[i]);
}
return tmpEventsSet.toArray(new JSwingRipplesEIGEdgeEvent[tmpEventsSet.size()]);
}
/**
* Returns specific edge events.
* @param type
* desired type of event, where type is one of a constants defined in {@link JSwingRipplesEIGEdgeEvent}
* @return
* Array of edge events of the requested type related to this event. If there is no edge events of requested types registered with this event, empty array will be returned.
*/
public JSwingRipplesEIGEdgeEvent[] getEdgeTypedEvents(final int type) {
final ArrayList<JSwingRipplesEIGEdgeEvent> tmpEventsSet=new ArrayList<JSwingRipplesEIGEdgeEvent>();
for (int i=0;i<edgeEvents.length;i++) {
if (type==edgeEvents[i].getEventType())
tmpEventsSet.add(edgeEvents[i]);
}
return tmpEventsSet.toArray(new JSwingRipplesEIGEdgeEvent[tmpEventsSet.size()]);
}
/**
* @return the events
*/
public JSwingRipplesEvent[] getEvents() {
return events;
}
}