Package de.dfki.km.text20.services.pseudorenderer.impl

Source Code of de.dfki.km.text20.services.pseudorenderer.impl.RenderElementImpl

/*
* RenderElementImpl.java
*
* Copyright (c) 2010, Ralf Biedert, DFKI. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301  USA
*
*/
package de.dfki.km.text20.services.pseudorenderer.impl;

import java.awt.Point;
import java.awt.Rectangle;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

import sun.reflect.generics.reflectiveObjects.NotImplementedException;
import de.dfki.km.text20.services.pseudorenderer.CoordinatesType;
import de.dfki.km.text20.services.pseudorenderer.RenderElement;
import de.dfki.km.text20.services.pseudorenderer.RenderElementMetaAttribute;

/**
* Implementation of the RenderElement interface
*
* @author rb
*/
public class RenderElementImpl implements RenderElement {

    /** Contains the meta information of this render element */
    private final Map<RenderElementMetaAttribute, Serializable> metaInformation = new HashMap<RenderElementMetaAttribute, Serializable>();

    /** Attached pseudorenderer */
    private final PseudorendererImpl pseudorenderer;

    /** Our rectangle relative to our corrdinated anchor. */
    private final Rectangle rectangle = new Rectangle();

    /** Increased with every change */
    private long changeID = 0;

    /** Our coordinates anchor, document based is default. */
    private CoordinatesType coordinatesType = CoordinatesType.DOCUMENT_BASED;

    /** ID */
    private String identifier;

    /** Which layer we're in. */
    private int zindex = 0;

    /** If we are visible or not */
    private boolean visible;

    /**
     * @param pseudorendererImpl
     */
    public RenderElementImpl(final PseudorendererImpl pseudorendererImpl) {
        this.pseudorenderer = pseudorendererImpl;
        this.metaInformation.put(RenderElementMetaAttribute.MISC, new HashMap<String, Serializable>());

        updateChangeID();
    }

    /* (non-Javadoc)
     * @see de.dfki.km.augmentedtext.services.pseudorenderer.RenderElement#getCoordinatesType()
     */
    @Override
    public CoordinatesType getCoordinatesType() {
        return this.coordinatesType;
    }

    /* (non-Javadoc)
     * @see de.dfki.km.augmentedtext.services.pseudorenderer.RenderElement#getGeometry(de.dfki.km.augmentedtext.services.pseudorenderer.CoordinatesType)
     */
    @Override
    public Rectangle getGeometry(final CoordinatesType ct) {

        // 1. normalize element position to document
        final Rectangle rval = (Rectangle) this.rectangle.clone();

        final Point viewport = this.pseudorenderer.getViewport();
        final Rectangle window = this.pseudorenderer.getGeometry();

        switch (this.coordinatesType) {
        case DOCUMENT_BASED:
            break;
        case VIEWPORT_BASED:
            rval.x += viewport.x;
            rval.y += viewport.y;
            break;
        case SCREEN_BASED:
            // Still does not make sense ...
            throw new NotImplementedException();
        }

        // 2. rval is now in document coordinates. Now convert to requested output format
        switch (ct) {
        case DOCUMENT_BASED:
            break;
        case VIEWPORT_BASED:
            rval.x -= viewport.x;
            rval.y -= viewport.y;
            break;
        case SCREEN_BASED:
            // FIXME: Check if elements are visible, or outside the viewport / screen
            rval.x += window.x - viewport.x;
            rval.y += window.y - viewport.y;
        }

        return rval;
    }

    /* (non-Javadoc)
     * @see de.dfki.km.augmentedtext.services.pseudorenderer.RenderElement#getIdentifier()
     */
    @Override
    public String getIdentifier() {
        return this.identifier;
    }

    /* (non-Javadoc)
     * @see de.dfki.km.augmentedtext.services.pseudorenderer.RenderElement#setGeometry(java.awt.Rectangle, de.dfki.km.augmentedtext.services.pseudorenderer.CoordinatesType)
     */
    @Override
    public void setGeometry(final Rectangle rectangle, final CoordinatesType type) {
        updateChangeID();

        if (type == CoordinatesType.DOCUMENT_BASED || type == CoordinatesType.VIEWPORT_BASED) {
            this.rectangle.x = rectangle.x;
            this.rectangle.y = rectangle.y;
            this.rectangle.width = rectangle.width;
            this.rectangle.height = rectangle.height;
            this.coordinatesType = type;
            return;
        }

        // Setting element-positions by screen position doesn't make sense ...
        throw new NotImplementedException();
    }

    /* (non-Javadoc)
     * @see de.dfki.km.augmentedtext.services.pseudorenderer.RenderElement#setIdentifier(java.lang.String)
     */
    @Override
    public void setIdentifier(final String id) {
        updateChangeID();
        this.identifier = id;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "RenderElement Rectangle=" + this.rectangle;
    }

    /**
     * @return
     */
    protected long getChangeID() {
        return this.changeID;
    }

    /**
     * Updates our change ID.
     */
    protected void updateChangeID() {
        this.changeID = this.pseudorenderer.getChangeID();
    }

    /* (non-Javadoc)
     * @see de.dfki.km.augmentedtext.services.pseudorenderer.RenderElement#getZIndex()
     */
    @Override
    public int getZIndex() {
        return this.zindex;
    }

    /* (non-Javadoc)
     * @see de.dfki.km.augmentedtext.services.pseudorenderer.RenderElement#setZIndex(int)
     */
    @Override
    public void setZIndex(int zindex) {
        updateChangeID();
        this.zindex = zindex;
    }

    /* (non-Javadoc)
     * @see de.dfki.km.augmentedtext.services.pseudorenderer.RenderElement#getMetaInformation(java.lang.String)
     */
    @Override
    public Serializable getMetaAttribute(RenderElementMetaAttribute key) {
        return this.metaInformation.get(key);
    }

    /* (non-Javadoc)
     * @see de.dfki.km.augmentedtext.services.pseudorenderer.RenderElement#hasMetaAttribute(java.lang.String)
     */
    @Override
    public boolean hasMetaAttribute(RenderElementMetaAttribute key) {
        return this.metaInformation.containsKey(key);
    }

    /* (non-Javadoc)
     * @see de.dfki.km.augmentedtext.services.pseudorenderer.RenderElement#setMetaAttribute(java.lang.String, java.io.Serializable)
     */
    @Override
    public void setMetaAttribute(RenderElementMetaAttribute key, Serializable value) {
        updateChangeID();
        this.metaInformation.put(key, value);
    }

    /* (non-Javadoc)
     * @see de.dfki.km.augmentedtext.services.pseudorenderer.RenderElement#isVisible()
     */
    @Override
    public boolean isVisible() {
        return this.visible;
    }

    /* (non-Javadoc)
     * @see de.dfki.km.augmentedtext.services.pseudorenderer.RenderElement#setVisible(boolean)
     */
    @Override
    public void setVisible(boolean visible) {
        this.visible = visible;
    }
}
TOP

Related Classes of de.dfki.km.text20.services.pseudorenderer.impl.RenderElementImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.