tmf: Simple warning fixes in tmf.ui and tests
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / tmf / ui / views / uml2sd / NGC.java
1 /**********************************************************************
2 * Copyright (c) 2005, 2008 IBM Corporation and others.
3 * Copyright (c) 2011, 2012 Ericsson.
4 *
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
9 *
10 * Contributors:
11 * IBM - Initial API and implementation
12 * Bernd Hufmann - Updated for TMF
13 **********************************************************************/
14 package org.eclipse.linuxtools.tmf.ui.views.uml2sd;
15
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;
31
32 /**
33 * <p>
34 * This class implements the graphical context for the sequence diagram widgets.
35 * </p>
36 *
37 * @version 1.0
38 * @author sveyrier
39 */
40 public class NGC implements IGC {
41
42 // ------------------------------------------------------------------------
43 // Attributes
44 // ------------------------------------------------------------------------
45
46 /**
47 * The graphical context.
48 */
49 protected GC fContext;
50 /**
51 * The reference to the sequence diagram view.
52 */
53 protected SDWidget fView;
54 /**
55 * A reference to the last used font.
56 */
57 protected Font fTempFont = null;
58 /**
59 * The color of the gradient.
60 */
61 protected IColor fGradientColor = null;
62 /**
63 * The color of the background.
64 */
65 protected IColor fBackground = null;
66 /**
67 * The color of the foreground.
68 */
69 protected IColor fForeground = null;
70 /**
71 * The current visible y screen bounds
72 */
73 protected int fVisibleY;
74 /**
75 * The current visible x screen bound.
76 */
77 protected int fVisibleX;
78 /**
79 * The current yx value (view visible height - visible screen bounds)
80 */
81 protected int yx;
82 /**
83 * The current xx value (view visible width - visible screen bounds)
84 */
85 protected int xx;
86 /**
87 * <code>true</code> to draw with focus else <code>false</code>.
88 */
89 protected boolean fDrawWithFocus = false;
90
91 /**
92 * The static visible screen bounds.
93 */
94 private static int fVisibleScreenBounds = 0;
95
96
97 // ------------------------------------------------------------------------
98 // Constructors
99 // ------------------------------------------------------------------------
100
101 /**
102 * Default constructor.
103 *
104 * @param scrollView A sequence diagram view reference.
105 * @param gc A graphical context.
106 */
107 public NGC(SDWidget scrollView, GC gc) {
108 fContext = gc;
109 fView = scrollView;
110 }
111
112 // ------------------------------------------------------------------------
113 // Methods
114 // ------------------------------------------------------------------------
115
116 /*
117 * (non-Javadoc)
118 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#setLineStyle(int)
119 */
120 @Override
121 public void setLineStyle(int style) {
122 fContext.setLineStyle(style);
123 }
124
125 /*
126 * (non-Javadoc)
127 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getLineStyle()
128 */
129 @Override
130 public int getLineStyle() {
131 return fContext.getLineStyle();
132 }
133
134 /*
135 * (non-Javadoc)
136 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getContentsX()
137 */
138 @Override
139 public int getContentsX() {
140 return Math.round(fView.getContentsX() / fView.fZoomValue);
141 }
142
143 /*
144 * (non-Javadoc)
145 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getContentsY()
146 */
147 @Override
148 public int getContentsY() {
149 return Math.round(fView.getContentsY() / fView.fZoomValue);
150 }
151
152 /*
153 * (non-Javadoc)
154 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getVisibleWidth()
155 */
156 @Override
157 public int getVisibleWidth() {
158 return Math.round(fView.getVisibleWidth() / fView.fZoomValue);
159 }
160
161 /*
162 * (non-Javadoc)
163 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getVisibleHeight()
164 */
165 @Override
166 public int getVisibleHeight() {
167 return Math.round(fView.getVisibleHeight() / fView.fZoomValue);
168 }
169
170 /*
171 * (non-Javadoc)
172 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#contentsToViewX(int)
173 */
174 @Override
175 public int contentsToViewX(int x) {
176 return fView.contentsToViewX(x);
177 }
178
179 /*
180 * (non-Javadoc)
181 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#contentsToViewY(int)
182 */
183 @Override
184 public int contentsToViewY(int y) {
185 return fView.contentsToViewY(y);
186 }
187
188 /**
189 * Get code for drawings at given x and y position.
190 *
191 * @param x The x position
192 * @param y The y position.
193 * @return A code for top, bottom, right and left
194 */
195 protected byte code(int x, int y) {
196 byte c = 0;
197 fVisibleY = fVisibleScreenBounds;
198 fVisibleX = fVisibleScreenBounds;
199 yx = fView.getVisibleHeight() + fVisibleScreenBounds;
200 xx = fView.getVisibleWidth() + fVisibleScreenBounds;
201 if (y > yx) {
202 c |= 0x01; // top
203 } else if (y < fVisibleY) {
204 c |= 0x02; // bottom
205 }
206
207 if (x > xx) {
208 c |= 0x04; // right
209 } else if (x < fVisibleX) {
210 c |= 0x08; // left
211 }
212 return c;
213 }
214
215 /*
216 * (non-Javadoc)
217 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#drawLine(int, int, int, int)
218 */
219 @Override
220 public void drawLine(int x1, int y1, int x2, int y2) {
221 int localX1 = x1;
222 int localY1 = y1;
223 int localX2 = x2;
224 int localY2 = y2;
225
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);
234
235 byte code1 = code(localX1, localY1);
236 byte code2 = code(localX2, localY2);
237 byte codex;
238 boolean draw = false;
239 boolean end = false;
240 int x = 0, y = 0;
241
242 do {
243 if (code1 == 0 && code2 == 0) {
244 draw = true;
245 end = true;
246 } else if ((code1 & code2) != 0) {
247 end = true;
248 } else {
249 codex = (code1 != 0) ? code1 : code2;
250 if ((codex & 0x01) != 0) { // top
251 x = localX1 + ((localX2 - localX1) * (yx - localY1)) / (localY2 - localY1);
252 y = yx;
253 } else if ((codex & 0x02) != 0) { // bottom
254 x = localX1 + ((localX2 - localX1) * (fVisibleY - localY1)) / (localY2 - localY1);
255 y = fVisibleY;
256 } else if ((codex & 0x04) != 0) { // right
257 y = localY1 + ((localY2 - localY1) * (xx - localX1)) / (localX2 - localX1);
258 x = xx;
259 } else if ((codex & 0x08) != 0) { // left
260 y = localY1 + ((localY2 - localY1) * (fVisibleX - localX1)) / (localX2 - localX1);
261 x = fVisibleX;
262 }
263
264 if (codex == code1) {
265 localX1 = x;
266 localY1 = y;
267 code1 = code(localX1, localY1);
268 } else {
269 localX2 = x;
270 localY2 = y;
271 code2 = code(localX2, localY2);
272 }
273 }
274 } while (!end);
275
276 if (draw) {
277 fContext.drawLine(localX1, localY1, localX2, localY2);
278 }
279 }
280
281 /*
282 * (non-Javadoc)
283 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#drawRectangle(int, int, int, int)
284 */
285 @Override
286 public void drawRectangle(int x, int y, int width, int height) {
287 int localX = x;
288 int localY = y;
289 int localWidth = width;
290 int localHeight = height;
291
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);
297 } else {
298 localY = 0;
299 }
300 localWidth = Math.round(localWidth * fView.fZoomValue);
301 localHeight = Math.round(localHeight * fView.fZoomValue);
302 localX = fView.contentsToViewX(localX);
303
304 if (localX < -fVisibleScreenBounds) {
305 localWidth = localWidth + localX + fVisibleScreenBounds;
306 localX = -fVisibleScreenBounds;
307 }
308 if (localY < -fVisibleScreenBounds) {
309 localHeight = localHeight + localY + fVisibleScreenBounds;
310 localY = -fVisibleScreenBounds;
311 }
312 if ((localWidth < -fVisibleScreenBounds) && (localX + localWidth < -fVisibleScreenBounds)) {
313 localWidth = -fVisibleScreenBounds;
314 } else if (localWidth + localX > fView.getVisibleWidth() + fVisibleScreenBounds) {
315 localWidth = fView.getVisibleWidth() + fVisibleScreenBounds - localX;
316 }
317 if ((localHeight < -fVisibleScreenBounds) && (localY + localHeight < -fVisibleScreenBounds)) {
318 localHeight = -fVisibleScreenBounds;
319 } else if (localHeight + localY > fView.getVisibleHeight() + fVisibleScreenBounds) {
320 localHeight = fView.getVisibleHeight() + fVisibleScreenBounds - localY;
321 }
322 fContext.drawRectangle(localX, localY, localWidth, localHeight);
323 }
324
325 /*
326 * (non-Javadoc)
327 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#drawFocus(int, int, int, int)
328 */
329 @Override
330 public void drawFocus(int x, int y, int width, int height) {
331 int localX = x;
332 int localY = y;
333 int localWidth = width;
334 int localHeight = height;
335
336 IColor bC = getBackground();
337 IColor fC = getForeground();
338
339 if (localWidth < 0) {
340 localX = localX + localWidth;
341 localWidth = -localWidth;
342 }
343
344 if (localHeight < 0) {
345 localY = localY + localHeight;
346 localHeight = -localHeight;
347 }
348
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);
353
354 setForeground(SDViewPref.getInstance().getForeGroundColorSelection());
355 setBackground(SDViewPref.getInstance().getBackGroundColorSelection());
356
357 fContext.drawFocus(fView.contentsToViewX(localX - 1), fView.contentsToViewY(localY - 1), localWidth + 3, localHeight + 3);
358
359 setBackground(bC);
360 setForeground(fC);
361 }
362
363 /*
364 * (non-Javadoc)
365 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#fillPolygon(int[])
366 */
367 @Override
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));
373 i++;
374 localPoint[i] = fView.contentsToViewY(Math.round(points[i] * fView.fZoomValue));
375 }
376
377 if (validatePolygonHeight(localPoint) <= 0) {
378 return;
379 }
380
381 fContext.fillPolygon(localPoint);
382 }
383
384 /*
385 * (non-Javadoc)
386 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#drawPolygon(int[])
387 */
388 @Override
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));
394 i++;
395 localPoint[i] = fView.contentsToViewY(Math.round(points[i] * fView.fZoomValue));
396 }
397
398 if (validatePolygonHeight(localPoint) <= 0) {
399 return;
400 }
401
402 fContext.drawPolygon(localPoint);
403 }
404
405 /*
406 * (non-Javadoc)
407 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#fillRectangle(int, int, int, int)
408 */
409 @Override
410 public void fillRectangle(int x, int y, int width, int height) {
411 int localX = x;
412 int localY = y;
413 int localWidth = width;
414 int localHeight = height;
415
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;
421 } else {
422 localY = 1;
423 }
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;
430 }
431 if (localY < -fVisibleScreenBounds) {
432 localHeight = localHeight + localY + fVisibleScreenBounds;
433 localY = -fVisibleScreenBounds;
434 }
435 if ((localWidth < -fVisibleScreenBounds) && (localX + localWidth < -fVisibleScreenBounds)) {
436 localWidth = -fVisibleScreenBounds;
437 } else if (localWidth + localX > fView.getVisibleWidth() + fVisibleScreenBounds) {
438 localWidth = fView.getVisibleWidth() + fVisibleScreenBounds - localX;
439 }
440 if ((localHeight < -fVisibleScreenBounds) && (localY + localHeight < -fVisibleScreenBounds)) {
441 localHeight = -fVisibleScreenBounds;
442 } else if (localHeight + localY > fView.getVisibleHeight() + fVisibleScreenBounds) {
443 localHeight = fView.getVisibleHeight() + fVisibleScreenBounds - localY;
444 }
445 fContext.fillRectangle(localX, localY, localWidth, localHeight);
446
447 }
448
449 /*
450 * (non-Javadoc)
451 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#fillGradientRectangle(int, int, int, int, boolean)
452 */
453 @Override
454 public void fillGradientRectangle(int x, int y, int width, int height, boolean isVertical) {
455 int localX = x;
456 int localY = y;
457 int localWidth = width;
458 int localHeight = height;
459
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);
468
469 if (localX < -fVisibleScreenBounds) {
470 localWidth = localWidth + localX + fVisibleScreenBounds;
471 localX = -fVisibleScreenBounds;
472 }
473 if (localY < -fVisibleScreenBounds) {
474 localHeight = localHeight + localY + fVisibleScreenBounds;
475 localY = -fVisibleScreenBounds;
476 }
477
478 if ((localWidth < -fVisibleScreenBounds) && (localX + localWidth < -fVisibleScreenBounds)) {
479 localWidth = -fVisibleScreenBounds;
480 } else if (localWidth + localX > fView.getVisibleWidth() + fVisibleScreenBounds) {
481 localWidth = fView.getVisibleWidth() + fVisibleScreenBounds - localX;
482 }
483 if ((localHeight < -fVisibleScreenBounds) && (localY + localHeight < -fVisibleScreenBounds)) {
484 localHeight = -fVisibleScreenBounds;
485 } else if (localHeight + localY > fView.getVisibleHeight() + fVisibleScreenBounds) {
486 localHeight = fView.getVisibleHeight() + fVisibleScreenBounds - localY;
487 }
488 if (isVertical) {
489 fContext.fillGradientRectangle(localX, localY, localWidth, localHeight, isVertical);
490 }
491 else {
492 fContext.fillGradientRectangle(localX + localWidth, localY, -localWidth, localHeight + 1, isVertical);
493 }
494 setForeground(tempColor);
495 }
496
497
498 /*
499 * (non-Javadoc)
500 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#textExtent(java.lang.String)
501 */
502 @Override
503 public int textExtent(String name) {
504 return fContext.textExtent(name).x;
505 }
506
507 /*
508 * (non-Javadoc)
509 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#drawText(java.lang.String, int, int, boolean)
510 */
511 @Override
512 public void drawText(String string, int x, int y, boolean isTrans) {
513 int localX = x;
514 int localY = y;
515
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);
522 }
523 }
524
525 /*
526 * (non-Javadoc)
527 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#drawText(java.lang.String, int, int)
528 */
529 @Override
530 public void drawText(String string, int x, int y) {
531 int localX = x;
532 int localY = y;
533
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);
540 }
541 }
542
543 /*
544 * (non-Javadoc)
545 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#fillOval(int, int, int, int)
546 */
547 @Override
548 public void fillOval(int x, int y, int width, int height) {
549 int localX = x;
550 int localY = y;
551 int localWidth = width;
552 int localHeight = height;
553
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);
559 }
560
561 /*
562 * (non-Javadoc)
563 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getBackground()
564 */
565 @Override
566 public IColor getBackground() {
567 if ((fBackground != null) && (fBackground.getColor() instanceof Color) && (!((Color) (fBackground.getColor())).isDisposed())) {
568 return fBackground;
569 }
570 return ColorImpl.getSystemColor(SWT.COLOR_WHITE);
571 }
572
573 /*
574 * (non-Javadoc)
575 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getForeground()
576 */
577 @Override
578 public IColor getForeground() {
579 if ((fForeground != null) && (fForeground.getColor() instanceof Color) && (!((Color) (fForeground.getColor())).isDisposed())) {
580 return fForeground;
581 }
582 return ColorImpl.getSystemColor(SWT.COLOR_WHITE);
583 }
584
585 /*
586 * (non-Javadoc)
587 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#setBackground(org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IColor)
588 */
589 @Override
590 public void setBackground(IColor color) {
591 if (color == null) {
592 return;
593 }
594 if (color.getColor() instanceof Color) {
595 fContext.setBackground((Color) color.getColor());
596 fBackground = color;
597 }
598 }
599
600 /*
601 * (non-Javadoc)
602 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#setForeground(org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IColor)
603 */
604 @Override
605 public void setForeground(IColor color) {
606 if (color == null) {
607 return;
608 }
609 if (color.getColor() instanceof Color) {
610 Color c = (Color) color.getColor();
611 if (!c.isDisposed()) {
612 fContext.setForeground(c);
613 fForeground = color;
614 }
615 }
616 }
617
618 /*
619 * (non-Javadoc)
620 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#setGradientColor(org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IColor)
621 */
622 @Override
623 public void setGradientColor(IColor color) {
624 if (color == null) {
625 return;
626 }
627 if (color.getColor() instanceof Color) {
628 fGradientColor = color;
629 }
630 }
631
632 /*
633 * (non-Javadoc)
634 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#setLineWidth(int)
635 */
636 @Override
637 public void setLineWidth(int width) {
638 if (fView.isPrinting()) {
639 fContext.setLineWidth(width * 2);
640 }
641 else {
642 fContext.setLineWidth(width);
643 }
644 }
645
646 /*
647 * (non-Javadoc)
648 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getLineWidth()
649 */
650 @Override
651 public int getLineWidth() {
652 return fContext.getLineWidth();
653 }
654
655 /**
656 * Method to draw a text in rectangle. (Linux GTK Workaround)
657 *
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
662 */
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);
667 }
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);
671 }
672 }
673
674 /*
675 * (non-Javadoc)
676 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#drawTextTruncatedCentred(java.lang.String, int, int, int, int, boolean)
677 */
678 @Override
679 public void drawTextTruncatedCentred(String name, int xValue, int yValue, int width, int height, boolean trans) {
680 int localX = xValue;
681 int localY = yValue;
682 int localWidth = width;
683 int localHeight = height;
684
685 Point tx = fContext.textExtent(name);
686 localX = Math.round(localX * fView.fZoomValue);
687 int y = 0;
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);
692 }
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) {
697 return;
698 }
699
700 // Adjust height and y
701 if (y < -fVisibleScreenBounds) {
702 localHeight = localHeight + y + fVisibleScreenBounds;
703 y = -fVisibleScreenBounds;
704 }
705 if ((localHeight < -fVisibleScreenBounds) && (y + localHeight < -fVisibleScreenBounds)) {
706 localHeight = -fVisibleScreenBounds;
707 } else if (localHeight + y > fView.getVisibleHeight() + fVisibleScreenBounds) {
708 localHeight = fView.getVisibleHeight() + fVisibleScreenBounds - y;
709 }
710
711 if (tx.x <= localWidth) {
712 localDrawText(name, x + 1 + (localWidth - tx.x) / 2, y + 1 + (localHeight - tx.y) / 2, trans);
713 } else {
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);
717 }
718 int dotCount = 0;
719 for (int i = 1; i <= 3 && nameToDisplay.length() - i > 0; i++) {
720 dotCount++;
721 }
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$
726 }
727 nameToDisplay = buf.toString();
728 localDrawText(nameToDisplay, x + 1 + (localWidth - fContext.textExtent(nameToDisplay).x) / 2, y + 1 + (localHeight - fContext.textExtent(nameToDisplay).y) / 2, trans);
729 }
730 }
731
732 /*
733 * (non-Javadoc)
734 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#drawTextTruncated(java.lang.String, int, int, int, int, boolean)
735 */
736 @Override
737 public void drawTextTruncated(String name, int xValue, int yValue, int width, int height, boolean trans) {
738 int localX = xValue;
739 int localY = yValue;
740 int localWidth = width;
741 int localHeight = height;
742
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);
751 } else {
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);
755 }
756 int dotCount = 0;
757 for (int i = 1; i <= 3 && nameToDisplay.length() - i > 0; i++) {
758 dotCount++;
759 }
760 nameToDisplay = nameToDisplay.substring(0, nameToDisplay.length() - dotCount);
761
762 StringBuffer buf = new StringBuffer(nameToDisplay);
763
764 for (int i = 0; i < dotCount; i++) {
765 buf.append("."); //$NON-NLS-1$
766 }
767 nameToDisplay = buf.toString();
768 localDrawText(nameToDisplay, x + 1, y + 1 + localHeight, trans);
769 }
770 }
771
772 /*
773 * (non-Javadoc)
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)
775 */
776 @Override
777 public void drawImage(IImage image, int xValue, int yValue, int maxWith, int maxHeight) {
778 int localX = xValue;
779 int localY = yValue;
780
781 Image img = null;
782 if (image != null && image.getImage() instanceof Image) {
783 img = (Image) image.getImage();
784 } else {
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);
794 return;
795 }
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();
801 int width = b.width;
802 int height = b.height;
803 if (width > maxWith) {
804 width = maxWith;
805 }
806 if (height > maxHeight) {
807 height = maxHeight;
808 }
809 float tempZoom = fView.fZoomValue;
810 width = Math.round(width * tempZoom);
811 height = Math.round(height * tempZoom);
812
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);
819 tempgc.dispose();
820 dbuffer.dispose();
821 dbuffer2.dispose();
822 } else {
823 fContext.drawImage(img, 0, 0, b.width, b.height, x, y, width, height);
824 }
825 }
826
827 /*
828 * (non-Javadoc)
829 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#drawArc(int, int, int, int, int, int)
830 */
831 @Override
832 public void drawArc(int x, int y, int width, int height, int startAngle, int endAngle) {
833 int localX = x;
834 int localY = y;
835 int localWidth = width;
836 int localHeight = height;
837
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) {
843 return;
844 }
845 fContext.drawArc(fView.contentsToViewX(localX), fView.contentsToViewY(localY), localWidth, localHeight, startAngle, endAngle);
846 }
847
848 /*
849 * (non-Javadoc)
850 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#setFont(org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IFont)
851 */
852 @Override
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);
858 if (h > 0) {
859 fontData.setHeight(h);
860 }
861 }
862 if (fTempFont != null) {
863 fTempFont.dispose();
864 }
865 fTempFont = new Font(Display.getCurrent(), fontData);
866 fContext.setFont(fTempFont);
867 }
868 }
869
870 /*
871 * (non-Javadoc)
872 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getFontHeight(org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IFont)
873 */
874 @Override
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);
881 return height;
882 }
883 return 0;
884 }
885
886 /**
887 * Returns the current font height.
888 *
889 * @return the current font height.
890 */
891 protected int getCurrentFontHeight() {
892 return fContext.textExtent("lp").y; //$NON-NLS-1$
893 }
894
895 /*
896 * (non-Javadoc)
897 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getFontWidth(org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IFont)
898 */
899 @Override
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);
906 return width;
907 }
908 return 0;
909 }
910
911 /**
912 * Disposes all created resources.
913 */
914 public void dispose() {
915 if (fTempFont != null) {
916 fTempFont.dispose();
917 }
918 fTempFont = null;
919 if (fContext != null) {
920 fContext.dispose();
921 }
922 fContext = null;
923 }
924
925 /*
926 * (non-Javadoc)
927 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getZoom()
928 */
929 @Override
930 public float getZoom() {
931 if (fView != null) {
932 return fView.fZoomValue;
933 }
934 return 1;
935 }
936
937 /*
938 * (non-Javadoc)
939 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getLineDotStyle()
940 */
941 @Override
942 public int getLineDotStyle() {
943 return SWT.LINE_DOT;
944 }
945
946 /*
947 * (non-Javadoc)
948 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getLineDashStyle()
949 */
950 @Override
951 public int getLineDashStyle() {
952 return SWT.LINE_DASH;
953 }
954
955 /*
956 * (non-Javadoc)
957 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#getLineSolidStyle()
958 */
959 @Override
960 public int getLineSolidStyle() {
961 return SWT.LINE_SOLID;
962 }
963
964 /*
965 * (non-Javadoc)
966 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#createColor(int, int, int)
967 */
968 @Override
969 public IColor createColor(int r, int g, int b) {
970 return new ColorImpl(Display.getDefault(), r, g, b);
971 }
972
973 /*
974 * (non-Javadoc)
975 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC#setDrawTextWithFocusStyle(boolean)
976 */
977 @Override
978 public void setDrawTextWithFocusStyle(boolean focus) {
979 fDrawWithFocus = focus;
980 }
981
982 /**
983 * Returns the screen bounds.
984 *
985 * @return the screen bounds.
986 */
987 protected static int getVscreenBounds() {
988 return fVisibleScreenBounds;
989 }
990
991 /**
992 * Sets the visible screen bounds.
993 *
994 * @param vBounds the screen bounds.
995 */
996 protected static void setVscreenBounds(int vBounds) {
997 fVisibleScreenBounds = vBounds;
998 }
999
1000 // ------------------------------------------------------------------------
1001 // Helper methods
1002 // ------------------------------------------------------------------------
1003
1004 /**
1005 * Validates the polygon height
1006 *
1007 * @param localPoint array of points
1008 * @return height
1009 */
1010 private int validatePolygonHeight(int[] localPoint) {
1011 int i = 1;
1012 int max = 0;
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;
1017 i+=2;
1018 }
1019 int height = max - min;
1020 if (min < -fVisibleScreenBounds) {
1021 height = height + min + fVisibleScreenBounds;
1022 min = -fVisibleScreenBounds;
1023 }
1024 if ((height < -fVisibleScreenBounds) && (min + height < -fVisibleScreenBounds)) {
1025 height = -fVisibleScreenBounds;
1026 } else if (height + min > fView.getVisibleHeight() + fVisibleScreenBounds) {
1027 height = fView.getVisibleHeight() + fVisibleScreenBounds - min;
1028 }
1029 return height;
1030 }
1031 }
This page took 0.057441 seconds and 6 git commands to generate.