⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 visofgraph.java

📁 petrinets小程序
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.Polygon;

import javax.swing.JFrame;


public class visOfGraph extends Canvas{
	
//	 height and width of tokens/items (in pixel)
    private static final int TokenH = 10;
    private static final int TokenW = 3;
    
//  different modes which mouse events are handled by
    public static final int NodeMode = 1;
    public static final int TransitionMode = 2;
    public static final int EdgeMode = 3;
    public static final int MODE_ITEM = 4;
    public static final int MODE_DELETE = 5;
    public static final int MODE_DRAG = 6;
    public static final int MODE_EDIT = 7;
    public static final int SELECTMODE = 8;
    private int mode;
    
//  color modes (color or black&white)
    public static final int COLORMODE_STANDARD = 20;
    public static final int COLORMODE_BLACKANDWHITE = 21;
    private int colorMode;
//    
    private static final int MAX_NUM_DELETE_EDGE = 255;
    private int     iDeleteNode;
    private int     iDeleteTransition;
    private int     nDeleteEdge;
    private int     iDeleteEdge[];
//
    private place        dragingPlace;
    private transition  dragingTransition;
    private edge    newEdge;
    private boolean newEdgeFinished;
//    
    private Dimension   ViewDim;
//
    private static pn PNet;
//
    private Image   BackBuffer;

    PlaceFrame PlaceFra;
    TransitionFrame TransFra;
    EdgeFrame EdgeFra;

    public visOfGraph(pn PN, Dimension dim) {
        PNet = PN;
        ViewDim = new Dimension(dim);
        resize(dim);
        newEdgeFinished = true;

        colorMode = COLORMODE_STANDARD;
//      colorMode = COLORMODE_BLACKANDWHITE;

        iDeleteNode = -1;
        iDeleteTransition = -1;
        nDeleteEdge = 0;
        iDeleteEdge = new int[MAX_NUM_DELETE_EDGE];
    }
    
    public void setDimension(Dimension d) {
        ViewDim.height = d.height;
        ViewDim.width = d.width;
    }
    
    public boolean setMode(int mode, int autorisation) {
        if (this.mode == SELECTMODE) {
            if (autorisation == run.CODE) {
                this.mode = mode;
                iDeleteNode = -1;
                iDeleteTransition = -1;
                nDeleteEdge = 0;
                return true;
            }
        } else {
            this.mode = mode;
            iDeleteNode = -1;
            iDeleteTransition = -1;
            nDeleteEdge = 0;
            return true;
        }
        return false;
    }
    
    public int getMode() {
        return mode;
    }
    
    public void setColorMode(int colorMode) {
        this.colorMode = colorMode;
    }
    
    public int getColorMode() {
        return colorMode;
    }
	
    public void setPN(pn PN) {
        PNet = PN;
    }
    
    public boolean handleEvent(Event evt) {
        switch(evt.id) {
        case Event.MOUSE_DOWN:
            // right mouse button down
            if (mode == MODE_DRAG || evt.modifiers == Event.META_MASK) {////iSco  modifiers:修饰符键的状态
                mouseMetaDown(evt);                                     ////iSco  META_MASK:此标志指示当事件发生时按下 Meta 键
            }
            else {
                if (mode == SELECTMODE)
                	;
//                  mouseDownSelect(evt);
                if (mode == NodeMode)
                    mouseDownPlace(evt);
                else if (mode == TransitionMode)
                    mouseDownTransition(evt);
                else if (mode == EdgeMode)
                    mouseDownEdge(evt);
                else if (mode == MODE_ITEM)
                    mouseDownToken(evt);
                else if (mode == MODE_DELETE)
                    mouseDownDelete(evt);
                else if (mode == MODE_EDIT)
                    mouseDownEdit(evt);
            }
            repaint();
            break;
        case Event.MOUSE_UP:
            break;
        case Event.MOUSE_DRAG:
            if (mode == MODE_DRAG || evt.modifiers == Event.META_MASK) {
                mouseMetaDrag(evt);
            }
            else {
                if (mode == NodeMode)
                    ;
                else if (mode == TransitionMode)
                    ;
                else if (mode == EdgeMode)
                    mouseDragEdge(evt);
            }
            repaint();
            break;
        case Event.MOUSE_MOVE:
            if (mode == NodeMode)
                ;
            else if (mode == TransitionMode)
                ;
            else if (mode == EdgeMode)
                mouseMoveEdge(evt);
            else if (mode == MODE_DELETE)
                mouseMoveDelete(evt);
            repaint();
            break;
        case Event.MOUSE_EXIT:
            if (mode == EdgeMode && ! newEdgeFinished) {
                PNet.removeEdge(newEdge);
                newEdgeFinished = true;
            }
            repaint();
            return true;
        }
        return true;
    }
    
