/* * Copyright (C) 2010-2016 JPEXS * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.jpexs.decompiler.flash.gui.editor; import com.jpexs.decompiler.flash.gui.Main; import com.jpexs.decompiler.flash.gui.View; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.util.Set; import jsyntaxpane.components.BreakPointListener; import jsyntaxpane.components.LineMarkerPainter; import jsyntaxpane.components.LineNumbersBreakpointsRuler; /** * * @author JPEXS */ public class DebuggableEditorPane extends LineMarkedEditorPane implements BreakPointListener, LineMarkerPainter { private static final Color BG_CURRENT_COLOR = new Color(0xd6, 0xe8, 0xe2); private static final Color BG_RULER_COLOR = new Color(0xe9, 0xe8, 0xe2); private static final Color BG_BREAKPOINT_COLOR = new Color(0xfc, 0x9d, 0x9f); private static final Color FG_BREAKPOINT_COLOR = null; private static final int PRIORITY_BREAKPOINT = 20; private static final Color BG_IP_COLOR = new Color(0xbd, 0xe6, 0xaa); private static final Color FG_IP_COLOR = null; private static final int PRIORITY_IP = 0; private static final Color BG_INVALID_BREAKPOINT_COLOR = new Color(0xdc, 0xdc, 0xd8); private static final Color FG_INVALID_BREAKPOINT_COLOR = null; private static final int PRIORITY_INVALID_BREAKPOINT = 10; public static final LineMarker BREAKPOINT_MARKER = new LineMarker(FG_BREAKPOINT_COLOR, BG_BREAKPOINT_COLOR, PRIORITY_BREAKPOINT); public static final LineMarker IP_MARKER = new LineMarker(FG_IP_COLOR, BG_IP_COLOR, PRIORITY_IP); public static final LineMarker INVALID_BREAKPOINT_MARKER = new LineMarker(FG_INVALID_BREAKPOINT_COLOR, BG_INVALID_BREAKPOINT_COLOR, PRIORITY_INVALID_BREAKPOINT); protected String scriptName = null; private LineNumbersBreakpointsRuler ruler; public synchronized void setScriptName(String scriptName) { this.scriptName = scriptName; } @Override public synchronized void toggled(int line) { if (scriptName == null) { return; } boolean on = Main.toggleBreakPoint(scriptName, line - firstLineOffset()); removeColorMarker(line, INVALID_BREAKPOINT_MARKER); if (on) { if (Main.isBreakPointValid(scriptName, line - firstLineOffset())) { addColorMarker(line, BREAKPOINT_MARKER); } else { addColorMarker(line, INVALID_BREAKPOINT_MARKER); } } else { removeColorMarker(line, BREAKPOINT_MARKER); removeColorMarker(line, INVALID_BREAKPOINT_MARKER); } } public synchronized void refreshMarkers() { removeColorMarkerOnAllLines(BREAKPOINT_MARKER); removeColorMarkerOnAllLines(INVALID_BREAKPOINT_MARKER); removeColorMarkerOnAllLines(IP_MARKER); if (scriptName == null) { return; } Set<Integer> bkptLines = Main.getScriptBreakPoints(scriptName, false); for (int line : bkptLines) { if (Main.isBreakPointValid(scriptName, line)) { addColorMarker(line + firstLineOffset(), BREAKPOINT_MARKER); } else { addColorMarker(line + firstLineOffset(), INVALID_BREAKPOINT_MARKER); } } int ip = Main.getIp(scriptName); String ipPath = Main.getIpClass(); if (ip > 0 && ipPath != null && ipPath.equals(scriptName)) { addColorMarker(ip + firstLineOffset(), IP_MARKER); } } @Override public void setText(String t) { super.setText(t); refreshMarkers(); } public String getScriptName() { return scriptName; } @Override public void paintLineMarker(Graphics g, int line, int x, int lineY, int textY, int lineHeight, boolean currentLine, int maxLines) { if (currentLine) { g.setColor(BG_CURRENT_COLOR); } else { g.setColor(View.getDefaultBackgroundColor()); } int h = lineHeight; if (line == 1) { h += lineY; } if (line == maxLines) { h = getHeight() - lineY; } g.fillRect(0, line == 1 ? 0 : lineY, getWidth(), h); ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); ((Graphics2D) g).setStroke(new BasicStroke(0.5f)); boolean drawText = true; if (hasColorMarker(line, INVALID_BREAKPOINT_MARKER)) { g.setColor(BG_INVALID_BREAKPOINT_COLOR); g.fillOval(x + 5, textY - 10, 10, 10); g.setColor(Color.black); g.drawOval(x + 5, textY - 10, 10, 10); drawText = false; } else if (hasColorMarker(line, BREAKPOINT_MARKER)) { g.setColor(BG_BREAKPOINT_COLOR); g.fillOval(x + 5, textY - 10, 10, 10); g.setColor(Color.black); g.drawOval(x + 5, textY - 10, 10, 10); drawText = false; } if (hasColorMarker(line, IP_MARKER)) { int mx = x + 10; g.setColor(BG_IP_COLOR); g.fillPolygon(new int[]{mx, mx + 10, mx}, new int[]{textY - 10, textY - 5, textY}, 3); g.setColor(Color.black); g.drawPolygon(new int[]{mx, mx + 10, mx}, new int[]{textY - 10, textY - 5, textY}, 3); drawText = false; } if (drawText) { g.setColor(getForeground()); g.drawString("" + line, x, textY); } } @Override public void installLineMarker(LineNumbersBreakpointsRuler ruler) { this.ruler = ruler; } @Override public void addColorMarker(int line, LineMarker lm) { super.addColorMarker(line, lm); ruler.repaint(); } @Override public void removeColorMarker(int line, LineMarker lm) { super.removeColorMarker(line, lm); ruler.repaint(); } }