13
13
*******************************************************************************/
14
14
package org .eclipse .ltk .internal .ui .refactoring ;
15
15
16
+ import java .lang .reflect .InvocationTargetException ;
16
17
import java .text .Collator ;
17
18
import java .text .MessageFormat ;
18
19
import java .util .ArrayList ;
29
30
import org .eclipse .swt .accessibility .AccessibleEvent ;
30
31
import org .eclipse .swt .custom .BusyIndicator ;
31
32
import org .eclipse .swt .custom .SashForm ;
33
+ import org .eclipse .swt .events .MouseEvent ;
34
+ import org .eclipse .swt .events .MouseListener ;
32
35
import org .eclipse .swt .graphics .Point ;
33
36
import org .eclipse .swt .graphics .Rectangle ;
34
37
import org .eclipse .swt .layout .GridData ;
43
46
import org .eclipse .swt .widgets .ToolItem ;
44
47
45
48
import org .eclipse .core .runtime .CoreException ;
49
+ import org .eclipse .core .runtime .IAdaptable ;
46
50
47
51
import org .eclipse .jface .action .Action ;
48
52
import org .eclipse .jface .action .ActionContributionItem ;
49
53
import org .eclipse .jface .action .IAction ;
50
54
import org .eclipse .jface .action .IMenuCreator ;
55
+ import org .eclipse .jface .action .MenuManager ;
51
56
import org .eclipse .jface .action .Separator ;
52
57
import org .eclipse .jface .action .ToolBarManager ;
53
58
import org .eclipse .jface .dialogs .Dialog ;
54
59
import org .eclipse .jface .dialogs .IDialogConstants ;
55
60
import org .eclipse .jface .dialogs .IDialogSettings ;
56
61
import org .eclipse .jface .dialogs .MessageDialog ;
62
+ import org .eclipse .jface .operation .IRunnableContext ;
63
+ import org .eclipse .jface .operation .IRunnableWithProgress ;
57
64
import org .eclipse .jface .viewers .CheckStateChangedEvent ;
58
65
import org .eclipse .jface .viewers .ICheckStateListener ;
59
66
import org .eclipse .jface .viewers .ILabelProvider ;
60
67
import org .eclipse .jface .viewers .ISelectionChangedListener ;
68
+ import org .eclipse .jface .viewers .ISelectionProvider ;
61
69
import org .eclipse .jface .viewers .IStructuredSelection ;
62
70
import org .eclipse .jface .viewers .ITreeContentProvider ;
63
71
import org .eclipse .jface .viewers .StructuredSelection ;
64
72
import org .eclipse .jface .viewers .Viewer ;
65
73
import org .eclipse .jface .viewers .ViewerComparator ;
74
+ import org .eclipse .jface .wizard .IWizardContainer ;
66
75
76
+ import org .eclipse .ui .IActionBars ;
77
+ import org .eclipse .ui .IWorkbenchPart ;
67
78
import org .eclipse .ui .PlatformUI ;
68
79
import org .eclipse .ui .part .PageBook ;
80
+ import org .eclipse .ui .services .IServiceLocator ;
69
81
82
+ import org .eclipse .compare .CompareConfiguration ;
70
83
import org .eclipse .compare .CompareUI ;
84
+ import org .eclipse .compare .ICompareContainer ;
85
+ import org .eclipse .compare .ICompareNavigator ;
86
+ import org .eclipse .compare .structuremergeviewer .ICompareInput ;
87
+ import org .eclipse .compare .structuremergeviewer .ICompareInputChangeListener ;
71
88
72
89
import org .eclipse .ltk .core .refactoring .Change ;
73
90
import org .eclipse .ltk .core .refactoring .CompositeChange ;
@@ -461,7 +478,7 @@ public void getName(AccessibleEvent e) {
461
478
fTreeViewer .setContentProvider (createTreeContentProvider ());
462
479
fTreeViewer .setLabelProvider (createTreeLabelProvider ());
463
480
fTreeViewer .setComparator (createTreeComparator ());
464
- fTreeViewer .addSelectionChangedListener (createSelectionChangedListener ());
481
+ fTreeViewer .addSelectionChangedListener (createSelectionChangedListener (fTreeViewer ));
465
482
fTreeViewer .addCheckStateListener (createCheckStateListener ());
466
483
fTreeViewerPane .setContent (fTreeViewer .getControl ());
467
484
fTreeViewer .getControl ().getAccessible ().addAccessibleListener (new AccessibleAdapter () {
@@ -596,14 +613,47 @@ private boolean isChild(PreviewNode element, PreviewNode child) {
596
613
};
597
614
}
598
615
599
- private ISelectionChangedListener createSelectionChangedListener () {
616
+ private ISelectionChangedListener createSelectionChangedListener (ChangeElementTreeViewer treeViewer ) {
617
+ Runnable [] runOnMouseUp =new Runnable [] {null };
618
+ boolean [] mouseDownPressed = new boolean [] {false };
619
+ treeViewer .getTree ().addMouseListener (new MouseListener () {
620
+
621
+ @ Override
622
+ public void mouseUp (MouseEvent e ) {
623
+ mouseDownPressed [0 ] = false ;
624
+ if (runOnMouseUp [0 ] != null ) {
625
+ runOnMouseUp [0 ].run ();
626
+ runOnMouseUp [0 ] = null ;
627
+ }
628
+ }
629
+
630
+ @ Override
631
+ public void mouseDown (MouseEvent e ) {
632
+ mouseDownPressed [0 ] = true ;
633
+ }
634
+
635
+ @ Override
636
+ public void mouseDoubleClick (MouseEvent e ) {
637
+ }
638
+ });
600
639
return event -> {
601
640
IStructuredSelection sel = (IStructuredSelection ) event .getSelection ();
602
641
if (sel .size () == 1 ) {
603
642
PreviewNode newSelection = (PreviewNode )sel .getFirstElement ();
604
643
if (newSelection != fCurrentSelection ) {
605
644
fCurrentSelection = newSelection ;
606
- showPreview (newSelection );
645
+ Runnable r = new Runnable () {
646
+
647
+ @ Override
648
+ public void run () {
649
+ showPreview (newSelection );
650
+ }
651
+ };
652
+ if (mouseDownPressed [0 ]) {
653
+ runOnMouseUp [0 ] = r ;
654
+ }else {
655
+ r .run ();
656
+ }
607
657
}
608
658
} else {
609
659
showPreview (null );
@@ -622,6 +672,13 @@ private void showPreview(PreviewNode element) {
622
672
if (descriptor != null ) {
623
673
newViewer = descriptor .createViewer ();
624
674
newViewer .createControl (fPreviewContainer );
675
+ IWizardContainer container = getContainer ();
676
+ if (container != null ) {
677
+ if (newViewer .getControl () instanceof IAdaptable adaptable ) {
678
+ CompareConfiguration config = adaptable .getAdapter (CompareConfiguration .class );
679
+ config .setContainer (new WizardCompareContainer (container ));
680
+ }
681
+ }
625
682
} else {
626
683
newViewer = fNullPreviewer ;
627
684
}
@@ -761,4 +818,70 @@ private void setHideDerived(boolean hide) {
761
818
public Change getChange () {
762
819
return fChange ;
763
820
}
821
+
822
+ private static final class WizardCompareContainer implements ICompareContainer {
823
+
824
+ private IRunnableContext context ;
825
+
826
+ public WizardCompareContainer (IRunnableContext context ) {
827
+ this .context =context ;
828
+ }
829
+
830
+ @ Override
831
+ public void setStatusMessage (String message ) {
832
+ }
833
+
834
+ @ Override
835
+ public void addCompareInputChangeListener (ICompareInput input ,
836
+ ICompareInputChangeListener listener ) {
837
+ input .addCompareInputChangeListener (listener );
838
+ }
839
+
840
+ @ Override
841
+ public void removeCompareInputChangeListener (ICompareInput input ,
842
+ ICompareInputChangeListener listener ) {
843
+ input .removeCompareInputChangeListener (listener );
844
+ }
845
+
846
+ @ Override
847
+ public void registerContextMenu (MenuManager menu ,
848
+ ISelectionProvider selectionProvider ) {
849
+ }
850
+
851
+ @ Override
852
+ public IServiceLocator getServiceLocator () {
853
+ return null ;
854
+ }
855
+
856
+ @ Override
857
+ public IActionBars getActionBars () {
858
+ return null ;
859
+ }
860
+
861
+ @ Override
862
+ public void run (boolean fork , boolean cancelable ,
863
+ IRunnableWithProgress runnable )
864
+ throws InvocationTargetException , InterruptedException {
865
+ context .run (fork , cancelable , runnable );
866
+ }
867
+
868
+ @ Override
869
+ public ICompareNavigator getNavigator () {
870
+ return null ;
871
+ }
872
+
873
+ @ Override
874
+ public synchronized void runAsynchronously (IRunnableWithProgress runnable ) {
875
+ try {
876
+ context .run (true , false , runnable );
877
+ } catch (InvocationTargetException | InterruptedException e ) {
878
+ RefactoringUIPlugin .log (e );
879
+ }
880
+ }
881
+
882
+ @ Override
883
+ public IWorkbenchPart getWorkbenchPart () {
884
+ return null ;
885
+ }
886
+ }
764
887
}
0 commit comments