Correction drag acc

This commit is contained in:
AdecWatt
2019-04-18 07:44:32 +02:00
parent 805ff7b813
commit 8a68404cf8
5 changed files with 98 additions and 67 deletions

View File

@ -53,26 +53,29 @@ public abstract class Item<P extends XmlPermanent<T, A>, T extends Enum<?>, A ex
}
// ========================================
public boolean onAcc (String accId, double theta, Point2D.Double realPos, double close) {
try {
double [] coord = new double [] {realPos.x, realPos.y};
Point2D.Double accPos = accCenter.get (accId);
DimensionDouble accSize = this.accSize.get (accId);
AffineTransform at = new AffineTransform ();
at.rotate (theta);
at.translate (-accPos.x, -accPos.y);
at.transform (coord, 0, coord, 0, 1);
double halfWidth = accSize.width/2+close, halfHeight = accSize.height/2+close;
if (coord[0] >= -halfWidth && coord[0] <= halfWidth &&
coord[1] >= -halfHeight && coord[1] <= halfHeight)
return true;
} catch (Exception e) {
}
return false;
}
public ArrayList<Acc> findAccs (Point2D.Double realPos, double close) {
ArrayList<Acc> result = new ArrayList<Acc> ();
double theta = Math.toRadians (-getThetaDegree ());
double [] coord = new double [] {realPos.x, realPos.y};
for (String accId : getEmbeddedIds ())
try {
coord[0] = realPos.x;
coord[1] = realPos.y;
Point2D.Double accPos = accCenter.get (accId);
DimensionDouble accSize = this.accSize.get (accId);
AffineTransform at = new AffineTransform ();
at.rotate (theta);
at.translate (-accPos.x, -accPos.y);
at.transform (coord, 0, coord, 0, 1);
double halfWidth = accSize.width/2+close, halfHeight = accSize.height/2+close;
if (coord[0] >= -halfWidth && coord[0] <= halfWidth &&
coord[1] >= -halfHeight && coord[1] <= halfHeight)
result.add (findEmbedded (accId));
} catch (Exception e) {
}
if (onAcc (accId, theta, realPos, close))
result.add (findEmbedded (accId));
return result;
}

View File

@ -1,12 +1,13 @@
package adecWatt.view;
import adecWatt.model.Acc;
import adecWatt.model.Item;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;
import javax.swing.JLabel;
import adecWatt.model.Acc;
import adecWatt.model.Item;
@SuppressWarnings ("serial")
public class JAcc extends JLabel {
@ -27,9 +28,9 @@ public class JAcc extends JLabel {
setIcon (acc.getModel ().getIcon (16));
setSize (getPreferredSize ());
setPos ();
AccMouseAdapter accMouseAdapter = new AccMouseAdapter ();
addMouseListener (accMouseAdapter);
addMouseMotionListener (accMouseAdapter);
// AccMouseAdapter accMouseAdapter = new AccMouseAdapter ();
// addMouseListener (accMouseAdapter);
// addMouseMotionListener (accMouseAdapter);
}
public void setPos () {
setPos (jWorkspaceView.scaleModelToView (item.getAccCenter (acc.getId ())));
@ -112,6 +113,11 @@ public class JAcc extends JLabel {
// } catch (Exception e2) {
// }
// }
// ========================================
public boolean contains (Point2D.Double realPos, double close) {
double theta = Math.toRadians (-item.getThetaDegree ());
return item.onAcc (acc.getId (), theta, realPos, close);
}
// ========================================
public void dragAcc (Dimension delta) {

View File

@ -4,6 +4,7 @@ import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@ -22,8 +23,15 @@ import adecWatt.control.AdecWattManager;
this.jWorkspaceView = jWorkspaceView;
this.mouseEvent = mouseEvent;
Point pos = mouseEvent.getPoint ();
if (jWorkspaceView.selectedAcc != null) {
Point2D.Double realPos = jWorkspaceView.scaleViewToModel (new Point (pos.x, pos.y));
if (jWorkspaceView.selectedAcc.contains (realPos, jWorkspaceView.closePixelsAccs/jWorkspaceView.scale))
return;
}
ArrayList<Item> overlapItems = jWorkspaceView.findItems (pos);
if (mouseEvent.getID () == MouseEvent.MOUSE_PRESSED && !SwingUtilities.isRightMouseButton (mouseEvent) &&
if (mouseEvent.getID () == MouseEvent.MOUSE_PRESSED &&
!mouseEvent.isShiftDown () &&
!SwingUtilities.isRightMouseButton (mouseEvent) &&
jWorkspaceView.selectedItems.size () > 0) {
for (final JItem jItem : jWorkspaceView.selectedItems.values ())
if (overlapItems.contains (jItem.getItem ())) {
@ -53,6 +61,7 @@ import adecWatt.control.AdecWattManager;
});
add (menuItem);
}
jWorkspaceView.noDrag ();
show (jWorkspaceView, pos.x, pos.y);
}

View File

@ -241,7 +241,11 @@ import adecWatt.model.unit.Workspace;
}
return false;
}
//private ArrayList<Item> overlapItems;
public void noDrag () {
refHandle = null;
handleOff = null;
//firstClick = lastClick = null;
}
public void startDrag (Item<?,?,?> item, Point mPos) {
firstClick = lastClick = mPos;
selectionRefHandle (item, mPos);
@ -256,6 +260,7 @@ import adecWatt.model.unit.Workspace;
}
Hashtable<Item, ArrayList<Acc>> overlapAccs = findAccs (mPos, item);
if (overlapAccs.size () > 0) {
firstClick = lastClick = mPos;
lastSelectedAccId = (lastSelectedAccId+1)%nbOverlapAccs (overlapAccs);
setSelectedAcc (overlapAccs, lastSelectedAccId);
return;
@ -265,11 +270,8 @@ import adecWatt.model.unit.Workspace;
if (e.isShiftDown ()) {
//invertItemSelection (overlapItems.get (0));
invertItemSelection (item);
if (selectedItems.size () < 1) {
firstClick = lastClick = null;
refHandle = null;
handleOff = null;
}
if (selectedItems.size () < 1)
noDrag ();
// XXX changement du choix de la poignée de référence ?
return;
}
@ -453,6 +455,7 @@ import adecWatt.model.unit.Workspace;
protected void setSelectedAcc () {
if (selectedAcc == null)
return;
firstClick = lastClick = null;
remove (selectedAcc);
selectedAcc = null;
updateSelection ();
@ -688,8 +691,6 @@ import adecWatt.model.unit.Workspace;
ArrayList<Item> dstItems = workspace.findItems (realPos, closePixelsItems/scale);
PermanentDB permanentDB = adecWatt.getPermanentDB ();
if (selectedAcc.getAcc ().getDirectUnit ().isDescendingFrom (permanentDB.getPowerPlugId ())) {
if (dstItems.size () < 1) {
eraseAcc (selectedAcc.getAcc ());
return;
@ -794,9 +795,7 @@ import adecWatt.model.unit.Workspace;
} catch (Exception e2) {
e2.printStackTrace ();
} finally {
firstClick = lastClick = null;
refHandle = null;
handleOff = null;
noDrag ();
}
}
public void storyRotResizeItem (JItem jItem) {