From 4a91ecd63a99966e12f3e4236fca22072f0b66a3 Mon Sep 17 00:00:00 2001 From: Daniel_M_Williams Date: Tue, 10 Jul 2018 14:15:43 -0400 Subject: [PATCH] [feature][Resolves #426] implemented FinPoint SelectedIndex Indicators - figure and table update each other --- .../configdialog/FreeformFinSetConfig.java | 81 ++++++++++++------- .../gui/scalefigure/FinPointFigure.java | 40 ++++++--- 2 files changed, 81 insertions(+), 40 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java index d288935e9..8949883c1 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/FreeformFinSetConfig.java @@ -3,6 +3,7 @@ package net.sf.openrocket.gui.configdialog; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; import java.io.BufferedWriter; @@ -71,6 +72,8 @@ public class FreeformFinSetConfig extends FinSetConfig { private JTable table = null; private FinPointTableModel tableModel = null; + private int dragIndex = -1; + private FinPointFigure figure = null; @@ -214,6 +217,14 @@ public class FreeformFinSetConfig extends FinSetConfig { for (int i = 0; i < Columns.values().length; i++) { table.getColumnModel().getColumn(i).setPreferredWidth(Columns.values()[i].getWidth()); } + table.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent ev) { + figure.setSelectedIndex(table.getSelectedRow()); + figure.updateFigure(); + } + + }); JScrollPane tablePane = new JScrollPane(table); JButton scaleButton = new JButton(trans.get("FreeformFinSetConfig.lbl.scaleFin")); @@ -340,8 +351,7 @@ public class FreeformFinSetConfig extends FinSetConfig { } finally { document.stopUndo(); } - } - + } } @@ -351,22 +361,33 @@ public class FreeformFinSetConfig extends FinSetConfig { if (tableModel != null) { tableModel.fireTableDataChanged(); + + // make sure to do this *after* the table data is updated. + if( 0 <= this.dragIndex ) { + table.setRowSelectionInterval(dragIndex, dragIndex); + }else { + table.clearSelection(); + } } + if (figure != null) { - figure.updateFigure(); + if( 0 <= this.dragIndex ) { + figure.setSelectedIndex(dragIndex); + }else{ + figure.resetSelectedIndex(); + } + figure.updateFigure(); } revalidate(); repaint(); } - - private class FinPointScrollPane extends ScaleScrollPane { private static final int ANY_MASK = (MouseEvent.ALT_DOWN_MASK | MouseEvent.ALT_GRAPH_DOWN_MASK | MouseEvent.META_DOWN_MASK | MouseEvent.CTRL_DOWN_MASK | MouseEvent.SHIFT_DOWN_MASK); - private int dragIndex = -1; + private FinPointScrollPane( final FinPointFigure _figure) { super( _figure); @@ -381,30 +402,30 @@ public class FreeformFinSetConfig extends FinSetConfig { return; } - final int pointIndex = getPoint(event); - - if ( pointIndex >= 0) { - dragIndex = pointIndex; + final int pressIndex = getPoint(event); + if ( pressIndex >= 0) { + dragIndex = pressIndex; + updateFields(); return; } final int segmentIndex = getSegment(event); - System.err.println(String.format(".... finpoint//segmentIndex: %d", segmentIndex)); if (segmentIndex >= 0) { Point2D.Double point = getCoordinates(event); finset.addPoint(segmentIndex ); try { finset.setPoint(dragIndex, point.x, point.y); + dragIndex = segmentIndex; + updateFields(); + return; } catch (IllegalFinPointException ignore) { // no-op } catch (ArrayIndexOutOfBoundsException ex) { log.error("bad index while editing fin points!!", ex); } - dragIndex = segmentIndex; updateFields(); - return; } @@ -415,7 +436,7 @@ public class FreeformFinSetConfig extends FinSetConfig { @Override public void mouseDragged(MouseEvent event) { int mods = event.getModifiersEx(); - if (dragIndex < 0 || (mods & (ANY_MASK | MouseEvent.BUTTON1_DOWN_MASK)) != MouseEvent.BUTTON1_DOWN_MASK) { + if (dragIndex <= 0 || (mods & (ANY_MASK | MouseEvent.BUTTON1_DOWN_MASK)) != MouseEvent.BUTTON1_DOWN_MASK) { super.mouseDragged(event); return; } @@ -439,22 +460,22 @@ public class FreeformFinSetConfig extends FinSetConfig { @Override public void mouseClicked(MouseEvent event) { - int mods = event.getModifiersEx(); - if (event.getButton() != MouseEvent.BUTTON1 || (mods & ANY_MASK) != MouseEvent.CTRL_DOWN_MASK) { - super.mouseClicked(event); - return; - } - - int index = getPoint(event); - if (index < 0) { - super.mouseClicked(event); - return; - } - - try { - finset.removePoint(index); - } catch (IllegalFinPointException ignore) { - } + int mods = event.getModifiersEx(); + if (event.getButton() != MouseEvent.BUTTON1 || (mods & ANY_MASK) != MouseEvent.CTRL_DOWN_MASK) { + super.mouseClicked(event); + return; + } + + int index = getPoint(event); + if (index < 0) { + super.mouseClicked(event); + return; + } + + try { + finset.removePoint(index); + } catch (IllegalFinPointException ignore) { + } } diff --git a/swing/src/net/sf/openrocket/gui/scalefigure/FinPointFigure.java b/swing/src/net/sf/openrocket/gui/scalefigure/FinPointFigure.java index 9edc176cb..0bf8a416d 100644 --- a/swing/src/net/sf/openrocket/gui/scalefigure/FinPointFigure.java +++ b/swing/src/net/sf/openrocket/gui/scalefigure/FinPointFigure.java @@ -7,7 +7,6 @@ import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.RenderingHints; -import java.awt.geom.AffineTransform; import java.awt.geom.Line2D; import java.awt.geom.NoninvertibleTransformException; import java.awt.geom.Path2D; @@ -43,6 +42,7 @@ public class FinPointFigure extends AbstractScaleFigure { // the size of the boxes around each fin point vertex private static final float BOX_WIDTH_PIXELS = 12; + private static final float SELECTED_BOX_WIDTH_PIXELS = 16; private static final double MINOR_TICKS = 0.05; private static final double MAJOR_TICKS = 0.1; @@ -56,7 +56,7 @@ public class FinPointFigure extends AbstractScaleFigure { protected final List listeners = new LinkedList(); private Rectangle2D.Double[] finPointHandles = null; - + private int selectedIndex = -1; public FinPointFigure(FreeformFinSet finset) { this.finset = finset; @@ -229,19 +229,30 @@ public class FinPointFigure extends AbstractScaleFigure { // Fin point boxes final float boxWidth = (float) (BOX_WIDTH_PIXELS / scale ); + final float boxHalfWidth = boxWidth/2; + final float selBoxWidth = (float) (SELECTED_BOX_WIDTH_PIXELS / scale ); + final float selBoxHalfWidth = boxWidth/2; + final float boxEdgeWidth_m = (float) ( LINE_WIDTH_PIXELS / scale ); g2.setStroke(new BasicStroke( boxEdgeWidth_m, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); g2.setColor(new Color(150, 0, 0)); - final double boxHalfWidth = boxWidth/2; + finPointHandles = new Rectangle2D.Double[ drawPoints.length]; - for (int i = 0; i < drawPoints.length; i++) { - Coordinate c = drawPoints[i]; - finPointHandles[i] = new Rectangle2D.Double(c.x - boxHalfWidth, c.y - boxHalfWidth, boxWidth, boxWidth); - g2.draw(finPointHandles[i]); + for (int currentIndex = 0; currentIndex < drawPoints.length; currentIndex++) { + Coordinate c = drawPoints[currentIndex]; + + if( currentIndex == selectedIndex ) { + finPointHandles[currentIndex] = new Rectangle2D.Double(c.x - selBoxHalfWidth, c.y - selBoxHalfWidth, selBoxWidth, selBoxWidth); + } else { + // normal boxes + finPointHandles[currentIndex] = new Rectangle2D.Double(c.x - boxHalfWidth, c.y - boxHalfWidth, boxWidth, boxWidth); + } + + g2.draw(finPointHandles[currentIndex]); } } - public Point2D.Double getPoint( final int x, final int y){ + private Point2D.Double getPoint( final int x, final int y){ if (finPointHandles == null) return null; @@ -261,9 +272,11 @@ public class FinPointFigure extends AbstractScaleFigure { return -1; for (int i = 0; i < finPointHandles.length; i++) { - if (finPointHandles[i].contains(p)) + if (finPointHandles[i].contains(p)) { return i; + } } + return -1; } @@ -353,6 +366,13 @@ public class FinPointFigure extends AbstractScaleFigure { System.err.println(String.format("________ Origin Location (px): w=%d, h=%d: ", originLocation_px.width, originLocation_px.height)); } - + + public void resetSelectedIndex() { + this.selectedIndex = -1; + } + + public void setSelectedIndex(final int newIndex) { + this.selectedIndex = newIndex; + } }