    public void mouseMetaDown(Event evt){
    	place n = getPlaceAtXY(evt.x, evt.y, null);
    	transition t = getTransitionAtXY(evt.x, evt.y, null);
    	if (n != null) {
            if (mode == MODE_ITEM) {
                n.decTokens();
                dragingPlace = null;
                dragingTransition = null;
            } else {
                dragingPlace = n;
                dragingTransition = null;
            }
        }
        else if (t != null) {
            dragingPlace = null;
            dragingTransition = t;
        }
        else {
            dragingPlace = null;
            dragingTransition = null;
        }
    }
    
/*    private void mouseDownSelect(Event evt) {
        transition t = getTransitionAtXY(evt.x, evt.y, null);
        if ((t != null) && (t.highlight)) {
            ((Editor)getParent()).getRunStep().select(t);
        }
    }*/
    
    private void mouseDownPlace(Event evt) {
        if (!tooCloseToPlace(evt.x, evt.y, null) &&
            !tooCloseToTransition(evt.x, evt.y , null))
            PNet.addPlace(evt.x, evt.y);
    }
    
    private void mouseDownTransition(Event evt) {
        if (!tooCloseToPlace(evt.x, evt.y, null) &&
            !tooCloseToTransition(evt.x, evt.y, null))
            PNet.addTransition(evt.x, evt.y);
        else {
            transition t = getTransitionAtXY(evt.x, evt.y, null);
            if (t != null)
                t.cycleOrientation();
        }
    }
    
    private void mouseDownEdge(Event evt) {
        place n = getPlaceAtXY(evt.x, evt.y, null);
        transition t = getTransitionAtXY(evt.x, evt.y, null);

        if (newEdgeFinished == true) {
            if (n != null) {
                newEdge = PNet.addEdge(edge.PLACE, PNet.getIndexOf(n), edge.NOTHING, 0, null);
                newEdgeFinished = false;
            }
            else if (t != null) {
                newEdge = PNet.addEdge(edge.TRANSITION, PNet.getIndexOf(t), edge.NOTHING, 0, null);
                newEdgeFinished = false;
            }
        }
        else {
            if (n != null) {
                // edge starts and ends at a node
                if (newEdge.getTFrom() == edge.PLACE) {
                    PNet.removeEdge(newEdge);
                    newEdgeFinished = true;
                }
                else {
                    newEdge.clearLastPoint();
                    newEdge.setTTo(edge.PLACE);
                    newEdge.setITo(PNet.getIndexOf(n));
                    newEdgeFinished = true;
                }
            }
            else if (t != null) {
                // edge starts and ends at a transition
                if (newEdge.getTFrom() == edge.TRANSITION) {
                    PNet.removeEdge(newEdge);
                    newEdgeFinished = true;
                }
                else {
                    newEdge.clearLastPoint();
                    newEdge.setTTo(edge.TRANSITION);
                    newEdge.setITo(PNet.getIndexOf(t));
                    newEdgeFinished = true;
                }
            }
            else {
                newEdge.setLastPoint(evt.x, evt.y);
                newEdge.addPoint(evt.x, evt.y);
            }
        }
    }

    private void mouseDownToken(Event evt) {
        place n = getPlaceAtXY(evt.x, evt.y, null);
        if (n != null)
            n.incTokens();
    }
    
    private void mouseDownDelete(Event evt) {
        place n = getPlaceAtXY(evt.x, evt.y, null);
        transition t = getTransitionAtXY(evt.x, evt.y, null);
        edge e = getEdgeAtXY(evt.x, evt.y, null);
        if (n != null) {
            iDeleteNode = PNet.getIndexOf(n);
            iDeleteTransition = -1;
            nDeleteEdge = 0;
            for (int i = 0; i < PNet.numberOfEdges(); i++) {
                edge ee = PNet.getEdge(i);
                if (ee.getTFrom() == edge.PLACE && ee.getIFrom() == iDeleteNode ||
                    ee.getTTo() == edge.PLACE && ee.getITo() == iDeleteNode) {
                    PNet.removeEdge(ee);
                }
            }
            PNet.removePlace(n);
            iDeleteNode = -1;
        }
        else if (t != null) {
            iDeleteNode = -1;
            iDeleteTransition = PNet.getIndexOf(t);
            nDeleteEdge = 0;
            for (int i = 0; i < PNet.numberOfEdges(); i++) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -