1 /**********************************************************************
2 * Copyright (c) 2005, 2013 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 **********************************************************************/
13 package org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.dialogs
;
15 import java
.text
.MessageFormat
;
16 import java
.util
.Arrays
;
18 import org
.eclipse
.jface
.dialogs
.MessageDialog
;
19 import org
.eclipse
.jface
.wizard
.WizardPage
;
20 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.DiagramToolTip
;
21 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.NGC
;
22 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.SDWidget
;
23 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.uml2sd
.util
.Messages
;
24 import org
.eclipse
.swt
.SWT
;
25 import org
.eclipse
.swt
.events
.FocusEvent
;
26 import org
.eclipse
.swt
.events
.FocusListener
;
27 import org
.eclipse
.swt
.events
.KeyEvent
;
28 import org
.eclipse
.swt
.events
.ModifyEvent
;
29 import org
.eclipse
.swt
.events
.ModifyListener
;
30 import org
.eclipse
.swt
.events
.MouseEvent
;
31 import org
.eclipse
.swt
.events
.MouseTrackListener
;
32 import org
.eclipse
.swt
.events
.SelectionEvent
;
33 import org
.eclipse
.swt
.events
.SelectionListener
;
34 import org
.eclipse
.swt
.events
.TraverseEvent
;
35 import org
.eclipse
.swt
.events
.TraverseListener
;
36 import org
.eclipse
.swt
.graphics
.GC
;
37 import org
.eclipse
.swt
.graphics
.Image
;
38 import org
.eclipse
.swt
.graphics
.ImageData
;
39 import org
.eclipse
.swt
.graphics
.RGB
;
40 import org
.eclipse
.swt
.graphics
.Rectangle
;
41 import org
.eclipse
.swt
.layout
.GridData
;
42 import org
.eclipse
.swt
.layout
.GridLayout
;
43 import org
.eclipse
.swt
.printing
.PrintDialog
;
44 import org
.eclipse
.swt
.printing
.Printer
;
45 import org
.eclipse
.swt
.printing
.PrinterData
;
46 import org
.eclipse
.swt
.widgets
.Button
;
47 import org
.eclipse
.swt
.widgets
.Composite
;
48 import org
.eclipse
.swt
.widgets
.Control
;
49 import org
.eclipse
.swt
.widgets
.Display
;
50 import org
.eclipse
.swt
.widgets
.Group
;
51 import org
.eclipse
.swt
.widgets
.Label
;
52 import org
.eclipse
.swt
.widgets
.Shell
;
53 import org
.eclipse
.swt
.widgets
.Text
;
56 * The class implements the actual print dialog UI for collecting printing data.
61 public class SDPrintDialogUI
{
62 // ------------------------------------------------------------------------
64 // ------------------------------------------------------------------------
66 * The set horizontal pages number.
68 private Button fSetHPagesNumber
;
70 * The set vertical pages number.
72 private Button fSetVPagesNumber
;
74 * Flag whether to use current zoom or not.
76 private Button fUseCurrentZoom
;
78 * Flag whether to print all pages or not
80 private Button fAllPages
;
82 * Flag whether to print current page only
84 private Button fCurrentPage
;
86 * Button to select a page list.
88 private Button fPageList
;
90 * Button to select a page range.
92 private Button fPageRange
;
94 * Text field to enter from page.
96 private Text fFromPage
;
98 * Text field to enter to page.
100 private Text fToPage
;
102 * The sequence diagram widget reference.
104 private SDWidget fSdView
;
106 * Text field for number of horizontal pages
108 private Text fHorPagesNum
;
110 * Text field for number of vertical pages
112 private Text fVertPagesNum
;
114 * Text field for toal number of pages
116 private Text fTotalPages
;
118 * A modify listener implementation to handle modifications.
120 private ModifyListener fModifyListener
;
122 * A selection listener implementation to handle selections.
124 private SelectionListener fSelectionListener
;
126 * Local canvas displaying sequence diagram overview.
128 private LocalSD fOverviewCanvas
;
132 private int fNbPages
= 0;
134 * Number of selected pages.
136 private int fPageNum
= -1;
138 * Number of first page.
140 private int fFirstPage
= -1;
142 * List of pages to print.
144 private int fPagesList
[];
147 * Value for dividing the sequence diagram into pages
149 private float fStepX
;
152 * Value for dividing the sequence diagram into pages
154 private float fStepY
;
157 * Value for dividing the sequence diagram into pages
162 * Value for dividing the sequence diagram into pages
167 * Page which to print from.
171 * Page which to print to.
175 * Flag for enabling multi-selection.
177 private boolean fMultiSelection
= false;
179 * Flag for enabling area selection.
181 private boolean fAreaSelection
= false;
183 * Flag for printing all.
185 private boolean fPrintAll
;
187 * Flag for printing current page only.
189 private boolean fPrintCurrent
;
191 * Flag for printing a selection of pages.
193 private boolean fPrintSelection
;
195 * Flag for printing a range of pages.
197 private boolean fPrintRange
;
199 * Number of selected rows
203 * Number of selected lines
205 private int fNbLines
;
209 private float fZoomFactor
;
211 * The printer data reference.
213 private PrinterData fPrinterData
;
215 * The diagram tooltip to show if necessary.
217 private DiagramToolTip fToolTip
= null;
219 * Label for current selection.
221 private Label fCurrentSelection
;
223 * The shell reference.
225 private Shell fShell
;
227 * Button to open printer dialog from OS.
229 private Button fPrinterDialog
;
231 * Flag for showing print button.
233 private boolean fShowPrintButton
;
237 private int fTest
= 3;
239 * Parent wizard page if used as wizard
241 private WizardPage fParentWizardPage
= null;
243 * Reference to parent print dialog.
245 private SDPrintDialog fParentDialog
= null;
247 // ------------------------------------------------------------------------
249 // ------------------------------------------------------------------------
251 * Local sequence diagram widget used to display overview of sequence diagram to print.
254 private class LocalSD
extends SDWidget
{
258 * @param c Parent composite
259 * @param s Style bits
261 public LocalSD(Composite c
, int s
) {
266 public int getContentsHeight() {
267 if (fSdView
.getContentsHeight() > fSdView
.getContentsHeight()) {
268 return (int) (fSdView
.getVisibleHeight() / (float) fTest
/ fSdView
.getZoomValue());
270 return super.getContentsHeight();
274 public int getContentsWidth() {
275 if (fSdView
.getVisibleWidth() > fSdView
.getContentsWidth()) {
276 return (int) (fSdView
.getVisibleWidth() / (float) fTest
/ fSdView
.getZoomValue());
278 return super.getContentsWidth();
282 protected void contentsMouseHover(MouseEvent event
) {
286 * Creates page selection images.
288 * @param img - Overview image
289 * @param width -The width value
290 * @param stepX - Step X
291 * @param height - Height value
292 * @param stepY - Step Y
295 protected Image
createPagesSelectionImages(Image img
, int width
, float stepX
, int height
, float stepY
) {
297 Image over
= new Image(super.getShell().getDisplay(), img
.getImageData());
299 for (int pageIndex
= 0; pageIndex
< fPagesList
.length
; pageIndex
++) {
301 int pageNum
= fPagesList
[pageIndex
];
303 if (getPagesForSelection() > 0 && pageNum
> 0) {
304 int line
= pageNum
/ getNbRow();
305 int row
= pageNum
% getNbRow();
316 if (fOverviewCanvas
.isFocusControl()) {
317 over
= new Image(super.getShell().getDisplay(), drawRegionSelected(toDel
, new Rectangle(contentsToViewX((int) (row
* stepX
* fOverviewCanvas
.getZoomValue())), contentsToViewY((int) (line
* stepY
* fOverviewCanvas
.getZoomValue())),
318 ((int) (stepX
* fOverviewCanvas
.getZoomValue())), ((int) (stepY
* fOverviewCanvas
.getZoomValue()))), new RGB(0, 0, 128)));
320 over
= new Image(super.getShell().getDisplay(), drawRegionSelected(toDel
, new Rectangle(contentsToViewX((int) (row
* stepX
* fOverviewCanvas
.getZoomValue())), contentsToViewY((int) (line
* stepY
* fOverviewCanvas
.getZoomValue())),
321 ((int) (stepX
* fOverviewCanvas
.getZoomValue())), ((int) (stepY
* fOverviewCanvas
.getZoomValue()))), new RGB(221, 208, 200)));
327 Arrays
.sort(fPagesList
);
328 int pos
= Arrays
.binarySearch(fPagesList
, fPageNum
);
329 if ((pos
< 0) && (getPagesForSelection() > 0 && fPageNum
> 0)) {
330 int line
= fPageNum
/ getNbRow();
331 int row
= fPageNum
% getNbRow();
342 over
= new Image(super.getShell().getDisplay(), drawRegionSelected(toDel
, new Rectangle(contentsToViewX((int) (row
* stepX
* fOverviewCanvas
.getZoomValue())), contentsToViewY((int) (line
* stepY
* fOverviewCanvas
.getZoomValue())),
343 ((int) (stepX
* fOverviewCanvas
.getZoomValue())), ((int) (stepY
* fOverviewCanvas
.getZoomValue()))), new RGB(221, 208, 200)));
347 GC imGC2
= new GC(over
);
348 imGC2
.setBackground(Display
.getDefault().getSystemColor(SWT
.COLOR_BLACK
));
349 NGC imGC
= new NGC(fOverviewCanvas
, imGC2
);
350 for (int i
= 0, x
= 0; x
<= width
&& stepX
> 0; i
++, x
= (int) (i
* stepX
)) {
351 imGC
.drawLine(x
, 0, x
, height
);
354 for (int j
= 0, y
= 0; y
<= height
&& stepY
> 0; j
++, y
= (int) (j
* stepY
)) {
355 imGC
.drawLine(0, y
, width
, y
);
364 protected void drawContents(GC gc
, int clipx
, int clipy
, int clipw
, int cliph
) {
366 Image dbuffer
= getDrawBuffer();
370 int lw
= (int) (getContentsWidth() / getZoomValue());
371 if (getContentsWidth() < getVisibleWidth()) {
372 lw
= (int) (getVisibleWidth() / getZoomValue());
375 int lh
= (int) (getContentsHeight() / getZoomValue());
376 if (getContentsHeight() < getVisibleHeight()) {
377 lh
= (int) (getVisibleHeight() / getZoomValue());
379 d
= createPagesSelectionImages(dbuffer
, lw
, fStepX
, lh
, fStepY
);
383 d
= new Image(super.getShell().getDisplay(), drawRegionSelected(d
, new Rectangle(0, 0, lw
, lh
), new RGB(221, 208, 200)));
387 Rectangle area
= getClientArea();
388 int w
= d
.getBounds().width
;
389 int h
= d
.getBounds().height
;
390 gc
.drawImage(d
, 0, 0, w
, h
, 0, 0, area
.width
, area
.height
);
392 fTotalPages
.setText(Integer
.valueOf(maxNumOfPages()).toString());
400 protected void keyPressedEvent(KeyEvent e
) {
401 if (e
.keyCode
== SWT
.CTRL
) {
402 fMultiSelection
= true;
404 if (e
.keyCode
== SWT
.SHIFT
) {
405 fAreaSelection
= true;
407 if (e
.keyCode
== SWT
.ARROW_DOWN
) {
408 if (fPageNum
+ getNbRow() <= maxNumOfPages()) {
409 fPageNum
+= getNbRow();
411 int line
= fPageNum
/ getNbRow();
412 int row
= fPageNum
% getNbRow();
416 if ((line
+ 1) * fStepY
> (fOverviewCanvas
.getContentsY() + fOverviewCanvas
.getVisibleHeight()) / fOverviewCanvas
.getZoomValue()) {
417 fOverviewCanvas
.scrollBy(0, (int) (fStepY
* fOverviewCanvas
.getZoomValue()));
420 if (e
.keyCode
== SWT
.ARROW_UP
) {
421 if (fPageNum
- getNbRow() > 0) {
422 fPageNum
-= getNbRow();
424 int line
= fPageNum
/ getNbRow();
425 int row
= fPageNum
% getNbRow();
429 if ((line
) * fStepY
<= fOverviewCanvas
.getContentsY() / fOverviewCanvas
.getZoomValue()) {
430 fOverviewCanvas
.scrollBy(0, -(int) (fStepY
* fOverviewCanvas
.getZoomValue()));
433 if (e
.keyCode
== SWT
.ARROW_LEFT
) {
434 if ((fPageNum
- 2) / getNbRow() == (fPageNum
- 1) / getNbRow() && fPageNum
> 1) {
437 int row
= fPageNum
% getNbRow();
438 if ((row
- 1) * fStepX
< (fOverviewCanvas
.getContentsX()) / fOverviewCanvas
.getZoomValue()) {
439 fOverviewCanvas
.scrollBy(-(int) (fStepX
* fOverviewCanvas
.getZoomValue()), 0);
442 if (e
.keyCode
== SWT
.ARROW_RIGHT
) {
443 if ((fPageNum
- 1) / getNbRow() == fPageNum
/ getNbRow()) {
446 int row
= fPageNum
% getNbRow();
450 if ((row
) * fStepX
> (fOverviewCanvas
.getContentsX() + fOverviewCanvas
.getVisibleWidth()) / fOverviewCanvas
.getZoomValue()) {
451 fOverviewCanvas
.scrollBy((int) (fStepX
* fOverviewCanvas
.getZoomValue()), 0);
455 if (e
.keyCode
== 32 && fPageNum
> -1) {
456 Arrays
.sort(fPagesList
);
457 int pos
= Arrays
.binarySearch(fPagesList
, fPageNum
);
459 addToPagesList(fPageNum
);
461 removeFromPagesList(fPageNum
);
465 if (!fAreaSelection
&& !fMultiSelection
) {
466 fFirstPage
= fPageNum
;
467 fPagesList
= new int[1];
468 fPagesList
[0] = fPageNum
;
469 } else if ((fPageNum
!= -1) && (fAreaSelection
) && (fFirstPage
!= -1)) {
470 fPagesList
= new int[0];
471 int line1
= fFirstPage
/ getNbRow();
472 int row1
= fFirstPage
% getNbRow();
479 int line2
= fPageNum
/ getNbRow();
480 int row2
= fPageNum
% getNbRow();
500 for (int i
= row1
- 1; i
< row2
; i
++) {
501 for (int j
= line1
- 1; j
< line2
; j
++) {
502 addToPagesList(i
+ j
* getNbRow() + 1);
507 fOverviewCanvas
.redraw();
511 protected void keyReleasedEvent(KeyEvent e
) {
512 if (e
.keyCode
== SWT
.CTRL
) {
513 fMultiSelection
= false;
515 if (e
.keyCode
== SWT
.SHIFT
) {
516 fAreaSelection
= false;
521 protected void contentsMouseDownEvent(MouseEvent event
) {
524 int x1
= (int) ((event
.x
/ fOverviewCanvas
.getZoomValue()) / fStepX
);
525 int x2
= (int) ((event
.y
/ fOverviewCanvas
.getZoomValue()) / fStepY
);
527 int oldPage
= fPageNum
;
529 fPageNum
= x1
+ x2
* getNbRow() + 1;
531 if (fPageNum
> maxNumOfPages()) {
536 if (!fAreaSelection
) {
537 fFirstPage
= fPageNum
;
540 if ((fPageNum
!= -1) && (fMultiSelection
)) {
541 Arrays
.sort(fPagesList
);
542 int pos
= Arrays
.binarySearch(fPagesList
, fPageNum
);
544 addToPagesList(fPageNum
);
546 removeFromPagesList(fPageNum
);
548 } else if ((fPageNum
!= -1) && (fAreaSelection
) && (fFirstPage
!= -1)) {
550 fPagesList
= new int[0];
552 int line1
= fFirstPage
/ getNbRow();
553 int row1
= fFirstPage
% getNbRow();
560 int line2
= fPageNum
/ getNbRow();
561 int row2
= fPageNum
% getNbRow();
581 for (int i
= row1
- 1; i
< row2
; i
++) {
582 for (int j
= line1
- 1; j
< line2
; j
++) {
583 addToPagesList(i
+ j
* getNbRow() + 1);
587 fPagesList
= new int[1];
588 fPagesList
[0] = fPageNum
;
590 if ((event
.stateMask
& SWT
.CTRL
) != 0) {
591 fMultiSelection
= true;
598 protected void contentsMouseMoveEvent(MouseEvent e
) {
599 fToolTip
.hideToolTip();
603 public void resizeContents(int w
, int h
) {
604 super.resizeContents(w
, h
);
610 * A traverse listener implementation.
612 protected static class LocalTraverseListener
implements TraverseListener
{
614 public void keyTraversed(TraverseEvent e
) {
615 if ((e
.detail
== SWT
.TRAVERSE_TAB_NEXT
) || (e
.detail
== SWT
.TRAVERSE_TAB_PREVIOUS
)) {
621 // ------------------------------------------------------------------------
623 // ------------------------------------------------------------------------
628 * The shell reference
630 * The sequence diagram widget reference
632 public SDPrintDialogUI(Shell shell
, SDWidget sdWidget
) {
633 this(shell
, sdWidget
, false);
640 * The shell reference
642 * The sequence diagram widget reference
643 * @param showPrintBtn
644 * Flag for showing print buttons
646 public SDPrintDialogUI(Shell shell
, SDWidget sdWidget
, boolean showPrintBtn
) {
649 fShowPrintButton
= showPrintBtn
;
651 fPrinterData
= Printer
.getDefaultPrinterData();
652 if (fPrinterData
!= null) {
653 fPrinterData
.scope
= PrinterData
.SELECTION
;
656 fPagesList
= new int[0];
658 fSelectionListener
= new SelectionListener() {
661 public void widgetSelected(SelectionEvent e
) {
662 if (fUseCurrentZoom
.getSelection()) {
663 fHorPagesNum
.setEnabled(false);
664 fVertPagesNum
.setEnabled(false);
666 if (fSetHPagesNumber
.getSelection()) {
667 fHorPagesNum
.setEnabled(true);
668 fVertPagesNum
.setEnabled(false);
669 if (fCurrentPage
.getSelection()) {
670 fCurrentPage
.setSelection(false);
671 fAllPages
.setSelection(true);
673 if ("".equals(fHorPagesNum
.getText())) { //$NON-NLS-1$
674 fHorPagesNum
.setText("1"); //$NON-NLS-1$
677 if (fSetVPagesNumber
.getSelection()) {
678 fHorPagesNum
.setEnabled(false);
679 fVertPagesNum
.setEnabled(true);
680 if (fCurrentPage
.getSelection()) {
681 fCurrentPage
.setSelection(false);
682 fAllPages
.setSelection(true);
684 if ("".equals(fVertPagesNum
.getText())) { //$NON-NLS-1$
685 fVertPagesNum
.setText("1"); //$NON-NLS-1$
688 if (fCurrentPage
.getSelection() || fAllPages
.getSelection() || fPageList
.getSelection()) {
689 fFromPage
.setEnabled(false);
690 fToPage
.setEnabled(false);
692 fFromPage
.setEnabled(true);
693 fToPage
.setEnabled(true);
696 fCurrentPage
.setEnabled(fUseCurrentZoom
.getSelection());
697 fOverviewCanvas
.setEnabled(fPageList
.getSelection());
698 if (fOverviewCanvas
.isEnabled() && (e
.widget
== fUseCurrentZoom
|| e
.widget
== fSetHPagesNumber
|| e
.widget
== fSetVPagesNumber
)) {
699 fPagesList
= new int[1];
703 } else if ((fOverviewCanvas
.isEnabled() && (e
.widget
== fPageList
)) &&
704 (fPagesList
== null || fPagesList
.length
<= 0)) {
706 fPagesList
= new int[1];
712 fTotalPages
.setText(Integer
.valueOf(maxNumOfPages()).toString());
713 fOverviewCanvas
.redraw();
714 fOverviewCanvas
.update();
718 public void widgetDefaultSelected(SelectionEvent e
) {
719 fPagesList
= new int[0];
721 fOverviewCanvas
.redraw();
726 fModifyListener
= new ModifyListener() {
728 public void modifyText(ModifyEvent e
) {
729 fPagesList
= new int[0];
731 fTotalPages
.setText(Integer
.valueOf(maxNumOfPages()).toString());
732 fOverviewCanvas
.redraw();
738 // ------------------------------------------------------------------------
740 // ------------------------------------------------------------------------
743 * Creates new grid data object.
745 * @param span horizontal span.
748 protected GridData
newGridData(int span
) {
749 GridData data
= new GridData(GridData
.GRAB_VERTICAL
| GridData
.VERTICAL_ALIGN_FILL
| GridData
.GRAB_HORIZONTAL
| GridData
.HORIZONTAL_ALIGN_FILL
);
750 data
.horizontalSpan
= span
;
755 * Creates the dialog area.
757 * @param parent The parent composite
758 * @return dialog control
760 public Control
createDialogArea(Composite parent
) {
762 GridLayout parentLayout
= new GridLayout();
763 parentLayout
.numColumns
= 6;
764 parent
.setLayout(parentLayout
);
766 Group g1
= new Group(parent
, SWT
.SHADOW_NONE
);
767 g1
.setText(Messages
.SequenceDiagram_ZoomOption
);
768 g1
.setLayoutData(newGridData(3));
769 GridLayout g1layout
= new GridLayout();
770 g1layout
.numColumns
= 2;
771 g1
.setLayout(g1layout
);
773 fUseCurrentZoom
= new Button(g1
, SWT
.RADIO
);
774 fUseCurrentZoom
.setText(Messages
.SequenceDiagram_UseCurrentZoom
);
775 fUseCurrentZoom
.setLayoutData(newGridData(2));
776 fUseCurrentZoom
.addSelectionListener(fSelectionListener
);
778 fSetHPagesNumber
= new Button(g1
, SWT
.RADIO
);
779 fSetHPagesNumber
.setText(Messages
.SequenceDiagram_NumberOfHorizontalPages
);
780 fSetHPagesNumber
.setLayoutData(newGridData(1));
781 fSetHPagesNumber
.addSelectionListener(fSelectionListener
);
783 fHorPagesNum
= new Text(g1
, SWT
.SINGLE
| SWT
.BORDER
);
784 fHorPagesNum
.addModifyListener(fModifyListener
);
786 fSetVPagesNumber
= new Button(g1
, SWT
.RADIO
);
787 fSetVPagesNumber
.setText(Messages
.SequenceDiagram_NumberOfVerticalPages
);
788 fSetVPagesNumber
.setLayoutData(newGridData(1));
789 fSetVPagesNumber
.addSelectionListener(fSelectionListener
);
791 fVertPagesNum
= new Text(g1
, SWT
.SINGLE
| SWT
.BORDER
);
792 fVertPagesNum
.addModifyListener(fModifyListener
);
794 Label nbTotal
= new Label(g1
, SWT
.SHADOW_NONE
| SWT
.RIGHT
);
795 nbTotal
.setText(Messages
.TotalNumberOfPages
);
796 // nbTotal.setLayoutData(newGridData(1));
798 fTotalPages
= new Text(g1
, SWT
.SINGLE
| SWT
.BORDER
| SWT
.READ_ONLY
);
799 // nbHV.addModifyListener(modifListener);
801 Group g2
= new Group(parent
, SWT
.SHADOW_NONE
);
802 g2
.setText(Messages
.SequenceDiagram_Preview
);
803 GridData data
= new GridData(GridData
.GRAB_VERTICAL
| GridData
.VERTICAL_ALIGN_FILL
| GridData
.GRAB_HORIZONTAL
| GridData
.HORIZONTAL_ALIGN_FILL
);
804 data
.horizontalSpan
= 3;
805 data
.verticalSpan
= 2;
806 g2
.setLayoutData(data
);
807 GridLayout g2layout
= new GridLayout();
809 g2layout
.numColumns
= 1;
810 // SVLayout g2layout = new SVLayout();
811 g2
.setLayout(g2layout
);
813 GridData data2
= new GridData(GridData
.GRAB_VERTICAL
| GridData
.VERTICAL_ALIGN_FILL
| GridData
.GRAB_HORIZONTAL
| GridData
.HORIZONTAL_ALIGN_FILL
);
814 data2
.horizontalSpan
= 1;
815 data2
.verticalSpan
= 1;
817 fOverviewCanvas
= new LocalSD(g2
, SWT
.NO_BACKGROUND
);
818 GridData seqDiagLayoutData
= new GridData(GridData
.HORIZONTAL_ALIGN_FILL
| GridData
.VERTICAL_ALIGN_FILL
);
819 fOverviewCanvas
.setLayoutData(seqDiagLayoutData
);
820 // overviewCanvas.resizeContents(100,100);
821 if (fSdView
.getContentsWidth() < fSdView
.getVisibleWidth() && fSdView
.getContentsHeight() < fSdView
.getVisibleHeight()) {
826 fOverviewCanvas
.setFrame(fSdView
.getFrame(), true);
827 fOverviewCanvas
.setZoomValue((float) 1 / fTest
);
828 fOverviewCanvas
.setCornerControl(null);
829 seqDiagLayoutData
.widthHint
= fOverviewCanvas
.getContentsWidth() / fTest
;
830 seqDiagLayoutData
.widthHint
= fOverviewCanvas
.getFrame().getWidth() / fTest
+ 15;
832 if (fSdView
.getVisibleWidth() < fSdView
.getContentsWidth()) {
833 seqDiagLayoutData
.widthHint
= fOverviewCanvas
.getContentsWidth() / fTest
;
834 if (seqDiagLayoutData
.widthHint
> Display
.getDefault().getClientArea().width
/ 4) {
835 seqDiagLayoutData
.widthHint
= Display
.getDefault().getClientArea().width
/ 4;
838 seqDiagLayoutData
.widthHint
= fOverviewCanvas
.getFrame().getWidth() / fTest
+ 15;
841 if (fSdView
.getVisibleHeight() < fSdView
.getContentsHeight()) {
842 seqDiagLayoutData
.heightHint
= fOverviewCanvas
.getContentsHeight() / fTest
;
843 if (seqDiagLayoutData
.heightHint
> Display
.getDefault().getClientArea().width
/ 4) {
844 seqDiagLayoutData
.heightHint
= Display
.getDefault().getClientArea().width
/ 4;
847 seqDiagLayoutData
.heightHint
= fOverviewCanvas
.getFrame().getHeight() / fTest
;
850 fOverviewCanvas
.setEnabled(false);
852 fCurrentSelection
= new Label(g2
, SWT
.SHADOW_NONE
| SWT
.LEFT
);
853 fCurrentSelection
.setLayoutData(newGridData(1));
855 Group g3
= new Group(parent
, SWT
.SHADOW_NONE
);
856 g3
.setText(Messages
.SequenceDiagram_PrintRange
);
857 g3
.setLayoutData(newGridData(3));
858 GridLayout g3layout
= new GridLayout();
859 g3layout
.numColumns
= 4;
860 g3
.setLayout(g3layout
);
862 fAllPages
= new Button(g3
, SWT
.RADIO
);
863 fAllPages
.setText(Messages
.SequenceDiagram_AllPages
);
864 fAllPages
.setLayoutData(newGridData(4));
865 fAllPages
.addSelectionListener(fSelectionListener
);
867 fCurrentPage
= new Button(g3
, SWT
.RADIO
);
868 fCurrentPage
.setText(Messages
.SequenceDiagram_CurrentView
);
869 fCurrentPage
.setLayoutData(newGridData(4));
870 fCurrentPage
.setEnabled(true);
871 fCurrentPage
.setSelection(true);
872 fCurrentPage
.addSelectionListener(fSelectionListener
);
874 fPageList
= new Button(g3
, SWT
.RADIO
);
875 fPageList
.setText(Messages
.SequenceDiagram_SelectedPages
);
876 fPageList
.setLayoutData(newGridData(4));
877 fPageList
.addSelectionListener(fSelectionListener
);
879 fPageRange
= new Button(g3
, SWT
.RADIO
);
880 fPageRange
.setText(Messages
.SequenceDiagram_FromPage
);
881 fPageRange
.setLayoutData(newGridData(1));
882 fPageRange
.addSelectionListener(fSelectionListener
);
884 fFromPage
= new Text(g3
, SWT
.SINGLE
| SWT
.BORDER
);
886 Label labelTo
= new Label(g3
, SWT
.CENTER
);
887 labelTo
.setText(Messages
.SequenceDiagram_to
);
889 fToPage
= new Text(g3
, SWT
.SINGLE
| SWT
.BORDER
);
891 fToolTip
= new DiagramToolTip(fOverviewCanvas
);
893 fOverviewCanvas
.getViewControl().addMouseTrackListener(new MouseTrackListener() {
895 public void mouseEnter(MouseEvent e
) {
896 fToolTip
.hideToolTip();
900 public void mouseExit(MouseEvent e
) {
901 fToolTip
.hideToolTip();
905 public void mouseHover(MouseEvent e
) {
906 int x1
= (int) (fOverviewCanvas
.viewToContentsX(e
.x
) / fOverviewCanvas
.getZoomValue() / fStepX
);
907 int x2
= (int) (fOverviewCanvas
.viewToContentsY(e
.y
) / fOverviewCanvas
.getZoomValue() / fStepY
);
908 int num
= x1
+ x2
* getNbRow() + 1;
909 if (num
> maxNumOfPages()) {
913 fToolTip
.showToolTip(String
.valueOf(num
));
916 fCurrentSelection
.setText("");//$NON-NLS-1$
917 fToolTip
.hideToolTip();
923 fOverviewCanvas
.addTraverseListener(new LocalTraverseListener());
925 fOverviewCanvas
.addFocusListener(new FocusListener() {
927 public void focusGained(FocusEvent e
) {
928 fOverviewCanvas
.redraw();
932 public void focusLost(FocusEvent e
) {
933 fOverviewCanvas
.redraw();
937 if (fShowPrintButton
) {
938 Composite printerDlg
= new Composite(parent
, SWT
.NONE
);
939 data
= new GridData(SWT
.FILL
, SWT
.DEFAULT
, true, false);
940 data
.horizontalSpan
= 6;
941 parentLayout
= new GridLayout();
942 parentLayout
.numColumns
= 2;
943 printerDlg
.setLayout(parentLayout
);
944 printerDlg
.setLayoutData(data
);
946 Label label
= new Label(printerDlg
, SWT
.NONE
);
947 label
.setLayoutData(new GridData(SWT
.FILL
, SWT
.DEFAULT
, true, false));
948 fPrinterDialog
= new Button(printerDlg
, SWT
.PUSH
);
949 fPrinterDialog
.setText(Messages
.SequenceDiagram_Printer
);
951 fPrinterDialog
.addSelectionListener(new SelectionListener() {
953 public void widgetSelected(SelectionEvent e
) {
954 printButtonSelected();
958 public void widgetDefaultSelected(SelectionEvent e
) {
964 updatePrinterStatus();
970 * Get number of pages for selection.
971 * @return number of pages for selection.
973 public int getPagesForSelection() {
978 * Handler for when the OK button is pressed
980 * @return True if the operation was successful, false if there was an error
982 public boolean okPressed() {
983 fPrintAll
= fAllPages
.getSelection();
984 fPrintCurrent
= fCurrentPage
.getSelection();
985 fPrintSelection
= fPageList
.getSelection();
986 fPrintRange
= fPageRange
.getSelection();
989 fFrom
= Integer
.valueOf(fFromPage
.getText()).intValue();
990 fTo
= Integer
.valueOf(fToPage
.getText()).intValue();
991 if (fFrom
> maxNumOfPages() || fTo
> maxNumOfPages() || fFrom
<= 0 || fTo
<= 0) {
992 MessageDialog
.openError(getShell(), Messages
.SequenceDiagram_Error
, Messages
.SequenceDiagram_InvalidRange
);
995 } else if (fSetHPagesNumber
.getSelection() && fNbPages
<= 0) {
996 MessageDialog
.openError(getShell(), Messages
.SequenceDiagram_Error
, Messages
.SequenceDiagram_InvalidNbHorizontal
);
998 } else if (fSetVPagesNumber
.getSelection() && fNbPages
<= 0) {
999 MessageDialog
.openError(getShell(), Messages
.SequenceDiagram_Error
, Messages
.SequenceDiagram_InvalidNbVertical
);
1001 } else if (fPrintSelection
&& getPageList().length
<= 0) {
1002 MessageDialog
.openError(getShell(), Messages
.SequenceDiagram_Error
, Messages
.SequenceDiagram_NoPageSelected
);
1006 } catch (Exception e
) {
1007 MessageDialog
.openError(getShell(), Messages
.SequenceDiagram_Error
, Messages
.SequenceDiagram_InvalidRange
);
1017 * Draws region that was selected
1018 * @param img The corresponding image
1019 * @param r The selected rectangle.
1020 * @param color The color to use for selection
1021 * @return image data reference
1023 public ImageData
drawRegionSelected(Image img
, Rectangle r
, RGB color
) {
1024 ImageData id
= img
.getImageData();
1025 for (int a
= 0; a
< r
.width
&& r
.x
+ a
< id
.width
; a
++) {
1026 for (int b
= 0; b
< r
.height
&& r
.y
+ b
< id
.height
; b
++) {
1027 int index
= id
.getPixel(r
.x
+ a
, r
.y
+ b
);
1028 RGB rgb
= id
.palette
.getRGB(index
);
1029 rgb
= combine(color
, rgb
);
1030 id
.setPixel(r
.x
+ a
, r
.y
+ b
, id
.palette
.getPixel(rgb
));
1037 * Combines two RGB colors.
1038 * @param front The front color
1039 * @param back The back color
1040 * @return new RGB color
1042 public static RGB
combine(RGB front
, RGB back
) {
1046 double af
= (_af
) / 255.0;
1047 double rf
= front
.red
;
1048 double gf
= front
.green
;
1049 double bf
= front
.blue
;
1051 double ab
= (_ab
) / 255.0;
1052 double rb
= back
.red
;
1053 double gb
= back
.green
;
1054 double bb
= back
.blue
;
1056 double k
= (1.0 - af
) * ab
;
1057 int r
= (int) ((af
* rf
+ k
* rb
));
1058 int g
= (int) ((af
* gf
+ k
* gb
));
1059 int b
= (int) ((af
* bf
+ k
* bb
));
1061 return new RGB(r
, g
, b
);
1065 * Computes value for X coordinates step and Y coordinates step.
1067 protected void computeStepXY() {
1068 float cw
= fOverviewCanvas
.getContentsWidth() / fOverviewCanvas
.getZoomValue();
1069 float ch
= fOverviewCanvas
.getContentsHeight() / fOverviewCanvas
.getZoomValue();
1071 if (fPrinterData
== null) {
1077 Printer printer
= new Printer(fPrinterData
);
1078 if (fSetHPagesNumber
.getSelection()) {
1079 fNbPages
= Integer
.valueOf(fHorPagesNum
.getText()).intValue();
1080 float z1
= fSdView
.getContentsWidth() / cw
;
1081 float z2
= printer
.getClientArea().width
/ ((float) fSdView
.getContentsWidth() / fNbPages
);
1083 fStepY
= printer
.getClientArea().height
/ z1
/ z2
;
1084 fStepX
= cw
/ fNbPages
;
1085 } else if (fSetVPagesNumber
.getSelection()) {
1086 fNbPages
= Integer
.valueOf(fVertPagesNum
.getText()).intValue();
1087 float z1
= fSdView
.getContentsHeight() / ch
;
1088 float z2
= printer
.getClientArea().height
/ ((float) fSdView
.getContentsHeight() / fNbPages
);
1089 fStepX
= printer
.getClientArea().width
/ z1
/ z2
;
1090 fStepY
= ch
/ fNbPages
;
1092 float z1
= fSdView
.getContentsWidth() / (cw
);
1093 fStepX
= fSdView
.getVisibleWidth() / z1
;
1094 fNbPages
= Math
.round(cw
/ fStepX
);
1095 if (fNbPages
== 0) {
1098 int pw
= printer
.getClientArea().width
;
1099 int ph
= printer
.getClientArea().height
;
1100 float z2
= pw
/ ((float) fSdView
.getContentsWidth() / fNbPages
);
1101 fStepY
= ph
/ z1
/ z2
;
1104 } catch (NumberFormatException e
) {
1105 fStepX
= fStepY
= fNbPages
= 0;
1108 sTX
= fStepX
* (fSdView
.getContentsWidth() / cw
);
1109 sTY
= fStepY
* (fSdView
.getContentsHeight() / ch
);
1111 if ((fSdView
.getVisibleWidth() > fSdView
.getContentsWidth()) && (fSetVPagesNumber
.getSelection() || fSetHPagesNumber
.getSelection())) {
1112 rat
= (float) fSdView
.getVisibleWidth() / (float) fSdView
.getContentsWidth();
1114 fZoomFactor
= (fOverviewCanvas
.getContentsWidth() / cw
) / fOverviewCanvas
.getZoomFactor() * rat
;
1118 * Returns the pages list.
1120 * @return the pages list.
1122 public int[] getPageList() {
1123 return Arrays
.copyOf(fPagesList
, fPagesList
.length
);
1127 * Adds a page to pages list.
1130 * The number of the the new page
1132 public void addToPagesList(int num
) {
1133 int temp
[] = new int[fPagesList
.length
+ 1];
1134 System
.arraycopy(fPagesList
, 0, temp
, 0, fPagesList
.length
);
1135 temp
[temp
.length
- 1] = num
;
1136 fPagesList
= new int[temp
.length
];
1137 System
.arraycopy(temp
, 0, fPagesList
, 0, temp
.length
);
1141 * Removes a page from the pages list.
1144 * The number of the page to remove
1146 public void removeFromPagesList(int num
) {
1147 int pos
= Arrays
.binarySearch(fPagesList
, num
);
1148 int temp
[] = new int[fPagesList
.length
- 1];
1149 System
.arraycopy(fPagesList
, 0, temp
, 0, pos
);
1150 System
.arraycopy(fPagesList
, pos
+ 1, temp
, pos
, fPagesList
.length
- pos
- 1);
1151 fPagesList
= new int[temp
.length
];
1152 System
.arraycopy(temp
, 0, fPagesList
, 0, temp
.length
);
1156 * Returns the maximum number of pages.
1158 * @return maximum number of pages.
1160 public int maxNumOfPages() {
1161 return (getNbRow() * getNbLines());
1165 * Returns the number of rows.
1167 * @return number of rows.
1169 public int getNbRow() {
1170 if (!fSetHPagesNumber
.isDisposed()) {
1171 int cw
= (int) (fOverviewCanvas
.getContentsWidth() / fOverviewCanvas
.getZoomValue());
1174 row
= (int) (cw
/ fStepX
);
1175 if (fSetHPagesNumber
.getSelection()) {
1176 row
= Math
.round(cw
/ fStepX
);
1177 } else if ((cw
% fStepX
!= 0)) {
1187 * Returns the number of lines.
1189 * @return number of lines
1191 public int getNbLines() {
1192 if (!fSetVPagesNumber
.isDisposed()) {
1193 int ch
= (int) (fOverviewCanvas
.getContentsHeight() / fOverviewCanvas
.getZoomValue());
1196 line
= (int) (ch
/ fStepY
);
1197 if (fSetVPagesNumber
.getSelection()) {
1198 line
= Math
.round(ch
/ fStepY
);
1199 } else if (ch
% fStepY
!= 0) {
1209 * Returns whether to print all pages or not.
1211 * @return <code>true</code> for all pages else <code>false</code>.
1213 public boolean printAll() {
1218 * Returns whether to print only current page
1220 * @return <code>true</code> for current page only else <code>false</code>..
1222 public boolean printCurrent() {
1223 return fPrintCurrent
;
1227 * Returns whether to print selected pages.
1229 * @return <code>true</code> for selected pages only else <code>false</code>.
1231 public boolean printSelection() {
1232 return fPrintSelection
;
1236 * Returns whether to print range of pages.
1238 * @return <code>true</code> for range of pages only else <code>false</code>.
1240 public boolean printRange() {
1245 * Returns the step in X direction.
1247 * @return step in X direction
1249 public float getStepX() {
1254 * Returns the step in Y direction.
1256 * @return step in Y direction
1258 public float getStepY() {
1263 * Returns the zoom factor
1265 * @return zoom factor
1267 public float getZoomFactor() {
1272 * Returns the printer data reference.
1274 * @return printer data reference
1276 public PrinterData
getPrinterData() {
1277 return fPrinterData
;
1281 * Returns the page number to start printing from.
1283 * @return page number to start printing from
1285 public int getFrom() {
1290 * Returns the page number to print to.
1292 * @return page number to print to
1294 public int getTo() {
1299 * Displays current number of pages
1301 protected void displayPageNum() {
1303 String message
= MessageFormat
.format(Messages
.SequenceDiagram_Page
, new Object
[] { Integer
.valueOf(fPageNum
) });
1304 fCurrentSelection
.setText(message
);
1305 fCurrentSelection
.getParent().layout();
1310 * Returns the shell reference.
1312 * @return the shell reference.
1314 public Shell
getShell() {
1321 * @param shell The shell reference.
1323 public void setShell(Shell shell
) {
1328 * Handle selection of print button.
1330 public void printButtonSelected() {
1331 PrintDialog printer
= new PrintDialog(getShell());
1332 if (fAllPages
.getSelection()) {
1333 printer
.setScope(PrinterData
.ALL_PAGES
);
1335 if (fCurrentPage
.getSelection()) {
1336 printer
.setScope(PrinterData
.SELECTION
);
1338 if (fPageList
.getSelection()) {
1339 printer
.setScope(PrinterData
.SELECTION
);
1341 if (fPageRange
.getSelection()) {
1342 printer
.setScope(PrinterData
.PAGE_RANGE
);
1343 fFrom
= Integer
.valueOf(fFromPage
.getText()).intValue();
1344 fTo
= Integer
.valueOf(fToPage
.getText()).intValue();
1345 printer
.setStartPage(fFrom
);
1346 printer
.setEndPage(fTo
);
1349 PrinterData newPrinterData
= printer
.open();
1350 if (newPrinterData
!= null) {
1351 fPrinterData
= newPrinterData
;
1353 updatePrinterStatus();
1355 if (printer
.getScope() == PrinterData
.ALL_PAGES
) {
1356 fAllPages
.setSelection(true);
1357 fCurrentPage
.setSelection(false);
1358 fPageList
.setSelection(false);
1359 fPageRange
.setSelection(false);
1360 fHorPagesNum
.setEnabled(false);
1361 fVertPagesNum
.setEnabled(false);
1363 if (printer
.getScope() == PrinterData
.PAGE_RANGE
) {
1364 fAllPages
.setSelection(false);
1365 fCurrentPage
.setSelection(false);
1366 fPageList
.setSelection(false);
1367 fPageRange
.setSelection(true);
1368 fFromPage
.setEnabled(true);
1369 fToPage
.setEnabled(true);
1370 fFromPage
.setText((Integer
.valueOf(printer
.getStartPage())).toString());
1371 fToPage
.setText((Integer
.valueOf(printer
.getEndPage())).toString());
1374 fOverviewCanvas
.redraw();
1378 * Sets parent wizard page
1380 * @param parent The parent wizard page
1382 public void setParentWizardPage(WizardPage parent
) {
1383 fParentWizardPage
= parent
;
1387 * Sets the parent dialog box.
1389 * @param parent The parent dialog box.
1391 public void setParentDialog(SDPrintDialog parent
) {
1392 fParentDialog
= parent
;
1396 * Updates the printer status
1398 protected void updatePrinterStatus() {
1399 if (fParentWizardPage
!= null) {
1400 // used in the wizard dialog
1401 if (fPrinterData
== null) {
1402 // show error message and disable Finish button
1403 fParentWizardPage
.setErrorMessage(Messages
.SequenceDiagram_NoPrinterSelected
);
1404 fParentWizardPage
.setPageComplete(false);
1406 // clear error message and enable Finish button
1407 fParentWizardPage
.setErrorMessage(null);
1408 fParentWizardPage
.setPageComplete(true);
1410 } else if (fParentDialog
!= null) {
1411 // used in the print dialog
1412 if (fPrinterData
== null) {
1413 // show error message and disable OK button
1414 fParentDialog
.setErrorMessage(Messages
.SequenceDiagram_NoPrinterSelected
);
1415 fParentDialog
.setPageComplete(false);
1417 // clear error message and enable OK button
1418 fParentDialog
.setErrorMessage(null);
1419 fParentDialog
.setPageComplete(true);