001/* 002 * Copyright 2006 - 2013 003 * Stefan Balev <stefan.balev@graphstream-project.org> 004 * Julien Baudry <julien.baudry@graphstream-project.org> 005 * Antoine Dutot <antoine.dutot@graphstream-project.org> 006 * Yoann Pigné <yoann.pigne@graphstream-project.org> 007 * Guilhelm Savin <guilhelm.savin@graphstream-project.org> 008 * 009 * This file is part of GraphStream <http://graphstream-project.org>. 010 * 011 * GraphStream is a library whose purpose is to handle static or dynamic 012 * graph, create them from scratch, file or any source and display them. 013 * 014 * This program is free software distributed under the terms of two licenses, the 015 * CeCILL-C license that fits European law, and the GNU Lesser General Public 016 * License. You can use, modify and/ or redistribute the software under the terms 017 * of the CeCILL-C license as circulated by CEA, CNRS and INRIA at the following 018 * URL <http://www.cecill.info> or under the terms of the GNU LGPL as published by 019 * the Free Software Foundation, either version 3 of the License, or (at your 020 * option) any later version. 021 * 022 * This program is distributed in the hope that it will be useful, but WITHOUT ANY 023 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A 024 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. 025 * 026 * You should have received a copy of the GNU Lesser General Public License 027 * along with this program. If not, see <http://www.gnu.org/licenses/>. 028 * 029 * The fact that you are presently reading this means that you have had 030 * knowledge of the CeCILL-C and LGPL licenses and that you accept their terms. 031 */ 032package org.graphstream.ui.swingViewer; 033 034import java.awt.Color; 035import java.awt.Container; 036import java.awt.Graphics2D; 037 038import org.graphstream.ui.graphicGraph.GraphicGraph; 039import org.graphstream.ui.graphicGraph.StyleGroupListener; 040 041public abstract class GraphRendererBase implements GraphRenderer, 042 StyleGroupListener { 043 // Attribute 044 045 /** 046 * The graph to draw. 047 */ 048 protected GraphicGraph graph; 049 050 /** 051 * Current selection or null. 052 */ 053 protected Selection selection = null; 054 055 /** 056 * The surface we are rendering on (used only 057 */ 058 protected Container renderingSurface; 059 060 // Initialisation 061 062 public void open(GraphicGraph graph, Container renderingSurface) { 063 if (this.graph != null) 064 throw new RuntimeException( 065 "renderer already open, cannot open twice"); 066 067 this.graph = graph; 068 this.renderingSurface = renderingSurface; 069 070 this.graph.getStyleGroups().addListener(this); 071 } 072 073 public void close() { 074 if (graph != null) { 075 graph.getStyleGroups().removeListener(this); 076 graph = null; 077 } 078 } 079 080 // Access 081 082 public Container getRenderingSurface() { 083 return renderingSurface; 084 } 085 086 // Selection 087 088 public void beginSelectionAt(double x1, double y1) { 089 if (selection == null) 090 selection = new Selection(); 091 092 selection.x1 = x1; 093 selection.y1 = y1; 094 selection.x2 = x1; 095 selection.y2 = y1; 096 } 097 098 public void selectionGrowsAt(double x, double y) { 099 selection.x2 = x; 100 selection.y2 = y; 101 } 102 103 public void endSelectionAt(double x2, double y2) { 104 selection = null; 105 } 106 107 // Utilities 108 109 protected void displayNothingToDo(Graphics2D g, int w, int h) { 110 String msg1 = "Graph width/height/depth is zero !!"; 111 String msg2 = "Place components using the 'xyz' attribute."; 112 113 g.setColor(Color.RED); 114 g.drawLine(0, 0, w, h); 115 g.drawLine(0, h, w, 0); 116 117 double msg1length = g.getFontMetrics().stringWidth(msg1); 118 double msg2length = g.getFontMetrics().stringWidth(msg2); 119 120 double x = w / 2; 121 double y = h / 2; 122 123 g.setColor(Color.BLACK); 124 g.drawString(msg1, (float)(x - msg1length / 2), (float)(y - 20)); 125 g.drawString(msg2, (float)(x - msg2length / 2), (float)(y + 20)); 126 } 127}