/*
Copyright 2011-2016 Google Inc. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package com.google.security.zynamics.zylib.gui.zygraph.edges;
import java.awt.Color;
import java.util.ArrayList;
import java.util.List;
import com.google.common.base.Preconditions;
import com.google.security.zynamics.zylib.general.ListenerProvider;
public class CViewEdge<NodeType> implements IViewEdge<NodeType> {
private final NodeType m_sourceNode;
private final NodeType m_targetNode;
private EdgeType m_type;
private double m_x1;
private double m_y1;
private double m_x2;
private double m_y2;
private Color m_color;
private boolean m_visible;
private boolean m_selected;
private int m_id;
private final List<CBend> m_paths;
protected final ListenerProvider<IViewEdgeListener> m_listeners =
new ListenerProvider<IViewEdgeListener>();
public CViewEdge(final int id, final NodeType sourceNode, final NodeType targetNode,
final EdgeType type, final double x1, final double y1, final double x2, final double y2,
final Color color, final boolean selected, final boolean visible, final List<CBend> edgePaths) {
m_sourceNode =
Preconditions.checkNotNull(sourceNode, "Error: Source node argument can't be null");
m_targetNode =
Preconditions.checkNotNull(targetNode, "Error: Target node argument can't be null");
m_id = id;
m_type = type;
m_x1 = x1;
m_y1 = y1;
m_x2 = x2;
m_y2 = y2;
m_color = color;
m_visible = visible;
m_selected = selected;
m_paths = edgePaths;
}
@Override
public void addBend(final double x, final double y) {
final CBend path = new CBend(x, y);
// if (m_paths.contains(path))
// {
// return;
// }
m_paths.add(path);
for (final IViewEdgeListener listener : m_listeners) {
try {
listener.addedBend(this, path);
} catch (final Exception exception) {
exception.printStackTrace();
}
}
}
@Override
public void addListener(final IViewEdgeListener listener) {
m_listeners.addListener(listener);
}
@Override
public void clearBends() {
m_paths.clear();
for (final IViewEdgeListener listener : m_listeners) {
try {
listener.clearedBends(this);
} catch (final Exception exception) {
exception.printStackTrace();
}
}
}
@Override
public int getBendCount() {
return m_paths.size();
}
@Override
public List<CBend> getBends() {
return new ArrayList<CBend>(m_paths);
}
@Override
public Color getColor() {
return m_color;
}
@Override
public int getId() {
return m_id;
}
@Override
public NodeType getSource() {
return m_sourceNode;
}
@Override
public NodeType getTarget() {
return m_targetNode;
}
@Override
public EdgeType getType() {
return m_type;
}
@Override
public double getX1() {
return m_x1;
}
@Override
public double getX2() {
return m_x2;
}
@Override
public double getY1() {
return m_y1;
}
@Override
public double getY2() {
return m_y2;
}
@Override
public void insertBend(final int index, final double x, final double y) {
final CBend path = new CBend(x, y);
// if (m_paths.contains(path))
// {
// return;
// }
m_paths.add(index, path);
for (final IViewEdgeListener listener : m_listeners) {
try {
listener.insertedBend(this, index, path);
} catch (final Exception exception) {
exception.printStackTrace();
}
}
}
@Override
public boolean isSelected() {
return m_selected;
}
@Override
public boolean isVisible() {
return m_visible;
}
public void removeAllListeners() {
final List<IViewEdgeListener> listeners = new ArrayList<IViewEdgeListener>();
for (final IViewEdgeListener listener : m_listeners) {
listeners.add(listener);
}
for (final IViewEdgeListener listener : listeners) {
removeListener(listener);
}
}
@Override
public void removeBend(final int index) {
final CBend path = m_paths.get(index);
m_paths.remove(index);
for (final IViewEdgeListener listener : m_listeners) {
listener.removedBend(this, index, path);
}
}
@Override
public void removeListener(final IViewEdgeListener listener) {
m_listeners.removeListener(listener);
}
@Override
public void setColor(final Color color) {
Preconditions.checkNotNull(color, "Error: Color argument can not be null");
if (m_color.equals(color)) {
return;
}
m_color = color;
for (final IViewEdgeListener listener : m_listeners) {
listener.changedColor(this, color);
}
}
@Override
public void setEdgeType(final EdgeType type) {
Preconditions.checkNotNull(type, "Error: Type argument can't be null");
if (type == m_type) {
return;
}
m_type = type;
for (final IViewEdgeListener listener : m_listeners) {
listener.changedType(this, type);
}
}
@Override
public void setId(final int id) {
m_id = id;
}
@Override
public void setSelected(final boolean selected) {
if (m_selected == selected) {
return;
}
m_selected = selected;
for (final IViewEdgeListener listener : m_listeners) {
listener.changedSelection(this, selected);
}
}
@Override
public void setVisible(final boolean visible) {
if (m_visible == visible) {
return;
}
m_visible = visible;
for (final IViewEdgeListener listener : m_listeners) {
listener.changedVisibility(this, m_visible);
}
}
@Override
public void setX1(final double x1) {
if (Double.compare(m_x1, x1) == 0) {
return;
}
m_x1 = x1;
for (final IViewEdgeListener listener : m_listeners) {
listener.changedSourceX(this, x1);
}
}
@Override
public void setX2(final double x2) {
if (Double.compare(m_x2, x2) == 0) {
return;
}
m_x2 = x2;
for (final IViewEdgeListener listener : m_listeners) {
listener.changedTargetX(this, x2);
}
}
@Override
public void setY1(final double y1) {
if (Double.compare(m_y1, y1) == 0) {
return;
}
m_y1 = y1;
for (final IViewEdgeListener listener : m_listeners) {
listener.changedSourceY(this, y1);
}
}
@Override
public void setY2(final double y2) {
if (Double.compare(m_y2, y2) == 0) {
return;
}
m_y2 = y2;
for (final IViewEdgeListener listener : m_listeners) {
listener.changedTargetY(this, y2);
}
}
}