/*
Copyright 2008-2010 Gephi
Authors : Mathieu Bastian <mathieu.bastian@gephi.org>
Website : http://www.gephi.org
This file is part of Gephi.
Gephi is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
Gephi 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with Gephi. If not, see <http://www.gnu.org/licenses/>.
*/
package org.gephi.visualization.opengl.text;
import java.awt.Color;
import java.awt.Font;
import java.util.ArrayList;
import java.util.List;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.gephi.data.attributes.api.AttributeColumn;
import org.gephi.data.attributes.api.AttributeController;
import org.gephi.data.attributes.api.AttributeModel;
import org.gephi.ui.utils.ColorUtils;
import org.gephi.visualization.VizController;
import org.gephi.visualization.apiimpl.VizConfig;
import org.openide.util.Lookup;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
*
* @author Mathieu Bastian
*/
public class TextModel {
protected ColorMode colorMode;
protected SizeMode sizeMode;
protected boolean selectedOnly;
protected boolean showNodeLabels;
protected boolean showEdgeLabels;
protected Font nodeFont;
protected Font edgeFont;
protected float[] nodeColor = {0f, 0f, 0f, 1f};
protected float[] edgeColor = {0f, 0f, 0f, 1f};
protected float nodeSizeFactor = 0.5f;//Between 0 and 1
protected float edgeSizeFactor = 0.5f;
protected List<ChangeListener> listeners = new ArrayList<ChangeListener>();
protected AttributeColumn[] nodeTextColumns = new AttributeColumn[0];
protected AttributeColumn[] edgeTextColumns = new AttributeColumn[0];
public TextModel() {
defaultValues();
}
private void defaultValues() {
VizConfig vizConfig = VizController.getInstance().getVizConfig();
showNodeLabels = vizConfig.isDefaultShowNodeLabels();
showEdgeLabels = vizConfig.isDefaultShowEdgeLabels();
nodeFont = vizConfig.getDefaultNodeLabelFont();
edgeFont = vizConfig.getDefaultEdgeLabelFont();
nodeColor = vizConfig.getDefaultNodeLabelColor().getRGBComponents(null);
edgeColor = vizConfig.getDefaultEdgeLabelColor().getRGBComponents(null);
selectedOnly = vizConfig.isDefaultShowLabelOnSelectedOnly();
colorMode = VizController.getInstance().getTextManager().getColorModes()[0];
sizeMode = VizController.getInstance().getTextManager().getSizeModes()[0];
}
//Event
public void addChangeListener(ChangeListener changeListener) {
listeners.add(changeListener);
}
public void removeChangeListener(ChangeListener changeListener) {
listeners.remove(changeListener);
}
private void fireChangeEvent() {
ChangeEvent evt = new ChangeEvent(this);
for (ChangeListener l : listeners) {
l.stateChanged(evt);
}
}
public void setListeners(List<ChangeListener> listeners) {
this.listeners = listeners;
}
public List<ChangeListener> getListeners() {
return listeners;
}
//Getter & Setters
public boolean isShowEdgeLabels() {
return showEdgeLabels;
}
public boolean isShowNodeLabels() {
return showNodeLabels;
}
public void setShowEdgeLabels(boolean showEdgeLabels) {
this.showEdgeLabels = showEdgeLabels;
fireChangeEvent();
}
public void setShowNodeLabels(boolean showNodeLabels) {
this.showNodeLabels = showNodeLabels;
fireChangeEvent();
}
public void setEdgeFont(Font edgeFont) {
this.edgeFont = edgeFont;
fireChangeEvent();
}
public void setEdgeSizeFactor(float edgeSizeFactor) {
this.edgeSizeFactor = edgeSizeFactor;
fireChangeEvent();
}
public void setNodeFont(Font nodeFont) {
this.nodeFont = nodeFont;
fireChangeEvent();
}
public void setNodeSizeFactor(float nodeSizeFactor) {
this.nodeSizeFactor = nodeSizeFactor;
fireChangeEvent();
}
public Font getEdgeFont() {
return edgeFont;
}
public float getEdgeSizeFactor() {
return edgeSizeFactor;
}
public Font getNodeFont() {
return nodeFont;
}
public float getNodeSizeFactor() {
return nodeSizeFactor;
}
public ColorMode getColorMode() {
return colorMode;
}
public void setColorMode(ColorMode colorMode) {
this.colorMode = colorMode;
fireChangeEvent();
}
public boolean isSelectedOnly() {
return selectedOnly;
}
public void setSelectedOnly(boolean value) {
this.selectedOnly = value;
fireChangeEvent();
}
public SizeMode getSizeMode() {
return sizeMode;
}
public void setSizeMode(SizeMode sizeMode) {
this.sizeMode = sizeMode;
fireChangeEvent();
}
public Color getNodeColor() {
return new Color(nodeColor[0], nodeColor[1], nodeColor[2], nodeColor[3]);
}
public void setNodeColor(Color color) {
this.nodeColor = color.getRGBComponents(null);
fireChangeEvent();
}
public Color getEdgeColor() {
return new Color(edgeColor[0], edgeColor[1], edgeColor[2], edgeColor[3]);
}
public void setEdgeColor(Color color) {
this.edgeColor = color.getRGBComponents(null);
fireChangeEvent();
}
public AttributeColumn[] getEdgeTextColumns() {
return edgeTextColumns;
}
public void setTextColumns(AttributeColumn[] nodeTextColumns, AttributeColumn[] edgeTextColumns) {
this.nodeTextColumns = nodeTextColumns;
this.edgeTextColumns = edgeTextColumns;
fireChangeEvent();
}
public AttributeColumn[] getNodeTextColumns() {
return nodeTextColumns;
}
public void readXML(Element textModelElement) {
//Show
Element showNodeE = (Element) textModelElement.getElementsByTagName("shownodelabels").item(0);
showNodeLabels = Boolean.parseBoolean(showNodeE.getAttribute("enable"));
Element showEdgeE = (Element) textModelElement.getElementsByTagName("showedgelabels").item(0);
showEdgeLabels = Boolean.parseBoolean(showEdgeE.getAttribute("enable"));
//Selectedonly
Element selectedOnlyE = (Element) textModelElement.getElementsByTagName("selectedOnly").item(0);
selectedOnly = Boolean.parseBoolean(selectedOnlyE.getAttribute("value"));
//Font
Element nodeFontE = (Element) textModelElement.getElementsByTagName("nodefont").item(0);
String nodeFontName = nodeFontE.getAttribute("name");
int nodeFontSize = Integer.parseInt(nodeFontE.getAttribute("size"));
int nodeFontStyle = Integer.parseInt(nodeFontE.getAttribute("style"));
nodeFont = new Font(nodeFontName, nodeFontStyle, nodeFontSize);
Element edgeFontE = (Element) textModelElement.getElementsByTagName("edgefont").item(0);
String edgeFontName = edgeFontE.getAttribute("name");
int edgeFontSize = Integer.parseInt(edgeFontE.getAttribute("size"));
int edgeFontStyle = Integer.parseInt(edgeFontE.getAttribute("style"));
edgeFont = new Font(edgeFontName, edgeFontStyle, edgeFontSize);
//Color
Element nodeColorE = (Element) textModelElement.getElementsByTagName("nodecolor").item(0);
nodeColor = ColorUtils.decode(nodeColorE.getAttribute("value")).getRGBComponents(null);
Element edgeColorE = (Element) textModelElement.getElementsByTagName("edgecolor").item(0);
edgeColor = ColorUtils.decode(edgeColorE.getAttribute("value")).getRGBComponents(null);
//Size factor
Element nodeSizeFactorE = (Element) textModelElement.getElementsByTagName("nodesizefactor").item(0);
nodeSizeFactor = Float.parseFloat(nodeSizeFactorE.getTextContent());
Element edgeSizeFactorE = (Element) textModelElement.getElementsByTagName("edgesizefactor").item(0);
edgeSizeFactor = Float.parseFloat(edgeSizeFactorE.getTextContent());
//ColorMode
Element colorModeE = (Element) textModelElement.getElementsByTagName("colormode").item(0);
String colorModeClass = colorModeE.getAttribute("class");
if (colorModeClass.equals("UniqueColorMode")) {
colorMode = VizController.getInstance().getTextManager().getColorModes()[0];
} else if (colorModeClass.equals("ObjectColorMode")) {
colorMode = VizController.getInstance().getTextManager().getColorModes()[1];
}
//SizeMode
Element sizeModeE = (Element) textModelElement.getElementsByTagName("sizemode").item(0);
String sizeModeClass = sizeModeE.getAttribute("class");
if (sizeModeClass.equals("FixedSizeMode")) {
// sizeMode = new FixedSizeMode(this);
sizeMode = VizController.getInstance().getTextManager().getSizeModes()[0];
} else if (sizeModeClass.equals("ProportionalSizeMode")) {
// sizeMode = new ProportionalSizeMode(this);
sizeMode = VizController.getInstance().getTextManager().getSizeModes()[2];
} else if (sizeModeClass.equals("ScaledSizeMode")) {
// sizeMode = new ScaledSizeMode(this);
sizeMode = VizController.getInstance().getTextManager().getSizeModes()[1];
}
//NodeColumns
AttributeController attributeController = Lookup.getDefault().lookup(AttributeController.class);
if (attributeController != null && attributeController.getModel() != null) {
AttributeModel attributeModel = attributeController.getModel();
List<AttributeColumn> nodeCols = new ArrayList<AttributeColumn>();
List<AttributeColumn> edgeCols = new ArrayList<AttributeColumn>();
Element nodeColumnsE = (Element) textModelElement.getElementsByTagName("nodecolumns").item(0);
NodeList nodeColumnList = nodeColumnsE.getElementsByTagName("column");
for (int i = 0; i < nodeColumnList.getLength(); i++) {
if (nodeColumnList.item(i).getNodeType() == Node.ELEMENT_NODE) {
Element nodeColumnE = (Element) nodeColumnList.item(i);
String id = nodeColumnE.getAttribute("id");
AttributeColumn col = attributeModel.getNodeTable().getColumn(id);
if (col != null) {
nodeCols.add(col);
}
}
}
Element edgeColumnsE = (Element) textModelElement.getElementsByTagName("edgecolumns").item(0);
NodeList edgeColumnList = edgeColumnsE.getElementsByTagName("column");
for (int i = 0; i < edgeColumnList.getLength(); i++) {
if (edgeColumnList.item(i).getNodeType() == Node.ELEMENT_NODE) {
Element edgeColumnE = (Element) edgeColumnList.item(i);
String id = edgeColumnE.getAttribute("id");
AttributeColumn col = attributeModel.getEdgeTable().getColumn(id);
if (col != null) {
edgeCols.add(col);
}
}
}
nodeTextColumns = nodeCols.toArray(new AttributeColumn[0]);
edgeTextColumns = edgeCols.toArray(new AttributeColumn[0]);
}
}
public Element writeXML(Document document) {
Element textModelE = document.createElement("textmodel");
//Show
Element showNodeE = document.createElement("shownodelabels");
showNodeE.setAttribute("enable", String.valueOf(showNodeLabels));
textModelE.appendChild(showNodeE);
Element showEdgeE = document.createElement("showedgelabels");
showEdgeE.setAttribute("enable", String.valueOf(showEdgeLabels));
textModelE.appendChild(showEdgeE);
//Selectedonly
Element selectedOnlyE = document.createElement("selectedOnly");
selectedOnlyE.setAttribute("value", String.valueOf(selectedOnly));
textModelE.appendChild(selectedOnlyE);
//Font
Element nodeFontE = document.createElement("nodefont");
nodeFontE.setAttribute("name", nodeFont.getName());
nodeFontE.setAttribute("size", Integer.toString(nodeFont.getSize()));
nodeFontE.setAttribute("style", Integer.toString(nodeFont.getStyle()));
textModelE.appendChild(nodeFontE);
Element edgeFontE = document.createElement("edgefont");
edgeFontE.setAttribute("name", edgeFont.getName());
edgeFontE.setAttribute("size", Integer.toString(edgeFont.getSize()));
edgeFontE.setAttribute("style", Integer.toString(edgeFont.getStyle()));
textModelE.appendChild(edgeFontE);
//Size factor
Element nodeSizeFactorE = document.createElement("nodesizefactor");
nodeSizeFactorE.setTextContent(String.valueOf(nodeSizeFactor));
textModelE.appendChild(nodeSizeFactorE);
Element edgeSizeFactorE = document.createElement("edgesizefactor");
edgeSizeFactorE.setTextContent(String.valueOf(edgeSizeFactor));
textModelE.appendChild(edgeSizeFactorE);
//Colors
Element nodeColorE = document.createElement("nodecolor");
nodeColorE.setAttribute("value", ColorUtils.encode(ColorUtils.decode(nodeColor)));
textModelE.appendChild(nodeColorE);
Element edgeColorE = document.createElement("edgecolor");
edgeColorE.setAttribute("value", ColorUtils.encode(ColorUtils.decode(edgeColor)));
textModelE.appendChild(edgeColorE);
//Colormode
Element colorModeE = document.createElement("colormode");
if (colorMode instanceof UniqueColorMode) {
colorModeE.setAttribute("class", "UniqueColorMode");
} else if (colorMode instanceof ObjectColorMode) {
colorModeE.setAttribute("class", "ObjectColorMode");
}
textModelE.appendChild(colorModeE);
//SizeMode
Element sizeModeE = document.createElement("sizemode");
if (sizeMode instanceof FixedSizeMode) {
sizeModeE.setAttribute("class", "FixedSizeMode");
} else if (sizeMode instanceof ProportionalSizeMode) {
sizeModeE.setAttribute("class", "ProportionalSizeMode");
} else if (sizeMode instanceof ScaledSizeMode) {
sizeModeE.setAttribute("class", "ScaledSizeMode");
}
textModelE.appendChild(sizeModeE);
//NodeColumns
Element nodeColumnsE = document.createElement("nodecolumns");
for (AttributeColumn c : nodeTextColumns) {
Element nodeColumnE = document.createElement("column");
nodeColumnE.setAttribute("id", c.getId());
nodeColumnsE.appendChild(nodeColumnE);
}
textModelE.appendChild(nodeColumnsE);
//EdgeColumns
Element edgeColumnsE = document.createElement("edgecolumns");
for (AttributeColumn c : edgeTextColumns) {
Element edgeColumnE = document.createElement("column");
edgeColumnE.setAttribute("id", c.getId());
edgeColumnsE.appendChild(edgeColumnE);
}
textModelE.appendChild(edgeColumnsE);
return textModelE;
}
}