/*
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;
import org.gephi.graph.api.Edge;
import org.gephi.graph.api.GraphModel;
import org.gephi.graph.api.HierarchicalGraph;
import org.gephi.graph.api.Node;
import org.gephi.graph.api.TextData;
import org.gephi.visualization.impl.TextDataImpl;
import org.gephi.project.api.Workspace;
import org.gephi.project.spi.WorkspacePersistenceProvider;
import org.openide.util.lookup.ServiceProvider;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
/**
*
* @author Mathieu Bastian
*/
@ServiceProvider(service = WorkspacePersistenceProvider.class)
public class TextDataPersistenceProvider implements WorkspacePersistenceProvider {
private static final String ELEMENT_TEXTDATA = "textdata";
private static final String ELEMENT_NODEDATA_TEXTDATA = "textdatanode";
private static final String ELEMENT_EDGEDATA_TEXTDATA = "textdataedge";
private static final String ELEMENT_TEXTDATA_COLOR = "color";
private static final String ELEMENT_TEXTDATA_SIZE = "size";
private static final String ELEMENT_TEXTDATA_VISIBLE = "visible";
public Element writeXML(Document document, Workspace workspace) {
Element textDataE = document.createElement(ELEMENT_TEXTDATA);
GraphModel graphModel = workspace.getLookup().lookup(GraphModel.class);
HierarchicalGraph hierarchicalGraph = graphModel.getHierarchicalGraph();
for (Node node : hierarchicalGraph.getNodesTree()) {
TextData nodeTextData = node.getNodeData().getTextData();
if (nodeTextData != null) {
Element nodeE = document.createElement(ELEMENT_NODEDATA_TEXTDATA);
nodeE.setAttribute("for", String.valueOf(node.getId()));
if (nodeTextData.getR() > 0) {
Element colorE = document.createElement(ELEMENT_TEXTDATA_COLOR);
colorE.setAttribute("r", String.valueOf(nodeTextData.getR()));
colorE.setAttribute("g", String.valueOf(nodeTextData.getG()));
colorE.setAttribute("b", String.valueOf(nodeTextData.getB()));
colorE.setAttribute("a", String.valueOf(nodeTextData.getAlpha()));
nodeE.appendChild(colorE);
}
Element sizeE = document.createElement(ELEMENT_TEXTDATA_SIZE);
sizeE.setAttribute("value", String.valueOf(nodeTextData.getSize()));
nodeE.appendChild(sizeE);
Element visibleE = document.createElement(ELEMENT_TEXTDATA_VISIBLE);
visibleE.setAttribute("value", String.valueOf(nodeTextData.isVisible()));
nodeE.appendChild(visibleE);
textDataE.appendChild(nodeE);
}
}
for (Node node : hierarchicalGraph.getNodesTree()) {
for (Edge edge : hierarchicalGraph.getEdges(node)) {
TextData edgeTextData = edge.getEdgeData().getTextData();
if (edgeTextData != null) {
Element edgeE = document.createElement(ELEMENT_EDGEDATA_TEXTDATA);
edgeE.setAttribute("for", String.valueOf(edge.getId()));
if (edgeTextData.getR() > 0) {
Element colorE = document.createElement(ELEMENT_TEXTDATA_COLOR);
colorE.setAttribute("r", String.valueOf(edgeTextData.getR()));
colorE.setAttribute("g", String.valueOf(edgeTextData.getG()));
colorE.setAttribute("b", String.valueOf(edgeTextData.getB()));
colorE.setAttribute("a", String.valueOf(edgeTextData.getAlpha()));
edgeE.appendChild(colorE);
}
Element sizeE = document.createElement(ELEMENT_TEXTDATA_SIZE);
sizeE.setAttribute("value", String.valueOf(edgeTextData.getSize()));
edgeE.appendChild(sizeE);
Element visibleE = document.createElement(ELEMENT_TEXTDATA_VISIBLE);
visibleE.setAttribute("value", String.valueOf(edgeTextData.isVisible()));
edgeE.appendChild(visibleE);
textDataE.appendChild(edgeE);
}
}
}
return textDataE;
}
public void readXML(Element textDataE, Workspace workspace) {
GraphModel graphModel = workspace.getLookup().lookup(GraphModel.class);
HierarchicalGraph hierarchicalGraph = graphModel.getHierarchicalGraph();
NodeList textDataList = textDataE.getChildNodes();
for (int i = 0; i < textDataList.getLength(); i++) {
if (textDataList.item(i).getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) {
Element itemE = (Element) textDataList.item(i);
if (itemE.getTagName().equals(ELEMENT_NODEDATA_TEXTDATA)) {
int id = Integer.parseInt(itemE.getAttribute("for"));
Node node = hierarchicalGraph.getNode(id);
TextDataImpl textDataImpl = (TextDataImpl) node.getNodeData().getTextData();
readTextData(itemE, textDataImpl);
} else if (itemE.getTagName().equals(ELEMENT_EDGEDATA_TEXTDATA)) {
int id = Integer.parseInt(itemE.getAttribute("for"));
Edge edge = hierarchicalGraph.getEdge(id);
TextDataImpl textDataImpl = (TextDataImpl) edge.getEdgeData().getTextData();
readTextData(itemE, textDataImpl);
}
}
}
}
private void readTextData(Element textDataE, TextData textData) {
NodeList textDataList = textDataE.getChildNodes();
for (int i = 0; i < textDataList.getLength(); i++) {
if (textDataList.item(i).getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) {
Element itemE = (Element) textDataList.item(i);
if (itemE.getTagName().equals(ELEMENT_TEXTDATA_COLOR)) {
float r = Float.parseFloat(itemE.getAttribute("r"));
float g = Float.parseFloat(itemE.getAttribute("g"));
float b = Float.parseFloat(itemE.getAttribute("b"));
float a = Float.parseFloat(itemE.getAttribute("a"));
textData.setColor(r, g, b, a);
} else if (itemE.getTagName().equals(ELEMENT_TEXTDATA_SIZE)) {
textData.setSize(Float.parseFloat(itemE.getAttribute("value")));
} else if (itemE.getTagName().equals(ELEMENT_TEXTDATA_VISIBLE)) {
textData.setVisible(Boolean.parseBoolean(itemE.getAttribute("value")));
}
}
}
}
public String getIdentifier() {
return ELEMENT_TEXTDATA;
}
}