view game/IDMWidget.java @ 175:55ea5821c802

Implement "real" widget modality.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 16 Mar 2017 10:42:54 +0200
parents 5070e57ebbfc
children 9f04e8ab180a
line wrap: on
line source

/*
 * Ristipolku IDM base widget
 * (C) Copyright 2011 Matti 'ccr' Hämäläinen <ccr@tnsp.org>
 */
package game;

import java.awt.*;
import java.awt.event.*;


public class IDMWidget
{
    IDMWidget parent;
    IDMPoint pos, size, scale;
    int keyCode;
    boolean modalWidget;

    IDMPoint textCurrPos, textCurrOffs;
    Paint textPaint;
    Font textFont;
    FontMetrics textMetrics;


    public IDMWidget()
    {
        keyCode = -1;
        this.scale = new IDMPoint(1, 1);
        this.pos = new IDMPoint(0, 0);
        this.size = new IDMPoint(0, 0);
    }

    public IDMWidget(IDMPoint pos)
    {
        this();
        this.pos = pos;
    }

    public IDMWidget(IDMPoint pos, IDMPoint size)
    {
        this();
        this.pos = pos;
        this.size = size;
    }

    public void setParent(IDMWidget par)
    {
        this.parent = par;
    }

    public void add(IDMWidget widget)
    {
    }

    public void remove(IDMWidget widget)
    {
    }

    public void setPos(IDMPoint pos)
    {
        this.pos = pos;
    }

    public void setPos(float x, float y)
    {
        this.pos = new IDMPoint(x, y);
    }

    public void setSize(IDMPoint size)
    {
        this.size = size;
    }

    public void setSize(float w, float h)
    {
        this.size = new IDMPoint(w, h);
    }

    public void setScale(IDMPoint scale)
    {
        this.scale = scale;
    }

    public void setScale(float x, float y)
    {
        this.setScale(new IDMPoint(x, y));
    }

    public int getScaledX()
    {
        return (int) (pos.x * scale.x);
    }

    public int getScaledY()
    {
        return (int) (pos.y * scale.y);
    }

    public int getScaledX(float x)
    {
        return (int) (x * scale.x);
    }

    public int getScaledY(float y)
    {
        return (int) (y * scale.y);
    }

    public int getScaledRelX(float x)
    {
        return (int) ((pos.x + x) * scale.x);
    }

    public int getScaledRelY(float y)
    {
        return (int) ((pos.y + y) * scale.y);
    }

    public int getScaledWidth()
    {
        return (int) (size.x * scale.x);
    }

    public int getScaledHeight()
    {
        return (int) (size.y * scale.y);
    }

    public boolean contains(float x, float y)
    {
        return (x >= getScaledX() &&
                y >= getScaledY() &&
                x < getScaledX() + getScaledWidth() &&
                y < getScaledY() + getScaledHeight());
    }

    public boolean contains(Point where)
    {
        return contains(where.x, where.y);
    }

    public boolean contains(IDMPoint where)
    {
        return contains(where.x, where.y);
    }

    public void paint(Graphics2D g)
    {
    }

    public boolean mousePressed(MouseEvent e)
    {
        return false;
    }

    public boolean mouseReleased(MouseEvent e)
    {
        if (contains(e.getPoint()))
        {
            clicked();
            return true;
        }
        return false;
    }

    public boolean mouseEntered(MouseEvent e)
    {
        return false;
    }

    public boolean mouseExited(MouseEvent e)
    {
        return false;
    }

    // Generic key handler
    public boolean keyPressed(KeyEvent e)
    {
        if (e.getKeyCode() == keyCode)
        {
            clicked();
            return true;
        }
        else
            return false;
    }

    public void clicked()
    {
    }

    public void setTextFont(Font font, FontMetrics metrics)
    {
        textFont = font;
        textMetrics = metrics;
    }

    public void setTextPaint(Paint paint)
    {
        textPaint = paint;
    }

    public void setCurrPos(IDMPoint npos)
    {
        textCurrPos = npos;
        textCurrOffs = new IDMPoint(0, 0);
    }

    public void setCurrPos(float x, float y)
    {
        setCurrPos(new IDMPoint(x, y));
    }

    public void setCurrPosScaledRel(float x, float y)
    {
        setCurrPos(new IDMPoint(getScaledRelX(x), getScaledRelY(y)));
    }

    public void drawString(Graphics2D g, String text)
    {
        Paint savePaint = g.getPaint();
        g.setPaint(textPaint);
        g.setFont(textFont);

        int i = 0;
        while (i < text.length())
        {
            int p = text.indexOf("\n", i);
            boolean linefeed;
            String str;
            if (p >= i)
            {
                str = text.substring(i, p);
                i = p + 1;
                linefeed = true;
            }
            else
            {
                str = text.substring(i);
                i += str.length();
                linefeed = false;
            }

            g.drawString(str, textCurrPos.x + textCurrOffs.x, textCurrPos.y + textCurrOffs.y);

            if (linefeed)
            {
                textCurrOffs.x = 0;
                textCurrOffs.y += textMetrics.getHeight();
            }
            else
            {
                textCurrOffs.x += textMetrics.stringWidth(str);
            }
        }

        g.setPaint(savePaint);
    }

    public boolean isModal()
    {
        return modalWidget;
    }

    public void setModal(boolean m)
    {
        modalWidget = m;
    }
}