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}