function h = Graph(I,h,n,c,varargin)
% Graph zeichnet einen gerichteten Graphen zu der gegebenen Inzidenzmatrix I.
% Die Matrix I ist von der Dimension |V| x |E|.  
% I_ij = -1 : Kante #j beginnt in Knoten #i 
% I_ij = +1 : Kante #j endet in Knoten #i
%
% h = Graph(I) oeffnet ein neues Grafikfenster, zeichnet den durch I
% dargestellten gerichteten Graphen und gibt ein graphViz4Matlab-Objekt zurueck.
%
% h = Graph(I,h) zeichnet den durch I dargestellten gerichteten Graphen in
% dasselbe Fenster, in dem bereits der Graph zum Objekt h zu sehen ist.
%
% h = Graph(I,h,n) beschriftet die Knoten mit den Inhalten des Feldes n (statt der Nummer).
% 
% h = Graph(I,h,n,c) beschriftet zusaetzlich die Kanten mit den Inhalten des Feldes c.
% 
% h = Graph(I,h,n,c,...) reicht die zusaetzlichen Parameter an graphViz4Matlab weiter.
% 

% Wieviele Knoten und Kanten haben wir?
nnodes = size(I,1);
nedges = size(I,2);

% Wir stellen sicher, dass die Inzidenzmatrix I sparse ist, sonst gibt inc2adj
% unten eine Warnung aus.
I = sparse(I);

% Erstelle die zugehoerige Adjazenzmatrix mittels inc2adj
% Achtung, inc2adj interpretiert die Inzidenzmatrix anders
% (mit vertauschter Bedeutung von 
adj = inc2adj(-I');

% Haben wir ein graphViz4Matlab-Objekt? Da graphViz4Matlab stets ein neues Fenster oeffnet,
% loeschen wir einfach das alte Fenster. Das Objekt h wird unten ueberschrieben.
if (nargin>=2)
  if (~isempty(h)) && (ishghandle(h.fig)); 
    close(h.fig); 
  end
end

% Wurde ein Feld n mit Knotenbezeichnungen uebergeben?
haven = 0;
if (nargin>=3) && (~isempty(n))
  if (size(n,1) < size(n,2)) n = n'; end
  if (size(n,1) ~= nnodes)
    error('Graph: The length of the node label field must be equal to the number of nodes.');
  end
  haven = 1;
  nodeLabels = cell(nnodes,1);
  % Bestimme die Labels
  for j=1:nnodes
    if (iscell(n))
      label = n(j,:);
      nodeLabels(j) = label;
    else
      label = mat2str(n(j,:));
      nodeLabels{j} = label;
    end
  end
  % Stelle eventuellen Minuszeichen ein Leerzeichen voran, sonst wuerde dies 
  % von graphViz4Matlab als Option behandelt werden
  nodeLabels = regexprep(nodeLabels, '^-', ' -');
end

% Wurde ein Feld c mit Kantenwerten uebergeben?
havec = 0;
if (nargin>=4) && (~isempty(c))
  if (size(c,1) < size(c,2)) c = c'; end
  if (size(c,1) ~= nedges)
    error('Graph: The length of the edge label field must be equal to the number of edges.');
  end
  havec = 1;
  edgeLabels = cell(nedges,3);
  % Bestimme die Labels
  for j=1:nedges
    if haven
      from = nodeLabels(find(I(:,j) == -1));
      to = nodeLabels(find(I(:,j) == 1));
    else
      from = num2str(find(I(:,j) == -1));
      to = num2str(find(I(:,j) == 1));
    end
    if (iscell(c))
      label = c(j,:);
      edgeLabels(j,1:2) = {from to};
      edgeLabels(j,3) = label;
    else
      label = mat2str(c(j,:));
      edgeLabels(j,:) = {from to label};
    end
  end
end

% Rufe graphViz4Matlab auf, um den Graphen darzustellen
if (haven) && (havec)
  h = graphViz4Matlab('-adjMat',adj,'-splitLabels',false,'-nodeLabels',nodeLabels,'-edgeLabels',edgeLabels,varargin{:});
elseif (~haven) && (havec)
  h = graphViz4Matlab('-adjMat',adj,'-splitLabels',false,'-edgeLabels',edgeLabels,varargin{:});
elseif (haven) && (~havec)
  h = graphViz4Matlab('-adjMat',adj,'-splitLabels',false,'-nodeLabels',nodeLabels,varargin{:});
else
  h = graphViz4Matlab('-adjMat',adj,'-splitLabels',false,varargin{:});
end

