re-organize layout and fix drawing errors

This commit is contained in:
2020-10-17 12:44:33 +02:00
parent 675b2ed972
commit 664e99d09e
15 changed files with 142 additions and 704 deletions

View File

@ -126,24 +126,17 @@ public class ArrowPainter implements IPainter {
Rectangle correctedTargetRectangle = new Rectangle(txRectangle.x+correctionValue, txRectangle.y, txRectangle.width, txRectangle.height);
for (LinkEntry entry : iRect) {
Rectangle correctedRectangle = new Rectangle(entry.rectangle.x+correctionValue, entry.rectangle.y, entry.rectangle.width, entry.rectangle.height);
Point target = drawPath(proj, highlightType.equals(entry.relationType) ? highliteColor : fgColor,
drawArrow(proj, highlightType.equals(entry.relationType) ? highliteColor : fgColor,
correctedRectangle, correctedTargetRectangle);
drawArrow(proj, target);
}
for (LinkEntry entry : oRect) {
Rectangle correctedRectangle = new Rectangle(entry.rectangle.x+correctionValue, entry.rectangle.y, entry.rectangle.width, entry.rectangle.height);
Point target = drawPath(proj, highlightType.equals(entry.relationType) ? highliteColor : fgColor, correctedTargetRectangle,
drawArrow(proj, highlightType.equals(entry.relationType) ? highliteColor : fgColor, correctedTargetRectangle,
correctedRectangle);
drawArrow(proj, target);
}
}
protected void drawArrow(Projection proj, Point target) {
proj.drawLine(target.x - 8, target.y - 5, target.x, target.y);
proj.drawLine(target.x - 8, target.y + 5, target.x, target.y);
}
protected Point drawPath(Projection proj, Color fgColor, Rectangle srcRectangle, Rectangle tgtRectangle) {
protected void drawArrow(Projection proj, Color fgColor, Rectangle srcRectangle, Rectangle tgtRectangle) {
Point point1 = proj.project(new Point(srcRectangle.x, srcRectangle.y + srcRectangle.height / 2));
Point point2 = proj.project(new Point(tgtRectangle.x, tgtRectangle.y + tgtRectangle.height / 2));
@ -160,11 +153,15 @@ public class ArrowPainter implements IPainter {
path.cubicTo(center.x + xCtrlOffset, center.y, point2.x - xCtrlOffset, point2.y, point2.x, point2.y);
} else
path.cubicTo(point1.x + xCtrlOffset, point1.y, point2.x - xCtrlOffset, point2.y, point2.x, point2.y);
proj.setAntialias(SWT.ON);
proj.setForeground(fgColor);
proj.getGC().drawPath(path);
path.dispose();
return point2;
// now draw the arrow head
proj.getGC().drawLine(point2.x - 8, point2.y - 5, point2.x, point2.y);
proj.getGC().drawLine(point2.x - 8, point2.y + 5, point2.x, point2.y);
}
class LinkEntry {

View File

@ -44,10 +44,6 @@ public class Projection {
public void setFillRule(int rule) {
gc.setFillRule(rule);
}
public void fillRectangle(Rectangle rect) {
gc.fillRectangle(rect.x+translation.x, rect.y+translation.y, rect.width, rect.height);
}
public void setLineStyle(int style) {
gc.setLineStyle(style);
}
@ -69,6 +65,10 @@ public class Projection {
return gc;
}
public void fillRectangle(Rectangle rect) {
gc.fillRectangle(rect.x+translation.x, rect.y+translation.y, rect.width, rect.height);
}
public void drawRectangle(Rectangle rect) {
gc.drawRectangle(rect.x+translation.y, rect.y+translation.y, rect.width, rect.height);
}

View File

@ -135,9 +135,6 @@ public class StreamPainter extends TrackPainter{
if(bb.x+bb.width<area.x || bb.x>area.x+area.width) return;
if(bb.width==0){
proj.drawLine(bb.x, bb.y, bb.x, bb.y+bb.height);
} else if(bb.width<10){
proj.fillRectangle(bb);
proj.drawRectangle(bb);
} else {
if(bb.x < area.x) {
bb.width = bb.width-(area.x-bb.x)+5;
@ -149,8 +146,9 @@ public class StreamPainter extends TrackPainter{
bb_x2=area_x2+5;
bb.width= bb_x2-bb.x;
}
proj.fillRoundRectangle(bb.x, bb.y, bb.width, bb.height, 5, 5);
proj.drawRoundRectangle(bb.x, bb.y, bb.width, bb.height, 5, 5);
int arc = bb.width<10?1:5;
proj.fillRoundRectangle(bb.x, bb.y, bb.width, bb.height, arc, arc);
proj.drawRoundRectangle(bb.x, bb.y, bb.width, bb.height, arc, arc);
}
}

View File

@ -229,10 +229,10 @@ public class WaveformCanvas extends Canvas {
}
public void setZoomLevel(int level, long centerTime) {
//FIXME: keep center if zoom-out and cursor is not in view
long oldScaleFactor=scaleFactor;
if(level<0) level = 0;
if(level<Constants.unitMultiplier.length*Constants.unitString.length){
this.level = level;
this.scaleFactor = (long) Math.pow(10, level/2);
if(level%2==1) this.scaleFactor*=3;
ITx tx = arrowPainter.getTx();
@ -243,18 +243,19 @@ public class WaveformCanvas extends Canvas {
* xcn = tc/newScaleFactor
* t0n = (xcn-xoffs)*scaleFactor
*/
long xc=centerTime/oldScaleFactor; // cursor total x-offset
long xoffs=xc+origin.x; // cursor offset relative to left border
long xcn=centerTime/scaleFactor; // new total x-offset
long originX=xcn-xoffs;
if(originX>0) {
origin.x=(int) -originX; // new cursor time offset relative to left border
}else {
origin.x=0;
}
long xc=centerTime/oldScaleFactor; // cursor total x-offset
long xoffs=xc+origin.x; // cursor offset relative to left border
long xcn=centerTime/scaleFactor; // new total x-offset
long originX=xcn-xoffs;
if(originX>0) {
origin.x=(int) -originX; // new cursor time offset relative to left border
}else {
origin.x=0;
}
syncScrollBars();
arrowPainter.setTx(tx);
redraw();
this.level = level;
}
}
@ -400,12 +401,13 @@ public class WaveformCanvas extends Canvas {
/* Paint function */
private void paint(GC gc) {
Point pt = getSize();
if(pt.x==0 || pt.y==0) return;
Rectangle clientRect = getClientArea(); /* Canvas' painting area */
GC thisGc = gc;
Image d_backingImg = null;
if(doubleBuffering) {
Point p = getSize();
d_backingImg = new Image(getDisplay(), p.x, p.y);
d_backingImg = new Image(getDisplay(), pt.x, pt.y);
thisGc = new GC(d_backingImg);
thisGc.setBackground(gc.getBackground());
thisGc.setForeground(gc.getForeground());

View File

@ -52,7 +52,6 @@ import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionAdapter;
@ -170,37 +169,11 @@ public class WaveformView implements IWaveformView {
}
};
class WaveformMouseListener implements MouseMoveListener, MouseListener, PaintListener {
class WaveformMouseListener implements PaintListener, Listener {
Point start, end;
List<Object> initialSelected;
boolean down=false;
@Override
public void mouseDoubleClick(MouseEvent e) {
}
@Override
public void mouseDown(MouseEvent e) {
start=new Point(e.x, e.y);
end=new Point(e.x, e.y);
down=true;
if((e.stateMask&SWT.MODIFIER_MASK)!=0) return; //don't react on modifier
if (e.button == 1) {
initialSelected = waveformCanvas.getElementsAt(start);
} else if (e.button == 3) {
Menu topMenu= top.getMenu();
if(topMenu!=null) topMenu.setVisible(true);
}
}
@Override
public void mouseMove(MouseEvent e) {
if(down) {
end=new Point(e.x, e.y);
asyncUpdate(e.widget);
}
}
@Override
public void paintControl(PaintEvent e) {
if(down) {
@ -214,8 +187,7 @@ public class WaveformView implements IWaveformView {
}
}
@Override
public void mouseUp(MouseEvent e) {
private void mouseUp(MouseEvent e) {
down=false;
if(start==null) return;
if((e.stateMask&SWT.MODIFIER_MASK&~SWT.SHIFT)!=0) return; //don't react on modifier except shift
@ -307,8 +279,43 @@ public class WaveformView implements IWaveformView {
return time;
}
@Override
public void handleEvent(Event e) {
switch (e.type) {
case SWT.MouseWheel:
break;
case SWT.MouseDown:
start=new Point(e.x, e.y);
end=new Point(e.x, e.y);
down=true;
if((e.stateMask&SWT.MODIFIER_MASK)!=0) return; //don't react on modifier
if (e.button == 1) {
initialSelected = waveformCanvas.getElementsAt(start);
} else if (e.button == 3) {
Menu topMenu= top.getMenu();
if(topMenu!=null) topMenu.setVisible(true);
}
break;
case SWT.MouseUp:
mouseUp(new MouseEvent(e));
break;
//case SWT.MouseDoubleClick:
//mouseDoubleClick(new MouseEvent(e));
//break;
case SWT.MouseMove:
if(down) {
end=new Point(e.x, e.y);
asyncUpdate(e.widget);
}
break;
default:
break;
}
}
};
protected WaveformMouseListener waveformMouseListener = new WaveformMouseListener();
protected WaveformMouseListener waveformMouseListener = new WaveformMouseListener();
public WaveformView(Composite parent) {
pcs=new PropertyChangeSupport(this);
@ -322,7 +329,7 @@ public class WaveformView implements IWaveformView {
streams = new ObservableList<>();
streams.addPropertyChangeListener("content", this);
top = new Composite(parent, SWT.NONE);
top = parent;
top.setLayout(new FillLayout(SWT.HORIZONTAL));
SashForm topSash = new SashForm(top, SWT.SMOOTH);
@ -407,9 +414,12 @@ public class WaveformView implements IWaveformView {
valueListScrolled.setContent(valueList);
waveformCanvas.setMaxTime(1);
waveformCanvas.addMouseListener(waveformMouseListener);
waveformCanvas.addMouseMoveListener(waveformMouseListener);
waveformCanvas.addPaintListener(waveformMouseListener);
waveformCanvas.addPaintListener(waveformMouseListener);
waveformCanvas.addListener(SWT.MouseDown,waveformMouseListener);
waveformCanvas.addListener(SWT.MouseUp,waveformMouseListener);
//waveformCanvas.addListener(SWT.MouseDoubleClick,waveformMouseListener);
waveformCanvas.addListener(SWT.MouseMove,waveformMouseListener);
waveformCanvas.addListener(SWT.MouseWheel, waveformMouseListener);
nameListScrolled.getVerticalBar().addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
@ -895,7 +905,7 @@ public class WaveformView implements IWaveformView {
@Override
public void moveCursor(GotoDirection direction) {
if(currentWaveformSelection.size()!=1) return;
TrackEntry sel = currentWaveformSelection.get(1);
TrackEntry sel = currentWaveformSelection.get(0);
long time = getCursorTime();
NavigableMap<Long, ?> map=null;
if(sel.isStream()){