import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
/**
* LoadGraph loada a graph from a file.
*
* @author Gideon Schwarz (mail@gideon-schwarz.de)
* @version 24.02.2004
*/
public class LoadGraph{
/** Position in 2-dimensional space for every node. */
private float[][] pos = null;
/** Similarity (edge weight) for every pair of nodes. */
private float[][] sim = null;
/** Similarity (edge weight) for evere node.*/
private float[][] sim2 = null;
/** Name of the nodes.*/
private String[] names = null;
/**
* Finds the name of the file with data of a graph.
* Uses a interactive dialog to find the file.
* @param fr frame is used for interactive input
*/
private static String getFileName(Frame fr){
String fileName= null;
FileDialog dlg = new FileDialog(fr, "Datei öffnen", FileDialog.LOAD);
dlg.setFile("*.rsf");
dlg.show();
String dn = dlg.getFile();
if(dn != null) fileName = dlg.getDirectory() + dn;
return fileName;
}
/**
* Returns the length for the arrays sim and pos.
* @param fileName name of file, with path, where graph is saved.
*/
private static int arrayLength(String fileName) {
int length = 0;
boolean eof = false;
try {
FileReader file = new FileReader(fileName);
BufferedReader buff = new BufferedReader(file);
while (!eof){
String line = buff.readLine();
if (line == null){
eof = true;
} else {
StringTokenizer str = new StringTokenizer(line);
String test = str.nextToken();
if (test.equals("NODE")) {
length++;
} else {
if (!test.equals("EDGE")){
//Error message 1: error in file
JOptionPane.showMessageDialog(null,"Error in file! " ,"Error 1", JOptionPane.ERROR_MESSAGE);
return 0;
}
}
}
}
buff.close();
} catch(IOException e) {
//Error message 2: file not found
JOptionPane.showMessageDialog(null,"File not found!","Error 2", JOptionPane.ERROR_MESSAGE);
return 0;
}
return length;
}
/**
* Enters a new information in sim with the data read from file.
* Gives a Errormessage if start node or end node or both not allready read.
* @param i integer save number of nodes, which allready read
* @param startName name of the start node of the edge, read from file
* @param endName name of the end node of the edge, read from file
*/
private void createEdge(int i, String startName, String endName){
int startIndex = i;
int endIndex = i;
for(int k = 0;k < i;k++){
if(names[k].equals(startName) && names[k].equals(endName)){
startIndex = k;
endIndex = k;
} else {
if(names[k].equals(startName)){
startIndex = k;
} else {
if(names[k].equals(endName)){
endIndex = k;
}
}
}
}
if (startIndex != i && endIndex != i) {
//start node and end node exist => enters information in sim.
if(startIndex != endIndex){
sim[startIndex][endIndex] = 1.0f;
sim[endIndex][startIndex] = 1.0f;
} else {
sim[startIndex][endIndex] = 0.0f;
}
return;
} else {
if(startIndex == i && endIndex == i){
//Error message 1: error in file
JOptionPane.showMessageDialog(null, "Startnode and Endnode not found line!","Error 1", JOptionPane.ERROR_MESSAGE);
return;
} else {
if (endIndex == i) {
//Error message 1: error in file
JOptionPane.showMessageDialog(null, "Endnode not found line!","Error 1", JOptionPane.ERROR_MESSAGE);
return;
} else {
//Error message 1: error in file
JOptionPane.showMessageDialog(null, "Startnode not found line!","Error 1", JOptionPane.ERROR_MESSAGE);
return;
}
}
}
}
/**
* Create similitary Matrix (Edge Weight) for every Node.
* sim2 is necessary for CalculatLayout.
*/
private void modifySimilarityMatrix(){
sim2 = new float[names.length][];
for(int i = 0; i < names.length; i++){
Vector temp = new Vector();
for(int j = 0; j < names.length;j++){
if(sim[i][j]==1.0f){
temp.add(new Integer(j));
}
}
float[] help = new float[temp.size()];
for(int j = 0; j < help.length; j++){
Integer in = (Integer)temp.elementAt(j);
help[j] = (float)in.intValue();
}
sim2[i] = help;
}
}
/**
* Loads a graph from a file.
*/
public Graph load(){
Frame little = new Frame();
String fileName = LoadGraph.getFileName(little);
int i = 0;
// no file => return to menue
if (fileName == null) {
return null;
}
int length = LoadGraph.arrayLength(fileName);
if (length == 0){
return null;
}
pos = new float[length][3];
sim = new float[length][length];
names = new String[length];
boolean eof = false;
try {
FileReader file = new FileReader(fileName);
BufferedReader buff = new BufferedReader(file);
//read the data of nodes and edges from the graph
while (!eof){
String line = buff.readLine();
if (line == null){
eof = true;
} else {
StringTokenizer str = new StringTokenizer(line);
String test = str.nextToken();
if(test.equals("NODE")){
names[i] = str.nextToken();
//for 3 dimensinal change for-loop
for(int k = 0;k<2;k++){
pos[i][k] = Float.parseFloat(str.nextToken().trim());
}
i++;
} else {
createEdge(i, str.nextToken(), str.nextToken());
}
}
}
buff.close();
} catch(IOException e) {
// Error message 2: File not found
JOptionPane.showMessageDialog(null,"File not found","Error 2", JOptionPane.ERROR_MESSAGE);
return null;
}
modifySimilarityMatrix();
Graph graph = new Graph(sim, pos, names, fileName, sim2);
return graph;
}
}