diff --git a/src/org/ohdsi/rabbitInAHat/Arrow.java b/src/org/ohdsi/rabbitInAHat/Arrow.java index d90d862b..5ba93862 100644 --- a/src/org/ohdsi/rabbitInAHat/Arrow.java +++ b/src/org/ohdsi/rabbitInAHat/Arrow.java @@ -147,6 +147,10 @@ public Color fillColor() { return color; } } + + public boolean isHighlighted() { + return (source != null && source.isSelected()) || (target != null && target.isSelected()); + } public static void drawArrowHead(Graphics2D g2d, int x, int y) { int nPoints = 3; diff --git a/src/org/ohdsi/rabbitInAHat/MappingPanel.java b/src/org/ohdsi/rabbitInAHat/MappingPanel.java index 924e1a8b..fd8c2d43 100644 --- a/src/org/ohdsi/rabbitInAHat/MappingPanel.java +++ b/src/org/ohdsi/rabbitInAHat/MappingPanel.java @@ -235,7 +235,7 @@ public void paint(Graphics g) { if (component != dragRectangle) component.paint(g2d); - for (Arrow component : arrows) + for (Arrow component : normalArrows()) if (component != dragArrow) component.paint(g2d); @@ -244,7 +244,11 @@ public void paint(Graphics g) { if (dragArrow != null) dragArrow.paint(g2d); - + + for (Arrow component : highlightedArrows()) + if (component != dragArrow) + component.paint(g2d); + if (offscreen != null) g.drawImage(offscreen, 0, 0, this); } @@ -258,6 +262,11 @@ private void addLabel(Graphics2D g2d, String string, int x, int y) { @Override public void mouseClicked(MouseEvent event) { + // Save away which arrows are currently highlighted vs normal before we + // de-select all the tables and arrows + List currentlyHighlightedArrows = highlightedArrows(); + List currentlyNormalArrows = normalArrows(); + if (selectedArrow != null) { selectedArrow.setSelected(false); detailsListener.showDetails(null); @@ -296,27 +305,42 @@ public void mouseClicked(MouseEvent event) { } } if (event.getX() > sourceX + ITEM_WIDTH && event.getX() < cdmX) { // Arrows - for (Arrow component : arrows) { - if (component.contains(event.getPoint())) { - if (event.getClickCount() == 2) { // double click - zoomArrow = component; - if (slaveMappingPanel != null) { - slaveMappingPanel.setMapping(ObjectExchange.etl.getFieldToFieldMapping((Table) zoomArrow.getSource().getItem(), (Table) zoomArrow - .getTarget().getItem())); - new AnimateThread(true).start(); - } - - } else { // single click - if (!component.isSelected()) { - component.setSelected(true); - selectedArrow = component; - detailsListener.showDetails(mapping.getSourceToCdmMap(selectedArrow.getSource().getItem(), selectedArrow.getTarget().getItem())); - } - repaint(); + Arrow clickedArrow = null; + + for (Arrow arrow : currentlyHighlightedArrows) { + if (arrow.contains(event.getPoint())) { + clickedArrow = arrow; + break; + } + } + + if (clickedArrow == null) { + for (Arrow arrow : currentlyNormalArrows) { + if (arrow.contains(event.getPoint())) { + clickedArrow = arrow; break; } } } + + if (clickedArrow != null) { + if (event.getClickCount() == 2) { // double click + zoomArrow = clickedArrow; + if (slaveMappingPanel != null) { + slaveMappingPanel.setMapping(ObjectExchange.etl.getFieldToFieldMapping((Table) zoomArrow.getSource().getItem(), (Table) zoomArrow + .getTarget().getItem())); + new AnimateThread(true).start(); + } + + } else { // single click + if (!clickedArrow.isSelected()) { + clickedArrow.setSelected(true); + selectedArrow = clickedArrow; + detailsListener.showDetails(mapping.getSourceToCdmMap(selectedArrow.getSource().getItem(), selectedArrow.getTarget().getItem())); + } + repaint(); + } + } } } @@ -598,5 +622,26 @@ public void addResizeListener(ResizeListener resizeListener) { public void setDetailsListener(DetailsListener detailsListener) { this.detailsListener = detailsListener; } + + private List highlightedArrows() { + List highlighted = new ArrayList(); + for(Arrow arrow : arrows) { + if (arrow.isHighlighted()) { + highlighted.add(arrow); + } + } + return highlighted; + } + + + private List normalArrows() { + List highlighted = new ArrayList(); + for(Arrow arrow : arrows) { + if (!arrow.isHighlighted()) { + highlighted.add(arrow); + } + } + return highlighted; + } }