1 /**********************************************************************
2 * Copyright (c) 2005, 2014 IBM Corporation, Ericsson
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
9 * IBM - Initial API and implementation
10 * Bernd Hufmann - Updated for TMF
11 * Matthew Khouzam - Minor refactor
12 **********************************************************************/
14 package org
.eclipse
.tracecompass
.tmf
.ui
.views
.uml2sd
.dialogs
;
16 import java
.text
.MessageFormat
;
17 import java
.util
.Arrays
;
19 import org
.eclipse
.jface
.wizard
.WizardPage
;
20 import org
.eclipse
.swt
.SWT
;
21 import org
.eclipse
.swt
.events
.FocusEvent
;
22 import org
.eclipse
.swt
.events
.FocusListener
;
23 import org
.eclipse
.swt
.events
.KeyEvent
;
24 import org
.eclipse
.swt
.events
.ModifyEvent
;
25 import org
.eclipse
.swt
.events
.ModifyListener
;
26 import org
.eclipse
.swt
.events
.MouseEvent
;
27 import org
.eclipse
.swt
.events
.MouseTrackListener
;
28 import org
.eclipse
.swt
.events
.SelectionEvent
;
29 import org
.eclipse
.swt
.events
.SelectionListener
;
30 import org
.eclipse
.swt
.events
.TraverseEvent
;
31 import org
.eclipse
.swt
.events
.TraverseListener
;
32 import org
.eclipse
.swt
.graphics
.GC
;
33 import org
.eclipse
.swt
.graphics
.Image
;
34 import org
.eclipse
.swt
.graphics
.ImageData
;
35 import org
.eclipse
.swt
.graphics
.RGB
;
36 import org
.eclipse
.swt
.graphics
.Rectangle
;
37 import org
.eclipse
.swt
.layout
.GridData
;
38 import org
.eclipse
.swt
.layout
.GridLayout
;
39 import org
.eclipse
.swt
.printing
.PrintDialog
;
40 import org
.eclipse
.swt
.printing
.Printer
;
41 import org
.eclipse
.swt
.printing
.PrinterData
;
42 import org
.eclipse
.swt
.widgets
.Button
;
43 import org
.eclipse
.swt
.widgets
.Composite
;
44 import org
.eclipse
.swt
.widgets
.Control
;
45 import org
.eclipse
.swt
.widgets
.Display
;
46 import org
.eclipse
.swt
.widgets
.Group
;
47 import org
.eclipse
.swt
.widgets
.Label
;
48 import org
.eclipse
.swt
.widgets
.Shell
;
49 import org
.eclipse
.swt
.widgets
.Text
;
50 import org
.eclipse
.tracecompass
.tmf
.ui
.project
.model
.TraceUtils
;
51 import org
.eclipse
.tracecompass
.tmf
.ui
.views
.uml2sd
.DiagramToolTip
;
52 import org
.eclipse
.tracecompass
.tmf
.ui
.views
.uml2sd
.NGC
;
53 import org
.eclipse
.tracecompass
.tmf
.ui
.views
.uml2sd
.SDWidget
;
54 import org
.eclipse
.tracecompass
.tmf
.ui
.views
.uml2sd
.util
.Messages
;
57 * The class implements the actual print dialog UI for collecting printing data.
62 public class SDPrintDialogUI
{
64 private static final RGB FOCUS_COLOR
= new RGB(0, 0, 128);
65 private static final RGB NON_FOCUS_COLOR
= new RGB(221, 208, 200);
67 // ------------------------------------------------------------------------
69 // ------------------------------------------------------------------------
71 * The set horizontal pages number.
73 private Button fSetHPagesNumber
;
75 * The set vertical pages number.
77 private Button fSetVPagesNumber
;
79 * Flag whether to use current zoom or not.
81 private Button fUseCurrentZoom
;
83 * Flag whether to print all pages or not
85 private Button fAllPages
;
87 * Flag whether to print current page only
89 private Button fCurrentPage
;
91 * Button to select a page list.
93 private Button fPageList
;
95 * Button to select a page range.
97 private Button fPageRange
;
99 * Text field to enter from page.
101 private Text fFromPage
;
103 * Text field to enter to page.
105 private Text fToPage
;
107 * The sequence diagram widget reference.
109 private SDWidget fSdView
;
111 * Text field for number of horizontal pages
113 private Text fHorPagesNum
;
115 * Text field for number of vertical pages
117 private Text fVertPagesNum
;
119 * Text field for toal number of pages
121 private Text fTotalPages
;
123 * A modify listener implementation to handle modifications.
125 private ModifyListener fModifyListener
;
127 * A selection listener implementation to handle selections.
129 private SelectionListener fSelectionListener
;
131 * Local canvas displaying sequence diagram overview.
133 private LocalSD fOverviewCanvas
;
137 private int fNbPages
= 0;
139 * Number of selected pages.
141 private int fPageNum
= -1;
143 * Number of first page.
145 private int fFirstPage
= -1;
147 * List of pages to print.
149 private int fPagesList
[];
152 * Value for dividing the sequence diagram into pages
154 private float fStepX
;
157 * Value for dividing the sequence diagram into pages
159 private float fStepY
;
162 * Value for dividing the sequence diagram into pages
167 * Value for dividing the sequence diagram into pages
172 * Page which to print from.
176 * Page which to print to.
180 * Flag for enabling multi-selection.
182 private boolean fMultiSelection
= false;
184 * Flag for enabling area selection.
186 private boolean fAreaSelection
= false;
188 * Flag for printing all.
190 private boolean fPrintAll
;
192 * Flag for printing current page only.
194 private boolean fPrintCurrent
;
196 * Flag for printing a selection of pages.
198 private boolean fPrintSelection
;
200 * Flag for printing a range of pages.
202 private boolean fPrintRange
;
204 * Number of selected rows
208 * Number of selected lines
210 private int fNbLines
;
214 private float fZoomFactor
;
216 * The printer data reference.
218 private PrinterData fPrinterData
;
220 * The diagram tooltip to show if necessary.
222 private DiagramToolTip fToolTip
= null;
224 * Label for current selection.
226 private Label fCurrentSelection
;
228 * The shell reference.
230 private Shell fShell
;
232 * Button to open printer dialog from OS.
234 private Button fPrinterDialog
;
236 * Flag for showing print button.
238 private boolean fShowPrintButton
;
242 private int fTest
= 3;
244 * Parent wizard page if used as wizard
246 private WizardPage fParentWizardPage
= null;
248 * Reference to parent print dialog.
250 private SDPrintDialog fParentDialog
= null;
252 // ------------------------------------------------------------------------
254 // ------------------------------------------------------------------------
256 * Local sequence diagram widget used to display overview of sequence
261 private class LocalSD
extends SDWidget
{
271 public LocalSD(Composite c
, int s
) {
276 public int getContentsHeight() {
277 if (fSdView
.getContentsHeight() > fSdView
.getContentsHeight()) {
278 return (int) (fSdView
.getVisibleHeight() / (float) fTest
/ fSdView
.getZoomValue());
280 return super.getContentsHeight();
284 public int getContentsWidth() {
285 if (fSdView
.getVisibleWidth() > fSdView
.getContentsWidth()) {
286 return (int) (fSdView
.getVisibleWidth() / (float) fTest
/ fSdView
.getZoomValue());
288 return super.getContentsWidth();
292 protected void contentsMouseHover(MouseEvent event
) {
296 * Creates page selection images.
310 protected Image
createPagesSelectionImages(Image img
, int width
, float stepX
, int height
, float stepY
) {
312 Image over
= new Image(super.getShell().getDisplay(), img
.getImageData());
314 for (int pageIndex
= 0; pageIndex
< fPagesList
.length
; pageIndex
++) {
316 int pageNum
= fPagesList
[pageIndex
];
318 if (getPagesForSelection() > 0 && pageNum
> 0) {
319 int line
= pageNum
/ getNbRow();
320 int row
= pageNum
% getNbRow();
331 if (fOverviewCanvas
.isFocusControl()) {
332 over
= new Image(super.getShell().getDisplay(), drawRegionSelected(toDel
,
333 new Rectangle(contentsToViewX((int) (row
* stepX
* fOverviewCanvas
.getZoomValue())), contentsToViewY((int) (line
* stepY
* fOverviewCanvas
.getZoomValue())),
334 ((int) (stepX
* fOverviewCanvas
.getZoomValue())), ((int) (stepY
* fOverviewCanvas
.getZoomValue()))), FOCUS_COLOR
));
336 over
= new Image(super.getShell().getDisplay(), drawRegionSelected(toDel
,
337 new Rectangle(contentsToViewX((int) (row
* stepX
* fOverviewCanvas
.getZoomValue())), contentsToViewY((int) (line
* stepY
* fOverviewCanvas
.getZoomValue())),
338 ((int) (stepX
* fOverviewCanvas
.getZoomValue())), ((int) (stepY
* fOverviewCanvas
.getZoomValue()))), NON_FOCUS_COLOR
));
344 Arrays
.sort(fPagesList
);
345 int pos
= Arrays
.binarySearch(fPagesList
, fPageNum
);
346 if ((pos
< 0) && (getPagesForSelection() > 0 && fPageNum
> 0)) {
347 int line
= fPageNum
/ getNbRow();
348 int row
= fPageNum
% getNbRow();
359 over
= new Image(super.getShell().getDisplay(), drawRegionSelected(toDel
, new Rectangle(contentsToViewX((int) (row
* stepX
* fOverviewCanvas
.getZoomValue())), contentsToViewY((int) (line
* stepY
* fOverviewCanvas
.getZoomValue())),
360 ((int) (stepX
* fOverviewCanvas
.getZoomValue())), ((int) (stepY
* fOverviewCanvas
.getZoomValue()))), NON_FOCUS_COLOR
));
364 GC imGC2
= new GC(over
);
365 imGC2
.setBackground(Display
.getDefault().getSystemColor(SWT
.COLOR_BLACK
));
366 NGC imGC
= new NGC(fOverviewCanvas
, imGC2
);
367 for (int i
= 0, x
= 0; x
<= width
&& stepX
> 0; i
++, x
= (int) (i
* stepX
)) {
368 imGC
.drawLine(x
, 0, x
, height
);
371 for (int j
= 0, y
= 0; y
<= height
&& stepY
> 0; j
++, y
= (int) (j
* stepY
)) {
372 imGC
.drawLine(0, y
, width
, y
);
381 protected void drawContents(GC gc
, int clipx
, int clipy
, int clipw
, int cliph
) {
383 Image dbuffer
= getDrawBuffer();
387 int lw
= (int) (getContentsWidth() / getZoomValue());
388 if (getContentsWidth() < getVisibleWidth()) {
389 lw
= (int) (getVisibleWidth() / getZoomValue());
392 int lh
= (int) (getContentsHeight() / getZoomValue());
393 if (getContentsHeight() < getVisibleHeight()) {
394 lh
= (int) (getVisibleHeight() / getZoomValue());
396 d
= createPagesSelectionImages(dbuffer
, lw
, fStepX
, lh
, fStepY
);
400 d
= new Image(super.getShell().getDisplay(), drawRegionSelected(d
, new Rectangle(0, 0, lw
, lh
), NON_FOCUS_COLOR
));
404 Rectangle area
= getClientArea();
405 int w
= d
.getBounds().width
;
406 int h
= d
.getBounds().height
;
407 gc
.drawImage(d
, 0, 0, w
, h
, 0, 0, area
.width
, area
.height
);
409 fTotalPages
.setText(Integer
.valueOf(maxNumOfPages()).toString());
417 protected void keyPressedEvent(KeyEvent e
) {
418 if (e
.keyCode
== SWT
.CTRL
) {
419 fMultiSelection
= true;
421 if (e
.keyCode
== SWT
.SHIFT
) {
422 fAreaSelection
= true;
424 if (e
.keyCode
== SWT
.ARROW_DOWN
) {
425 if (fPageNum
+ getNbRow() <= maxNumOfPages()) {
426 fPageNum
+= getNbRow();
428 int line
= fPageNum
/ getNbRow();
429 int row
= fPageNum
% getNbRow();
433 if ((line
+ 1) * fStepY
> (fOverviewCanvas
.getContentsY() + fOverviewCanvas
.getVisibleHeight()) / fOverviewCanvas
.getZoomValue()) {
434 fOverviewCanvas
.scrollBy(0, (int) (fStepY
* fOverviewCanvas
.getZoomValue()));
437 if (e
.keyCode
== SWT
.ARROW_UP
) {
438 if (fPageNum
- getNbRow() > 0) {
439 fPageNum
-= getNbRow();
441 int line
= fPageNum
/ getNbRow();
442 int row
= fPageNum
% getNbRow();
446 if ((line
) * fStepY
<= fOverviewCanvas
.getContentsY() / fOverviewCanvas
.getZoomValue()) {
447 fOverviewCanvas
.scrollBy(0, -(int) (fStepY
* fOverviewCanvas
.getZoomValue()));
450 if (e
.keyCode
== SWT
.ARROW_LEFT
) {
451 if ((fPageNum
- 2) / getNbRow() == (fPageNum
- 1) / getNbRow() && fPageNum
> 1) {
454 int row
= fPageNum
% getNbRow();
455 if ((row
- 1) * fStepX
< (fOverviewCanvas
.getContentsX()) / fOverviewCanvas
.getZoomValue()) {
456 fOverviewCanvas
.scrollBy(-(int) (fStepX
* fOverviewCanvas
.getZoomValue()), 0);
459 if (e
.keyCode
== SWT
.ARROW_RIGHT
) {
460 if ((fPageNum
- 1) / getNbRow() == fPageNum
/ getNbRow()) {
463 int row
= fPageNum
% getNbRow();
467 if ((row
) * fStepX
> (fOverviewCanvas
.getContentsX() + fOverviewCanvas
.getVisibleWidth()) / fOverviewCanvas
.getZoomValue()) {
468 fOverviewCanvas
.scrollBy((int) (fStepX
* fOverviewCanvas
.getZoomValue()), 0);
472 if (e
.keyCode
== 32 && fPageNum
> -1) {
473 Arrays
.sort(fPagesList
);
474 int pos
= Arrays
.binarySearch(fPagesList
, fPageNum
);
476 addToPagesList(fPageNum
);
478 removeFromPagesList(fPageNum
);
482 if (!fAreaSelection
&& !fMultiSelection
) {
483 fFirstPage
= fPageNum
;
484 fPagesList
= new int[1];
485 fPagesList
[0] = fPageNum
;
486 } else if ((fPageNum
!= -1) && (fAreaSelection
) && (fFirstPage
!= -1)) {
487 fPagesList
= new int[0];
488 int line1
= fFirstPage
/ getNbRow();
489 int row1
= fFirstPage
% getNbRow();
496 int line2
= fPageNum
/ getNbRow();
497 int row2
= fPageNum
% getNbRow();
517 for (int i
= row1
- 1; i
< row2
; i
++) {
518 for (int j
= line1
- 1; j
< line2
; j
++) {
519 addToPagesList(i
+ j
* getNbRow() + 1);
524 fOverviewCanvas
.redraw();
528 protected void keyReleasedEvent(KeyEvent e
) {
529 if (e
.keyCode
== SWT
.CTRL
) {
530 fMultiSelection
= false;
532 if (e
.keyCode
== SWT
.SHIFT
) {
533 fAreaSelection
= false;
538 protected void contentsMouseDownEvent(MouseEvent event
) {
541 int x1
= (int) ((event
.x
/ fOverviewCanvas
.getZoomValue()) / fStepX
);
542 int x2
= (int) ((event
.y
/ fOverviewCanvas
.getZoomValue()) / fStepY
);
544 int oldPage
= fPageNum
;
546 fPageNum
= x1
+ x2
* getNbRow() + 1;
548 if (fPageNum
> maxNumOfPages()) {
553 if (!fAreaSelection
) {
554 fFirstPage
= fPageNum
;
557 if ((fPageNum
!= -1) && (fMultiSelection
)) {
558 Arrays
.sort(fPagesList
);
559 int pos
= Arrays
.binarySearch(fPagesList
, fPageNum
);
561 addToPagesList(fPageNum
);
563 removeFromPagesList(fPageNum
);
565 } else if ((fPageNum
!= -1) && (fAreaSelection
) && (fFirstPage
!= -1)) {
567 fPagesList
= new int[0];
569 int line1
= fFirstPage
/ getNbRow();
570 int row1
= fFirstPage
% getNbRow();
577 int line2
= fPageNum
/ getNbRow();
578 int row2
= fPageNum
% getNbRow();
598 for (int i
= row1
- 1; i
< row2
; i
++) {
599 for (int j
= line1
- 1; j
< line2
; j
++) {
600 addToPagesList(i
+ j
* getNbRow() + 1);
604 fPagesList
= new int[1];
605 fPagesList
[0] = fPageNum
;
607 if ((event
.stateMask
& SWT
.CTRL
) != 0) {
608 fMultiSelection
= true;
615 protected void contentsMouseMoveEvent(MouseEvent e
) {
616 fToolTip
.hideToolTip();
620 public void resizeContents(int w
, int h
) {
621 super.resizeContents(w
, h
);
627 * A traverse listener implementation.
629 protected static class LocalTraverseListener
implements TraverseListener
{
631 public void keyTraversed(TraverseEvent e
) {
632 if ((e
.detail
== SWT
.TRAVERSE_TAB_NEXT
) || (e
.detail
== SWT
.TRAVERSE_TAB_PREVIOUS
)) {
638 // ------------------------------------------------------------------------
640 // ------------------------------------------------------------------------
645 * The shell reference
647 * The sequence diagram widget reference
649 public SDPrintDialogUI(Shell shell
, SDWidget sdWidget
) {
650 this(shell
, sdWidget
, false);
657 * The shell reference
659 * The sequence diagram widget reference
660 * @param showPrintBtn
661 * Flag for showing print buttons
663 public SDPrintDialogUI(Shell shell
, SDWidget sdWidget
, boolean showPrintBtn
) {
666 fShowPrintButton
= showPrintBtn
;
668 fPrinterData
= Printer
.getDefaultPrinterData();
669 if (fPrinterData
!= null) {
670 fPrinterData
.scope
= PrinterData
.SELECTION
;
673 fPagesList
= new int[0];
675 fSelectionListener
= new SelectionListener() {
678 public void widgetSelected(SelectionEvent e
) {
679 if (fUseCurrentZoom
.getSelection()) {
680 fHorPagesNum
.setEnabled(false);
681 fVertPagesNum
.setEnabled(false);
683 if (fSetHPagesNumber
.getSelection()) {
684 fHorPagesNum
.setEnabled(true);
685 fVertPagesNum
.setEnabled(false);
686 if (fCurrentPage
.getSelection()) {
687 fCurrentPage
.setSelection(false);
688 fAllPages
.setSelection(true);
690 if ("".equals(fHorPagesNum
.getText())) { //$NON-NLS-1$
691 fHorPagesNum
.setText("1"); //$NON-NLS-1$
694 if (fSetVPagesNumber
.getSelection()) {
695 fHorPagesNum
.setEnabled(false);
696 fVertPagesNum
.setEnabled(true);
697 if (fCurrentPage
.getSelection()) {
698 fCurrentPage
.setSelection(false);
699 fAllPages
.setSelection(true);
701 if ("".equals(fVertPagesNum
.getText())) { //$NON-NLS-1$
702 fVertPagesNum
.setText("1"); //$NON-NLS-1$
705 if (fCurrentPage
.getSelection() || fAllPages
.getSelection() || fPageList
.getSelection()) {
706 fFromPage
.setEnabled(false);
707 fToPage
.setEnabled(false);
709 fFromPage
.setEnabled(true);
710 fToPage
.setEnabled(true);
713 fCurrentPage
.setEnabled(fUseCurrentZoom
.getSelection());
714 fOverviewCanvas
.setEnabled(fPageList
.getSelection());
715 if (fOverviewCanvas
.isEnabled() && (e
.widget
== fUseCurrentZoom
|| e
.widget
== fSetHPagesNumber
|| e
.widget
== fSetVPagesNumber
)) {
716 fPagesList
= new int[1];
720 } else if ((fOverviewCanvas
.isEnabled() && (e
.widget
== fPageList
)) &&
721 (fPagesList
== null || fPagesList
.length
<= 0)) {
723 fPagesList
= new int[1];
729 fTotalPages
.setText(Integer
.valueOf(maxNumOfPages()).toString());
730 fOverviewCanvas
.redraw();
731 fOverviewCanvas
.update();
735 public void widgetDefaultSelected(SelectionEvent e
) {
736 fPagesList
= new int[0];
738 fOverviewCanvas
.redraw();
743 fModifyListener
= new ModifyListener() {
745 public void modifyText(ModifyEvent e
) {
746 fPagesList
= new int[0];
748 fTotalPages
.setText(Integer
.valueOf(maxNumOfPages()).toString());
749 fOverviewCanvas
.redraw();
755 // ------------------------------------------------------------------------
757 // ------------------------------------------------------------------------
760 * Creates new grid data object.
766 protected GridData
newGridData(int span
) {
767 GridData data
= new GridData(GridData
.GRAB_VERTICAL
| GridData
.VERTICAL_ALIGN_FILL
| GridData
.GRAB_HORIZONTAL
| GridData
.HORIZONTAL_ALIGN_FILL
);
768 data
.horizontalSpan
= span
;
773 * Creates the dialog area.
776 * The parent composite
777 * @return dialog control
779 public Control
createDialogArea(Composite parent
) {
781 GridLayout parentLayout
= new GridLayout();
782 parentLayout
.numColumns
= 6;
783 parent
.setLayout(parentLayout
);
785 Group g1
= new Group(parent
, SWT
.SHADOW_NONE
);
786 g1
.setText(Messages
.SequenceDiagram_ZoomOption
);
787 g1
.setLayoutData(newGridData(3));
788 GridLayout g1layout
= new GridLayout();
789 g1layout
.numColumns
= 2;
790 g1
.setLayout(g1layout
);
792 fUseCurrentZoom
= new Button(g1
, SWT
.RADIO
);
793 fUseCurrentZoom
.setText(Messages
.SequenceDiagram_UseCurrentZoom
);
794 fUseCurrentZoom
.setLayoutData(newGridData(2));
795 fUseCurrentZoom
.addSelectionListener(fSelectionListener
);
797 fSetHPagesNumber
= new Button(g1
, SWT
.RADIO
);
798 fSetHPagesNumber
.setText(Messages
.SequenceDiagram_NumberOfHorizontalPages
);
799 fSetHPagesNumber
.setLayoutData(newGridData(1));
800 fSetHPagesNumber
.addSelectionListener(fSelectionListener
);
802 fHorPagesNum
= new Text(g1
, SWT
.SINGLE
| SWT
.BORDER
);
803 fHorPagesNum
.addModifyListener(fModifyListener
);
805 fSetVPagesNumber
= new Button(g1
, SWT
.RADIO
);
806 fSetVPagesNumber
.setText(Messages
.SequenceDiagram_NumberOfVerticalPages
);
807 fSetVPagesNumber
.setLayoutData(newGridData(1));
808 fSetVPagesNumber
.addSelectionListener(fSelectionListener
);
810 fVertPagesNum
= new Text(g1
, SWT
.SINGLE
| SWT
.BORDER
);
811 fVertPagesNum
.addModifyListener(fModifyListener
);
813 Label nbTotal
= new Label(g1
, SWT
.SHADOW_NONE
| SWT
.RIGHT
);
814 nbTotal
.setText(Messages
.TotalNumberOfPages
);
815 // nbTotal.setLayoutData(newGridData(1));
817 fTotalPages
= new Text(g1
, SWT
.SINGLE
| SWT
.BORDER
| SWT
.READ_ONLY
);
818 // nbHV.addModifyListener(modifListener);
820 Group g2
= new Group(parent
, SWT
.SHADOW_NONE
);
821 g2
.setText(Messages
.SequenceDiagram_Preview
);
822 GridData data
= new GridData(GridData
.GRAB_VERTICAL
| GridData
.VERTICAL_ALIGN_FILL
| GridData
.GRAB_HORIZONTAL
| GridData
.HORIZONTAL_ALIGN_FILL
);
823 data
.horizontalSpan
= 3;
824 data
.verticalSpan
= 2;
825 g2
.setLayoutData(data
);
826 GridLayout g2layout
= new GridLayout();
828 g2layout
.numColumns
= 1;
829 // SVLayout g2layout = new SVLayout();
830 g2
.setLayout(g2layout
);
832 GridData data2
= new GridData(GridData
.GRAB_VERTICAL
| GridData
.VERTICAL_ALIGN_FILL
| GridData
.GRAB_HORIZONTAL
| GridData
.HORIZONTAL_ALIGN_FILL
);
833 data2
.horizontalSpan
= 1;
834 data2
.verticalSpan
= 1;
836 fOverviewCanvas
= new LocalSD(g2
, SWT
.NO_BACKGROUND
);
837 GridData seqDiagLayoutData
= new GridData(GridData
.HORIZONTAL_ALIGN_FILL
| GridData
.VERTICAL_ALIGN_FILL
);
838 fOverviewCanvas
.setLayoutData(seqDiagLayoutData
);
839 // overviewCanvas.resizeContents(100,100);
840 if (fSdView
.getContentsWidth() < fSdView
.getVisibleWidth() && fSdView
.getContentsHeight() < fSdView
.getVisibleHeight()) {
845 fOverviewCanvas
.setFrame(fSdView
.getFrame(), true);
846 fOverviewCanvas
.setZoomValue((float) 1 / fTest
);
847 fOverviewCanvas
.setCornerControl(null);
848 seqDiagLayoutData
.widthHint
= fOverviewCanvas
.getContentsWidth() / fTest
;
849 seqDiagLayoutData
.widthHint
= fOverviewCanvas
.getFrame().getWidth() / fTest
+ 15;
851 if (fSdView
.getVisibleWidth() < fSdView
.getContentsWidth()) {
852 seqDiagLayoutData
.widthHint
= fOverviewCanvas
.getContentsWidth() / fTest
;
853 if (seqDiagLayoutData
.widthHint
> Display
.getDefault().getClientArea().width
/ 4) {
854 seqDiagLayoutData
.widthHint
= Display
.getDefault().getClientArea().width
/ 4;
857 seqDiagLayoutData
.widthHint
= fOverviewCanvas
.getFrame().getWidth() / fTest
+ 15;
860 if (fSdView
.getVisibleHeight() < fSdView
.getContentsHeight()) {
861 seqDiagLayoutData
.heightHint
= fOverviewCanvas
.getContentsHeight() / fTest
;
862 if (seqDiagLayoutData
.heightHint
> Display
.getDefault().getClientArea().width
/ 4) {
863 seqDiagLayoutData
.heightHint
= Display
.getDefault().getClientArea().width
/ 4;
866 seqDiagLayoutData
.heightHint
= fOverviewCanvas
.getFrame().getHeight() / fTest
;
869 fOverviewCanvas
.setEnabled(false);
871 fCurrentSelection
= new Label(g2
, SWT
.SHADOW_NONE
| SWT
.LEFT
);
872 fCurrentSelection
.setLayoutData(newGridData(1));
874 Group g3
= new Group(parent
, SWT
.SHADOW_NONE
);
875 g3
.setText(Messages
.SequenceDiagram_PrintRange
);
876 g3
.setLayoutData(newGridData(3));
877 GridLayout g3layout
= new GridLayout();
878 g3layout
.numColumns
= 4;
879 g3
.setLayout(g3layout
);
881 fAllPages
= new Button(g3
, SWT
.RADIO
);
882 fAllPages
.setText(Messages
.SequenceDiagram_AllPages
);
883 fAllPages
.setLayoutData(newGridData(4));
884 fAllPages
.addSelectionListener(fSelectionListener
);
886 fCurrentPage
= new Button(g3
, SWT
.RADIO
);
887 fCurrentPage
.setText(Messages
.SequenceDiagram_CurrentView
);
888 fCurrentPage
.setLayoutData(newGridData(4));
889 fCurrentPage
.setEnabled(true);
890 fCurrentPage
.setSelection(true);
891 fCurrentPage
.addSelectionListener(fSelectionListener
);
893 fPageList
= new Button(g3
, SWT
.RADIO
);
894 fPageList
.setText(Messages
.SequenceDiagram_SelectedPages
);
895 fPageList
.setLayoutData(newGridData(4));
896 fPageList
.addSelectionListener(fSelectionListener
);
898 fPageRange
= new Button(g3
, SWT
.RADIO
);
899 fPageRange
.setText(Messages
.SequenceDiagram_FromPage
);
900 fPageRange
.setLayoutData(newGridData(1));
901 fPageRange
.addSelectionListener(fSelectionListener
);
903 fFromPage
= new Text(g3
, SWT
.SINGLE
| SWT
.BORDER
);
905 Label labelTo
= new Label(g3
, SWT
.CENTER
);
906 labelTo
.setText(Messages
.SequenceDiagram_to
);
908 fToPage
= new Text(g3
, SWT
.SINGLE
| SWT
.BORDER
);
910 fToolTip
= new DiagramToolTip(fOverviewCanvas
);
912 fOverviewCanvas
.getViewControl().addMouseTrackListener(new MouseTrackListener() {
914 public void mouseEnter(MouseEvent e
) {
915 fToolTip
.hideToolTip();
919 public void mouseExit(MouseEvent e
) {
920 fToolTip
.hideToolTip();
924 public void mouseHover(MouseEvent e
) {
925 int x1
= (int) (fOverviewCanvas
.viewToContentsX(e
.x
) / fOverviewCanvas
.getZoomValue() / fStepX
);
926 int x2
= (int) (fOverviewCanvas
.viewToContentsY(e
.y
) / fOverviewCanvas
.getZoomValue() / fStepY
);
927 int num
= x1
+ x2
* getNbRow() + 1;
928 if (num
> maxNumOfPages()) {
932 fToolTip
.showToolTip(String
.valueOf(num
));
935 fCurrentSelection
.setText("");//$NON-NLS-1$
936 fToolTip
.hideToolTip();
942 fOverviewCanvas
.addTraverseListener(new LocalTraverseListener());
944 fOverviewCanvas
.addFocusListener(new FocusListener() {
946 public void focusGained(FocusEvent e
) {
947 fOverviewCanvas
.redraw();
951 public void focusLost(FocusEvent e
) {
952 fOverviewCanvas
.redraw();
956 if (fShowPrintButton
) {
957 Composite printerDlg
= new Composite(parent
, SWT
.NONE
);
958 data
= new GridData(SWT
.FILL
, SWT
.DEFAULT
, true, false);
959 data
.horizontalSpan
= 6;
960 parentLayout
= new GridLayout();
961 parentLayout
.numColumns
= 2;
962 printerDlg
.setLayout(parentLayout
);
963 printerDlg
.setLayoutData(data
);
965 Label label
= new Label(printerDlg
, SWT
.NONE
);
966 label
.setLayoutData(new GridData(SWT
.FILL
, SWT
.DEFAULT
, true, false));
967 fPrinterDialog
= new Button(printerDlg
, SWT
.PUSH
);
968 fPrinterDialog
.setText(Messages
.SequenceDiagram_Printer
);
970 fPrinterDialog
.addSelectionListener(new SelectionListener() {
972 public void widgetSelected(SelectionEvent e
) {
973 printButtonSelected();
977 public void widgetDefaultSelected(SelectionEvent e
) {
983 updatePrinterStatus();
989 * Get number of pages for selection.
991 * @return number of pages for selection.
993 public int getPagesForSelection() {
998 * Handler for when the OK button is pressed
1000 * @return True if the operation was successful, false if there was an error
1002 public boolean okPressed() {
1003 fPrintAll
= fAllPages
.getSelection();
1004 fPrintCurrent
= fCurrentPage
.getSelection();
1005 fPrintSelection
= fPageList
.getSelection();
1006 fPrintRange
= fPageRange
.getSelection();
1009 fFrom
= Integer
.valueOf(fFromPage
.getText()).intValue();
1010 fTo
= Integer
.valueOf(fToPage
.getText()).intValue();
1011 if (fFrom
> maxNumOfPages() || fTo
> maxNumOfPages() || fFrom
<= 0 || fTo
<= 0) {
1012 TraceUtils
.displayErrorMsg(Messages
.SequenceDiagram_Error
, Messages
.SequenceDiagram_InvalidRange
);
1015 } else if (fSetHPagesNumber
.getSelection() && fNbPages
<= 0) {
1016 TraceUtils
.displayErrorMsg(Messages
.SequenceDiagram_Error
, Messages
.SequenceDiagram_InvalidNbHorizontal
);
1018 } else if (fSetVPagesNumber
.getSelection() && fNbPages
<= 0) {
1019 TraceUtils
.displayErrorMsg(Messages
.SequenceDiagram_Error
, Messages
.SequenceDiagram_InvalidNbVertical
);
1021 } else if (fPrintSelection
&& getPageList().length
<= 0) {
1022 TraceUtils
.displayErrorMsg(Messages
.SequenceDiagram_Error
, Messages
.SequenceDiagram_NoPageSelected
);
1026 } catch (Exception e
) {
1027 TraceUtils
.displayErrorMsg(Messages
.SequenceDiagram_Error
, Messages
.SequenceDiagram_InvalidRange
);
1037 * Draws region that was selected
1040 * The corresponding image
1042 * The selected rectangle.
1044 * The color to use for selection
1045 * @return image data reference
1047 public ImageData
drawRegionSelected(Image img
, Rectangle r
, RGB color
) {
1048 ImageData id
= img
.getImageData();
1049 for (int a
= 0; a
< r
.width
&& r
.x
+ a
< id
.width
; a
++) {
1050 for (int b
= 0; b
< r
.height
&& r
.y
+ b
< id
.height
; b
++) {
1051 int index
= id
.getPixel(r
.x
+ a
, r
.y
+ b
);
1052 RGB rgb
= id
.palette
.getRGB(index
);
1053 rgb
= combine(color
, rgb
);
1054 id
.setPixel(r
.x
+ a
, r
.y
+ b
, id
.palette
.getPixel(rgb
));
1061 * Combines two RGB colors.
1067 * @return new RGB color
1069 public static RGB
combine(RGB front
, RGB back
) {
1073 double af
= (_af
) / 255.0;
1074 double rf
= front
.red
;
1075 double gf
= front
.green
;
1076 double bf
= front
.blue
;
1078 double ab
= (_ab
) / 255.0;
1079 double rb
= back
.red
;
1080 double gb
= back
.green
;
1081 double bb
= back
.blue
;
1083 double k
= (1.0 - af
) * ab
;
1084 int r
= (int) ((af
* rf
+ k
* rb
));
1085 int g
= (int) ((af
* gf
+ k
* gb
));
1086 int b
= (int) ((af
* bf
+ k
* bb
));
1088 return new RGB(r
, g
, b
);
1092 * Computes value for X coordinates step and Y coordinates step.
1094 protected void computeStepXY() {
1095 float cw
= fOverviewCanvas
.getContentsWidth() / fOverviewCanvas
.getZoomValue();
1096 float ch
= fOverviewCanvas
.getContentsHeight() / fOverviewCanvas
.getZoomValue();
1098 if (fPrinterData
== null) {
1104 Printer printer
= new Printer(fPrinterData
);
1105 if (fSetHPagesNumber
.getSelection()) {
1106 fNbPages
= Integer
.valueOf(fHorPagesNum
.getText()).intValue();
1107 float z1
= fSdView
.getContentsWidth() / cw
;
1108 float z2
= printer
.getClientArea().width
/ ((float) fSdView
.getContentsWidth() / fNbPages
);
1110 fStepY
= printer
.getClientArea().height
/ z1
/ z2
;
1111 fStepX
= cw
/ fNbPages
;
1112 } else if (fSetVPagesNumber
.getSelection()) {
1113 fNbPages
= Integer
.valueOf(fVertPagesNum
.getText()).intValue();
1114 float z1
= fSdView
.getContentsHeight() / ch
;
1115 float z2
= printer
.getClientArea().height
/ ((float) fSdView
.getContentsHeight() / fNbPages
);
1116 fStepX
= printer
.getClientArea().width
/ z1
/ z2
;
1117 fStepY
= ch
/ fNbPages
;
1119 float z1
= fSdView
.getContentsWidth() / (cw
);
1120 fStepX
= fSdView
.getVisibleWidth() / z1
;
1121 fNbPages
= Math
.round(cw
/ fStepX
);
1122 if (fNbPages
== 0) {
1125 int pw
= printer
.getClientArea().width
;
1126 int ph
= printer
.getClientArea().height
;
1127 float z2
= pw
/ ((float) fSdView
.getContentsWidth() / fNbPages
);
1128 fStepY
= ph
/ z1
/ z2
;
1131 } catch (NumberFormatException e
) {
1132 fStepX
= fStepY
= fNbPages
= 0;
1135 sTX
= fStepX
* (fSdView
.getContentsWidth() / cw
);
1136 sTY
= fStepY
* (fSdView
.getContentsHeight() / ch
);
1138 if ((fSdView
.getVisibleWidth() > fSdView
.getContentsWidth()) && (fSetVPagesNumber
.getSelection() || fSetHPagesNumber
.getSelection())) {
1139 rat
= (float) fSdView
.getVisibleWidth() / (float) fSdView
.getContentsWidth();
1141 fZoomFactor
= (fOverviewCanvas
.getContentsWidth() / cw
) / fOverviewCanvas
.getZoomFactor() * rat
;
1145 * Returns the pages list.
1147 * @return the pages list.
1149 public int[] getPageList() {
1150 return Arrays
.copyOf(fPagesList
, fPagesList
.length
);
1154 * Adds a page to pages list.
1157 * The number of the the new page
1159 public void addToPagesList(int num
) {
1160 int temp
[] = new int[fPagesList
.length
+ 1];
1161 System
.arraycopy(fPagesList
, 0, temp
, 0, fPagesList
.length
);
1162 temp
[temp
.length
- 1] = num
;
1163 fPagesList
= new int[temp
.length
];
1164 System
.arraycopy(temp
, 0, fPagesList
, 0, temp
.length
);
1168 * Removes a page from the pages list.
1171 * The number of the page to remove
1173 public void removeFromPagesList(int num
) {
1174 int pos
= Arrays
.binarySearch(fPagesList
, num
);
1175 int temp
[] = new int[fPagesList
.length
- 1];
1176 System
.arraycopy(fPagesList
, 0, temp
, 0, pos
);
1177 System
.arraycopy(fPagesList
, pos
+ 1, temp
, pos
, fPagesList
.length
- pos
- 1);
1178 fPagesList
= new int[temp
.length
];
1179 System
.arraycopy(temp
, 0, fPagesList
, 0, temp
.length
);
1183 * Returns the maximum number of pages.
1185 * @return maximum number of pages.
1187 public int maxNumOfPages() {
1188 return (getNbRow() * getNbLines());
1192 * Returns the number of rows.
1194 * @return number of rows.
1196 public int getNbRow() {
1197 if (!fSetHPagesNumber
.isDisposed()) {
1198 int cw
= (int) (fOverviewCanvas
.getContentsWidth() / fOverviewCanvas
.getZoomValue());
1201 row
= (int) (cw
/ fStepX
);
1202 if (fSetHPagesNumber
.getSelection()) {
1203 row
= Math
.round(cw
/ fStepX
);
1204 } else if ((cw
% fStepX
!= 0)) {
1214 * Returns the number of lines.
1216 * @return number of lines
1218 public int getNbLines() {
1219 if (!fSetVPagesNumber
.isDisposed()) {
1220 int ch
= (int) (fOverviewCanvas
.getContentsHeight() / fOverviewCanvas
.getZoomValue());
1223 line
= (int) (ch
/ fStepY
);
1224 if (fSetVPagesNumber
.getSelection()) {
1225 line
= Math
.round(ch
/ fStepY
);
1226 } else if (ch
% fStepY
!= 0) {
1236 * Returns whether to print all pages or not.
1238 * @return <code>true</code> for all pages else <code>false</code>.
1240 public boolean printAll() {
1245 * Returns whether to print only current page
1247 * @return <code>true</code> for current page only else <code>false</code>..
1249 public boolean printCurrent() {
1250 return fPrintCurrent
;
1254 * Returns whether to print selected pages.
1256 * @return <code>true</code> for selected pages only else <code>false</code>
1259 public boolean printSelection() {
1260 return fPrintSelection
;
1264 * Returns whether to print range of pages.
1266 * @return <code>true</code> for range of pages only else <code>false</code>
1269 public boolean printRange() {
1274 * Returns the step in X direction.
1276 * @return step in X direction
1278 public float getStepX() {
1283 * Returns the step in Y direction.
1285 * @return step in Y direction
1287 public float getStepY() {
1292 * Returns the zoom factor
1294 * @return zoom factor
1296 public float getZoomFactor() {
1301 * Returns the printer data reference.
1303 * @return printer data reference
1305 public PrinterData
getPrinterData() {
1306 return fPrinterData
;
1310 * Returns the page number to start printing from.
1312 * @return page number to start printing from
1314 public int getFrom() {
1319 * Returns the page number to print to.
1321 * @return page number to print to
1323 public int getTo() {
1328 * Displays current number of pages
1330 protected void displayPageNum() {
1332 String message
= MessageFormat
.format(Messages
.SequenceDiagram_Page
, new Object
[] { Integer
.valueOf(fPageNum
) });
1333 fCurrentSelection
.setText(message
);
1334 fCurrentSelection
.getParent().layout();
1339 * Returns the shell reference.
1341 * @return the shell reference.
1343 public Shell
getShell() {
1351 * The shell reference.
1353 public void setShell(Shell shell
) {
1358 * Handle selection of print button.
1360 public void printButtonSelected() {
1361 PrintDialog printer
= new PrintDialog(getShell());
1362 if (fAllPages
.getSelection()) {
1363 printer
.setScope(PrinterData
.ALL_PAGES
);
1365 if (fCurrentPage
.getSelection()) {
1366 printer
.setScope(PrinterData
.SELECTION
);
1368 if (fPageList
.getSelection()) {
1369 printer
.setScope(PrinterData
.SELECTION
);
1371 if (fPageRange
.getSelection()) {
1372 printer
.setScope(PrinterData
.PAGE_RANGE
);
1373 fFrom
= Integer
.valueOf(fFromPage
.getText()).intValue();
1374 fTo
= Integer
.valueOf(fToPage
.getText()).intValue();
1375 printer
.setStartPage(fFrom
);
1376 printer
.setEndPage(fTo
);
1379 PrinterData newPrinterData
= printer
.open();
1380 if (newPrinterData
!= null) {
1381 fPrinterData
= newPrinterData
;
1383 updatePrinterStatus();
1385 if (printer
.getScope() == PrinterData
.ALL_PAGES
) {
1386 fAllPages
.setSelection(true);
1387 fCurrentPage
.setSelection(false);
1388 fPageList
.setSelection(false);
1389 fPageRange
.setSelection(false);
1390 fHorPagesNum
.setEnabled(false);
1391 fVertPagesNum
.setEnabled(false);
1393 if (printer
.getScope() == PrinterData
.PAGE_RANGE
) {
1394 fAllPages
.setSelection(false);
1395 fCurrentPage
.setSelection(false);
1396 fPageList
.setSelection(false);
1397 fPageRange
.setSelection(true);
1398 fFromPage
.setEnabled(true);
1399 fToPage
.setEnabled(true);
1400 fFromPage
.setText((Integer
.valueOf(printer
.getStartPage())).toString());
1401 fToPage
.setText((Integer
.valueOf(printer
.getEndPage())).toString());
1404 fOverviewCanvas
.redraw();
1408 * Sets parent wizard page
1411 * The parent wizard page
1413 public void setParentWizardPage(WizardPage parent
) {
1414 fParentWizardPage
= parent
;
1418 * Sets the parent dialog box.
1421 * The parent dialog box.
1423 public void setParentDialog(SDPrintDialog parent
) {
1424 fParentDialog
= parent
;
1428 * Updates the printer status
1430 protected void updatePrinterStatus() {
1431 if (fParentWizardPage
!= null) {
1432 // used in the wizard dialog
1433 if (fPrinterData
== null) {
1434 // show error message and disable Finish button
1435 fParentWizardPage
.setErrorMessage(Messages
.SequenceDiagram_NoPrinterSelected
);
1436 fParentWizardPage
.setPageComplete(false);
1438 // clear error message and enable Finish button
1439 fParentWizardPage
.setErrorMessage(null);
1440 fParentWizardPage
.setPageComplete(true);
1442 } else if (fParentDialog
!= null) {
1443 // used in the print dialog
1444 if (fPrinterData
== null) {
1445 // show error message and disable OK button
1446 fParentDialog
.setErrorMessage(Messages
.SequenceDiagram_NoPrinterSelected
);
1447 fParentDialog
.setPageComplete(false);
1449 // clear error message and enable OK button
1450 fParentDialog
.setErrorMessage(null);
1451 fParentDialog
.setPageComplete(true);