1 /**********************************************************************
2 * Copyright (c) 2005, 2008 IBM Corporation and others.
3 * Copyright (c) 2011, 2012 Ericsson.
5 * All rights reserved. This program and the accompanying materials
6 * are made available under the terms of the Eclipse Public License v1.0
7 * which accompanies this distribution, and is available at
8 * http://www.eclipse.org/legal/epl-v10.html
11 * IBM - Initial API and implementation
12 * Bernd Hufmann - Updated for TMF
13 **********************************************************************/
14 package org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
;
16 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.drawings
.IColor
;
17 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.drawings
.IFont
;
18 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.drawings
.IGC
;
19 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.drawings
.IImage
;
20 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.drawings
.impl
.ColorImpl
;
21 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.preferences
.SDViewPref
;
22 import org
.eclipse
.swt
.SWT
;
23 import org
.eclipse
.swt
.graphics
.Color
;
24 import org
.eclipse
.swt
.graphics
.Font
;
25 import org
.eclipse
.swt
.graphics
.FontData
;
26 import org
.eclipse
.swt
.graphics
.GC
;
27 import org
.eclipse
.swt
.graphics
.Image
;
28 import org
.eclipse
.swt
.graphics
.Point
;
29 import org
.eclipse
.swt
.graphics
.Rectangle
;
30 import org
.eclipse
.swt
.widgets
.Display
;
34 * This class implements the graphical context for the sequence diagram widgets.
40 public class NGC
implements IGC
{
42 // ------------------------------------------------------------------------
44 // ------------------------------------------------------------------------
47 * The graphical context.
49 protected GC fContext
;
51 * The reference to the sequence diagram view.
53 protected SDWidget fView
;
55 * A reference to the last used font.
57 protected Font fTempFont
= null;
59 * The color of the gradient.
61 protected IColor fGradientColor
= null;
63 * The color of the background.
65 protected IColor fBackground
= null;
67 * The color of the foreground.
69 protected IColor fForeground
= null;
71 * The current visible y screen bounds
73 protected int fVisibleY
;
75 * The current visible x screen bound.
77 protected int fVisibleX
;
79 * The current yx value (view visible height - visible screen bounds)
83 * The current xx value (view visible width - visible screen bounds)
87 * <code>true</code> to draw with focus else <code>false</code>.
89 protected boolean fDrawWithFocus
= false;
92 * The static visible screen bounds.
94 private static int fVisibleScreenBounds
= 0;
97 // ------------------------------------------------------------------------
99 // ------------------------------------------------------------------------
102 * Default constructor.
104 * @param scrollView A sequence diagram view reference.
105 * @param gc A graphical context.
107 public NGC(SDWidget scrollView
, GC gc
) {
112 // ------------------------------------------------------------------------
114 // ------------------------------------------------------------------------
118 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#setLineStyle(int)
121 public void setLineStyle(int style
) {
122 fContext
.setLineStyle(style
);
127 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getLineStyle()
130 public int getLineStyle() {
131 return fContext
.getLineStyle();
136 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getContentsX()
139 public int getContentsX() {
140 return Math
.round(fView
.getContentsX() / fView
.fZoomValue
);
145 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getContentsY()
148 public int getContentsY() {
149 return Math
.round(fView
.getContentsY() / fView
.fZoomValue
);
154 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getVisibleWidth()
157 public int getVisibleWidth() {
158 return Math
.round(fView
.getVisibleWidth() / fView
.fZoomValue
);
163 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getVisibleHeight()
166 public int getVisibleHeight() {
167 return Math
.round(fView
.getVisibleHeight() / fView
.fZoomValue
);
172 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#contentsToViewX(int)
175 public int contentsToViewX(int x
) {
176 return fView
.contentsToViewX(x
);
181 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#contentsToViewY(int)
184 public int contentsToViewY(int y
) {
185 return fView
.contentsToViewY(y
);
189 * Get code for drawings at given x and y position.
191 * @param x The x position
192 * @param y The y position.
193 * @return A code for top, bottom, right and left
195 protected byte code(int x
, int y
) {
197 fVisibleY
= fVisibleScreenBounds
;
198 fVisibleX
= fVisibleScreenBounds
;
199 yx
= fView
.getVisibleHeight() + fVisibleScreenBounds
;
200 xx
= fView
.getVisibleWidth() + fVisibleScreenBounds
;
203 } else if (y
< fVisibleY
) {
209 } else if (x
< fVisibleX
) {
217 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#drawLine(int, int, int, int)
220 public void drawLine(int x1
, int y1
, int x2
, int y2
) {
226 localX1
= Math
.round(localX1
* fView
.fZoomValue
);
227 localY1
= Math
.round(localY1
* fView
.fZoomValue
);
228 localX2
= Math
.round(localX2
* fView
.fZoomValue
);
229 localY2
= Math
.round(localY2
* fView
.fZoomValue
);
230 localX1
= fView
.contentsToViewX(localX1
);
231 localY1
= fView
.contentsToViewY(localY1
);
232 localX2
= fView
.contentsToViewX(localX2
);
233 localY2
= fView
.contentsToViewY(localY2
);
235 byte code1
= code(localX1
, localY1
);
236 byte code2
= code(localX2
, localY2
);
238 boolean draw
= false;
243 if (code1
== 0 && code2
== 0) {
246 } else if ((code1
& code2
) != 0) {
249 codex
= (code1
!= 0) ? code1
: code2
;
250 if ((codex
& 0x01) != 0) { // top
251 x
= localX1
+ ((localX2
- localX1
) * (yx
- localY1
)) / (localY2
- localY1
);
253 } else if ((codex
& 0x02) != 0) { // bottom
254 x
= localX1
+ ((localX2
- localX1
) * (fVisibleY
- localY1
)) / (localY2
- localY1
);
256 } else if ((codex
& 0x04) != 0) { // right
257 y
= localY1
+ ((localY2
- localY1
) * (xx
- localX1
)) / (localX2
- localX1
);
259 } else if ((codex
& 0x08) != 0) { // left
260 y
= localY1
+ ((localY2
- localY1
) * (fVisibleX
- localX1
)) / (localX2
- localX1
);
264 if (codex
== code1
) {
267 code1
= code(localX1
, localY1
);
271 code2
= code(localX2
, localY2
);
277 fContext
.drawLine(localX1
, localY1
, localX2
, localY2
);
283 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#drawRectangle(int, int, int, int)
286 public void drawRectangle(int x
, int y
, int width
, int height
) {
289 int localWidth
= width
;
290 int localHeight
= height
;
292 localX
= Math
.round(localX
* fView
.fZoomValue
);
293 // Workaround to avoid problems for some special cases (not very nice)
294 if (localY
!= getContentsY()) {
295 localY
= Math
.round(localY
* fView
.fZoomValue
);
296 localY
= fView
.contentsToViewY(localY
);
300 localWidth
= Math
.round(localWidth
* fView
.fZoomValue
);
301 localHeight
= Math
.round(localHeight
* fView
.fZoomValue
);
302 localX
= fView
.contentsToViewX(localX
);
304 if (localX
< -fVisibleScreenBounds
) {
305 localWidth
= localWidth
+ localX
+ fVisibleScreenBounds
;
306 localX
= -fVisibleScreenBounds
;
308 if (localY
< -fVisibleScreenBounds
) {
309 localHeight
= localHeight
+ localY
+ fVisibleScreenBounds
;
310 localY
= -fVisibleScreenBounds
;
312 if ((localWidth
< -fVisibleScreenBounds
) && (localX
+ localWidth
< -fVisibleScreenBounds
)) {
313 localWidth
= -fVisibleScreenBounds
;
314 } else if (localWidth
+ localX
> fView
.getVisibleWidth() + fVisibleScreenBounds
) {
315 localWidth
= fView
.getVisibleWidth() + fVisibleScreenBounds
- localX
;
317 if ((localHeight
< -fVisibleScreenBounds
) && (localY
+ localHeight
< -fVisibleScreenBounds
)) {
318 localHeight
= -fVisibleScreenBounds
;
319 } else if (localHeight
+ localY
> fView
.getVisibleHeight() + fVisibleScreenBounds
) {
320 localHeight
= fView
.getVisibleHeight() + fVisibleScreenBounds
- localY
;
322 fContext
.drawRectangle(localX
, localY
, localWidth
, localHeight
);
327 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#drawFocus(int, int, int, int)
330 public void drawFocus(int x
, int y
, int width
, int height
) {
333 int localWidth
= width
;
334 int localHeight
= height
;
336 IColor bC
= getBackground();
337 IColor fC
= getForeground();
339 if (localWidth
< 0) {
340 localX
= localX
+ localWidth
;
341 localWidth
= -localWidth
;
344 if (localHeight
< 0) {
345 localY
= localY
+ localHeight
;
346 localHeight
= -localHeight
;
349 localX
= Math
.round(localX
* fView
.fZoomValue
);
350 localY
= Math
.round(localY
* fView
.fZoomValue
);
351 localWidth
= Math
.round(localWidth
* fView
.fZoomValue
);
352 localHeight
= Math
.round(localHeight
* fView
.fZoomValue
);
354 setForeground(SDViewPref
.getInstance().getForeGroundColorSelection());
355 setBackground(SDViewPref
.getInstance().getBackGroundColorSelection());
357 fContext
.drawFocus(fView
.contentsToViewX(localX
- 1), fView
.contentsToViewY(localY
- 1), localWidth
+ 3, localHeight
+ 3);
365 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#fillPolygon(int[])
368 public void fillPolygon(int[] points
) {
369 int len
= (points
.length
/ 2) * 2;
370 int[] localPoint
= new int[len
];
371 for (int i
= 0; i
< len
; i
++) {
372 localPoint
[i
] = fView
.contentsToViewX(Math
.round(points
[i
] * fView
.fZoomValue
));
374 localPoint
[i
] = fView
.contentsToViewY(Math
.round(points
[i
] * fView
.fZoomValue
));
377 if (validatePolygonHeight(localPoint
) <= 0) {
381 fContext
.fillPolygon(localPoint
);
386 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#drawPolygon(int[])
389 public void drawPolygon(int[] points
) {
390 int len
= (points
.length
/ 2) * 2;
391 int[] localPoint
= new int[len
];
392 for (int i
= 0; i
< len
; i
++) {
393 localPoint
[i
] = fView
.contentsToViewX(Math
.round(points
[i
] * fView
.fZoomValue
));
395 localPoint
[i
] = fView
.contentsToViewY(Math
.round(points
[i
] * fView
.fZoomValue
));
398 if (validatePolygonHeight(localPoint
) <= 0) {
402 fContext
.drawPolygon(localPoint
);
407 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#fillRectangle(int, int, int, int)
410 public void fillRectangle(int x
, int y
, int width
, int height
) {
413 int localWidth
= width
;
414 int localHeight
= height
;
416 localX
= Math
.round(localX
* fView
.fZoomValue
);
417 // Workaround to avoid problems for some special cases (not very nice)
418 if (localY
!= getContentsY()) {
419 localY
= Math
.round(localY
* fView
.fZoomValue
);
420 localY
= fView
.contentsToViewY(localY
) + 1;
424 localWidth
= Math
.round(localWidth
* fView
.fZoomValue
) - 1;
425 localHeight
= Math
.round(localHeight
* fView
.fZoomValue
) - 1;
426 localX
= fView
.contentsToViewX(localX
) + 1;
427 if (localX
< -fVisibleScreenBounds
) {
428 localWidth
= localWidth
+ localX
+ fVisibleScreenBounds
;
429 localX
= -fVisibleScreenBounds
;
431 if (localY
< -fVisibleScreenBounds
) {
432 localHeight
= localHeight
+ localY
+ fVisibleScreenBounds
;
433 localY
= -fVisibleScreenBounds
;
435 if ((localWidth
< -fVisibleScreenBounds
) && (localX
+ localWidth
< -fVisibleScreenBounds
)) {
436 localWidth
= -fVisibleScreenBounds
;
437 } else if (localWidth
+ localX
> fView
.getVisibleWidth() + fVisibleScreenBounds
) {
438 localWidth
= fView
.getVisibleWidth() + fVisibleScreenBounds
- localX
;
440 if ((localHeight
< -fVisibleScreenBounds
) && (localY
+ localHeight
< -fVisibleScreenBounds
)) {
441 localHeight
= -fVisibleScreenBounds
;
442 } else if (localHeight
+ localY
> fView
.getVisibleHeight() + fVisibleScreenBounds
) {
443 localHeight
= fView
.getVisibleHeight() + fVisibleScreenBounds
- localY
;
445 fContext
.fillRectangle(localX
, localY
, localWidth
, localHeight
);
451 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#fillGradientRectangle(int, int, int, int, boolean)
454 public void fillGradientRectangle(int x
, int y
, int width
, int height
, boolean isVertical
) {
457 int localWidth
= width
;
458 int localHeight
= height
;
460 localX
= Math
.round(localX
* fView
.fZoomValue
);
461 localY
= Math
.round(localY
* fView
.fZoomValue
);
462 localWidth
= Math
.round(localWidth
* fView
.fZoomValue
);
463 localHeight
= Math
.round(localHeight
* fView
.fZoomValue
);
464 IColor tempColor
= fForeground
;
465 setForeground(fGradientColor
);
466 localX
= fView
.contentsToViewX(localX
);
467 localY
= fView
.contentsToViewY(localY
);
469 if (localX
< -fVisibleScreenBounds
) {
470 localWidth
= localWidth
+ localX
+ fVisibleScreenBounds
;
471 localX
= -fVisibleScreenBounds
;
473 if (localY
< -fVisibleScreenBounds
) {
474 localHeight
= localHeight
+ localY
+ fVisibleScreenBounds
;
475 localY
= -fVisibleScreenBounds
;
478 if ((localWidth
< -fVisibleScreenBounds
) && (localX
+ localWidth
< -fVisibleScreenBounds
)) {
479 localWidth
= -fVisibleScreenBounds
;
480 } else if (localWidth
+ localX
> fView
.getVisibleWidth() + fVisibleScreenBounds
) {
481 localWidth
= fView
.getVisibleWidth() + fVisibleScreenBounds
- localX
;
483 if ((localHeight
< -fVisibleScreenBounds
) && (localY
+ localHeight
< -fVisibleScreenBounds
)) {
484 localHeight
= -fVisibleScreenBounds
;
485 } else if (localHeight
+ localY
> fView
.getVisibleHeight() + fVisibleScreenBounds
) {
486 localHeight
= fView
.getVisibleHeight() + fVisibleScreenBounds
- localY
;
489 fContext
.fillGradientRectangle(localX
, localY
, localWidth
, localHeight
, isVertical
);
492 fContext
.fillGradientRectangle(localX
+ localWidth
, localY
, -localWidth
, localHeight
+ 1, isVertical
);
494 setForeground(tempColor
);
500 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#textExtent(java.lang.String)
503 public int textExtent(String name
) {
504 return fContext
.textExtent(name
).x
;
509 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#drawText(java.lang.String, int, int, boolean)
512 public void drawText(String string
, int x
, int y
, boolean isTrans
) {
516 localX
= Math
.round(localX
* fView
.fZoomValue
);
517 localY
= Math
.round(localY
* fView
.fZoomValue
);
518 fContext
.drawText(string
, fView
.contentsToViewX(localX
), fView
.contentsToViewY(localY
), isTrans
);
519 if (fDrawWithFocus
) {
520 Point r
= fContext
.textExtent(string
);
521 fContext
.drawFocus(localX
- 1, localY
- 1, r
.x
+ 2, r
.y
+ 2);
527 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#drawText(java.lang.String, int, int)
530 public void drawText(String string
, int x
, int y
) {
534 localX
= Math
.round(localX
* fView
.fZoomValue
);
535 localY
= Math
.round(localY
* fView
.fZoomValue
);
536 fContext
.drawText(string
, fView
.contentsToViewX(localX
), fView
.contentsToViewY(localY
), true);
537 if (fDrawWithFocus
) {
538 Point r
= fContext
.textExtent(string
);
539 fContext
.drawFocus(localX
- 1, localY
- 1, r
.x
+ 2, r
.y
+ 2);
545 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#fillOval(int, int, int, int)
548 public void fillOval(int x
, int y
, int width
, int height
) {
551 int localWidth
= width
;
552 int localHeight
= height
;
554 localX
= Math
.round(localX
* fView
.fZoomValue
);
555 localY
= Math
.round(localY
* fView
.fZoomValue
);
556 localWidth
= Math
.round(localWidth
* fView
.fZoomValue
);
557 localHeight
= Math
.round(localHeight
* fView
.fZoomValue
);
558 fContext
.fillOval(fView
.contentsToViewX(localX
), fView
.contentsToViewY(localY
), localWidth
, localHeight
);
563 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getBackground()
566 public IColor
getBackground() {
567 if ((fBackground
!= null) && (fBackground
.getColor() instanceof Color
) && (!((Color
) (fBackground
.getColor())).isDisposed())) {
570 return ColorImpl
.getSystemColor(SWT
.COLOR_WHITE
);
575 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getForeground()
578 public IColor
getForeground() {
579 if ((fForeground
!= null) && (fForeground
.getColor() instanceof Color
) && (!((Color
) (fForeground
.getColor())).isDisposed())) {
582 return ColorImpl
.getSystemColor(SWT
.COLOR_WHITE
);
587 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#setBackground(org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IColor)
590 public void setBackground(IColor color
) {
594 if (color
.getColor() instanceof Color
) {
595 fContext
.setBackground((Color
) color
.getColor());
602 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#setForeground(org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IColor)
605 public void setForeground(IColor color
) {
609 if (color
.getColor() instanceof Color
) {
610 Color c
= (Color
) color
.getColor();
611 if (!c
.isDisposed()) {
612 fContext
.setForeground(c
);
620 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#setGradientColor(org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IColor)
623 public void setGradientColor(IColor color
) {
627 if (color
.getColor() instanceof Color
) {
628 fGradientColor
= color
;
634 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#setLineWidth(int)
637 public void setLineWidth(int width
) {
638 if (fView
.isPrinting()) {
639 fContext
.setLineWidth(width
* 2);
642 fContext
.setLineWidth(width
);
648 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getLineWidth()
651 public int getLineWidth() {
652 return fContext
.getLineWidth();
656 * Method to draw a text in rectangle. (Linux GTK Workaround)
658 * @param string The text to draw.
659 * @param x The x position.
660 * @param y The y position.
661 * @param isTransparent true for transparent else false
663 protected void localDrawText(String string
, int x
, int y
, boolean isTransparent
) {
664 Point r
= fContext
.textExtent(string
);
665 if (!isTransparent
) {
666 fContext
.fillRectangle(x
, y
, r
.x
, r
.y
);
668 fContext
.drawText(string
, x
, y
, isTransparent
);
669 if ((fDrawWithFocus
) && (string
.length() > 1)) {
670 fContext
.drawFocus(x
- 1, y
- 1, r
.x
+ 2, r
.y
+ 2);
676 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#drawTextTruncatedCentred(java.lang.String, int, int, int, int, boolean)
679 public void drawTextTruncatedCentred(String name
, int xValue
, int yValue
, int width
, int height
, boolean trans
) {
682 int localWidth
= width
;
683 int localHeight
= height
;
685 Point tx
= fContext
.textExtent(name
);
686 localX
= Math
.round(localX
* fView
.fZoomValue
);
688 // Workaround to avoid round problems for some special cases (not very nice)
689 if (localY
!= getContentsY()) {
690 localY
= Math
.round(localY
* fView
.fZoomValue
);
691 y
= fView
.contentsToViewY(localY
);
693 localWidth
= Math
.round(localWidth
* fView
.fZoomValue
);
694 localHeight
= Math
.round(localHeight
* fView
.fZoomValue
);
695 int x
= fView
.contentsToViewX(localX
);
696 if (tx
.y
> localHeight
) {
700 // Adjust height and y
701 if (y
< -fVisibleScreenBounds
) {
702 localHeight
= localHeight
+ y
+ fVisibleScreenBounds
;
703 y
= -fVisibleScreenBounds
;
705 if ((localHeight
< -fVisibleScreenBounds
) && (y
+ localHeight
< -fVisibleScreenBounds
)) {
706 localHeight
= -fVisibleScreenBounds
;
707 } else if (localHeight
+ y
> fView
.getVisibleHeight() + fVisibleScreenBounds
) {
708 localHeight
= fView
.getVisibleHeight() + fVisibleScreenBounds
- y
;
711 if (tx
.x
<= localWidth
) {
712 localDrawText(name
, x
+ 1 + (localWidth
- tx
.x
) / 2, y
+ 1 + (localHeight
- tx
.y
) / 2, trans
);
714 String nameToDisplay
= name
;
715 for (int i
= name
.length() - 1; i
>= 0 && fContext
.textExtent(nameToDisplay
).x
>= localWidth
; i
--) {
716 nameToDisplay
= name
.substring(0, i
);
719 for (int i
= 1; i
<= 3 && nameToDisplay
.length() - i
> 0; i
++) {
722 nameToDisplay
= nameToDisplay
.substring(0, nameToDisplay
.length() - dotCount
);
723 StringBuffer buf
= new StringBuffer(nameToDisplay
);
724 for (int i
= 0; i
< dotCount
; i
++) {
725 buf
.append("."); //$NON-NLS-1$
727 nameToDisplay
= buf
.toString();
728 localDrawText(nameToDisplay
, x
+ 1 + (localWidth
- fContext
.textExtent(nameToDisplay
).x
) / 2, y
+ 1 + (localHeight
- fContext
.textExtent(nameToDisplay
).y
) / 2, trans
);
734 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#drawTextTruncated(java.lang.String, int, int, int, int, boolean)
737 public void drawTextTruncated(String name
, int xValue
, int yValue
, int width
, int height
, boolean trans
) {
740 int localWidth
= width
;
741 int localHeight
= height
;
743 localX
= Math
.round(localX
* fView
.fZoomValue
);
744 localY
= Math
.round(localY
* fView
.fZoomValue
);
745 localWidth
= Math
.round(localWidth
* fView
.fZoomValue
);
746 localHeight
= Math
.round(localHeight
* fView
.fZoomValue
);
747 int x
= fView
.contentsToViewX(localX
);
748 int y
= fView
.contentsToViewY(localY
);
749 if (fContext
.textExtent(name
).x
<= localWidth
) {
750 localDrawText(name
, x
+ 1, y
+ 1 + localHeight
, trans
);
752 String nameToDisplay
= name
;
753 for (int i
= name
.length() - 1; i
>= 0 && fContext
.textExtent(nameToDisplay
).x
>= localWidth
; i
--) {
754 nameToDisplay
= name
.substring(0, i
);
757 for (int i
= 1; i
<= 3 && nameToDisplay
.length() - i
> 0; i
++) {
760 nameToDisplay
= nameToDisplay
.substring(0, nameToDisplay
.length() - dotCount
);
762 StringBuffer buf
= new StringBuffer(nameToDisplay
);
764 for (int i
= 0; i
< dotCount
; i
++) {
765 buf
.append("."); //$NON-NLS-1$
767 nameToDisplay
= buf
.toString();
768 localDrawText(nameToDisplay
, x
+ 1, y
+ 1 + localHeight
, trans
);
774 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#drawImage(org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IImage, int, int, int, int)
777 public void drawImage(IImage image
, int xValue
, int yValue
, int maxWith
, int maxHeight
) {
782 if (image
!= null && image
.getImage() instanceof Image
) {
783 img
= (Image
) image
.getImage();
785 localX
= Math
.round(localX
* fView
.fZoomValue
);
786 localY
= Math
.round(localY
* fView
.fZoomValue
);
787 int x
= fView
.contentsToViewX(localX
);
788 int y
= fView
.contentsToViewY(localY
);
789 float tempZoom
= fView
.fZoomValue
;
790 int width
= Math
.round(maxWith
* tempZoom
);
791 int height
= Math
.round(maxHeight
* tempZoom
);
792 fContext
.setBackground(fView
.getDisplay().getSystemColor(SWT
.COLOR_RED
));
793 fContext
.fillRectangle(x
, y
, width
, height
);
796 localX
= Math
.round(localX
* fView
.fZoomValue
);
797 localY
= Math
.round(localY
* fView
.fZoomValue
);
798 int x
= fView
.contentsToViewX(localX
);
799 int y
= fView
.contentsToViewY(localY
);
800 Rectangle b
= ((Image
) image
.getImage()).getBounds();
802 int height
= b
.height
;
803 if (width
> maxWith
) {
806 if (height
> maxHeight
) {
809 float tempZoom
= fView
.fZoomValue
;
810 width
= Math
.round(width
* tempZoom
);
811 height
= Math
.round(height
* tempZoom
);
813 if (fView
.fIsPrinting
&& width
> 0 && height
> 0) {
814 Image dbuffer
= new Image(fView
.getDisplay(), width
, height
);
815 GC tempgc
= new GC(dbuffer
);
816 tempgc
.drawImage(img
, 0, 0, b
.width
, b
.height
, 0, 0, width
, height
);
817 Image dbuffer2
= new Image(fView
.getDisplay(), dbuffer
.getImageData());
818 fContext
.drawImage(dbuffer2
, x
, y
);
823 fContext
.drawImage(img
, 0, 0, b
.width
, b
.height
, x
, y
, width
, height
);
829 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#drawArc(int, int, int, int, int, int)
832 public void drawArc(int x
, int y
, int width
, int height
, int startAngle
, int endAngle
) {
835 int localWidth
= width
;
836 int localHeight
= height
;
838 localX
= Math
.round(localX
* fView
.fZoomValue
);
839 localY
= Math
.round(localY
* fView
.fZoomValue
);
840 localWidth
= Math
.round(localWidth
* fView
.fZoomValue
);
841 localHeight
= Math
.round(localHeight
* fView
.fZoomValue
);
842 if (localWidth
== 0 || localHeight
== 0 || endAngle
== 0) {
845 fContext
.drawArc(fView
.contentsToViewX(localX
), fView
.contentsToViewY(localY
), localWidth
, localHeight
, startAngle
, endAngle
);
850 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#setFont(org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IFont)
853 public void setFont(IFont font
) {
854 if (font
.getFont() != null && ((Font
) font
.getFont()).getFontData().length
> 0) {
855 FontData fontData
= ((Font
) font
.getFont()).getFontData()[0];
856 if (SDViewPref
.getInstance().fontLinked() || fView
.fIsPrinting
) {
857 int h
= Math
.round(fontData
.getHeight() * fView
.fZoomValue
);
859 fontData
.setHeight(h
);
862 if (fTempFont
!= null) {
865 fTempFont
= new Font(Display
.getCurrent(), fontData
);
866 fContext
.setFont(fTempFont
);
872 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getFontHeight(org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IFont)
875 public int getFontHeight(IFont font
) {
876 if (font
.getFont() != null && (font
.getFont() instanceof Font
) && ((Font
) font
.getFont()).getFontData().length
> 0) {
877 Font toRestore
= fContext
.getFont();
878 fContext
.setFont((Font
) font
.getFont());
879 int height
= fContext
.textExtent("lp").y
;//$NON-NLS-1$
880 fContext
.setFont(toRestore
);
887 * Returns the current font height.
889 * @return the current font height.
891 protected int getCurrentFontHeight() {
892 return fContext
.textExtent("lp").y
; //$NON-NLS-1$
897 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getFontWidth(org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IFont)
900 public int getFontWidth(IFont font
) {
901 if ((font
.getFont() != null) && (font
.getFont() instanceof Font
)) {
902 Font toRestore
= fContext
.getFont();
903 fContext
.setFont((Font
) font
.getFont());
904 int width
= fContext
.getFontMetrics().getAverageCharWidth();
905 fContext
.setFont(toRestore
);
912 * Disposes all created resources.
914 public void dispose() {
915 if (fTempFont
!= null) {
919 if (fContext
!= null) {
927 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getZoom()
930 public float getZoom() {
932 return fView
.fZoomValue
;
939 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getLineDotStyle()
942 public int getLineDotStyle() {
948 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getLineDashStyle()
951 public int getLineDashStyle() {
952 return SWT
.LINE_DASH
;
957 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getLineSolidStyle()
960 public int getLineSolidStyle() {
961 return SWT
.LINE_SOLID
;
966 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#createColor(int, int, int)
969 public IColor
createColor(int r
, int g
, int b
) {
970 return new ColorImpl(Display
.getDefault(), r
, g
, b
);
975 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#setDrawTextWithFocusStyle(boolean)
978 public void setDrawTextWithFocusStyle(boolean focus
) {
979 fDrawWithFocus
= focus
;
983 * Returns the screen bounds.
985 * @return the screen bounds.
987 protected static int getVscreenBounds() {
988 return fVisibleScreenBounds
;
992 * Sets the visible screen bounds.
994 * @param vBounds the screen bounds.
996 protected static void setVscreenBounds(int vBounds
) {
997 fVisibleScreenBounds
= vBounds
;
1000 // ------------------------------------------------------------------------
1002 // ------------------------------------------------------------------------
1005 * Validates the polygon height
1007 * @param localPoint array of points
1010 private int validatePolygonHeight(int[] localPoint
) {
1013 int min
= Integer
.MAX_VALUE
;
1014 while (i
< localPoint
.length
) {
1015 max
= Math
.abs(localPoint
[i
]) > Math
.abs(max
) ? localPoint
[i
] : max
;
1016 min
= Math
.abs(localPoint
[i
]) < Math
.abs(min
) ? localPoint
[i
] : min
;
1019 int height
= max
- min
;
1020 if (min
< -fVisibleScreenBounds
) {
1021 height
= height
+ min
+ fVisibleScreenBounds
;
1022 min
= -fVisibleScreenBounds
;
1024 if ((height
< -fVisibleScreenBounds
) && (min
+ height
< -fVisibleScreenBounds
)) {
1025 height
= -fVisibleScreenBounds
;
1026 } else if (height
+ min
> fView
.getVisibleHeight() + fVisibleScreenBounds
) {
1027 height
= fView
.getVisibleHeight() + fVisibleScreenBounds
- min
;
This page took 0.057441 seconds and 6 git commands to generate.