Package com.cburch.logisim.std.memory

Source Code of com.cburch.logisim.std.memory.MemPoker$AddrPoker

/* Copyright (c) 2010, Carl Burch. License information is located in the
* com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */

package com.cburch.logisim.std.memory;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;

import com.cburch.logisim.data.Bounds;
import com.cburch.logisim.instance.InstancePainter;
import com.cburch.logisim.instance.InstancePoker;
import com.cburch.logisim.instance.InstanceState;
import com.cburch.logisim.proj.Project;

public class MemPoker extends InstancePoker {
    private MemPoker sub;

    @Override
    public boolean init(InstanceState state, MouseEvent event) {
        Bounds bds = state.getInstance().getBounds();
        MemState data = (MemState) state.getData();
        long addr = data.getAddressAt(event.getX() - bds.getX(),
                event.getY() - bds.getY());

        // See if outside box
        if (addr < 0) {
            sub = new AddrPoker();
        } else {
            sub = new DataPoker(state, data, addr);
        }
        return true;
    }

    @Override
    public Bounds getBounds(InstancePainter state) {
        return sub.getBounds(state);
    }
    @Override
    public void paint(InstancePainter painter) {
        sub.paint(painter);
    }
    @Override
    public void keyTyped(InstanceState state, KeyEvent e) {
        sub.keyTyped(state, e);
    }

    private static class DataPoker extends MemPoker {
        int initValue;
        int curValue;

        private DataPoker(InstanceState state, MemState data, long addr) {
            data.setCursor(addr);
            initValue = data.getContents().get(data.getCursor());
            curValue = initValue;

            Object attrs = state.getInstance().getAttributeSet();
            if (attrs instanceof RomAttributes) {
                Project proj = state.getProject();
                if (proj != null) {
                    ((RomAttributes) attrs).setProject(proj);
                }
            }
        }

        @Override
        public Bounds getBounds(InstancePainter painter) {
            MemState data = (MemState) painter.getData();
            Bounds inBounds = painter.getInstance().getBounds();
            return data.getBounds(data.getCursor(), inBounds);
        }

        @Override
        public void paint(InstancePainter painter) {
            Bounds bds = getBounds(painter);
            Graphics g = painter.getGraphics();
            g.setColor(Color.RED);
            g.drawRect(bds.getX(), bds.getY(), bds.getWidth(), bds.getHeight());
            g.setColor(Color.BLACK);
        }

        @Override
        public void stopEditing(InstanceState state) {
            MemState data = (MemState) state.getData();
            data.setCursor(-1);
        }

        @Override
        public void keyTyped(InstanceState state, KeyEvent e) {
            char c = e.getKeyChar();
            int val = Character.digit(e.getKeyChar(), 16);
            MemState data = (MemState) state.getData();
            if (val >= 0) {
                curValue = curValue * 16 + val;
                data.getContents().set(data.getCursor(), curValue);
                state.fireInvalidated();
            } else if (c == ' ' || c == '\t') {
                moveTo(data, data.getCursor() + 1);
            } else if (c == '\r' || c == '\n') {
                moveTo(data, data.getCursor() + data.getColumns());
            } else if (c == '\u0008' || c == '\u007f') {
                moveTo(data, data.getCursor() - 1);
            }
        }

        private void moveTo(MemState data, long addr) {
            if (data.isValidAddr(addr)) {
                data.setCursor(addr);
                data.scrollToShow(addr);
                initValue = data.getContents().get(addr);
                curValue = initValue;
            }
        }
    }

    private static class AddrPoker extends MemPoker {
        @Override
        public Bounds getBounds(InstancePainter painter) {
            MemState data = (MemState) painter.getData();
            return data.getBounds(-1, painter.getBounds());
        }

        @Override
        public void paint(InstancePainter painter) {
            Bounds bds = getBounds(painter);
            Graphics g = painter.getGraphics();
            g.setColor(Color.RED);
            g.drawRect(bds.getX(), bds.getY(), bds.getWidth(), bds.getHeight());
            g.setColor(Color.BLACK);
        }

        @Override
        public void keyTyped(InstanceState state, KeyEvent e) {
            char c = e.getKeyChar();
            int val = Character.digit(e.getKeyChar(), 16);
            MemState data = (MemState) state.getData();
            if (val >= 0) {
                long newScroll = (data.getScroll() * 16 + val) & (data.getLastAddress());
                data.setScroll(newScroll);
            } else if (c == ' ') {
                data.setScroll(data.getScroll() + (data.getRows() - 1) * data.getColumns());
            } else if (c == '\r' || c == '\n') {
                data.setScroll(data.getScroll() + data.getColumns());
            } else if (c == '\u0008' || c == '\u007f') {
                data.setScroll(data.getScroll() - data.getColumns());
            }
        }
    }
}
TOP

Related Classes of com.cburch.logisim.std.memory.MemPoker$AddrPoker

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.