diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index 74b4f307a..bb737cd87 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -726,7 +726,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS JOptionPane.showMessageDialog(Main.this, Lang.get("msg_restartNeeded")); } if (!Settings.getInstance().getAttributes().equalsKey(Keys.SETTINGS_GRID, modified)) - circuitComponent.repaintNeeded(); + circuitComponent.graphicHasChanged(); Settings.getInstance().getAttributes().getValuesFrom(modified); } @@ -958,7 +958,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS model.doMicroStep(false); circuitComponent.removeHighLighted(); modelCreator.addNodeElementsTo(model.nodesToUpdate(), circuitComponent.getHighLighted()); - circuitComponent.repaintNeeded(); + circuitComponent.graphicHasChanged(); doStep.setEnabled(model.needsUpdate()); } catch (Exception e1) { showErrorAndStopModel(Lang.get("msg_errorCalculatingStep"), e1); @@ -975,7 +975,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS public void actionPerformed(ActionEvent e) { try { Model.BreakInfo info = model.runToBreak(); - circuitComponent.repaintNeeded(); + circuitComponent.graphicHasChanged(); statusLabel.setText(Lang.get("stat_clocks", info.getSteps(), info.getLabel())); } catch (NodeException | RuntimeException e1) { showErrorAndStopModel(Lang.get("msg_fastRunError"), e1); @@ -1364,7 +1364,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS modelCreator.addNodeElementsTo(model.nodesToUpdate(), circuitComponent.getHighLighted()); model.fireManualChangeEvent(); doStep.setEnabled(model.needsUpdate()); - circuitComponent.repaintNeeded(); + circuitComponent.graphicHasChanged(); }; else handler = keyboard -> { @@ -1374,7 +1374,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS model.fireManualChangeEvent(); model.doStep(); }); - circuitComponent.repaintNeeded(); + circuitComponent.graphicHasChanged(); } catch (NodeException | RuntimeException e) { showErrorAndStopModel(Lang.get("msg_errorCalculatingStep"), e); } @@ -1435,7 +1435,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS circuitComponent.addHighLightedWires(e.getValues()); } circuitComponent.setHighLightStyle(Style.ERROR); - circuitComponent.repaintNeeded(); + circuitComponent.graphicHasChanged(); new ErrorMessage(message).addCause(cause).show(Main.this); ensureModelIsStopped(); } @@ -1576,7 +1576,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS model.fireManualChangeEvent(); model.doStep(); }); - circuitComponent.repaintNeeded(); + circuitComponent.graphicHasChanged(); } catch (NodeException | RuntimeException e) { showErrorAndStopModel(Lang.get("msg_errorCalculatingStep"), e); } @@ -1595,7 +1595,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS if (!realTimeClockRunning) modelCreator.addNodeElementsTo(model.nodesToUpdate(), circuitComponent.getHighLighted()); model.fireManualChangeEvent(); - circuitComponent.repaintNeeded(); + circuitComponent.graphicHasChanged(); if (!realTimeClockRunning) doStep.setEnabled(model.needsUpdate()); } @@ -1662,7 +1662,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS GifExporter gifExporter = new GifExporter(Main.this, circuitComponent.getCircuit(), 500, file); windowPosManager.closeAll(); runModelState.enter(false, gifExporter); - circuitComponent.repaintNeeded(); + circuitComponent.graphicHasChanged(); } ); } @@ -1712,7 +1712,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS public void start(File romHex) { SwingUtilities.invokeLater(() -> { runModelState.enter(true, new ProgramMemoryLoader(romHex)); - circuitComponent.repaintNeeded(); + circuitComponent.graphicHasChanged(); }); } @@ -1720,7 +1720,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS public void debug(File romHex) { SwingUtilities.invokeLater(() -> { runModelState.enter(false, new ProgramMemoryLoader(romHex)); - circuitComponent.repaintNeeded(); + circuitComponent.graphicHasChanged(); if (model != null) showMeasurementDialog(ModelEvent.STEP); }); @@ -1742,7 +1742,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS clkVal.setBool(!clkVal.getBool()); model.doStep(); } - circuitComponent.repaintNeeded(); + circuitComponent.graphicHasChanged(); addressPicker.getProgramROMAddress(model); } catch (NodeException | RuntimeException e) { showErrorAndStopModel(Lang.get("err_remoteExecution"), e); @@ -1777,7 +1777,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS public void stop() { SwingUtilities.invokeLater(() -> { ensureModelIsStopped(); - circuitComponent.repaintNeeded(); + circuitComponent.graphicHasChanged(); }); } //********************** diff --git a/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java b/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java index 826c25222..e5c546937 100644 --- a/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java +++ b/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java @@ -127,7 +127,7 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib private Vector lastMousePos; private SyncAccess modelSync = SyncAccess.NOSYNC; private boolean isManualScale; - private boolean graphicsHasChanged = true; + private boolean graphicHasChangedFlag = true; private boolean focusWasLost = false; private boolean lockMessageShown = false; private boolean antiAlias = true; @@ -225,7 +225,7 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib transform.scale(f, f); transform.translate(-pos.x, -pos.y); isManualScale = true; - repaintNeeded(); + graphicHasChanged(); }); addComponentListener(new ComponentAdapter() { @@ -437,8 +437,8 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib /** * invalidates the image buffer and calls repaint(); */ - public void repaintNeeded() { - graphicsHasChanged = true; + public void graphicHasChanged() { + graphicHasChangedFlag = true; repaint(); } @@ -628,8 +628,10 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib * @param type of drawable */ public void addHighLighted(T drawable) { - if (drawable != null) + if (drawable != null) { highLighted.add(drawable); + graphicHasChanged(); + } } /** @@ -638,8 +640,10 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib * @param drawables the list of drawables */ public void addHighLighted(Collection drawables) { - if (drawables != null) + if (drawables != null) { highLighted.addAll(drawables); + graphicHasChanged(); + } } /** @@ -660,8 +664,12 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib * remove all highlighted elements */ public void removeHighLighted() { - highLighted.clear(); - highLightStyle = Style.HIGHLIGHT; + if (!highLighted.isEmpty()) { + highLighted.clear(); + highLightStyle = Style.HIGHLIGHT; + graphicHasChanged(); + } + } /** @@ -705,7 +713,7 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib } mouseInsertElement.updateMousePos(getPosVector(point.x, point.y)); - repaintNeeded(); + graphicHasChanged(); requestFocus(); } @@ -726,30 +734,27 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib } elements = new CopiedElementLabelRenamer(getCircuit(), elements).rename(); mouseInsertList.activate(elements, pos); - repaintNeeded(); + graphicHasChanged(); } private BufferedImage buffer; - private int highlightedPaintedSize; @Override protected void paintComponent(Graphics g) { super.paintComponent(g); - boolean needsNewBuffer = buffer == null + boolean newBufferRequired = buffer == null || getWidth() != buffer.getWidth() || getHeight() != buffer.getHeight(); - if (needsNewBuffer && !isManualScale) + if (newBufferRequired && !isManualScale) fitCircuit(); final double scaleX = transform.getScaleX(); - if (graphicsHasChanged - || needsNewBuffer - || highLighted.size() != highlightedPaintedSize) { + if (graphicHasChangedFlag || newBufferRequired) { - if (needsNewBuffer) + if (newBufferRequired) buffer = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage(getWidth(), getHeight()); Graphics2D gr2 = buffer.createGraphics(); @@ -774,10 +779,9 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib if (time > 500) antiAlias = false; if (time < 50) antiAlias = true; -// System.out.println("repaint: " + Long.toString(time) + "ms"); +// System.out.println("repaint: " + time + "ms"); - highlightedPaintedSize = highLighted.size(); - graphicsHasChanged = false; + graphicHasChangedFlag = false; } g.drawImage(buffer, 0, 0, null); @@ -845,7 +849,7 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib @Override public void hasChanged() { - repaintNeeded(); + graphicHasChanged(); redoAction.setEnabled(undoManager.redoAvailable()); undoAction.setEnabled(undoManager.undoAvailable()); } @@ -856,7 +860,7 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib * Therefore the double buffer is invalidated. */ public void paintImmediately() { - graphicsHasChanged = true; + graphicHasChangedFlag = true; paintImmediately(0, 0, getWidth(), getHeight()); } @@ -935,7 +939,7 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib } if (!newTrans.equals(transform)) { transform = newTrans; - repaintNeeded(); + graphicHasChanged(); } } @@ -950,7 +954,7 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib transform.scale(f, f); transform.translate(-dif.x, -dif.y); isManualScale = true; - repaintNeeded(); + graphicHasChanged(); } /** @@ -962,7 +966,7 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib public void translateCircuit(int dx, int dy) { transform.translate(dx, dy); isManualScale = true; - repaintNeeded(); + graphicHasChanged(); } private void editAttributes(VisualElement element, MouseEvent e) { @@ -1012,7 +1016,7 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib @Override public void libraryChanged(LibraryNode node) { getCircuit().clearState(); - graphicsHasChanged = true; + graphicHasChangedFlag = true; repaint(); } @@ -1258,7 +1262,7 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib transform.translate(delta.x / s, delta.y / s); pos = newPos; isManualScale = true; - repaintNeeded(); + graphicHasChanged(); } } } @@ -1284,7 +1288,7 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib cutAction.setEnabled(false); rotateAction.setEnabled(false); setCursor(mouseCursor); - repaintNeeded(); + graphicHasChanged(); } void deactivate() { @@ -1507,7 +1511,7 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib deleteAction.setEnabled(true); rotateAction.setEnabled(true); copyAction.setEnabled(true); - repaintNeeded(); + graphicHasChanged(); } @Override @@ -1579,7 +1583,7 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib this.pos = raster(pos); deleteAction.setEnabled(true); removeHighLighted(); - repaintNeeded(); + graphicHasChanged(); } @Override @@ -2122,7 +2126,7 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib @Override public void rotate() { ModifyMoveSelected.rotateElements(elements, raster(lastPos)); - repaintNeeded(); + graphicHasChanged(); } @Override @@ -2194,7 +2198,7 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib if (modelHasChanged) { modelHasChanged(); } else - repaintNeeded(); + graphicHasChanged(); } }