1313 *******************************************************************************/
1414package org .eclipse .ltk .internal .ui .refactoring ;
1515
16+ import java .lang .reflect .InvocationTargetException ;
1617import java .text .Collator ;
1718import java .text .MessageFormat ;
1819import java .util .ArrayList ;
2930import org .eclipse .swt .accessibility .AccessibleEvent ;
3031import org .eclipse .swt .custom .BusyIndicator ;
3132import org .eclipse .swt .custom .SashForm ;
33+ import org .eclipse .swt .events .MouseEvent ;
34+ import org .eclipse .swt .events .MouseListener ;
3235import org .eclipse .swt .graphics .Point ;
3336import org .eclipse .swt .graphics .Rectangle ;
3437import org .eclipse .swt .layout .GridData ;
4346import org .eclipse .swt .widgets .ToolItem ;
4447
4548import org .eclipse .core .runtime .CoreException ;
49+ import org .eclipse .core .runtime .IAdaptable ;
4650
4751import org .eclipse .jface .action .Action ;
4852import org .eclipse .jface .action .ActionContributionItem ;
4953import org .eclipse .jface .action .IAction ;
5054import org .eclipse .jface .action .IMenuCreator ;
55+ import org .eclipse .jface .action .MenuManager ;
5156import org .eclipse .jface .action .Separator ;
5257import org .eclipse .jface .action .ToolBarManager ;
5358import org .eclipse .jface .dialogs .Dialog ;
5459import org .eclipse .jface .dialogs .IDialogConstants ;
5560import org .eclipse .jface .dialogs .IDialogSettings ;
5661import org .eclipse .jface .dialogs .MessageDialog ;
62+ import org .eclipse .jface .operation .IRunnableContext ;
63+ import org .eclipse .jface .operation .IRunnableWithProgress ;
5764import org .eclipse .jface .viewers .CheckStateChangedEvent ;
5865import org .eclipse .jface .viewers .ICheckStateListener ;
5966import org .eclipse .jface .viewers .ILabelProvider ;
6067import org .eclipse .jface .viewers .ISelectionChangedListener ;
68+ import org .eclipse .jface .viewers .ISelectionProvider ;
6169import org .eclipse .jface .viewers .IStructuredSelection ;
6270import org .eclipse .jface .viewers .ITreeContentProvider ;
6371import org .eclipse .jface .viewers .StructuredSelection ;
6472import org .eclipse .jface .viewers .Viewer ;
6573import org .eclipse .jface .viewers .ViewerComparator ;
74+ import org .eclipse .jface .wizard .IWizardContainer ;
6675
76+ import org .eclipse .ui .IActionBars ;
77+ import org .eclipse .ui .IWorkbenchPart ;
6778import org .eclipse .ui .PlatformUI ;
6879import org .eclipse .ui .part .PageBook ;
80+ import org .eclipse .ui .services .IServiceLocator ;
6981
82+ import org .eclipse .compare .CompareConfiguration ;
7083import 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 ;
7188
7289import org .eclipse .ltk .core .refactoring .Change ;
7390import org .eclipse .ltk .core .refactoring .CompositeChange ;
@@ -461,7 +478,7 @@ public void getName(AccessibleEvent e) {
461478 fTreeViewer .setContentProvider (createTreeContentProvider ());
462479 fTreeViewer .setLabelProvider (createTreeLabelProvider ());
463480 fTreeViewer .setComparator (createTreeComparator ());
464- fTreeViewer .addSelectionChangedListener (createSelectionChangedListener ());
481+ fTreeViewer .addSelectionChangedListener (createSelectionChangedListener (fTreeViewer ));
465482 fTreeViewer .addCheckStateListener (createCheckStateListener ());
466483 fTreeViewerPane .setContent (fTreeViewer .getControl ());
467484 fTreeViewer .getControl ().getAccessible ().addAccessibleListener (new AccessibleAdapter () {
@@ -596,14 +613,47 @@ private boolean isChild(PreviewNode element, PreviewNode child) {
596613 };
597614 }
598615
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+ });
600639 return event -> {
601640 IStructuredSelection sel = (IStructuredSelection ) event .getSelection ();
602641 if (sel .size () == 1 ) {
603642 PreviewNode newSelection = (PreviewNode )sel .getFirstElement ();
604643 if (newSelection != fCurrentSelection ) {
605644 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+ }
607657 }
608658 } else {
609659 showPreview (null );
@@ -622,6 +672,13 @@ private void showPreview(PreviewNode element) {
622672 if (descriptor != null ) {
623673 newViewer = descriptor .createViewer ();
624674 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+ }
625682 } else {
626683 newViewer = fNullPreviewer ;
627684 }
@@ -761,4 +818,70 @@ private void setHideDerived(boolean hide) {
761818 public Change getChange () {
762819 return fChange ;
763820 }
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+ }
764887}
0 commit comments