/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.felix.example.extenderbased.host;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import javax.swing.JComponent;
import org.apache.felix.example.extenderbased.host.extension.SimpleShape;

/**
 * Simple component class used to represent a drawn shape. This component
 * uses a shape service to paint its contents.
**/
public class ShapeComponent extends JComponent
{
    private static final long serialVersionUID = 1L;
    private DrawingFrame m_frame;
    private String m_shapeName;

    /**
     * Construct a component for the specified drawing frame with the specified
     * named shape. The component acquires the named shape from the drawing
     * frame at the time of painting, which enables it to account for
     * service dynamism.
     * @param frame The drawing frame associated with the component.
     * @param shapeName The name of the shape to draw.
    **/
    public ShapeComponent(DrawingFrame frame, String shapeName)
    {
        m_frame = frame;
        m_shapeName = shapeName;
    }

    /**
     * Paints the contents of the component. The component acquires the named
     * shape from the drawing frame at the time of painting, which enables it
     * to account for service dynamism.
     * @param g The graphics object to use for painting.
    **/
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
        SimpleShape shape = m_frame.getShape(m_shapeName);
        shape.draw(g2, new Point(getWidth()/2, getHeight()/2));
    }
}