From d201fe3579697dc862852176ddab44773b2d3217 Mon Sep 17 00:00:00 2001 From: cvs2svn Date: Thu, 9 Dec 2004 17:44:17 +0000 Subject: This commit was manufactured by cvs2svn to create branch 'bran'. Sprout from master 2004-12-09 17:44:15 UTC Jean Michel-Lemieux 'Bug 75735 Changes to working set names not reflected in synchronize dropdown' Delete: bundles/org.eclipse.compare/.classpath bundles/org.eclipse.compare/.cvsignore bundles/org.eclipse.compare/.project bundles/org.eclipse.compare/.settings/org.eclipse.jdt.core.prefs bundles/org.eclipse.compare/about.html bundles/org.eclipse.compare/build.properties bundles/org.eclipse.compare/buildnotes_compare.html bundles/org.eclipse.compare/compare/org/eclipse/compare/BufferedContent.java bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareConfiguration.java bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareEditorInput.java bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareUI.java bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareViewerPane.java bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareViewerSwitchingPane.java bundles/org.eclipse.compare/compare/org/eclipse/compare/EditionSelectionDialog.java bundles/org.eclipse.compare/compare/org/eclipse/compare/HistoryItem.java bundles/org.eclipse.compare/compare/org/eclipse/compare/ICompareNavigator.java bundles/org.eclipse.compare/compare/org/eclipse/compare/IContentChangeListener.java bundles/org.eclipse.compare/compare/org/eclipse/compare/IContentChangeNotifier.java bundles/org.eclipse.compare/compare/org/eclipse/compare/IEditableContent.java bundles/org.eclipse.compare/compare/org/eclipse/compare/IEncodedStreamContentAccessor.java bundles/org.eclipse.compare/compare/org/eclipse/compare/IModificationDate.java bundles/org.eclipse.compare/compare/org/eclipse/compare/IPropertyChangeNotifier.java bundles/org.eclipse.compare/compare/org/eclipse/compare/IStreamContentAccessor.java bundles/org.eclipse.compare/compare/org/eclipse/compare/IStreamMerger.java bundles/org.eclipse.compare/compare/org/eclipse/compare/ITypedElement.java bundles/org.eclipse.compare/compare/org/eclipse/compare/IViewerCreator.java bundles/org.eclipse.compare/compare/org/eclipse/compare/NavigationAction.java bundles/org.eclipse.compare/compare/org/eclipse/compare/ResourceNode.java bundles/org.eclipse.compare/compare/org/eclipse/compare/Splitter.java bundles/org.eclipse.compare/compare/org/eclipse/compare/ZipFileStructureCreator.java bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ContentMergeViewer.java bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/IDocumentRange.java bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/IMergeViewerContentProvider.java bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ITokenComparator.java bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewer.java bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewerResources.properties bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/package.html bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/AbstractViewer.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryAction.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryAction.properties bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryDialog.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BaseCompareAction.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewer.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewerCreator.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewerResources.properties bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BufferedCanvas.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BufferedResourceNode.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ChangePropertyAction.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareAction.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareDialog.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditor.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditorContributor.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareFilter.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareMessages.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareMessages.properties bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareNavigator.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareOutlinePage.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ComparePreferencePage.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareUIPlugin.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithEditionAction.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithEditionAction.properties bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/DiffImage.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/DocLineComparator.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/DocumentManager.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/EditionAction.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ExceptionHandler.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ICompareContextIds.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/INavigatable.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/IOpenable.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/IResourceProvider.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ISavable.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/IViewerDescriptor.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/IgnoreWhiteSpaceAction.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageCanvas.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewer.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewerCreator.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewerResources.properties bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ListContentProvider.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ListDialog.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeSourceViewer.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeViewerAction.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeViewerContentProvider.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/NullViewer.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/OverlayPreferenceStore.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithEditionAction.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithEditionAction.properties bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithPreviousEditionAction.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ResizableDialog.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ResourceCompareInput.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ShowPseudoConflicts.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/SimpleTextViewer.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/StreamMergerDescriptor.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/StructureCreatorDescriptor.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/TabFolderLayout.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/TextMergeViewerCreator.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/TextViewerCreator.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/TokenComparator.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/Utilities.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ViewerDescriptor.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ViewerSwitchingCancelled.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/LineComparator.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/MergeMessages.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/MergeMessages.properties bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/TextStreamMerger.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/CompareWithPatchAction.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/Diff.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/Hunk.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/InputPatchPage.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/LineReader.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchErrorDialog.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.properties bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchWizard.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/Patcher.java bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PreviewPatchPage.java bundles/org.eclipse.compare/compare/org/eclipse/compare/package.html bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/DifferencesIterator.java bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/IRangeComparator.java bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/LinkedRangeDifference.java bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/RangeDifference.java bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/RangeDifferencer.java bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/package.html bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffContainer.java bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffElement.java bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffNode.java bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffTreeViewer.java bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffTreeViewerResources.properties bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/Differencer.java bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DocumentRangeNode.java bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/ICompareInput.java bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/ICompareInputChangeListener.java bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IDiffContainer.java bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IDiffElement.java bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IStructureComparator.java bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IStructureCreator.java bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/StructureDiffViewer.java bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/package.html bundles/org.eclipse.compare/icons/full/dlcl16/ancestorpane_co.gif bundles/org.eclipse.compare/icons/full/dlcl16/copy_l_co.gif bundles/org.eclipse.compare/icons/full/dlcl16/copy_r_co.gif bundles/org.eclipse.compare/icons/full/dlcl16/copycont_l_co.gif bundles/org.eclipse.compare/icons/full/dlcl16/copycont_r_co.gif bundles/org.eclipse.compare/icons/full/dlcl16/next_nav.gif bundles/org.eclipse.compare/icons/full/dlcl16/prev_nav.gif bundles/org.eclipse.compare/icons/full/dlcl16/smartmode_co.gif bundles/org.eclipse.compare/icons/full/dlcl16/syncpane_co.gif bundles/org.eclipse.compare/icons/full/dlcl16/twowaycompare_co.gif bundles/org.eclipse.compare/icons/full/dtool16/conflict_edit.gif bundles/org.eclipse.compare/icons/full/dtool16/ignorews_edit.gif bundles/org.eclipse.compare/icons/full/elcl16/ancestorpane_co.gif bundles/org.eclipse.compare/icons/full/elcl16/copy_l_co.gif bundles/org.eclipse.compare/icons/full/elcl16/copy_r_co.gif bundles/org.eclipse.compare/icons/full/elcl16/copycont_l_co.gif bundles/org.eclipse.compare/icons/full/elcl16/copycont_r_co.gif bundles/org.eclipse.compare/icons/full/elcl16/next_nav.gif bundles/org.eclipse.compare/icons/full/elcl16/prev_nav.gif bundles/org.eclipse.compare/icons/full/elcl16/smartmode_co.gif bundles/org.eclipse.compare/icons/full/elcl16/syncpane_co.gif bundles/org.eclipse.compare/icons/full/elcl16/twowaycompare_co.gif bundles/org.eclipse.compare/icons/full/etool16/conflict_edit.gif bundles/org.eclipse.compare/icons/full/etool16/ignorews_edit.gif bundles/org.eclipse.compare/icons/full/eview16/compare_view.gif bundles/org.eclipse.compare/icons/full/obj16/day_obj.gif bundles/org.eclipse.compare/icons/full/obj16/resource_obj.gif bundles/org.eclipse.compare/icons/full/ovr16/add_ov.gif bundles/org.eclipse.compare/icons/full/ovr16/chg_ov.gif bundles/org.eclipse.compare/icons/full/ovr16/confadd_ov.gif bundles/org.eclipse.compare/icons/full/ovr16/confchg_ov.gif bundles/org.eclipse.compare/icons/full/ovr16/confdel_ov.gif bundles/org.eclipse.compare/icons/full/ovr16/del_ov.gif bundles/org.eclipse.compare/icons/full/ovr16/error_ov.gif bundles/org.eclipse.compare/icons/full/ovr16/inadd_ov.gif bundles/org.eclipse.compare/icons/full/ovr16/inchg_ov.gif bundles/org.eclipse.compare/icons/full/ovr16/indel_ov.gif bundles/org.eclipse.compare/icons/full/ovr16/outadd_ov.gif bundles/org.eclipse.compare/icons/full/ovr16/outchg_ov.gif bundles/org.eclipse.compare/icons/full/ovr16/outdel_ov.gif bundles/org.eclipse.compare/icons/full/ovr16/r_inadd_ov.gif bundles/org.eclipse.compare/icons/full/ovr16/r_inchg_ov.gif bundles/org.eclipse.compare/icons/full/ovr16/r_indel_ov.gif bundles/org.eclipse.compare/icons/full/ovr16/r_outadd_ov.gif bundles/org.eclipse.compare/icons/full/ovr16/r_outchg_ov.gif bundles/org.eclipse.compare/icons/full/ovr16/r_outdel_ov.gif bundles/org.eclipse.compare/icons/full/wizban/applypatch_wizban.gif bundles/org.eclipse.compare/old_buildnotes_compare_3_0.html bundles/org.eclipse.compare/plugin.properties bundles/org.eclipse.compare/plugin.xml bundles/org.eclipse.compare/plugins/org.eclipse.compare/.classpath bundles/org.eclipse.compare/plugins/org.eclipse.compare/.cvsignore bundles/org.eclipse.compare/plugins/org.eclipse.compare/.project bundles/org.eclipse.compare/plugins/org.eclipse.compare/.settings/org.eclipse.jdt.core.prefs bundles/org.eclipse.compare/plugins/org.eclipse.compare/about.html bundles/org.eclipse.compare/plugins/org.eclipse.compare/build.properties bundles/org.eclipse.compare/plugins/org.eclipse.compare/buildnotes_compare.html bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/BufferedContent.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareConfiguration.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareEditorInput.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareUI.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareViewerPane.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/CompareViewerSwitchingPane.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/EditionSelectionDialog.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/HistoryItem.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/ICompareNavigator.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IContentChangeListener.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IContentChangeNotifier.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IEditableContent.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IEncodedStreamContentAccessor.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IModificationDate.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IPropertyChangeNotifier.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IStreamContentAccessor.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IStreamMerger.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/ITypedElement.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/IViewerCreator.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/NavigationAction.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/ResourceNode.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/Splitter.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/ZipFileStructureCreator.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ContentMergeViewer.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/IDocumentRange.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/IMergeViewerContentProvider.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ITokenComparator.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewer.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewerResources.properties bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/package.html bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/AbstractViewer.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryAction.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryAction.properties bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryDialog.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/BaseCompareAction.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewer.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewerCreator.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewerResources.properties bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/BufferedCanvas.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/BufferedResourceNode.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ChangePropertyAction.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareAction.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareDialog.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditor.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditorContributor.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareFilter.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareMessages.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareMessages.properties bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareNavigator.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareOutlinePage.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ComparePreferencePage.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareUIPlugin.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithEditionAction.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithEditionAction.properties bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/DiffImage.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/DocLineComparator.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/DocumentManager.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/EditionAction.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ExceptionHandler.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ICompareContextIds.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/INavigatable.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/IOpenable.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/IResourceProvider.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ISavable.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/IViewerDescriptor.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/IgnoreWhiteSpaceAction.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageCanvas.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewer.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewerCreator.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewerResources.properties bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ListContentProvider.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ListDialog.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeSourceViewer.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeViewerAction.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeViewerContentProvider.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/NullViewer.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/OverlayPreferenceStore.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithEditionAction.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithEditionAction.properties bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithPreviousEditionAction.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ResizableDialog.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ResourceCompareInput.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ShowPseudoConflicts.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/SimpleTextViewer.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/StreamMergerDescriptor.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/StructureCreatorDescriptor.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/TabFolderLayout.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/TextMergeViewerCreator.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/TextViewerCreator.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/TokenComparator.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/Utilities.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ViewerDescriptor.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/ViewerSwitchingCancelled.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/LineComparator.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/MergeMessages.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/MergeMessages.properties bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/TextStreamMerger.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/Attic/LineReader.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/CompareWithPatchAction.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/Diff.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/Hunk.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/InputPatchPage.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/LineReader.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchErrorDialog.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.properties bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchWizard.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/Patcher.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PreviewPatchPage.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/package.html bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/DifferencesIterator.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/IRangeComparator.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/LinkedRangeDifference.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/RangeDifference.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/RangeDifferencer.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/package.html bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffContainer.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffElement.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffNode.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffTreeViewer.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffTreeViewerResources.properties bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/Differencer.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DocumentRangeNode.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/ICompareInput.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/ICompareInputChangeListener.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IDiffContainer.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IDiffElement.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IStructureComparator.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IStructureCreator.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/StructureDiffViewer.java bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/package.html bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/ancestorpane_co.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/copy_l_co.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/copy_r_co.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/copycont_l_co.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/copycont_r_co.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/next_nav.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/prev_nav.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/smartmode_co.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/syncpane_co.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dlcl16/twowaycompare_co.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dtool16/conflict_edit.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/dtool16/ignorews_edit.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/ancestorpane_co.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/copy_l_co.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/copy_r_co.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/copycont_l_co.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/copycont_r_co.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/next_nav.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/prev_nav.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/smartmode_co.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/syncpane_co.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/elcl16/twowaycompare_co.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/etool16/conflict_edit.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/etool16/ignorews_edit.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/eview16/compare_view.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/obj16/day_obj.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/obj16/resource_obj.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/add_ov.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/chg_ov.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/confadd_ov.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/confchg_ov.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/confdel_ov.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/del_ov.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/error_ov.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/inadd_ov.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/inchg_ov.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/indel_ov.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/outadd_ov.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/outchg_ov.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/outdel_ov.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/r_inadd_ov.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/r_inchg_ov.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/r_indel_ov.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/r_outadd_ov.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/r_outchg_ov.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/ovr16/r_outdel_ov.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/icons/full/wizban/applypatch_wizban.gif bundles/org.eclipse.compare/plugins/org.eclipse.compare/old_buildnotes_compare_3_0.html bundles/org.eclipse.compare/plugins/org.eclipse.compare/plugin.properties bundles/org.eclipse.compare/plugins/org.eclipse.compare/plugin.xml bundles/org.eclipse.compare/plugins/org.eclipse.compare/schema/contentMergeViewers.exsd bundles/org.eclipse.compare/plugins/org.eclipse.compare/schema/contentViewers.exsd bundles/org.eclipse.compare/plugins/org.eclipse.compare/schema/streamMergers.exsd bundles/org.eclipse.compare/plugins/org.eclipse.compare/schema/structureCreators.exsd bundles/org.eclipse.compare/plugins/org.eclipse.compare/schema/structureMergeViewers.exsd bundles/org.eclipse.compare/plugins/org.eclipse.compare/scripts/exportplugin.xml bundles/org.eclipse.compare/schema/contentMergeViewers.exsd bundles/org.eclipse.compare/schema/contentViewers.exsd bundles/org.eclipse.compare/schema/streamMergers.exsd bundles/org.eclipse.compare/schema/structureCreators.exsd bundles/org.eclipse.compare/schema/structureMergeViewers.exsd bundles/org.eclipse.compare/scripts/exportplugin.xml bundles/org.eclipse.team.core/.classpath bundles/org.eclipse.team.core/.cvsignore bundles/org.eclipse.team.core/.options bundles/org.eclipse.team.core/.project bundles/org.eclipse.team.core/about.html bundles/org.eclipse.team.core/build.properties bundles/org.eclipse.team.core/buildnotes_team.html bundles/org.eclipse.team.core/plugin.properties bundles/org.eclipse.team.core/plugin.xml bundles/org.eclipse.team.core/schema/defaultFileModificationValidator.exsd bundles/org.eclipse.team.core/schema/fileTypes.exsd bundles/org.eclipse.team.core/schema/ignore.exsd bundles/org.eclipse.team.core/schema/projectSets.exsd bundles/org.eclipse.team.core/schema/repository.exsd bundles/org.eclipse.team.core/src/org/eclipse/team/core/DefaultRepositoryProviderType.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/IFileTypeInfo.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/IIgnoreInfo.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/IProjectSetSerializer.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/ITeamStatus.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/ProjectSetCapability.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/ProjectSetSerializationContext.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/RepositoryProvider.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/RepositoryProviderType.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/Team.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/TeamException.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/TeamStatus.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/package.html bundles/org.eclipse.team.core/src/org/eclipse/team/core/subscribers/ActiveChangeSet.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/subscribers/ChangeSet.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/subscribers/ChangeSetCollector.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/subscribers/CheckedInChangeSet.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/subscribers/IChangeSetChangeListener.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/subscribers/ISubscriberChangeEvent.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/subscribers/ISubscriberChangeListener.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/subscribers/Subscriber.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/subscribers/SubscriberChangeEvent.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/subscribers/SubscriberChangeSetCollector.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/subscribers/package.html bundles/org.eclipse.team.core/src/org/eclipse/team/core/synchronize/FastSyncInfoFilter.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/synchronize/ISyncInfoSetChangeEvent.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/synchronize/ISyncInfoSetChangeListener.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/synchronize/ISyncInfoTreeChangeEvent.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/synchronize/SyncInfo.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/synchronize/SyncInfoFilter.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/synchronize/SyncInfoSet.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/synchronize/SyncInfoTree.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/synchronize/package.html bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/AbstractResourceVariantTree.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/CachedResourceVariant.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/IResourceVariant.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/IResourceVariantComparator.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/IResourceVariantTree.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/ISynchronizerChangeListener.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/PersistantResourceVariantByteStore.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/ResourceVariantByteStore.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/ResourceVariantTree.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/ResourceVariantTreeSubscriber.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/SessionResourceVariantByteStore.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/ThreeWayRemoteTree.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/ThreeWayResourceComparator.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/ThreeWaySubscriber.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/ThreeWaySynchronizer.java bundles/org.eclipse.team.core/src/org/eclipse/team/core/variants/package.html bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/Assert.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/BackgroundEventHandler.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/DefaultFileModificationValidator.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/DefaultMoveDeleteHook.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/DefaultProjectSetCapability.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/ExceptionCollector.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/FileModificationValidatorManager.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/IJobListener.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/InfiniteSubProgressMonitor.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/MoveDeleteManager.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/NullSubProgressMonitor.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/PessimisticResourceRuleFactory.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/Policy.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/ResourceVariantCache.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/ResourceVariantCacheEntry.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/Sorter.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/StringMatcher.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/TeamHookDispatcher.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/TeamPlugin.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/messages.properties bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/simpleAccess/SimpleAccessOperations.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/streams/CRLFtoLFInputStream.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/streams/LFtoCRLFInputStream.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/streams/PollingInputStream.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/streams/PollingOutputStream.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/streams/ProgressMonitorInputStream.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/streams/SizeConstrainedInputStream.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/streams/TimeoutInputStream.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/streams/TimeoutOutputStream.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/BatchingLock.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/ContentComparator.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/DescendantResourceVariantByteStore.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SubscriberEventHandler.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SubscriberResourceCollector.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SubscriberSyncInfoCollector.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SubscriberSyncInfoSet.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SyncByteConverter.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SyncInfoStatistics.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SyncInfoTreeChangeEvent.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SyncInfoWorkingSetFilter.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SyncSetChangedEvent.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SyncSetInput.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SyncSetInputFromSubscriber.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/SyncSetInputFromSyncSet.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/ThreeWayBaseTree.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/WorkingSetFilteredSyncInfoCollector.java bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/subscribers/WorkingSetSyncSetInput.java bundles/org.eclipse.team.cvs.core/.classpath bundles/org.eclipse.team.cvs.core/.cvsignore bundles/org.eclipse.team.cvs.core/.options bundles/org.eclipse.team.cvs.core/.project bundles/org.eclipse.team.cvs.core/about.html bundles/org.eclipse.team.cvs.core/asl-v20.txt bundles/org.eclipse.team.cvs.core/build.properties bundles/org.eclipse.team.cvs.core/buildnotes_cvs.html bundles/org.eclipse.team.cvs.core/doc/hglegal.htm bundles/org.eclipse.team.cvs.core/doc/ngibmcpy.gif bundles/org.eclipse.team.cvs.core/doc/org_eclipse_team_cvs_core.html bundles/org.eclipse.team.cvs.core/plugin.properties bundles/org.eclipse.team.cvs.core/plugin.xml bundles/org.eclipse.team.cvs.core/schema/authenticator.exsd bundles/org.eclipse.team.cvs.core/schema/connectionmethods.exsd bundles/org.eclipse.team.cvs.core/schema/filemodificationvalidator.exsd bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSAnnotateBlock.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSCompareSubscriber.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSCoreFileModificationValidator.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSException.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSMergeSubscriber.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSMergeSyncInfo.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSProjectSetCapability.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSProviderPlugin.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSRevisionNumberCompareCriteria.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSStatus.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSSyncInfo.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSSyncTreeSubscriber.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSTag.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSTeamProvider.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSTeamProviderType.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/CVSWorkspaceSubscriber.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/DateUtil.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/EditorsInfo.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSDecoratorEnablementListener.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSFile.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSFileModificationValidator.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSFolder.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSListener.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSRemoteFile.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSRemoteFolder.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSRemoteResource.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSRepositoryLocation.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSResource.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSResourceVisitor.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSRunnable.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ICVSStorage.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/IConnectionMethod.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/ILogEntry.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/IResourceStateChangeListener.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/IServerConnection.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/IUserAuthenticator.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/IUserInfo.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/Policy.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/AbstractMessageCommand.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/AbstractStructureVisitor.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Add.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/AddStructureVisitor.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Admin.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Annotate.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ByteCountOutputStream.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/CRLFDetectInputStream.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/CheckedInHandler.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Checkout.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/CheckoutWithOverwrite.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Command.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/CommandOutputListener.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Commit.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ConsoleListeners.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/CopyHandler.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Diff.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/DiffStructureVisitor.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Editors.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ExpandModules.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/FileStructureVisitor.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Import.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ImportStructureVisitor.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Log.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/MTHandler.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ModTimeHandler.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ModifiedFileSender.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ModuleExpansionHandler.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/NOOPCommand.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/NOOPVisitor.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/NewEntryHandler.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/NotifiedHandler.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/PruneFolderVisitor.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RDiff.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RLog.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RTag.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RemoteCommand.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Remove.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RemoveEntryHandler.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/RemovedHandler.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Request.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ResponseHandler.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Session.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/StaticHandler.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Status.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/StickyHandler.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/SyncUpdate.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Tag.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/TagFileSender.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/TemplateHandler.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Update.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/UpdateMergableOnly.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/UpdateWithOverwrite.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/UpdatedHandler.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ValidRequests.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/ValidRequestsHandler.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Version.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/AdminKSubstListener.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/AnnotateListener.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/CompareDiffListener.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/DiffListener.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/EditorsListener.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/ICommandOutputListener.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/IConsoleListener.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/ILogEntryListener.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/IMessagePatterns.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/IStatusListener.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/IUpdateMessageListener.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/LogEntry.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/LogListener.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/ModuleDefinitionsListener.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/ModuleExpansion.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/RDiffSummaryListener.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/ServerMessageLineMatcher.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/StatusListener.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/TagListener.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/UpdateListener.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/CVSAuthenticationException.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/CVSCommunicationException.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/CVSRepositoryLocation.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/CVSServerException.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/Connection.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/ExtConnection.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/ExtConnectionMethod.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/PServerConnection.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/PServerConnectionMethod.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/connection/UserInfo.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/messages.properties bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSEntryLineTag.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/CVSWorkspaceRoot.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/EclipseFile.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/EclipseFolder.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/EclipseResource.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/EclipseSynchronizer.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/FileContentCachingService.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/FileModificationManager.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFile.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolder.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolderMemberFetcher.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolderSandbox.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolderTree.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteFolderTreeBuilder.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteModule.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/RemoteResource.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/SessionPropertySyncInfoCache.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/SyncInfoCache.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/resources/SynchronizerSyncInfoCache.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/BaserevInfo.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/CVSBaseResourceVariantTree.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/CVSDescendantResourceVariantByteStore.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/CVSResourceVariantTree.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/DeferredResourceChangeHandler.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/FolderSyncInfo.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/MultiTagResourceVariantTree.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/MutableFolderSyncInfo.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/MutableResourceSyncInfo.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/NotifyInfo.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/ReentrantLock.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/syncinfo/ResourceSyncInfo.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/Assert.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/AssertionFailedException.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/BuildCleanupListener.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/CVSDateFormatter.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/FileNameMatcher.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/KnownRepositories.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/MoveDeleteHook.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/PrepareForReplaceVisitor.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/ReplaceWithBaseVisitor.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/ResourceStateChangeListeners.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/StringMatcher.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/SyncFileChangeListener.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/SyncFileWriter.java bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/Util.java bundles/org.eclipse.team.cvs.ssh/.classpath bundles/org.eclipse.team.cvs.ssh/.cvsignore bundles/org.eclipse.team.cvs.ssh/.options bundles/org.eclipse.team.cvs.ssh/.project bundles/org.eclipse.team.cvs.ssh/about.html bundles/org.eclipse.team.cvs.ssh/build.properties bundles/org.eclipse.team.cvs.ssh/plugin.properties bundles/org.eclipse.team.cvs.ssh/plugin.xml bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/Blowfish.java bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/Cipher.java bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/Client.java bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/ClientPacket.java bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/KnownHosts.java bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/Misc.java bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/Packet.java bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/Policy.java bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/SSHMethod.java bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/SSHPlugin.java bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/SSHServerConnection.java bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/ServerPacket.java bundles/org.eclipse.team.cvs.ssh/src/org/eclipse/team/internal/ccvs/ssh/messages.properties bundles/org.eclipse.team.cvs.ssh2/.classpath bundles/org.eclipse.team.cvs.ssh2/.cvsignore bundles/org.eclipse.team.cvs.ssh2/.project bundles/org.eclipse.team.cvs.ssh2/about.html bundles/org.eclipse.team.cvs.ssh2/build.properties bundles/org.eclipse.team.cvs.ssh2/jsch-0.1.16.jar bundles/org.eclipse.team.cvs.ssh2/jsch-0.1.17.jar bundles/org.eclipse.team.cvs.ssh2/jsch-0.1.18.jar bundles/org.eclipse.team.cvs.ssh2/plugin.properties bundles/org.eclipse.team.cvs.ssh2/plugin.xml bundles/org.eclipse.team.cvs.ssh2/src/org/eclipse/team/internal/ccvs/ssh2/CVSSSH2Method.java bundles/org.eclipse.team.cvs.ssh2/src/org/eclipse/team/internal/ccvs/ssh2/CVSSSH2Plugin.java bundles/org.eclipse.team.cvs.ssh2/src/org/eclipse/team/internal/ccvs/ssh2/CVSSSH2PreferencePage.java bundles/org.eclipse.team.cvs.ssh2/src/org/eclipse/team/internal/ccvs/ssh2/CVSSSH2ServerConnection.java bundles/org.eclipse.team.cvs.ssh2/src/org/eclipse/team/internal/ccvs/ssh2/ISSHContants.java bundles/org.eclipse.team.cvs.ssh2/src/org/eclipse/team/internal/ccvs/ssh2/JSchSession.java bundles/org.eclipse.team.cvs.ssh2/src/org/eclipse/team/internal/ccvs/ssh2/PServerSSH2Method.java bundles/org.eclipse.team.cvs.ssh2/src/org/eclipse/team/internal/ccvs/ssh2/PServerSSH2ServerConnection.java bundles/org.eclipse.team.cvs.ssh2/src/org/eclipse/team/internal/ccvs/ssh2/Policy.java bundles/org.eclipse.team.cvs.ssh2/src/org/eclipse/team/internal/ccvs/ssh2/messages.properties bundles/org.eclipse.team.cvs.ui/.classpath bundles/org.eclipse.team.cvs.ui/.cvsignore bundles/org.eclipse.team.cvs.ui/.options bundles/org.eclipse.team.cvs.ui/.project bundles/org.eclipse.team.cvs.ui/about.html bundles/org.eclipse.team.cvs.ui/build.properties bundles/org.eclipse.team.cvs.ui/icons/full/dlcl16/clear_co.gif bundles/org.eclipse.team.cvs.ui/icons/full/dlcl16/collapseall.gif bundles/org.eclipse.team.cvs.ui/icons/full/dlcl16/filter_history.gif bundles/org.eclipse.team.cvs.ui/icons/full/dlcl16/newstream_wiz.gif bundles/org.eclipse.team.cvs.ui/icons/full/dlcl16/refresh.gif bundles/org.eclipse.team.cvs.ui/icons/full/dlcl16/synced.gif bundles/org.eclipse.team.cvs.ui/icons/full/dtool16/annotate.gif bundles/org.eclipse.team.cvs.ui/icons/full/dtool16/checkout.gif bundles/org.eclipse.team.cvs.ui/icons/full/dtool16/cvs_synch.gif bundles/org.eclipse.team.cvs.ui/icons/full/dtool16/history.gif bundles/org.eclipse.team.cvs.ui/icons/full/dtool16/ignorefiles.gif bundles/org.eclipse.team.cvs.ui/icons/full/dtool16/newconnect_wiz.gif bundles/org.eclipse.team.cvs.ui/icons/full/dtool16/newlocation_wiz.gif bundles/org.eclipse.team.cvs.ui/icons/full/dtool16/share_prj_wiz.gif bundles/org.eclipse.team.cvs.ui/icons/full/elcl16/clear_co.gif bundles/org.eclipse.team.cvs.ui/icons/full/elcl16/collapseall.gif bundles/org.eclipse.team.cvs.ui/icons/full/elcl16/filter_history.gif bundles/org.eclipse.team.cvs.ui/icons/full/elcl16/newstream_wiz.gif bundles/org.eclipse.team.cvs.ui/icons/full/elcl16/refresh.gif bundles/org.eclipse.team.cvs.ui/icons/full/elcl16/synced.gif bundles/org.eclipse.team.cvs.ui/icons/full/etool16/annotate.gif bundles/org.eclipse.team.cvs.ui/icons/full/etool16/checkout.gif bundles/org.eclipse.team.cvs.ui/icons/full/etool16/cvs_synch.gif bundles/org.eclipse.team.cvs.ui/icons/full/etool16/history.gif bundles/org.eclipse.team.cvs.ui/icons/full/etool16/newconnect_wiz.gif bundles/org.eclipse.team.cvs.ui/icons/full/etool16/newlocation_wiz.gif bundles/org.eclipse.team.cvs.ui/icons/full/etool16/share_prj_wiz.gif bundles/org.eclipse.team.cvs.ui/icons/full/eview16/annotate_view.gif bundles/org.eclipse.team.cvs.ui/icons/full/eview16/compare_view.gif bundles/org.eclipse.team.cvs.ui/icons/full/eview16/console_view.gif bundles/org.eclipse.team.cvs.ui/icons/full/eview16/cvs_persp.gif bundles/org.eclipse.team.cvs.ui/icons/full/eview16/history_view.gif bundles/org.eclipse.team.cvs.ui/icons/full/eview16/rep_editors_view.gif bundles/org.eclipse.team.cvs.ui/icons/full/eview16/repo_rep.gif bundles/org.eclipse.team.cvs.ui/icons/full/glyphs/glyph1.gif bundles/org.eclipse.team.cvs.ui/icons/full/glyphs/glyph2.gif bundles/org.eclipse.team.cvs.ui/icons/full/glyphs/glyph3.gif bundles/org.eclipse.team.cvs.ui/icons/full/glyphs/glyph4.gif bundles/org.eclipse.team.cvs.ui/icons/full/glyphs/glyph5.gif bundles/org.eclipse.team.cvs.ui/icons/full/glyphs/glyph6.gif bundles/org.eclipse.team.cvs.ui/icons/full/glyphs/glyph7.gif bundles/org.eclipse.team.cvs.ui/icons/full/glyphs/glyph8.gif bundles/org.eclipse.team.cvs.ui/icons/full/obj16/branches_rep.gif bundles/org.eclipse.team.cvs.ui/icons/full/obj16/changelog_obj.gif bundles/org.eclipse.team.cvs.ui/icons/full/obj16/date.gif bundles/org.eclipse.team.cvs.ui/icons/full/obj16/dates.gif bundles/org.eclipse.team.cvs.ui/icons/full/obj16/module_rep.gif bundles/org.eclipse.team.cvs.ui/icons/full/obj16/prjversions_rep.gif bundles/org.eclipse.team.cvs.ui/icons/full/obj16/repository_rep.gif bundles/org.eclipse.team.cvs.ui/icons/full/obj16/tag.gif bundles/org.eclipse.team.cvs.ui/icons/full/obj16/versions_rep.gif bundles/org.eclipse.team.cvs.ui/icons/full/ovr16/confauto_ov.gif bundles/org.eclipse.team.cvs.ui/icons/full/ovr16/edited_ov.gif bundles/org.eclipse.team.cvs.ui/icons/full/ovr16/merged_ov.gif bundles/org.eclipse.team.cvs.ui/icons/full/ovr16/no_remotedir_ov.gif bundles/org.eclipse.team.cvs.ui/icons/full/ovr16/question_ov.gif bundles/org.eclipse.team.cvs.ui/icons/full/wizban/createpatch_wizban.gif bundles/org.eclipse.team.cvs.ui/icons/full/wizban/keywordsub_wizban.gif bundles/org.eclipse.team.cvs.ui/icons/full/wizban/mergestream_wizban.gif bundles/org.eclipse.team.cvs.ui/icons/full/wizban/newconnect_wizban.gif bundles/org.eclipse.team.cvs.ui/icons/full/wizban/newlocation_wizban.gif bundles/org.eclipse.team.cvs.ui/plugin.properties bundles/org.eclipse.team.cvs.ui/plugin.xml bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/AdaptableHierarchicalResourceList.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/AdaptableResourceList.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/AddToVersionControlDialog.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/AlternateUserValidationDialog.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/AnnotateView.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/AvoidableMessageDialog.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSCompareEditorInput.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSCompareRevisionsInput.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSDecoration.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSDecoratorConfiguration.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSDecoratorPreferencesPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSFieldEditorPreferencePage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSFilePropertiesPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSFolderPropertiesPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSLightweightDecorator.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSPerspective.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSPreferencesPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSProjectPropertiesPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSProjectSetSerializer.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSPropertiesPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSUIPlugin.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CommitCommentArea.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/ComparePreferencePage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/DateTagDialog.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/EditorsDialog.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/EditorsView.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/ExtMethodPreferencePage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/FileModificationValidator.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/HistoryDropAdapter.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/HistoryFilter.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/HistoryFilterAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/HistoryFilterDialog.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/HistoryTableProvider.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/HistoryView.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/ICVSUIConstants.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/IHelpContextIds.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/IRepositoryListener.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/IgnoreResourcesDialog.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/KeyboardInteractiveDialog.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/ListSelectionArea.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/OverlayIconCache.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/PasswordManagementPreferencePage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/Policy.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/ReleaseCommentDialog.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/RemoteAnnotationEditorInput.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/RemoteAnnotationStorage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/RemoteFileEditorInput.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/RemoteRevisionQuickDiffProvider.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/ResizableWizardDialog.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/ResourceEditionNode.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/ResourcePropertiesPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/SimpleContentProvider.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/TagetLocationSelectionDialog.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/TextViewerAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/TimeoutProgressMonitorDialog.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/UserValidationDialog.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/VersionCollator.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/WatchEditPreferencePage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/WorkInProgressPreferencePage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/WorkbenchUserAuthenticator.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/WorkingSetSelectionArea.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/XMLWriter.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/AddAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/BranchAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CVSAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CheckoutAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CheckoutAsAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CheckoutWizardAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CommitAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CompareRemoteResourcesAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CompareRemoteWithTagAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CompareWithRemoteAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CompareWithRevisionAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/CompareWithTagAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/ConfigureTagsFromRepoViewOnFolder.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/EditAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/EditorsAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/GenerateDiffFileAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/IgnoreAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/MergeAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/MoveRemoteTagAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/NewRepositoryAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/OpenLogEntryAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/OpenRemoteFileAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/ReplaceWithRemoteAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/ReplaceWithRevisionAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/ReplaceWithTagAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/RestoreFromRepositoryAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/SetKeywordSubstitutionAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/ShowAnnotationAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/ShowCVSPerspectiveAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/ShowEditorsAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/ShowHistoryAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/ShowResourceInHistoryAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/SyncAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/TagAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/TagInRepositoryAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/TagLocalAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/UneditAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/UnmanageAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/UpdateAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/UpdateSilentAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/actions/WorkspaceAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/console/CVSConsoleFactory.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/console/CVSConsolePageParticipant.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/console/CVSOutputConsole.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/console/ConsoleDocument.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/console/ConsolePreferencesPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/console/ConsoleRemoveAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/messages.properties bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/AllRootsElement.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/BranchCategory.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/CVSAdapterFactory.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/CVSModelElement.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/CVSRemoteFilePropertySource.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/CVSRemoteFolderPropertySource.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/CVSRepositoryLocationPropertySource.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/CVSRepositoryRootElement.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/CVSResourceElement.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/CVSTagElement.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/DateTagCategory.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/GroupedByVersionCategory.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/ModulesCategory.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/RemoteContentProvider.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/RemoteFileElement.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/RemoteFolderElement.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/RemoteModule.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/RemoteProjectsElement.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/RemoteResourceElement.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/RemoteVersionModule.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/RepositoryLocationSchedulingRule.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/TagCategory.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/model/VersionCategory.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/AddOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/BranchOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CVSOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CheckoutIntoOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CheckoutMultipleProjectsOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CheckoutOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CheckoutProjectOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CheckoutSingleProjectOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CheckoutToRemoteFolderOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/CommitOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/DisconnectOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/FetchMembersOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/HasProjectMetaFileOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/ITagOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/OverrideAndUpdateOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/ReconcileProjectOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/RemoteCompareOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/RemoteLogOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/RemoteOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/ReplaceOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/RepositoryLocationOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/RepositoryProviderOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/ShareProjectOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/ShowAnnotationOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/SingleCommandOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/TagInRepositoryOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/TagOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/UpdateOnlyMergableOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/operations/UpdateOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/AddToBranchAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/CVSRepoViewAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/CVSRepositoryPropertiesPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/CommentHistoryContentHandler.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/CopyRepositoryNameAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/NewCVSRepositoryAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/NewDateTagAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/RefreshRemoteProjectSelectionPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/RefreshRemoteProjectWizard.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/RefreshTagsAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/RemoteProjectsView.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/RemoteTagsView.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/RemoteViewPart.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/RemoveDateTagAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/RemoveRootAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/RepositoriesView.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/RepositoriesViewContentHandler.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/RepositoryEncodingPropertyPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/RepositoryManager.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/RepositoryRoot.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/repo/RepositorySorter.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSActionDelegateWrapper.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSChangeSetActionGroup.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSChangeSetCapability.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSChangeSetCollector.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSParticipant.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSParticipantAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSParticipantLabelDecorator.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSSubscriberOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSSynchronizeWizard.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CommitSetDialog.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CompareParticipant.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CompareRevertAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CompareRevertOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/ConfirmMergedAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/ConfirmMergedOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/LogEntryCacheUpdateHandler.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeSynchronizeParticipant.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeUpdateAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeUpdateOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/OpenChangeSetAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/OverrideAndCommitAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/OverrideAndUpdateAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/OverrideAndUpdateSubscriberOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/RefreshDirtyStateAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/RefreshDirtyStateOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/SafeUpdateOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/SyncInfoSetDetailsDialog.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/UpdateDialog.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/WorkspaceCommitAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/WorkspaceCommitOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/WorkspaceSynchronizeParticipant.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/WorkspaceUpdateAction.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/WorkspaceUpdateOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/sync/ToolTipMessageDialog.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/tags/BranchPromptDialog.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/tags/CVSFileElement.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/tags/CVSFolderElement.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/tags/FilteredTagList.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/tags/LocalProjectTagSource.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/tags/MultiFolderTagSource.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/tags/SingleFileTagSource.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/tags/SingleFolderTagSource.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/tags/TagAsVersionDialog.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/tags/TagConfigurationDialog.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/tags/TagContentAssistProcessor.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/tags/TagElement.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/tags/TagRefreshButtonArea.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/tags/TagRootElement.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/tags/TagSelectionArea.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/tags/TagSelectionDialog.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/tags/TagSelectionWizardPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/tags/TagSource.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/tags/TagSourceResourceAdapter.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/tags/TagSourceWorkbenchAdapter.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/CVSWizardPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/CheckoutAsLocationSelectionPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/CheckoutAsMainPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/CheckoutAsProjectSelectionPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/CheckoutAsWizard.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/CheckoutWizard.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/ConfigurationWizardAutoconnectPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/ConfigurationWizardMainPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/GenerateDiffFileOperation.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/GenerateDiffFileWizard.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/ICVSWizard.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/KSubstWizard.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/KSubstWizardCommitCommentPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/KSubstWizardDirtyFilesPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/KSubstWizardSelectionPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/KSubstWizardSharedFilesPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/KSubstWizardSummaryPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/MergeWizard.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/MergeWizardPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/ModuleSelectionPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/NewLocationWizard.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/RepositorySelectionPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/RestoreFromRepositoryFileSelectionPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/RestoreFromRepositoryWizard.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/SharingWizard.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/SharingWizardPageActionGroup.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/SharingWizardSyncPage.java bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/wizards/UpdateWizard.java examples/org.eclipse.compare.examples.xml/.classpath examples/org.eclipse.compare.examples.xml/.cvsignore examples/org.eclipse.compare.examples.xml/.project examples/org.eclipse.compare.examples.xml/.settings/org.eclipse.jdt.core.prefs examples/org.eclipse.compare.examples.xml/IdMaps/ant_test.xml examples/org.eclipse.compare.examples.xml/IdMaps/idmap.dtd examples/org.eclipse.compare.examples.xml/about.html examples/org.eclipse.compare.examples.xml/build.properties examples/org.eclipse.compare.examples.xml/doc-html/CreateNewIDMapButton.gif examples/org.eclipse.compare.examples.xml/doc-html/EditCopy.gif examples/org.eclipse.compare.examples.xml/doc-html/IDMapContextMenu.gif examples/org.eclipse.compare.examples.xml/doc-html/IDMap_GeneralMatching.gif examples/org.eclipse.compare.examples.xml/doc-html/IDMap_MyPlugin.gif examples/org.eclipse.compare.examples.xml/doc-html/IDMap_NewIDMapScheme.gif examples/org.eclipse.compare.examples.xml/doc-html/IDMap_NewMapping_ContextMenu.gif examples/org.eclipse.compare.examples.xml/doc-html/IDMap_NewMapping_PreferencePage.gif examples/org.eclipse.compare.examples.xml/doc-html/IDMap_SelectMyPlugin.gif examples/org.eclipse.compare.examples.xml/doc-html/Ordered_MyANT.gif examples/org.eclipse.compare.examples.xml/doc-html/Ordered_NewIDMapScheme.gif examples/org.eclipse.compare.examples.xml/doc-html/Ordered_NewOrderedEntry_ContextMenu.gif examples/org.eclipse.compare.examples.xml/doc-html/Ordered_NewOrderedEntry_PreferencePage.gif examples/org.eclipse.compare.examples.xml/doc-html/Ordered_UnorderedScheme.gif examples/org.eclipse.compare.examples.xml/doc-html/PreferencePage.gif examples/org.eclipse.compare.examples.xml/doc-html/addidmap.gif examples/org.eclipse.compare.examples.xml/doc-html/hglegal.htm examples/org.eclipse.compare.examples.xml/doc-html/idMapping.html examples/org.eclipse.compare.examples.xml/doc-html/ngibmcpy.gif examples/org.eclipse.compare.examples.xml/doc-html/smartmode_co.gif examples/org.eclipse.compare.examples.xml/doc-html/tutorial_and_examples.html examples/org.eclipse.compare.examples.xml/doc-html/ui_xmlcompare_ex.html examples/org.eclipse.compare.examples.xml/icons/full/obj16/addidmap.gif examples/org.eclipse.compare.examples.xml/icons/full/obj16/attribute_obj.gif examples/org.eclipse.compare.examples.xml/icons/full/obj16/element_obj.gif examples/org.eclipse.compare.examples.xml/icons/full/obj16/element_ordered_obj.gif examples/org.eclipse.compare.examples.xml/icons/full/obj16/smartmode_co.gif examples/org.eclipse.compare.examples.xml/icons/full/obj16/text_obj.gif examples/org.eclipse.compare.examples.xml/plugin.properties examples/org.eclipse.compare.examples.xml/plugin.xml examples/org.eclipse.compare.examples.xml/schema/idMapping.exsd examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/AbstractMatching.java examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/AttributesImpl.java examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/ChooseMatcherDropDownAction.java examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/CreateNewIdMapAction.java examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/IdMap.java examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/Mapping.java examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/OrderedMatching.java examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/SWTUtil.java examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/SelectMatcherAction.java examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/XMLChildren.java examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/XMLCompareAddIdMapDialog.java examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/XMLCompareEditCopyIdMapDialog.java examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/XMLCompareEditMappingDialog.java examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/XMLCompareEditOrderedDialog.java examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/XMLCompareMessages.java examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/XMLComparePreferencePage.java examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/XMLNode.java examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/XMLPlugin.java examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/XMLStructureCreator.java examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/XMLStructureViewer.java examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/XMLStructureViewerCreator.java examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/ui/MessageLine.java examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/ui/StatusDialog.java examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/ui/StatusInfo.java examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/ui/StatusUtil.java examples/org.eclipse.compare.examples.xml/src/org/eclipse/compare/examples/xml/xmlcompare.properties examples/org.eclipse.compare.examples.xml/tests/org/eclipse/compare/examples/xml/AllXMLCompareTests.java examples/org.eclipse.compare.examples.xml/tests/org/eclipse/compare/examples/xml/TestXMLStructureCreator.java examples/org.eclipse.compare.examples/.classpath examples/org.eclipse.compare.examples/.cvsignore examples/org.eclipse.compare.examples/.project examples/org.eclipse.compare.examples/.settings/org.eclipse.jdt.core.prefs examples/org.eclipse.compare.examples/about.html examples/org.eclipse.compare.examples/build.properties examples/org.eclipse.compare.examples/doc-html/hglegal.htm examples/org.eclipse.compare.examples/doc-html/ngibmcpy.gif examples/org.eclipse.compare.examples/doc-html/ui_structurecreator_ex.html examples/org.eclipse.compare.examples/plugin.properties examples/org.eclipse.compare.examples/plugin.xml examples/org.eclipse.compare.examples/src/org/eclipse/compare/examples/structurecreator/CompareExampleMessages.properties examples/org.eclipse.compare.examples/src/org/eclipse/compare/examples/structurecreator/KeyValuePairStructureCreator.java examples/org.eclipse.compare.examples/src/org/eclipse/compare/examples/structurecreator/TextMergeViewerCreator.java examples/org.eclipse.compare.examples/src/org/eclipse/compare/examples/structurecreator/Util.java examples/org.eclipse.team.examples.filesystem/.classpath examples/org.eclipse.team.examples.filesystem/.cvsignore examples/org.eclipse.team.examples.filesystem/.project examples/org.eclipse.team.examples.filesystem/about.html examples/org.eclipse.team.examples.filesystem/build.properties examples/org.eclipse.team.examples.filesystem/doc-html/hglegal.htm examples/org.eclipse.team.examples.filesystem/doc-html/ngibmcpy.gif examples/org.eclipse.team.examples.filesystem/doc-html/team_filesystem_ex.html examples/org.eclipse.team.examples.filesystem/doc-html/team_localhistory_ex.html examples/org.eclipse.team.examples.filesystem/icons/full/wizards/fsicon_wiz.gif examples/org.eclipse.team.examples.filesystem/icons/full/wizards/synced.gif examples/org.eclipse.team.examples.filesystem/icons/full/wizban/newconnect_wizban.gif examples/org.eclipse.team.examples.filesystem/plugin.properties examples/org.eclipse.team.examples.filesystem/plugin.xml examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/FileModificationValidator.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/FileSystemOperations.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/FileSystemPlugin.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/FileSystemProvider.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/FileSystemProviderType.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/Policy.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/StreamUtil.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/messages.properties examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/subscriber/FileSystemRemoteTree.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/subscriber/FileSystemResourceVariant.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/subscriber/FileSystemSubscriber.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/subscriber/FileSystemSyncInfo.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/ui/ConfigurationWizard.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/ui/DisconnectAction.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/ui/FileSystemAction.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/ui/FileSystemMainPage.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/ui/FileSystemPropertiesPage.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/ui/FileSystemSynchronizeOperation.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/ui/FileSystemSynchronizeParticipant.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/ui/GetAction.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/ui/GetSynchronizeAction.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/ui/GetSynchronizeOperation.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/ui/ProjectSetSerializer.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/ui/PutAction.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/ui/PutSynchronizeAction.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/ui/PutSynchronizeOperation.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/ui/ReplaceAction.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/ui/SynchronizeAction.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/filesystem/ui/SynchronizeWizard.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/localhistory/LocalHistoryPartipant.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/localhistory/LocalHistorySubscriber.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/localhistory/LocalHistorySyncInfo.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/localhistory/LocalHistorySynchronizeWizard.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/localhistory/LocalHistoryVariant.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/localhistory/LocalHistoryVariantComparator.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/localhistory/RevertAllOperation.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/pessimistic/IPessimisticFilesystemConstants.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/pessimistic/IResourceStateListener.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/pessimistic/PessimisticFilesystemProvider.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/pessimistic/PessimisticFilesystemProviderPlugin.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/pessimistic/PessimisticModificationValidator.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/pessimistic/ResourceChangeListener.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/pessimistic/ResourceSetContentProvider.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/pessimistic/ui/AddToControlAction.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/pessimistic/ui/BlankPage.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/pessimistic/ui/CheckInAction.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/pessimistic/ui/CheckOutAction.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/pessimistic/ui/ConfigurationWizard.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/pessimistic/ui/DisconnectAction.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/pessimistic/ui/PessimisticDecorator.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/pessimistic/ui/PessimisticPreferencesPage.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/pessimistic/ui/PessimisticProviderAction.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/pessimistic/ui/RemoveFromControlAction.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/pessimistic/ui/SourceManagementAction.java examples/org.eclipse.team.examples.filesystem/src/org/eclipse/team/examples/pessimistic/ui/UncheckOutAction.java tests/org.eclipse.compare.tests/.classpath tests/org.eclipse.compare.tests/.cvsignore tests/org.eclipse.compare.tests/.project tests/org.eclipse.compare.tests/.settings/org.eclipse.jdt.core.prefs tests/org.eclipse.compare.tests/about.html tests/org.eclipse.compare.tests/build.properties tests/org.eclipse.compare.tests/plugin.properties tests/org.eclipse.compare.tests/plugin.xml tests/org.eclipse.compare.tests/src/org/eclipse/compare/tests/AllTests.java tests/org.eclipse.compare.tests/src/org/eclipse/compare/tests/CompareTestPlugin.java tests/org.eclipse.compare.tests/src/org/eclipse/compare/tests/DocLineComparatorTest.java tests/org.eclipse.compare.tests/src/org/eclipse/compare/tests/FilterTest.java tests/org.eclipse.compare.tests/src/org/eclipse/compare/tests/StreamMergerTest.java tests/org.eclipse.compare.tests/src/org/eclipse/compare/tests/UITest.java tests/org.eclipse.compare.tests/test.xml tests/org.eclipse.team.tests.core/.classpath tests/org.eclipse.team.tests.core/.cvsignore tests/org.eclipse.team.tests.core/.project tests/org.eclipse.team.tests.core/about.html tests/org.eclipse.team.tests.core/build-tests.xml tests/org.eclipse.team.tests.core/build.properties tests/org.eclipse.team.tests.core/plugin.xml tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/AllTeamTests.java tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/RepositoryProviderBic.java tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/RepositoryProviderNaish.java tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/RepositoryProviderOtherSport.java tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/RepositoryProviderTests.java tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/RepositoryProviderTypeBic.java tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/RepositoryProviderWithLinking.java tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/StreamTests.java tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/TeamTest.java tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/ui/synchronize/AllTeamSynchronizeTests.java tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/ui/synchronize/SyncInfoSetContentProviderTest.java tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/ui/synchronize/TestDiffNodePresentationModel.java tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/ui/synchronize/TestPage.java tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/ui/synchronize/TestParticipant.java tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/ui/synchronize/TestSyncInfo.java tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/ui/synchronize/TestTreeViewerAdvisor.java tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/ui/views/ContentProviderTestView.java tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/ui/views/TestTreeViewer.java tests/org.eclipse.team.tests.core/test.xml tests/org.eclipse.team.tests.cvs.core/.classpath tests/org.eclipse.team.tests.cvs.core/.cvsignore tests/org.eclipse.team.tests.cvs.core/.project tests/org.eclipse.team.tests.cvs.core/.settings/org.eclipse.jdt.core.prefs tests/org.eclipse.team.tests.cvs.core/about.html tests/org.eclipse.team.tests.cvs.core/benchmark/cvsui_benchmark.bat tests/org.eclipse.team.tests.cvs.core/benchmark/readme.txt tests/org.eclipse.team.tests.cvs.core/benchmark/team2.0/2002_02_26.integration.all.xml tests/org.eclipse.team.tests.cvs.core/benchmark/team2.0/2002_03_19.integration.all.xml tests/org.eclipse.team.tests.cvs.core/benchmark/team2.0/2002_04_24.milestone5.all.xml tests/org.eclipse.team.tests.cvs.core/benchmark/team2.0/2002_04_25.integration.commandline.xml tests/org.eclipse.team.tests.cvs.core/benchmark/team2.0/2002_07_10.release2_0.commandline.xml tests/org.eclipse.team.tests.cvs.core/benchmark/team2.0/2002_07_11.release2_0.all.xml tests/org.eclipse.team.tests.cvs.core/benchmark/team2.1/I20021127.all.xml tests/org.eclipse.team.tests.cvs.core/benchmark/team2.1/I20030129.all.xml tests/org.eclipse.team.tests.cvs.core/benchmark/team2.1/RC1.all.xml tests/org.eclipse.team.tests.cvs.core/benchmark/teamui_benchmark.bat tests/org.eclipse.team.tests.cvs.core/benchmark/vcm1.0/2002_02_26.integration.all.xml tests/org.eclipse.team.tests.cvs.core/benchmark/vcmui_benchmark.bat tests/org.eclipse.team.tests.cvs.core/book.css tests/org.eclipse.team.tests.cvs.core/build-tests.xml tests/org.eclipse.team.tests.cvs.core/build.properties tests/org.eclipse.team.tests.cvs.core/html/00000.html tests/org.eclipse.team.tests.cvs.core/html/00001.html tests/org.eclipse.team.tests.cvs.core/html/00002.html tests/org.eclipse.team.tests.cvs.core/html/00003.html tests/org.eclipse.team.tests.cvs.core/html/00004.html tests/org.eclipse.team.tests.cvs.core/html/00005.html tests/org.eclipse.team.tests.cvs.core/html/00006.html tests/org.eclipse.team.tests.cvs.core/html/00007.html tests/org.eclipse.team.tests.cvs.core/html/00008.html tests/org.eclipse.team.tests.cvs.core/html/00009.html tests/org.eclipse.team.tests.cvs.core/html/00010.html tests/org.eclipse.team.tests.cvs.core/html/00011.html tests/org.eclipse.team.tests.cvs.core/html/00012.html tests/org.eclipse.team.tests.cvs.core/html/00013.html tests/org.eclipse.team.tests.cvs.core/html/00014.html tests/org.eclipse.team.tests.cvs.core/html/00015.html tests/org.eclipse.team.tests.cvs.core/html/00016.html tests/org.eclipse.team.tests.cvs.core/html/00017.html tests/org.eclipse.team.tests.cvs.core/html/00018.html tests/org.eclipse.team.tests.cvs.core/html/00019.html tests/org.eclipse.team.tests.cvs.core/html/00020.html tests/org.eclipse.team.tests.cvs.core/html/00021.html tests/org.eclipse.team.tests.cvs.core/html/00022.html tests/org.eclipse.team.tests.cvs.core/html/00023.html tests/org.eclipse.team.tests.cvs.core/html/00024.html tests/org.eclipse.team.tests.cvs.core/html/00025.html tests/org.eclipse.team.tests.cvs.core/html/00026.html tests/org.eclipse.team.tests.cvs.core/html/00027.html tests/org.eclipse.team.tests.cvs.core/html/00028.html tests/org.eclipse.team.tests.cvs.core/html/00028a.html tests/org.eclipse.team.tests.cvs.core/html/00029.html tests/org.eclipse.team.tests.cvs.core/html/00029a.html tests/org.eclipse.team.tests.cvs.core/html/00030.html tests/org.eclipse.team.tests.cvs.core/html/00030a.html tests/org.eclipse.team.tests.cvs.core/html/00031.html tests/org.eclipse.team.tests.cvs.core/html/00032.html tests/org.eclipse.team.tests.cvs.core/html/00033.html tests/org.eclipse.team.tests.cvs.core/html/00034.html tests/org.eclipse.team.tests.cvs.core/html/00035.html tests/org.eclipse.team.tests.cvs.core/html/00036.html tests/org.eclipse.team.tests.cvs.core/html/00037.html tests/org.eclipse.team.tests.cvs.core/html/00038.html tests/org.eclipse.team.tests.cvs.core/html/00039.html tests/org.eclipse.team.tests.cvs.core/html/00040.html tests/org.eclipse.team.tests.cvs.core/html/00041.html tests/org.eclipse.team.tests.cvs.core/html/00042.html tests/org.eclipse.team.tests.cvs.core/html/00043.html tests/org.eclipse.team.tests.cvs.core/html/00044.html tests/org.eclipse.team.tests.cvs.core/html/00045.html tests/org.eclipse.team.tests.cvs.core/html/00046.html tests/org.eclipse.team.tests.cvs.core/html/00047.html tests/org.eclipse.team.tests.cvs.core/html/00048.html tests/org.eclipse.team.tests.cvs.core/html/00049.html tests/org.eclipse.team.tests.cvs.core/html/00050.html tests/org.eclipse.team.tests.cvs.core/html/auth_problems00001.html tests/org.eclipse.team.tests.cvs.core/html/checkoutwizard00001.html tests/org.eclipse.team.tests.cvs.core/html/commands00001.html tests/org.eclipse.team.tests.cvs.core/html/commit_sets00001.html tests/org.eclipse.team.tests.cvs.core/html/commit_stes00001.html tests/org.eclipse.team.tests.cvs.core/html/connections00001.html tests/org.eclipse.team.tests.cvs.core/html/datetags_repoview00001.html tests/org.eclipse.team.tests.cvs.core/html/encoding00001.html tests/org.eclipse.team.tests.cvs.core/html/ext_connection_method00001.html tests/org.eclipse.team.tests.cvs.core/html/failures00001.html tests/org.eclipse.team.tests.cvs.core/html/latest_revision_commit_set00001.html tests/org.eclipse.team.tests.cvs.core/html/misc00001.html tests/org.eclipse.team.tests.cvs.core/html/passwords00001.html tests/org.eclipse.team.tests.cvs.core/html/perf00001.html tests/org.eclipse.team.tests.cvs.core/html/perf00002.html tests/org.eclipse.team.tests.cvs.core/html/perf00003.html tests/org.eclipse.team.tests.cvs.core/html/perf00004.html tests/org.eclipse.team.tests.cvs.core/html/perf00005.html tests/org.eclipse.team.tests.cvs.core/html/perf00006.html tests/org.eclipse.team.tests.cvs.core/html/perf00007.html tests/org.eclipse.team.tests.cvs.core/html/project_sets00001.html tests/org.eclipse.team.tests.cvs.core/html/quickdiff00001.html tests/org.eclipse.team.tests.cvs.core/html/repoview_basics00001.html tests/org.eclipse.team.tests.cvs.core/html/sharingbasics00001.html tests/org.eclipse.team.tests.cvs.core/html/sync00001.html tests/org.eclipse.team.tests.cvs.core/html/teamupdate00001.html tests/org.eclipse.team.tests.cvs.core/html/update00001.html tests/org.eclipse.team.tests.cvs.core/html/update_command00001.html tests/org.eclipse.team.tests.cvs.core/html/validate_edit00001.html tests/org.eclipse.team.tests.cvs.core/html/validate_edit_editing_files00001.html tests/org.eclipse.team.tests.cvs.core/html/validate_edit_refactoring00001.html tests/org.eclipse.team.tests.cvs.core/html/watch_edit00001.html tests/org.eclipse.team.tests.cvs.core/html/watch_edit_basic00001.html tests/org.eclipse.team.tests.cvs.core/html/watch_edit_editorsview00001.html tests/org.eclipse.team.tests.cvs.core/launchConfigurations/CVS Core Tests.launch tests/org.eclipse.team.tests.cvs.core/launchConfigurations/CVS UI Tests (Linux).launch tests/org.eclipse.team.tests.cvs.core/launchConfigurations/CVS UI Tests.launch tests/org.eclipse.team.tests.cvs.core/launchConfigurations/One CVS Test.launch tests/org.eclipse.team.tests.cvs.core/launchConfigurations/Performance - SyncTests.launch tests/org.eclipse.team.tests.cvs.core/launchConfigurations/Test using Ant application.launch tests/org.eclipse.team.tests.cvs.core/launchConfigurations/benchmark/Benchmark Test.launch tests/org.eclipse.team.tests.cvs.core/launchConfigurations/benchmark/PrintDiffMain.launch tests/org.eclipse.team.tests.cvs.core/plugin.xml tests/org.eclipse.team.tests.cvs.core/readme.html tests/org.eclipse.team.tests.cvs.core/repository.properties tests/org.eclipse.team.tests.cvs.core/resources/BenchmarkTest/benchmarkBig.zip tests/org.eclipse.team.tests.cvs.core/resources/BenchmarkTest/benchmarkSmall.zip tests/org.eclipse.team.tests.cvs.core/resources/BenchmarkTest/benchmarkTiny.zip tests/org.eclipse.team.tests.cvs.core/resources/CommandTest/CVSROOT/modules tests/org.eclipse.team.tests.cvs.core/resources/CommandTest/common/docs/readme.html tests/org.eclipse.team.tests.cvs.core/resources/CommandTest/common/macros/macro1 tests/org.eclipse.team.tests.cvs.core/resources/CommandTest/project1/f1/file-in-p1.txt tests/org.eclipse.team.tests.cvs.core/resources/CommandTest/project2/file-p2.txt tests/org.eclipse.team.tests.cvs.core/resources/CommandTest/project3/src/file.c tests/org.eclipse.team.tests.cvs.core/resources/CommandTest/project3/src/file.h tests/org.eclipse.team.tests.cvs.core/resources/CommandTest/project3/sub/file-sub.txt tests/org.eclipse.team.tests.cvs.core/resources/CommandTest/project7/common/common.txt tests/org.eclipse.team.tests.cvs.core/resources/CommandTest/project7/linux/linux.txt tests/org.eclipse.team.tests.cvs.core/resources/CommandTest/project7/pc/pc.txt tests/org.eclipse.team.tests.cvs.core/resources/CommandTest/project8/file-p8.txt tests/org.eclipse.team.tests.cvs.core/self-host.xml tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/AllCoreTests.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/AllTests.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/CVSClientException.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/CVSTestLogListener.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/CVSTestSetup.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/CVSUITestSetup.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/CommandLineCVSClient.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/EclipseCVSClient.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/EclipseTest.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/ICVSClient.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/JUnitTestCase.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/TestConnection.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/TestConnectionMethod.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/TestsUserAuthenticator.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/AllTestsCompatibility.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/BasicTest.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/CompatibleTestSetup.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/ConflictTest.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/ModuleTest.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/compatible/SameResultEnv.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/cvsresources/AllTestsCVSResources.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/cvsresources/BatchedTestSetup.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/cvsresources/EclipseFolderTest.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/cvsresources/EclipseSynchronizerTest.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/cvsresources/ResourceSyncBytesTest.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/cvsresources/ResourceSyncInfoTest.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/provider/AllTestsProvider.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/provider/CVSProviderTest.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/provider/ConcurrencyTests.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/provider/ImportTest.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/provider/IsModifiedTests.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/provider/LinkResourcesTest.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/provider/ModuleTest.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/provider/RemoteResourceTest.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/provider/ResourceDeltaTest.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/provider/WatchEditTest.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/subscriber/AllTestsTeamSubscriber.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/subscriber/CVSChangeSetTests.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/subscriber/CVSCompareSubscriberTest.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/subscriber/CVSMergeSubscriberTest.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/subscriber/CVSSyncSubscriberTest.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/subscriber/CVSWorkspaceSubscriberTest.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/subscriber/SyncInfoSource.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/subscriber/SyncSetTests.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/subscriber/TestCommitOperation.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/subscriber/TestMergeUpdateOperation.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/subscriber/TestOverrideAndUpdateOperation.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/subscriber/TestUpdateOperation.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/AllUITests.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/CVSOperationTest.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/CheckoutOperationTests.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/CommitSetTests.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/CompareOperationTests.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/MenuEnablementTest.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/MiscOperationsTests.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/SynchronizeViewTestAdapter.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/benchmark/BenchmarkTest.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/benchmark/BenchmarkTestSetup.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/benchmark/BenchmarkUtils.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/benchmark/SequenceGenerator.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/benchmark/ShareAndCheckoutTest.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/benchmark/SyncTests.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/benchmark/Util.java tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/ui/benchmark/WorkflowTests.java tests/org.eclipse.team.tests.cvs.core/test.xml tests/org.eclipse.team.tests.cvs.core/toc.html tests/org.eclipse.team.tests.cvs.core/toc.xml--- .../org/eclipse/compare/BufferedContent.java | 130 - .../org/eclipse/compare/CompareConfiguration.java | 450 -- .../org/eclipse/compare/CompareEditorInput.java | 815 ---- .../compare/org/eclipse/compare/CompareUI.java | 323 -- .../org/eclipse/compare/CompareViewerPane.java | 151 - .../compare/CompareViewerSwitchingPane.java | 369 -- .../eclipse/compare/EditionSelectionDialog.java | 1128 ----- .../compare/org/eclipse/compare/HistoryItem.java | 109 - .../org/eclipse/compare/ICompareNavigator.java | 34 - .../eclipse/compare/IContentChangeListener.java | 30 - .../eclipse/compare/IContentChangeNotifier.java | 39 - .../org/eclipse/compare/IEditableContent.java | 70 - .../compare/IEncodedStreamContentAccessor.java | 39 - .../org/eclipse/compare/IModificationDate.java | 31 - .../eclipse/compare/IPropertyChangeNotifier.java | 41 - .../eclipse/compare/IStreamContentAccessor.java | 36 - .../compare/org/eclipse/compare/IStreamMerger.java | 69 - .../compare/org/eclipse/compare/ITypedElement.java | 68 - .../org/eclipse/compare/IViewerCreator.java | 34 - .../org/eclipse/compare/NavigationAction.java | 94 - .../compare/org/eclipse/compare/ResourceNode.java | 215 - .../compare/org/eclipse/compare/Splitter.java | 129 - .../eclipse/compare/ZipFileStructureCreator.java | 322 -- .../contentmergeviewer/ContentMergeViewer.java | 1043 ----- .../compare/contentmergeviewer/IDocumentRange.java | 54 - .../IMergeViewerContentProvider.java | 155 - .../contentmergeviewer/ITokenComparator.java | 57 - .../contentmergeviewer/TextMergeViewer.java | 4303 -------------------- .../TextMergeViewerResources.properties | 98 - .../compare/contentmergeviewer/package.html | 45 - .../eclipse/compare/internal/AbstractViewer.java | 38 - .../compare/internal/AddFromHistoryAction.java | 139 - .../internal/AddFromHistoryAction.properties | 45 - .../compare/internal/AddFromHistoryDialog.java | 475 --- .../compare/internal/BaseCompareAction.java | 43 - .../compare/internal/BinaryCompareViewer.java | 117 - .../internal/BinaryCompareViewerCreator.java | 29 - .../BinaryCompareViewerResources.properties | 22 - .../eclipse/compare/internal/BufferedCanvas.java | 98 - .../compare/internal/BufferedResourceNode.java | 128 - .../compare/internal/ChangePropertyAction.java | 53 - .../eclipse/compare/internal/CompareAction.java | 59 - .../eclipse/compare/internal/CompareDialog.java | 124 - .../eclipse/compare/internal/CompareEditor.java | 260 -- .../compare/internal/CompareEditorContributor.java | 106 - .../eclipse/compare/internal/CompareFilter.java | 397 -- .../eclipse/compare/internal/CompareMessages.java | 33 - .../compare/internal/CompareMessages.properties | 58 - .../eclipse/compare/internal/CompareNavigator.java | 158 - .../compare/internal/CompareOutlinePage.java | 106 - .../compare/internal/ComparePreferencePage.java | 389 -- .../eclipse/compare/internal/CompareUIPlugin.java | 1155 ------ .../compare/internal/CompareWithEditionAction.java | 20 - .../internal/CompareWithEditionAction.properties | 38 - .../org/eclipse/compare/internal/DiffImage.java | 78 - .../compare/internal/DocLineComparator.java | 202 - .../eclipse/compare/internal/DocumentManager.java | 65 - .../eclipse/compare/internal/EditionAction.java | 237 -- .../eclipse/compare/internal/ExceptionHandler.java | 133 - .../compare/internal/ICompareContextIds.java | 53 - .../org/eclipse/compare/internal/INavigatable.java | 21 - .../org/eclipse/compare/internal/IOpenable.java | 24 - .../compare/internal/IResourceProvider.java | 23 - .../org/eclipse/compare/internal/ISavable.java | 19 - .../compare/internal/IViewerDescriptor.java | 41 - .../compare/internal/IgnoreWhiteSpaceAction.java | 26 - .../org/eclipse/compare/internal/ImageCanvas.java | 139 - .../eclipse/compare/internal/ImageMergeViewer.java | 145 - .../compare/internal/ImageMergeViewerCreator.java | 30 - .../internal/ImageMergeViewerResources.properties | 32 - .../compare/internal/ListContentProvider.java | 49 - .../org/eclipse/compare/internal/ListDialog.java | 90 - .../compare/internal/MergeSourceViewer.java | 410 -- .../compare/internal/MergeViewerAction.java | 44 - .../internal/MergeViewerContentProvider.java | 199 - .../org/eclipse/compare/internal/NullViewer.java | 35 - .../compare/internal/OverlayPreferenceStore.java | 452 -- .../compare/internal/ReplaceWithEditionAction.java | 20 - .../internal/ReplaceWithEditionAction.properties | 40 - .../internal/ReplaceWithPreviousEditionAction.java | 21 - .../eclipse/compare/internal/ResizableDialog.java | 163 - .../compare/internal/ResourceCompareInput.java | 423 -- .../compare/internal/ShowPseudoConflicts.java | 26 - .../eclipse/compare/internal/SimpleTextViewer.java | 65 - .../compare/internal/StreamMergerDescriptor.java | 47 - .../internal/StructureCreatorDescriptor.java | 57 - .../eclipse/compare/internal/TabFolderLayout.java | 53 - .../compare/internal/TextMergeViewerCreator.java | 31 - .../compare/internal/TextViewerCreator.java | 32 - .../eclipse/compare/internal/TokenComparator.java | 175 - .../org/eclipse/compare/internal/Utilities.java | 592 --- .../eclipse/compare/internal/ViewerDescriptor.java | 65 - .../compare/internal/ViewerSwitchingCancelled.java | 19 - .../compare/internal/merge/LineComparator.java | 69 - .../compare/internal/merge/MergeMessages.java | 33 - .../internal/merge/MergeMessages.properties | 15 - .../compare/internal/merge/TextStreamMerger.java | 97 - .../internal/patch/CompareWithPatchAction.java | 154 - .../org/eclipse/compare/internal/patch/Diff.java | 102 - .../org/eclipse/compare/internal/patch/Hunk.java | 132 - .../compare/internal/patch/InputPatchPage.java | 532 --- .../eclipse/compare/internal/patch/LineReader.java | 134 - .../compare/internal/patch/PatchErrorDialog.java | 19 - .../compare/internal/patch/PatchMessages.java | 33 - .../internal/patch/PatchMessages.properties | 91 - .../compare/internal/patch/PatchWizard.java | 135 - .../eclipse/compare/internal/patch/Patcher.java | 1081 ----- .../compare/internal/patch/PreviewPatchPage.java | 740 ---- .../compare/org/eclipse/compare/package.html | 113 - .../rangedifferencer/DifferencesIterator.java | 77 - .../compare/rangedifferencer/IRangeComparator.java | 60 - .../rangedifferencer/LinkedRangeDifference.java | 57 - .../compare/rangedifferencer/RangeDifference.java | 208 - .../compare/rangedifferencer/RangeDifferencer.java | 536 --- .../eclipse/compare/rangedifferencer/package.html | 44 - .../structuremergeviewer/DiffContainer.java | 107 - .../compare/structuremergeviewer/DiffElement.java | 93 - .../compare/structuremergeviewer/DiffNode.java | 365 -- .../structuremergeviewer/DiffTreeViewer.java | 727 ---- .../DiffTreeViewerResources.properties | 53 - .../compare/structuremergeviewer/Differencer.java | 529 --- .../structuremergeviewer/DocumentRangeNode.java | 358 -- .../structuremergeviewer/ICompareInput.java | 142 - .../ICompareInputChangeListener.java | 38 - .../structuremergeviewer/IDiffContainer.java | 62 - .../compare/structuremergeviewer/IDiffElement.java | 61 - .../structuremergeviewer/IStructureComparator.java | 45 - .../structuremergeviewer/IStructureCreator.java | 110 - .../structuremergeviewer/StructureDiffViewer.java | 375 -- .../compare/structuremergeviewer/package.html | 79 - 130 files changed, 26553 deletions(-) delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/BufferedContent.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareConfiguration.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareEditorInput.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareUI.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareViewerPane.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareViewerSwitchingPane.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/EditionSelectionDialog.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/HistoryItem.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/ICompareNavigator.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/IContentChangeListener.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/IContentChangeNotifier.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/IEditableContent.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/IEncodedStreamContentAccessor.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/IModificationDate.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/IPropertyChangeNotifier.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/IStreamContentAccessor.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/IStreamMerger.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/ITypedElement.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/IViewerCreator.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/NavigationAction.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/ResourceNode.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/Splitter.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/ZipFileStructureCreator.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ContentMergeViewer.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/IDocumentRange.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/IMergeViewerContentProvider.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ITokenComparator.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewer.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewerResources.properties delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/package.html delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/AbstractViewer.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryAction.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryAction.properties delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryDialog.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BaseCompareAction.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewer.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewerCreator.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewerResources.properties delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BufferedCanvas.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BufferedResourceNode.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ChangePropertyAction.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareAction.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareDialog.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditor.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditorContributor.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareFilter.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareMessages.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareMessages.properties delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareNavigator.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareOutlinePage.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ComparePreferencePage.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareUIPlugin.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithEditionAction.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithEditionAction.properties delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/DiffImage.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/DocLineComparator.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/DocumentManager.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/EditionAction.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ExceptionHandler.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ICompareContextIds.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/INavigatable.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/IOpenable.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/IResourceProvider.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ISavable.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/IViewerDescriptor.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/IgnoreWhiteSpaceAction.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageCanvas.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewer.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewerCreator.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewerResources.properties delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ListContentProvider.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ListDialog.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeSourceViewer.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeViewerAction.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeViewerContentProvider.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/NullViewer.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/OverlayPreferenceStore.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithEditionAction.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithEditionAction.properties delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithPreviousEditionAction.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ResizableDialog.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ResourceCompareInput.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ShowPseudoConflicts.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/SimpleTextViewer.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/StreamMergerDescriptor.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/StructureCreatorDescriptor.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/TabFolderLayout.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/TextMergeViewerCreator.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/TextViewerCreator.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/TokenComparator.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/Utilities.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ViewerDescriptor.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ViewerSwitchingCancelled.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/LineComparator.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/MergeMessages.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/MergeMessages.properties delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/TextStreamMerger.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/CompareWithPatchAction.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/Diff.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/Hunk.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/InputPatchPage.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/LineReader.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchErrorDialog.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.properties delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchWizard.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/Patcher.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PreviewPatchPage.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/package.html delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/DifferencesIterator.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/IRangeComparator.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/LinkedRangeDifference.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/RangeDifference.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/RangeDifferencer.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/package.html delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffContainer.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffElement.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffNode.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffTreeViewer.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffTreeViewerResources.properties delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/Differencer.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DocumentRangeNode.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/ICompareInput.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/ICompareInputChangeListener.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IDiffContainer.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IDiffElement.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IStructureComparator.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IStructureCreator.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/StructureDiffViewer.java delete mode 100644 bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/package.html (limited to 'bundles/org.eclipse.compare/compare') diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/BufferedContent.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/BufferedContent.java deleted file mode 100644 index 5e352752a..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/BufferedContent.java +++ /dev/null @@ -1,130 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare; - -import java.io.*; -import org.eclipse.jface.util.ListenerList; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.compare.internal.Utilities; - -/** - * Abstract implementation for a buffered IStreamContentAccessor. - *

- * Subclasses must implement the createStream method - * to connect the buffered content with a streamable source (e.g., a file). - *

- * As long as the contents of BufferedContent is only retrieved as an input stream - * (by means of getContents) and the BufferedContent is not modified (with - * setContent) no buffering takes place. - * Buffering starts when either method getContent or setContent is called. - * - * @see IContentChangeNotifier - * @see IStreamContentAccessor - */ -public abstract class BufferedContent implements IContentChangeNotifier, IStreamContentAccessor { - - byte[] fContent; - private ListenerList fListenerList; - - /** - * Creates a buffered stream content accessor. - */ - protected BufferedContent() { - // empty implementation - } - - /* (non-Javadoc) - * see IStreamContentAccessor.getContents - */ - public InputStream getContents() throws CoreException { - if (fContent != null) - return new ByteArrayInputStream(fContent); - return createStream(); - } - - /** - * Creates and returns a stream for reading the contents. - *

- * Subclasses must implement this method. - *

- * - * @return the stream from which the content is read - * @exception CoreException if the contents could not be accessed - */ - protected abstract InputStream createStream() throws CoreException; - - /** - * Sets the contents. Registered content change listeners are notified. - * - * @param contents the new contents - */ - public void setContent(byte[] contents) { - fContent= contents; - fireContentChanged(); - } - - /** - * Returns the contents as an array of bytes. - * - * @return the contents as an array of bytes, or null if - * the contents could not be accessed - */ - public byte[] getContent() { - if (fContent == null) { - try { - InputStream is= createStream(); - fContent= Utilities.readBytes(is); - } catch(CoreException ex) { - // NeedWork - } - } - return fContent; - } - - /** - * Discards the buffered content. - */ - public void discardBuffer() { - fContent= null; - } - - /* (non-Javadoc) - * see IContentChangeNotifier.addChangeListener - */ - public void addContentChangeListener(IContentChangeListener listener) { - if (fListenerList == null) - fListenerList= new ListenerList(); - fListenerList.add(listener); - } - - /* (non-Javadoc) - * see IContentChangeNotifier.removeChangeListener - */ - public void removeContentChangeListener(IContentChangeListener listener) { - if (fListenerList != null) { - fListenerList.remove(listener); - if (fListenerList.isEmpty()) - fListenerList= null; - } - } - - /** - * Notifies all registered IContentChangeListeners of a content change. - */ - protected void fireContentChanged() { - if (fListenerList != null) { - Object[] listeners= fListenerList.getListeners(); - for (int i= 0; i < listeners.length; i++) - ((IContentChangeListener)listeners[i]).contentChanged(this); - } - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareConfiguration.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareConfiguration.java deleted file mode 100644 index 8a5e89b1f..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareConfiguration.java +++ /dev/null @@ -1,450 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare; - -import java.util.HashMap; - -import org.eclipse.swt.graphics.*; - -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.util.*; -import org.eclipse.jface.preference.IPreferenceStore; - -import org.eclipse.compare.internal.*; -import org.eclipse.compare.structuremergeviewer.Differencer; - -/** - * A CompareConfiguration object - * controls various UI aspects of compare/merge viewers like - * title labels and images, or whether a side of a merge viewer is editable. - * In addition to these fixed properties ICompareConfiguration provides - * API for an open ended set of properties. Different viewers which share the same - * configuration can communicate via this mechanism. E.g. if a compare editor - * has a button for controlling whether compare viewers ignore white space, - * the button would trigger a change of the boolean IGNORE_WHITESPACE property - * and all interested viewers would receive notification. - *

- * Suitable default labels are provided (without images); both the left and right sides - * are editable. - *

- *

- * Clients may use this class as is, or subclass to add new state and behavior. - *

- */ -public class CompareConfiguration { - - /** - * Name of the ignore whitespace property (value "IGNORE_WHITESPACE"). - */ - public static final String IGNORE_WHITESPACE= "IGNORE_WHITESPACE"; //$NON-NLS-1$ - /** - * Name of the show pseudo conflicts property (value "SHOW_PSEUDO_CONFLICTS"). - */ - public static final String SHOW_PSEUDO_CONFLICTS= "SHOW_PSEUDO_CONFLICTS"; //$NON-NLS-1$ - /** - * Name of the use outline view property (value "USE_OUTLINE_VIEW"). - * @since 3.0 - */ - public static final String USE_OUTLINE_VIEW= "USE_OUTLINE_VIEW"; //$NON-NLS-1$ - - - private static final int WIDTH= 22; - - private static ImageDescriptor[] fgImages= new ImageDescriptor[16]; - private static Object fgDummy= new Object(); - private static HashMap fgMap= new HashMap(20); - private static boolean fLeftIsLocal= true; - - static { - if (fLeftIsLocal) { - fgImages[Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/del_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.LEFT + Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/r_inadd_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.RIGHT + Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/r_outadd_ov.gif"); //$NON-NLS-1$ - - fgImages[Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/add_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.LEFT + Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/r_indel_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.RIGHT + Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/r_outdel_ov.gif"); //$NON-NLS-1$ - - fgImages[Differencer.LEFT + Differencer.CHANGE]= CompareUIPlugin.getImageDescriptor("ovr16/r_inchg_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.RIGHT + Differencer.CHANGE]= CompareUIPlugin.getImageDescriptor("ovr16/r_outchg_ov.gif"); //$NON-NLS-1$ - } else { - fgImages[Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/add_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.LEFT + Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/inadd_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.RIGHT + Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/outadd_ov.gif"); //$NON-NLS-1$ - - fgImages[Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/del_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.LEFT + Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/indel_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.RIGHT + Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/outdel_ov.gif"); //$NON-NLS-1$ - - fgImages[Differencer.LEFT + Differencer.CHANGE]= CompareUIPlugin.getImageDescriptor("ovr16/inchg_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.RIGHT + Differencer.CHANGE]= CompareUIPlugin.getImageDescriptor("ovr16/outchg_ov.gif"); //$NON-NLS-1$ - } - - fgImages[Differencer.CONFLICTING + Differencer.ADDITION]= CompareUIPlugin.getImageDescriptor("ovr16/confadd_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.CONFLICTING + Differencer.DELETION]= CompareUIPlugin.getImageDescriptor("ovr16/confdel_ov.gif"); //$NON-NLS-1$ - fgImages[Differencer.CONFLICTING + Differencer.CHANGE]= CompareUIPlugin.getImageDescriptor("ovr16/confchg_ov.gif"); //$NON-NLS-1$ - } - - private IPreferenceStore fPreferenceStore; - private ListenerList fListeners= new ListenerList(); - private HashMap fProperties= new HashMap(); - private boolean fLeftEditable= true; - private boolean fRightEditable= true; - private String fAncestorLabel; - private String fLeftLabel; - private String fRightLabel; - private Image fAncestorImage; - private Image fRightImage; - private Image fLeftImage; - private Image[] fImages= new Image[16]; - - /** - * Creates a new configuration with editable left and right sides, - * suitable default labels, and no images. - * The given preference store is used to connect this configuration - * with the Compare preference page properties ComparePreferencePage.INITIALLY_SHOW_ANCESTOR_PANE, - * and CompareConfiguration.IGNORE_WHITESPACE. - * - * @param prefStore the preference store which this configuration holds onto. - * @since 2.0 - */ - public CompareConfiguration(IPreferenceStore prefStore) { - - setProperty("LEFT_IS_LOCAL", new Boolean(fLeftIsLocal)); //$NON-NLS-1$ - - fPreferenceStore= prefStore; - if (fPreferenceStore != null) { - boolean b= fPreferenceStore.getBoolean(ComparePreferencePage.INITIALLY_SHOW_ANCESTOR_PANE); - setProperty(ComparePreferencePage.INITIALLY_SHOW_ANCESTOR_PANE, new Boolean(b)); - - b= fPreferenceStore.getBoolean(ComparePreferencePage.IGNORE_WHITESPACE); - setProperty(CompareConfiguration.IGNORE_WHITESPACE, new Boolean(b)); - } - } - - /** - * Creates a new configuration with editable left and right sides, - * suitable default labels, and no images. - * This configuration uses the preference store of the Compare plugin - * (CompareUIPlugin.getDefault().getPreferenceStore()). - */ - public CompareConfiguration() { - this(CompareUIPlugin.getDefault().getPreferenceStore()); - } - - /** - * Returns the preference store of this configuration. - * @return the preference store of this configuration. - * @since 2.0 - */ - public IPreferenceStore getPreferenceStore() { - return fPreferenceStore; - } - - /** - * Returns an image showing the specified change kind. - * The different kind of changes are defined in the Differencer. - * Newly created images are remembered by this class and - * disposed when the dispose method is called. - * - * @param kind the kind of change as defined in Differencer. - * @return an modification of the base image reflecting the kind of change. - * @see org.eclipse.compare.structuremergeviewer.Differencer - * @since 2.0 - */ - public Image getImage(int kind) { - Image image= fImages[kind & 15]; - if (image == null) { - ImageDescriptor id= fgImages[kind & 15]; - if (id != null) - image= id.createImage(); - fImages[kind & 15]= image; - } - return image; - } - - /** - * Returns an image showing the specified change kind applied to a - * given base image. The different kind of changes are defined in the Differencer. - * Typically an implementation would build a composite image - * from the given base image and an image representing the change kind. - * Newly created images are remembered by this class and - * disposed when the dispose method is called. - * - * @param base the image which is modified to reflect the kind of change - * @param kind the kind of change as defined in Differencer. - * @return an modification of the base image reflecting the kind of change. - * @see org.eclipse.compare.structuremergeviewer.Differencer - */ - public Image getImage(Image base, int kind) { - - Object key= base; - if (key == null) - key= fgDummy; - - kind &= 15; - - Image[] a= (Image[]) fgMap.get(key); - if (a == null) { - a= new Image[16]; - fgMap.put(key, a); - } - Image b= a[kind]; - if (b == null) { - b= new DiffImage(base, fgImages[kind], WIDTH, !fLeftIsLocal).createImage(); - CompareUI.disposeOnShutdown(b); - a[kind]= b; - } - return b; - } - - /** - * Dispose of this compare configuration. - * This method is called if the compare configuration is no longer used. - * An implementation must dispose of all resources. - */ - public void dispose() { - if (fImages != null) { - for (int i= 0; i < fImages.length; i++){ - Image image= fImages[i]; - if (image != null && !image.isDisposed()) - image.dispose(); - } - } - fImages= null; - } - - /** - * Fires a PropertyChangeEvent to registered listeners. - * - * @param propertyName the name of the property that has changed - * @param oldValue the property's old value - * @param newValue the property's new value - */ - private void fireChange(String propertyName, Object oldValue, Object newValue) { - PropertyChangeEvent event= null; - Object[] listeners= fListeners.getListeners(); - if (listeners != null) { - for (int i= 0; i < listeners.length; i++) { - IPropertyChangeListener l= (IPropertyChangeListener) listeners[i]; - if (event == null) - event= new PropertyChangeEvent(this, propertyName, oldValue, newValue); - l.propertyChange(event); - } - } - } - - /* (non javadoc) - * see IPropertyChangeNotifier.addListener - */ - public void addPropertyChangeListener(IPropertyChangeListener listener) { - fListeners.add(listener); - } - - /* (non javadoc) - * see IPropertyChangeNotifier.removeListener - */ - public void removePropertyChangeListener(IPropertyChangeListener listener) { - fListeners.remove(listener); - } - - /** - * Sets the property with the given name. - * If the new value differs from the old a PropertyChangeEvent - * is sent to registered listeners. - * - * @param key the name of the property to set - * @param newValue the new value of the property - */ - public void setProperty(String key, Object newValue) { - Object oldValue= fProperties.get(key); - fProperties.put(key, newValue); - if (oldValue == null || !oldValue.equals(newValue)) - fireChange(key, oldValue, newValue); - } - - /** - * Returns the property with the given name, or null - * if no such property exists. - * - * @param key the name of the property to retrieve - * @return the property with the given name, or null if not found - */ - public Object getProperty(String key) { - return fProperties.get(key); - } - - //---- ancestor - - /** - * Sets the label to use for the ancestor of compare/merge viewers. - * - * @param label the new label for the ancestor of compare/merge viewers - */ - public void setAncestorLabel(String label) { - fAncestorLabel= label; - } - - /** - * Returns the label for the ancestor side of compare/merge viewers. - * This label is typically shown in the title of the ancestor area in a compare viewer. - * - * @param element the input object of a compare/merge viewer or null - * @return the label for the ancestor side or null - */ - public String getAncestorLabel(Object element) { - return fAncestorLabel; - } - - /** - * Sets the image to use for the ancestor of compare/merge viewers. - * The CompareConfiguration does not automatically dispose the old image. - * - * @param image the new image for the ancestor of compare/merge viewers - */ - public void setAncestorImage(Image image) { - fAncestorImage= image; - } - - /** - * Returns the image for the ancestor side of compare/merge viewers. - * This image is typically shown in the title of the ancestor area in a compare viewer. - * - * @param element the input object of a compare/merge viewer or null - * @return the image for the ancestor side or null - */ - public Image getAncestorImage(Object element) { - return fAncestorImage; - } - - //---- left side - - /** - * Controls whether the left side of a merge viewer is editable. - * - * @param editable if the value is true left side is editable - */ - public void setLeftEditable(boolean editable) { - fLeftEditable= editable; - } - - /** - * Returns whether the left hand side of a merge viewer is editable. - * - * @return true if the left hand side is editable - */ - public boolean isLeftEditable() { - return fLeftEditable; - } - - /** - * Sets the label to use for the left side of compare/merge viewers. - * - * @param label the new label for the left side of compare/merge viewers - */ - public void setLeftLabel(String label) { - fLeftLabel= label; - } - - /** - * Returns the label for the left hand side of compare/merge viewers. - * This label is typically shown in the title of the left side of a compare viewer. - * - * @param element the input object of a compare/merge viewer or null - * @return the label for the left hand side or null - */ - public String getLeftLabel(Object element) { - return fLeftLabel; - } - - /** - * Sets the image to use for the left side of compare/merge viewers. - * The compare configuration does not automatically dispose the old image. - * - * @param image the new image for the left side of compare/merge viewers - */ - public void setLeftImage(Image image) { - fLeftImage= image; - } - - /** - * Returns the image for the left hand side of compare/merge viewers. - * This image is typically shown in the title of the left side of a compare viewer. - * - * @param element the input object of a compare/merge viewer or null - * @return the image for the left hand side or null - */ - public Image getLeftImage(Object element) { - return fLeftImage; - } - - //---- right side - - /** - * Controls whether the right side of a merge viewer is editable. - * - * @param editable if the value is true right side is editable - */ - public void setRightEditable(boolean editable) { - fRightEditable= editable; - } - - /** - * Returns whether the right hand side of a merge viewer is editable. - * - * @return true if the right hand side is editable - */ - public boolean isRightEditable() { - return fRightEditable; - } - - /** - * Sets the label to use for the right side of compare/merge viewers. - * - * @param label the new label for the right side of compare/merge viewers - */ - public void setRightLabel(String label) { - fRightLabel= label; - } - - /** - * Returns the label for the right hand side of compare/merge viewers. - * This label is typically shown in the title of the right side of a compare viewer. - * - * @param element the input object of a compare/merge viewer or null - * @return the label for the right hand side or null - */ - public String getRightLabel(Object element) { - return fRightLabel; - } - - /** - * Sets the image to use for the right side of compare/merge viewers. - * The compare configuration does not automatically dispose the old image. - * - * @param image the new image for the right side of compare/merge viewers - */ - public void setRightImage(Image image) { - fRightImage= image; - } - - /** - * Returns the image for the right hand side of compare/merge viewers. - * This image is typically shown in the title of the right side of a compare viewer. - * - * @param element the input object of a compare/merge viewer or null - * @return the image for the right hand side or null - */ - public Image getRightImage(Object element) { - return fRightImage; - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareEditorInput.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareEditorInput.java deleted file mode 100644 index 9cfb91b88..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareEditorInput.java +++ /dev/null @@ -1,815 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare; - -import java.lang.reflect.InvocationTargetException; - -import java.util.ArrayList; -import java.util.ResourceBundle; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.*; -import org.eclipse.swt.widgets.*; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.custom.BusyIndicator; - -import org.eclipse.core.resources.IFile; -import org.eclipse.core.runtime.*; -import org.eclipse.ui.IPersistableElement; -import org.eclipse.ui.IEditorInput; - -import org.eclipse.jface.util.*; -import org.eclipse.jface.action.Separator; -import org.eclipse.jface.action.ToolBarManager; -import org.eclipse.jface.viewers.*; -import org.eclipse.jface.operation.IRunnableWithProgress; -import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.resource.ImageDescriptor; - -import org.eclipse.compare.internal.*; -import org.eclipse.compare.structuremergeviewer.*; - - -/** - * A compare operation which can present its results in a special editor. - * Running the compare operation and presentating the results in a compare editor - * are combined in one class because it allows a client to keep the implementation - * all in one place while separating it from the innards of a specific UI implementation of compare/merge. - *

- * A CompareEditorInput defines methods for the following sequence steps: - *

- * The Compare plug-in's openCompareEditor method takes an ICompareEditorInput - * and starts sequencing through the above steps. If the compare result is not empty a new compare editor - * is opened and takes over the sequence until eventually closed. - *

- * The prepareInput method should contain the - * code of the compare operation. It is executed under control of a progress monitor - * and can be canceled. If the result of the compare is not empty, that is if there are differences - * that needs to be presented, the ICompareEditorInput should hold onto them and return them with - * the getCompareResult method. - * If the value returned from getCompareResult is not null - * a compare editor is opened on the ICompareEditorInput with title and title image initialized by the - * corresponding methods of the ICompareEditorInput. - *

- * Creation of the editor's SWT controls is delegated to the createContents method. - * Here the SWT controls must be created and initialized with the result of the compare operation. - *

- * If merging is allowed, the modification state of the compared constituents must be tracked and the dirty - * state returned from method isSaveNeeded. The value true triggers a subsequent call - * to save where the modified resources can be saved. - *

- * The most important part of this implementation is the setup of the compare/merge UI. - * The UI uses a simple browser metaphor to present compare results. - * The top half of the layout shows the structural compare results (e.g. added, deleted, and changed files), - * the bottom half the content compare results (e.g. textual differences between two files). - * A selection in the top pane is fed to the bottom pane. If a content viewer is registered - * for the type of the selected object, this viewer is installed in the pane. - * In addition if a structure viewer is registered for the selection type the top pane - * is split horizontally to make room for another pane and the structure viewer is installed - * in it. When comparing Java files this second structure viewer would show the structural - * differences within a Java file, e.g. added, deleted or changed methods and fields. - *

- * Subclasses provide custom setups, e.g. for a Catchup/Release operation - * by passing a subclass of CompareConfiguration and by implementing the prepareInput method. - * If a subclass cannot use the DiffTreeViewer which is installed by default in the - * top left pane, method createDiffViewer can be overridden. - * - * @see CompareUI - * @see CompareEditorInput - */ -public abstract class CompareEditorInput implements IEditorInput, IPropertyChangeNotifier, IRunnableWithProgress { - - private static final boolean DEBUG= false; - - /** - * The name of the "dirty" property (value "DIRTY_STATE"). - */ - public static final String DIRTY_STATE= "DIRTY_STATE"; //$NON-NLS-1$ - - private static final String COMPARE_EDITOR_IMAGE_NAME= "eview16/compare_view.gif"; //$NON-NLS-1$ - private static Image fgTitleImage; - - private Splitter fComposite; - private CompareConfiguration fCompareConfiguration; - private CompareViewerSwitchingPane fStructureInputPane; - private CompareViewerSwitchingPane fStructurePane1; - private CompareViewerSwitchingPane fStructurePane2; - private CompareViewerSwitchingPane fContentInputPane; - private CompareViewerSwitchingPane fFocusPane; - private String fMessage; - private Object fInput; - private String fTitle; - private ListenerList fListenerList= new ListenerList(); - private CompareNavigator fNavigator; - private boolean fDirty= false; - private ArrayList fDirtyViewers= new ArrayList(); - private IPropertyChangeListener fDirtyStateListener; - - private IgnoreWhiteSpaceAction fIgnoreWhitespace; - private ShowPseudoConflicts fShowPseudoConflicts; - - boolean fStructureCompareOnSingleClick= true; - boolean fUseOutlineView= false; - - /** - * Creates a CompareEditorInput which is initialized with the given - * compare configuration. - * The compare configuration is passed to subsequently created viewers. - * - * @param configuration the compare configuration - */ - public CompareEditorInput(CompareConfiguration configuration) { - fCompareConfiguration= configuration; - Assert.isNotNull(configuration); - - Object object= fCompareConfiguration.getProperty(CompareConfiguration.USE_OUTLINE_VIEW); - if (object instanceof Boolean) - fUseOutlineView= ((Boolean) object).booleanValue(); - - ResourceBundle bundle= CompareUI.getResourceBundle(); - fIgnoreWhitespace= new IgnoreWhiteSpaceAction(bundle, configuration); - fShowPseudoConflicts= new ShowPseudoConflicts(bundle, configuration); - - fDirtyStateListener= new IPropertyChangeListener() { - public void propertyChange(PropertyChangeEvent e) { - String propertyName= e.getProperty(); - if (CompareEditorInput.DIRTY_STATE.equals(propertyName)) { - boolean changed= false; - Object newValue= e.getNewValue(); - if (newValue instanceof Boolean) - changed= ((Boolean)newValue).booleanValue(); - setDirty(e.getSource(), changed); - } - } - }; - - IPreferenceStore ps= configuration.getPreferenceStore(); - if (ps != null) - fStructureCompareOnSingleClick= ps.getBoolean(ComparePreferencePage.OPEN_STRUCTURE_COMPARE); - } - - private boolean structureCompareOnSingleClick() { - return fStructureCompareOnSingleClick; - } - - /* (non Javadoc) - * see IAdaptable.getAdapter - */ - public Object getAdapter(Class adapter) { - if (ICompareNavigator.class.equals(adapter) || CompareNavigator.class.equals(adapter)) { - if (fNavigator == null) - fNavigator= new CompareNavigator( - new CompareViewerSwitchingPane[] { - fStructureInputPane, - fStructurePane1, - fStructurePane2, - fContentInputPane - } - ); - return fNavigator; - } - if (IFile.class.equals(adapter)) { - IProgressMonitor pm= new NullProgressMonitor(); - // flush changes in any dirty viewer - try { - flushViewer(fStructureInputPane, pm); - flushViewer(fStructurePane1, pm); - flushViewer(fStructurePane2, pm); - flushViewer(fContentInputPane, pm); - } catch (CoreException e) { - CompareUIPlugin.log(e); - } - IFile[] files= (IFile[]) getAdapter(IFile[].class); - if (files.length > 0) - return files[0]; // can only return one: limitation on IDE.saveAllEditors; see #64617 - return null; - } - return null; - } - - /* (non Javadoc) - * see IEditorInput.getImageDescriptor - */ - public ImageDescriptor getImageDescriptor() { - return null; - } - - /* (non Javadoc) - * see IEditorInput.getToolTipText - */ - public String getToolTipText() { - return getTitle(); - } - - /* (non Javadoc) - * see IEditorInput.getName - */ - public String getName() { - return getTitle(); - } - - /** - * Returns null since this editor cannot be persisted. - * - * @return null because this editor cannot be persisted - */ - public IPersistableElement getPersistable() { - return null; - } - - /** - * Returns false to indicate that this input - * should not appear in the "File Most Recently Used" menu. - * - * @return false - */ - public boolean exists() { - return false; - } - - /* - * FIXME! - */ - protected void setMessage(String message) { - fMessage= message; - } - - /* - * FIXME! - */ - public String getMessage() { - return fMessage; - } - - /** - * Returns the title which will be used in the compare editor's title bar. - * It can be set with setTitle. - * - * @return the title - */ - public String getTitle() { - if (fTitle == null) - return Utilities.getString("CompareEditorInput.defaultTitle"); //$NON-NLS-1$ - return fTitle; - } - - /** - * Sets the title which will be used when presenting the compare result. - * This method must be called before the editor is opened. - * - * @param title the title to use for the CompareEditor - */ - public void setTitle(String title) { - fTitle= title; - } - - /** - * Returns the title image which will be used in the compare editor's title bar. - * Returns the title image which will be used when presenting the compare result. - * This implementation returns a generic compare icon. - * Subclasses can override. - * - * @return the title image, or null if none - */ - public Image getTitleImage() { - if (fgTitleImage == null) { - fgTitleImage= CompareUIPlugin.getImageDescriptor(COMPARE_EDITOR_IMAGE_NAME).createImage(); - CompareUI.disposeOnShutdown(fgTitleImage); - } - return fgTitleImage; - } - - /** - * Returns the configuration object for the viewers within the compare editor. - * Returns the configuration which was passed to the constructor. - * - * @return the compare configuration - */ - public CompareConfiguration getCompareConfiguration() { - return fCompareConfiguration; - } - - /** - * Adds standard actions to the given ToolBarManager. - *

- * Subclasses may override to add their own actions. - *

- * - * @param toolBarManager the ToolBarManager to which to contribute - */ - public void contributeToToolBar(ToolBarManager toolBarManager) { - - toolBarManager.add(new Separator()); - toolBarManager.add(fIgnoreWhitespace); - toolBarManager.add(fShowPseudoConflicts); - } - - /** - * Runs the compare operation and stores the compare result. - * - * @param monitor the progress monitor to use to display progress and receive - * requests for cancelation - * @exception InvocationTargetException if the prepareInput method must propagate a checked exception, - * it should wrap it inside an InvocationTargetException; runtime exceptions are automatically - * wrapped in an InvocationTargetException by the calling context - * @exception InterruptedException if the operation detects a request to cancel, - * using IProgressMonitor.isCanceled(), it should exit by throwing - * InterruptedException - */ - public void run(IProgressMonitor monitor) throws InterruptedException, InvocationTargetException { - fInput= prepareInput(monitor); - } - - /** - * Runs the compare operation and returns the compare result. - * If null is returned no differences were found and no compare editor needs to be opened. - * Progress should be reported to the given progress monitor. - * A request to cancel the operation should be honored and acknowledged - * by throwing InterruptedException. - *

- * Note: this method is typically called in a modal context thread which doesn't have a Display assigned. - * Implementors of this method shouldn't therefore allocated any SWT resources in this method. - *

- * - * @param monitor the progress monitor to use to display progress and receive - * requests for cancelation - * @return the result of the compare operation, or null if there are no differences - * @exception InvocationTargetException if the prepareInput method must propagate a checked exception, - * it should wrap it inside an InvocationTargetException; runtime exceptions are automatically - * wrapped in an InvocationTargetException by the calling context - * @exception InterruptedException if the operation detects a request to cancel, - * using IProgressMonitor.isCanceled(), it should exit by throwing - * InterruptedException - */ - protected abstract Object prepareInput(IProgressMonitor monitor) - throws InvocationTargetException, InterruptedException; - - /** - * Returns the compare result computed by the most recent call to the - * run method. Returns null if no - * differences were found. - * - * @return the compare result prepared in method prepareInput - * or null if there were no differences - */ - public Object getCompareResult() { - return fInput; - } - - /** - * Create the SWT controls that are used to display the result of the compare operation. - * Creates the SWT Controls and sets up the wiring between the individual panes. - * This implementation creates all four panes but makes only the necessary ones visible. - * Finally it feeds the compare result into the top left structure viewer - * and the content viewer. - *

- * Subclasses may override if they need to change the layout or wiring between panes. - * - * @param parent the parent control under which the control must be created - * @return the SWT control hierarchy for the compare editor - */ - public Control createContents(Composite parent) { - - fComposite= new Splitter(parent, SWT.VERTICAL); - fComposite.setData(this); - - Control outline= null; - if (!fUseOutlineView) - outline= createOutlineContents(fComposite, SWT.HORIZONTAL); - - fContentInputPane= new CompareViewerSwitchingPane(fComposite, SWT.BORDER | SWT.FLAT) { - protected Viewer getViewer(Viewer oldViewer, Object input) { - if (input instanceof ICompareInput) - return findContentViewer(oldViewer, (ICompareInput)input, this); - return null; - } - }; - if (fFocusPane == null) - fFocusPane= fContentInputPane; - if (outline != null) - fComposite.setVisible(outline, false); - fComposite.setVisible(fContentInputPane, true); - - if (fStructureInputPane != null) - fComposite.setWeights(new int[] { 30, 70 }); - - fComposite.layout(); - - if (fStructureInputPane != null && fInput instanceof ICompareInput) { - fStructureInputPane.setInput(fInput); - ISelection sel= fStructureInputPane.getSelection(); - if (sel == null || sel.isEmpty()) - feed1(sel); // we only feed downstream viewers if the top left pane is empty - } - - fComposite.setData("Nav", //$NON-NLS-1$ - new CompareViewerSwitchingPane[] { - fStructureInputPane, - fStructurePane1, - fStructurePane2, - fContentInputPane - } - ); - - return fComposite; - } - - /** - * @param parent the parent control under which the control must be created - * @param direction the layout direction of the contents, either SWT.HORIZONTAL or SWT.VERTICAL - * @return the SWT control hierarchy for the outline part of the compare editor - * @since 3.0 - */ - public Control createOutlineContents(Composite parent, int direction) { - final Splitter h= new Splitter(parent, direction); - - fStructureInputPane= new CompareViewerSwitchingPane(h, SWT.BORDER | SWT.FLAT, true) { - protected Viewer getViewer(Viewer oldViewer, Object input) { - if (input instanceof DiffNode) { - DiffNode dn= (DiffNode) input; - if (dn.hasChildren()) - return createDiffViewer(this); - } - if (input instanceof ICompareInput) - return findStructureViewer(oldViewer, (ICompareInput)input, this); - return null; - } - }; - fFocusPane= fStructureInputPane; - - fStructurePane1= new CompareViewerSwitchingPane(h, SWT.BORDER | SWT.FLAT, true) { - protected Viewer getViewer(Viewer oldViewer, Object input) { - if (input instanceof ICompareInput) - return findStructureViewer(oldViewer, (ICompareInput)input, this); - return null; - } - }; - h.setVisible(fStructurePane1, false); - - fStructurePane2= new CompareViewerSwitchingPane(h, SWT.BORDER | SWT.FLAT, true) { - protected Viewer getViewer(Viewer oldViewer, Object input) { - if (input instanceof ICompareInput) - return findStructureViewer(oldViewer, (ICompareInput)input, this); - return null; - } - }; - h.setVisible(fStructurePane2, false); - - // setup the wiring for top left pane - fStructureInputPane.addOpenListener( - new IOpenListener() { - public void open(OpenEvent oe) { - feed1(oe.getSelection()); - } - } - ); - fStructureInputPane.addSelectionChangedListener( - new ISelectionChangedListener() { - public void selectionChanged(SelectionChangedEvent e) { - ISelection s= e.getSelection(); - if (s == null || s.isEmpty()) - feed1(s); - } - } - ); - fStructureInputPane.addDoubleClickListener( - new IDoubleClickListener() { - public void doubleClick(DoubleClickEvent event) { - feedDefault1(event.getSelection()); - } - } - ); - - fStructurePane1.addSelectionChangedListener( - new ISelectionChangedListener() { - public void selectionChanged(SelectionChangedEvent e) { - feed2(e.getSelection()); - } - } - ); - - fStructurePane2.addSelectionChangedListener( - new ISelectionChangedListener() { - public void selectionChanged(SelectionChangedEvent e) { - feed3(e.getSelection()); - } - } - ); - - if (fUseOutlineView) { - if (fInput instanceof ICompareInput) { - fStructureInputPane.setInput(fInput); - ISelection sel= fStructureInputPane.getSelection(); - if (sel == null || sel.isEmpty()) - feed1(sel); // we only feed downstream viewers if the top left pane is empty - } - - fComposite.setData("Nav", //$NON-NLS-1$ - new CompareViewerSwitchingPane[] { - fStructureInputPane, - fStructurePane1, - fStructurePane2, - fContentInputPane - } - ); - } - - return h; - } - - private void feed1(final ISelection selection) { - BusyIndicator.showWhile(fComposite.getDisplay(), - new Runnable() { - public void run() { - if (selection == null || selection.isEmpty()) { - Object input= fStructureInputPane.getInput(); - fContentInputPane.setInput(input); - fStructurePane2.setInput(null); // clear downstream pane - fStructurePane1.setInput(null); - } else { - Object input= getElement(selection); - fContentInputPane.setInput(input); - if (structureCompareOnSingleClick()) - fStructurePane1.setInput(input); - fStructurePane2.setInput(null); // clear downstream pane - if (fStructurePane1.getInput() != input) - fStructurePane1.setInput(null); - } - } - } - ); - } - - private void feedDefault1(final ISelection selection) { - BusyIndicator.showWhile(fComposite.getDisplay(), - new Runnable() { - public void run() { - if (!selection.isEmpty()) - fStructurePane1.setInput(getElement(selection)); - } - } - ); - } - - private void feed2(final ISelection selection) { - BusyIndicator.showWhile(fComposite.getDisplay(), - new Runnable() { - public void run() { - if (selection.isEmpty()) { - Object input= fStructurePane1.getInput(); - fContentInputPane.setInput(input); - fStructurePane2.setInput(null); - } else { - Object input= getElement(selection); - fContentInputPane.setInput(input); - fStructurePane2.setInput(input); - } - } - } - ); - } - - private void feed3(final ISelection selection) { - BusyIndicator.showWhile(fComposite.getDisplay(), - new Runnable() { - public void run() { - if (selection.isEmpty()) - fContentInputPane.setInput(fStructurePane2.getInput()); - else - fContentInputPane.setInput(getElement(selection)); - } - } - ); - - } - - /** - * Returns the first element of the given selection if the selection - * is a IStructuredSelection with exactly one element. Returns - * null otherwise. - * - * @param selection the selection - * @return the first element of the selection, or null - */ - private static Object getElement(ISelection selection) { - if (selection instanceof IStructuredSelection) { - IStructuredSelection ss= (IStructuredSelection) selection; - if (ss.size() == 1) - return ss.getFirstElement(); - } - return null; - } - - /** - * Asks this input to take focus within its container (editor). - *

- * Clients should not call this method but they may - * override if they implement a different layout with different visual - * components. Clients are free to call the inherited method. - *

- */ - public void setFocus() { - if (fFocusPane != null) { - Viewer v= fFocusPane.getViewer(); - if (v != null) { - Control c= v.getControl(); - if (c != null) - c.setFocus(); - } - } else if (fComposite != null) - fComposite.setFocus(); - } - - /** - * Factory method for creating a differences viewer for the top left pane. - * It is called from createContents and returns a DiffTreeViewer. - *

- * Subclasses may override if they need a different viewer. - *

- * - * @param parent the SWT parent control under which to create the viewer's SWT controls - * @return a compare viewer for the top left pane - */ - public Viewer createDiffViewer(Composite parent) { - return new DiffTreeViewer(parent, fCompareConfiguration); - } - - /** - * Implements the dynamic viewer switching for structure viewers. - * The method must return a compare viewer based on the old (or current) viewer - * and a new input object. If the old viewer is suitable for showing the new input the old viewer - * can be returned. Otherwise a new viewer must be created under the given parent composite or - * null can be returned to indicate that no viewer could be found. - *

- * This implementation forwards the request to CompareUI.findStructureViewer. - *

- * Subclasses may override to implement a different strategy. - *

- * @param oldViewer a new viewer is only created if this old viewer cannot show the given input - * @param input the input object for which to find a structure viewer - * @param parent the SWT parent composite under which the new viewer is created - * @return a compare viewer which is suitable for the given input object or null - */ - public Viewer findStructureViewer(Viewer oldViewer, ICompareInput input, Composite parent) { - return CompareUI.findStructureViewer(oldViewer, input, parent, fCompareConfiguration); - } - - /** - * Implements the dynamic viewer switching for content viewers. - * The method must return a compare viewer based on the old (or current) viewer - * and a new input object. If the old viewer is suitable for showing the new input the old viewer - * can be returned. Otherwise a new viewer must be created under the given parent composite or - * null can be returned to indicate that no viewer could be found. - *

- * This implementation forwards the request to CompareUI.findContentViewer. - *

- * Subclasses may override to implement a different strategy. - *

- * @param oldViewer a new viewer is only created if this old viewer cannot show the given input - * @param input the input object for which to find a structure viewer - * @param parent the SWT parent composite under which the new viewer is created - * @return a compare viewer which is suitable for the given input object or null - */ - public Viewer findContentViewer(Viewer oldViewer, ICompareInput input, Composite parent) { - - Viewer newViewer= CompareUI.findContentViewer(oldViewer, input, parent, fCompareConfiguration); - - boolean isNewViewer= newViewer != oldViewer; - if (DEBUG) System.out.println("CompareEditorInput.findContentViewer: " + isNewViewer); //$NON-NLS-1$ - - if (isNewViewer && newViewer instanceof IPropertyChangeNotifier) { - final IPropertyChangeNotifier dsp= (IPropertyChangeNotifier) newViewer; - dsp.addPropertyChangeListener(fDirtyStateListener); - - Control c= newViewer.getControl(); - c.addDisposeListener( - new DisposeListener() { - public void widgetDisposed(DisposeEvent e) { - dsp.removePropertyChangeListener(fDirtyStateListener); - } - } - ); - } - - return newViewer; - } - - /** - * Returns true if there are unsaved changes. - * The value returned is the value of the DIRTY_STATE property of this input object. - - * Returns true if this input has unsaved changes, - * that is if setDirty(true) has been called. - * Subclasses don't have to override if the functionality provided by setDirty
- * is sufficient. - * - * @return true if there are changes that need to be saved - */ - public boolean isSaveNeeded() { - return fDirty || fDirtyViewers.size() > 0; - } - - /** - * Sets the dirty state of this input to the given - * value and sends out a PropertyChangeEvent if the new value differs from the old value. - * - * @param dirty the dirty state for this compare input - */ - public void setDirty(boolean dirty) { - - boolean confirmSave= true; - Object o= fCompareConfiguration.getProperty(CompareEditor.CONFIRM_SAVE_PROPERTY); - if (o instanceof Boolean) - confirmSave= ((Boolean)o).booleanValue(); - - if (!confirmSave) { - fDirty= dirty; - if (!fDirty) - fDirtyViewers.clear(); - } - } - - private void setDirty(Object source, boolean dirty) { - Assert.isNotNull(source); - boolean oldDirty= fDirtyViewers.size() > 0; - if (dirty) - fDirtyViewers.add(source); - else - fDirtyViewers.remove(source); - boolean newDirty= fDirty || fDirtyViewers.size() > 0; - if (DEBUG) System.out.println("setDirty("+source+", "+dirty+"): " + newDirty); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - if (oldDirty != newDirty) - Utilities.firePropertyChange(fListenerList, this, DIRTY_STATE, new Boolean(oldDirty), new Boolean(newDirty)); - } - - /* (non Javadoc) - * see IPropertyChangeNotifier.addListener - */ - public void addPropertyChangeListener(IPropertyChangeListener listener) { - if (listener != null) - fListenerList.add(listener); - } - - /* (non Javadoc) - * see IPropertyChangeNotifier.removeListener - */ - public void removePropertyChangeListener(IPropertyChangeListener listener) { - if (listener != null) - fListenerList.remove(listener); - } - - /** - * Save any unsaved changes. - * Empty implementation. - * Subclasses must override to save any changes. - * - * @param pm an IProgressMonitor that the implementation of save may use to show progress - * @deprecated Override method saveChanges instead. - */ - public void save(IProgressMonitor pm) { - // empty default implementation - } - - /** - * Save any unsaved changes. - * Subclasses must override to save any changes. - * This implementation tries to flush changes in all viewers by - * calling ISavable.save on them. - * - * @param pm an IProgressMonitor that the implementation of save may use to show progress - * @throws CoreException - * @since 2.0 - */ - public void saveChanges(IProgressMonitor pm) throws CoreException { - - // flush changes in any dirty viewer - flushViewer(fStructureInputPane, pm); - flushViewer(fStructurePane1, pm); - flushViewer(fStructurePane2, pm); - flushViewer(fContentInputPane, pm); - - save(pm); - } - - private static void flushViewer(CompareViewerSwitchingPane pane, IProgressMonitor pm) throws CoreException { - if (pane != null) { - Viewer v= pane.getViewer(); - if (v instanceof ISavable) - ((ISavable)v).save(pm); - } - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareUI.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareUI.java deleted file mode 100644 index 222de63ac..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareUI.java +++ /dev/null @@ -1,323 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare; - -import java.util.ResourceBundle; - -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Composite; - -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.viewers.Viewer; - -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.content.IContentType; - -import org.eclipse.ui.IReusableEditor; -import org.eclipse.ui.IWorkbenchPage; -import org.eclipse.ui.plugin.AbstractUIPlugin; - -import org.eclipse.compare.internal.CompareUIPlugin; -import org.eclipse.compare.structuremergeviewer.ICompareInput; - - -/** - * The class CompareUI defines the entry point to initiate a configurable - * compare operation on arbitrary resources. The result of the compare - * is opened into a compare editor where the details can be browsed and - * edited in dynamically selected structure and content viewers. - *

- * The Compare UI provides a registry for content and structure compare viewers, - * which is initialized from extensions contributed to extension points - * declared by this plug-in. - */ -public final class CompareUI { - - /** - * Compare Plug-in ID (value "org.eclipse.compare"). - * @since 2.0 - */ - public static final String PLUGIN_ID= "org.eclipse.compare"; //$NON-NLS-1$ - - /** - * Image descriptor for the disabled icon of the 'Next' tool bar button. - * @since 2.0 - */ - public static final ImageDescriptor DESC_DTOOL_NEXT= CompareUIPlugin.getImageDescriptor(CompareUIPlugin.DTOOL_NEXT); - /** - * Image descriptor for the normal icon of the 'Next' tool bar button. - * @since 2.0 - */ - public static final ImageDescriptor DESC_CTOOL_NEXT= CompareUIPlugin.getImageDescriptor(CompareUIPlugin.CTOOL_NEXT); - /** - * Image descriptor for the roll-over icon of the 'Next' tool bar button. - * @since 2.0 - */ - public static final ImageDescriptor DESC_ETOOL_NEXT= CompareUIPlugin.getImageDescriptor(CompareUIPlugin.ETOOL_NEXT); - - /** - * Image descriptor for the disabled icon of the 'Previous' tool bar button. - * @since 2.0 - */ - public static final ImageDescriptor DESC_DTOOL_PREV= CompareUIPlugin.getImageDescriptor(CompareUIPlugin.DTOOL_PREV); - /** - * Image descriptor for the normal icon of the 'Previous' tool bar button. - * @since 2.0 - */ - public static final ImageDescriptor DESC_CTOOL_PREV= CompareUIPlugin.getImageDescriptor(CompareUIPlugin.CTOOL_PREV); - /** - * Image descriptor for the roll-over icon of the 'Previous' tool bar button. - * @since 2.0 - */ - public static final ImageDescriptor DESC_ETOOL_PREV= CompareUIPlugin.getImageDescriptor(CompareUIPlugin.ETOOL_PREV); - - /** - * Name of the title property of a compare viewer. - * If a property with this name is set - * on the top level SWT control of a viewer, it is used as a title in the pane's - * title bar. - */ - public static final String COMPARE_VIEWER_TITLE= "org.eclipse.compare.CompareUI.CompareViewerTitle"; //$NON-NLS-1$ - - private CompareUI() { - // empty implementation - } - - public static AbstractUIPlugin getPlugin() { - return CompareUIPlugin.getDefault(); - } - - /** - * Returns this plug-in's resource bundle. - * - * @return the plugin's resource bundle - */ - public static ResourceBundle getResourceBundle() { - return CompareUIPlugin.getDefault().getResourceBundle(); - } - - /** - * Performs the comparison described by the given input and opens a - * compare editor on the result in the currently active workbench page. - * - * @param input the input on which to open the compare editor - */ - public static void openCompareEditor(CompareEditorInput input) { - openCompareEditorOnPage(input, null); - } - - /** - * Performs the comparison described by the given input and opens a - * compare editor on the result in the given workbench page. - * - * @param input the input on which to open the compare editor - * @param page the workbench page in which to open the compare editor - * @since 2.1 - */ - public static void openCompareEditorOnPage(CompareEditorInput input, IWorkbenchPage page) { - CompareUIPlugin plugin= CompareUIPlugin.getDefault(); - if (plugin != null) - plugin.openCompareEditor(input, page, null); - } - - /** - * Performs the comparison described by the given input and - * shows the result in the given editor. - * - * @param input the input on which to open the compare editor - * @param editor the compare editor to reuse or null to create a new one - * @since 3.0 - */ - public static void reuseCompareEditor(CompareEditorInput input, IReusableEditor editor) { - CompareUIPlugin plugin= CompareUIPlugin.getDefault(); - if (plugin != null) - plugin.openCompareEditor(input, null, editor); - } - - /** - * Performs the comparison described by the given input and opens a - * modal compare dialog on the result. - * - * @param input the input on which to open the compare dialog - */ - public static void openCompareDialog(CompareEditorInput input) { - CompareUIPlugin plugin= CompareUIPlugin.getDefault(); - if (plugin != null) - plugin.openCompareDialog(input); - } - - /** - * Registers an image descriptor for the given type. - * - * @param type the type - * @param descriptor the image descriptor - */ - public static void registerImageDescriptor(String type, ImageDescriptor descriptor) { - CompareUIPlugin.registerImageDescriptor(type, descriptor); - } - - /** - * Returns a shared image for the given type, or a generic image if none - * has been registered for the given type. - *

- * Note: Images returned from this method will be automatically disposed - * of when this plug-in shuts down. Callers must not dispose of these - * images themselves. - *

- * - * @param type the type - * @return the image - */ - public static Image getImage(String type) { - return CompareUIPlugin.getImage(type); - } - - /** - * Registers the given image for being disposed when this plug-in is shutdown. - * - * @param image the image to register for disposal - */ - public static void disposeOnShutdown(Image image) { - CompareUIPlugin.disposeOnShutdown(image); - } - - /** - * Returns a shared image for the given adaptable. - * This convenience method queries the given adaptable - * for its IWorkbenchAdapter.getImageDescriptor, which it - * uses to create an image if it does not already have one. - *

- * Note: Images returned from this method will be automatically disposed - * of when this plug-in shuts down. Callers must not dispose of these - * images themselves. - *

- * - * @param adaptable the adaptable for which to find an image - * @return an image - */ - public static Image getImage(IAdaptable adaptable) { - return CompareUIPlugin.getImage(adaptable); - } - - - /** - * Creates a stream merger for the given content type. - * If no stream merger is registered for the given content type null is returned. - * - * @param type the type for which to find a stream merger - * @return a stream merger for the given type, or null if no - * stream merger has been registered - */ - public static IStreamMerger createStreamMerger(IContentType type) { - return CompareUIPlugin.getDefault().createStreamMerger(type); - } - - /** - * Creates a stream merger for the given file extension. - * If no stream merger is registered for the file extension null is returned. - * - * @param type the type for which to find a stream merger - * @return a stream merger for the given type, or null if no - * stream merger has been registered - */ - public static IStreamMerger createStreamMerger(String type) { - return CompareUIPlugin.getDefault().createStreamMerger(type); - } - - /** - * Returns a structure compare viewer based on an old viewer and an input object. - * If the old viewer is suitable for showing the input, the old viewer - * is returned. Otherwise, the input's type is used to find a viewer descriptor in the registry - * which in turn is used to create a structure compare viewer under the given parent composite. - * If no viewer descriptor can be found null is returned. - * - * @param oldViewer a new viewer is only created if this old viewer cannot show the given input - * @param input the input object for which to find a structure viewer - * @param parent the SWT parent composite under which the new viewer is created - * @param configuration a configuration which is passed to a newly created viewer - * @return the compare viewer which is suitable for the given input object or null - */ - public static Viewer findStructureViewer(Viewer oldViewer, ICompareInput input, Composite parent, - CompareConfiguration configuration) { - - return CompareUIPlugin.getDefault().findStructureViewer(oldViewer, input, parent, configuration); - } - - /** - * Returns a content compare viewer based on an old viewer and an input object. - * If the old viewer is suitable for showing the input the old viewer - * is returned. Otherwise the input's type is used to find a viewer descriptor in the registry - * which in turn is used to create a content compare viewer under the given parent composite. - * If no viewer descriptor can be found null is returned. - * - * @param oldViewer a new viewer is only created if this old viewer cannot show the given input - * @param input the input object for which to find a content viewer - * @param parent the SWT parent composite under which the new viewer is created - * @param configuration a configuration which is passed to a newly created viewer - * @return the compare viewer which is suitable for the given input object or null - */ - public static Viewer findContentViewer(Viewer oldViewer, ICompareInput input, Composite parent, - CompareConfiguration configuration) { - return CompareUIPlugin.getDefault().findContentViewer(oldViewer, input, parent, configuration); - } - - /** - * Returns a content compare viewer based on an old viewer and an input - * object. If the old viewer is suitable for showing the input the old - * viewer is returned. Otherwise the input's type is used to find a viewer - * descriptor in the registry which in turn is used to create a content - * compare viewer under the given parent composite. In order to determine - * the input's type, the input must either implement IStreamContentAccessor - * and ITypedElement or ICompareInput. If no viewer descriptor can be found - * null is returned. - * - * @param oldViewer a new viewer is only created if this old viewer cannot show the given input - * @param input the input object for which to find a content viewer. Must - * implement either IStreamContentAccessor and - * ITypedElement or ICompareInput. - * @param parent the SWT parent composite under which the new viewer is created - * @param configuration a configuration which is passed to a newly created viewer - * @return the compare viewer which is suitable for the given input object or null - */ - public static Viewer findContentViewer(Viewer oldViewer, Object input, Composite parent, - CompareConfiguration configuration) { - - return CompareUIPlugin.getDefault().findContentViewer(oldViewer, input, parent, configuration); - } - - /** - * Adds an alias for the given type. - * Subsequent calls to findStructureViewer - * treat alias as a synonym for type and return the same viewer. - *

- * Note: this method is for internal use only. Clients should not call this method. - * @param type a type name for which a viewer has been registered - * @param alias a type name which should be treated as a synonym of type - * @since 2.0 - */ - public static void addStructureViewerAlias(String type, String alias) { - CompareUIPlugin.getDefault().addStructureViewerAlias(type, alias); - } - - /** - * Remove all aliases for the given type. This method does not affect - * the initial binding between type and viewer. If no aliases exist for the - * given type this method does nothing. - *

- * Note: this method is for internal use only. Clients should not call this method. - * @param type the type name for which all synonymes are removed. - * @since 2.0 - */ - public static void removeAllStructureViewerAliases(String type) { - CompareUIPlugin.getDefault().removeAllStructureViewerAliases(type); - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareViewerPane.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareViewerPane.java deleted file mode 100644 index 646f99092..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareViewerPane.java +++ /dev/null @@ -1,151 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.*; -import org.eclipse.swt.events.*; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.widgets.*; - -import org.eclipse.jface.action.ToolBarManager; - -/** - * A CompareViewerPane is a convenience class which installs a - * CLabel and a Toolbar in a ViewForm. - *

- * Double clicking onto the CompareViewerPane's title bar maximizes - * the CompareViewerPane to the size of an enclosing Splitter - * (if there is one). - * If more Splitters are nested maximizing walks up and - * maximizes to the outermost Splitter. - * - * @since 2.0 - */ -public class CompareViewerPane extends ViewForm { - - private ToolBarManager fToolBarManager; - - /** - * Constructs a new instance of this class given its parent - * and a style value describing its behavior and appearance. - * - * @param container a widget which will be the container of the new instance (cannot be null) - * @param style the style of widget to construct - * - * @exception IllegalArgumentException

- * @exception org.eclipse.swt.SWTException - */ - public CompareViewerPane(Composite container, int style) { - super(container, style); - - marginWidth= 0; - marginHeight= 0; - - CLabel label= new CLabel(this, SWT.NONE) { - public Point computeSize(int wHint, int hHint, boolean changed) { - return super.computeSize(wHint, Math.max(24, hHint), changed); - } - }; - setTopLeft(label); - - MouseAdapter ml= new MouseAdapter() { - public void mouseDoubleClick(MouseEvent e) { - Control content= getContent(); - if (content != null && content.getBounds().contains(e.x, e.y)) - return; - Control parent= getParent(); - if (parent instanceof Splitter) - ((Splitter)parent).setMaximizedControl(CompareViewerPane.this); - } - }; - - addMouseListener(ml); - label.addMouseListener(ml); - - addDisposeListener(new DisposeListener() { - public void widgetDisposed(DisposeEvent e) { - if (fToolBarManager != null) { - fToolBarManager.removeAll(); - fToolBarManager= null; - } - } - }); - } - - /** - * Set the pane's title text. - * The value null clears it. - * - * @param label the text to be displayed in the pane or null - */ - public void setText(String label) { - CLabel cl= (CLabel) getTopLeft(); - if (cl != null) - cl.setText(label); - } - - /** - * Set the pane's title Image. - * The value null clears it. - * - * @param image the image to be displayed in the pane or null - */ - public void setImage(Image image) { - CLabel cl= (CLabel) getTopLeft(); - if (cl != null) - cl.setImage(image); - } - - /** - * Returns a ToolBarManager if the given parent is a - * CompareViewerPane or null otherwise. - * - * @param parent a Composite or null - * @return a ToolBarManager if the given parent is a CompareViewerPane otherwise null - */ - public static ToolBarManager getToolBarManager(Composite parent) { - if (parent instanceof CompareViewerPane) { - CompareViewerPane pane= (CompareViewerPane) parent; - return pane.getToolBarManager(); - } - return null; - } - - /** - * Clears tool items in the CompareViewerPane's control bar. - * - * @param parent a Composite or null - */ - public static void clearToolBar(Composite parent) { - ToolBarManager tbm= getToolBarManager(parent); - if (tbm != null) { - tbm.removeAll(); - tbm.update(true); - } - } - - //---- private stuff - - private ToolBarManager getToolBarManager() { - if (fToolBarManager == null) { - ToolBar tb= new ToolBar(this, SWT.FLAT); - setTopCenter(tb); - fToolBarManager= new ToolBarManager(tb); - } - return fToolBarManager; - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareViewerSwitchingPane.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareViewerSwitchingPane.java deleted file mode 100644 index 1b5c92d8f..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/CompareViewerSwitchingPane.java +++ /dev/null @@ -1,369 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare; - -import java.text.MessageFormat; - -import org.eclipse.swt.events.*; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.*; - -import org.eclipse.jface.util.ListenerList; -import org.eclipse.jface.viewers.*; - -import org.eclipse.compare.internal.*; -import org.eclipse.compare.structuremergeviewer.ICompareInput; - - -/** - * A custom CompareViewerPane that supports dynamic viewer switching. - * - *

- * Clients must implement the viewer switching strategy by implementing - * the getViewer(Viewer, Object) method. - *

- * If a property with the name CompareUI.COMPARE_VIEWER_TITLE is set - * on the top level SWT control of a viewer, it is used as a title in the CompareViewerPane's - * title bar. - * - * @since 2.0 - */ -public abstract class CompareViewerSwitchingPane extends CompareViewerPane - implements ISelectionChangedListener, ISelectionProvider, IDoubleClickListener { - - private Viewer fViewer; - private Object fInput; - private ListenerList fSelectionListeners= new ListenerList(); - private ListenerList fDoubleClickListener= new ListenerList(); - private ListenerList fOpenListener= new ListenerList(); - private boolean fControlVisibility= false; - private String fTitle; - private String fTitleArgument; - - private IOpenListener fOpenHandler= new IOpenListener() { - public void open(OpenEvent event) { - Object[] listeners= fOpenListener.getListeners(); - for (int i= 0; i < listeners.length; i++) - ((IOpenListener) listeners[i]).open(event); - } - }; - - /** - * Creates a CompareViewerSwitchingPane as a child of the given parent and with the - * specified SWT style bits. - * - * @param parent a widget which will be the parent of the new instance (cannot be null) - * @param style the style of widget to construct - * - * @exception IllegalArgumentException

- * @exception org.eclipse.swt.SWTException - */ - public CompareViewerSwitchingPane(Composite parent, int style) { - this(parent, style, false); - } - - /** - * Creates a CompareViewerSwitchingPane as a child of the given parent and with the - * specified SWT style bits. - * - * @param parent a widget which will be the parent of the new instance (cannot be null) - * @param style the style of widget to construct - * @param visibility the initial visibility of the CompareViewerSwitchingPane - * - * @exception IllegalArgumentException - * @exception org.eclipse.swt.SWTException - */ - public CompareViewerSwitchingPane(Composite parent, int style, boolean visibility) { - super(parent, style); - - fControlVisibility= visibility; - - setViewer(new NullViewer(this)); - - addDisposeListener( - new DisposeListener() { - public void widgetDisposed(DisposeEvent e) { - if (fViewer != null) - fViewer.removeSelectionChangedListener(CompareViewerSwitchingPane.this); - if (fViewer instanceof StructuredViewer) { - StructuredViewer sv= (StructuredViewer) fViewer; - sv.removeDoubleClickListener(CompareViewerSwitchingPane.this); - sv.removeOpenListener(fOpenHandler); - } - fViewer= null; - fInput= null; - fSelectionListeners= null; - } - } - ); - } - - /** - * Returns the current viewer. - * - * @return the current viewer - */ - public Viewer getViewer() { - return fViewer; - } - - private void setViewer(Viewer newViewer) { - - if (newViewer == fViewer) - return; - - boolean oldEmpty= isEmpty(); - - if (fViewer != null) { - - fViewer.removeSelectionChangedListener(this); - - if (fViewer instanceof StructuredViewer) { - StructuredViewer sv= (StructuredViewer) fViewer; - sv.removeDoubleClickListener(this); - sv.removeOpenListener(fOpenHandler); - } - - Control content= getContent(); - setContent(null); - - fViewer.setInput(null); - - if (content != null && !content.isDisposed()) - content.dispose(); - - } else - oldEmpty= false; - setContent(null); - - fViewer= newViewer; - - if (fViewer != null) { - // we have to remember and restore the old visibility of the CustomPane - // since setContent changes the visibility - boolean old= getVisible(); - setContent(fViewer.getControl()); - setVisible(old); // restore old visibility - - boolean newEmpty= isEmpty(); - - fViewer.addSelectionChangedListener(this); - - if (fViewer instanceof StructuredViewer) { - StructuredViewer sv= (StructuredViewer) fViewer; - sv.addDoubleClickListener(this); - sv.addOpenListener(fOpenHandler); - } - - if (oldEmpty != newEmpty) { // relayout my container - Composite parent= getParent(); - if (parent instanceof Splitter) - ((Splitter)parent).setVisible(this, fControlVisibility ? !newEmpty : true); - } - - layout(true); - } - } - - /** - * Returns the optional title argument that has been set with setTitelArgument - * or null if no optional title argument has been set. - *

- * Note: this method is for internal use only. Clients should not call this method. - * - * @return the optional title argument or null - */ - public String getTitleArgument() { - return fTitleArgument; - } - - /** - * Returns true if no viewer is installed or if the current viewer - * is a NullViewer. - * - * @return true if no viewer is installed or if the current viewer is a NullViewer - */ - public boolean isEmpty() { - return fViewer == null || fViewer instanceof NullViewer; - } - - public void addSelectionChangedListener(ISelectionChangedListener l) { - fSelectionListeners.add(l); - } - - public void removeSelectionChangedListener(ISelectionChangedListener l) { - fSelectionListeners.remove(l); - } - - public void addDoubleClickListener(IDoubleClickListener l) { - fDoubleClickListener.add(l); - } - - public void removeDoubleClickListener(IDoubleClickListener l) { - fDoubleClickListener.remove(l); - } - - public void addOpenListener(IOpenListener l) { - fOpenListener.add(l); - } - - public void removeOpenListener(IOpenListener l) { - fOpenListener.remove(l); - } - - public void doubleClick(DoubleClickEvent event) { - Object[] listeners= fDoubleClickListener.getListeners(); - for (int i= 0; i < listeners.length; i++) - ((IDoubleClickListener) listeners[i]).doubleClick(event); - } - - public ISelection getSelection() { - if (fViewer != null) - return fViewer.getSelection(); - return null; - } - - public void setSelection(ISelection s) { - if (fViewer != null) - fViewer.setSelection(s); - } - - public void selectionChanged(SelectionChangedEvent ev) { - Object[] listeners= fSelectionListeners.getListeners(); - for (int i= 0; i < listeners.length; i++) - ((ISelectionChangedListener) listeners[i]).selectionChanged(ev); - } - - private boolean hasFocus2() { - // do we have focus? - Display display= getDisplay(); - if (display != null) - for (Control focus= display.getFocusControl(); focus != null; focus= focus.getParent()) - if (focus == this) - return true; - return false; - } - - /** - * Sets the input object of this pane. - * For this input object a suitable viewer is determined by calling the abstract - * method getViewer(Viewer, Object). - * If the returned viewer differs from the current one, the old viewer - * is disposed and the new one installed. Then the input object is fed - * into the newly installed viewer by calling its setInput(Object) method. - * If new and old viewer don't differ no new viewer is installed but just - * setInput(Object) is called. - * If the input is null the pane is cleared, - * that is the current viewer is disposed. - * - * @param input the new input object or null - */ - public void setInput(Object input) { - - if (fInput == input) - return; - - boolean hadFocus= hasFocus2(); - - fInput= input; - - // viewer switching - Viewer newViewer= null; - if (input != null) - newViewer= getViewer(fViewer, input); - - if (newViewer == null) { - if (fViewer instanceof NullViewer) - return; - newViewer= new NullViewer(this); - } - - setViewer(newViewer); - - // set input - fViewer.setInput(input); - - Image image= null; - if (!(fViewer instanceof NullViewer) && input instanceof ICompareInput) - image= ((ICompareInput)input).getImage(); - setImage(image); - - String title= null; - if (fViewer != null) { - Control c= fViewer.getControl(); - if (c != null) { - Object data= c.getData(CompareUI.COMPARE_VIEWER_TITLE); - if (data instanceof String) - title= (String) data; - if (hadFocus) - c.setFocus(); - } - } - - fTitle= title; - updateTitle(); - } - - /** - * Sets an additional and optional argument for the pane's title. - * Note: this method is for internal use only. Clients should not call this method. - * - * @param argument an optional argument for the pane's title - */ - public void setTitleArgument(String argument) { - fTitleArgument= argument; - updateTitle(); - } - - private void updateTitle() { - if (fTitle != null) { - if (fTitleArgument != null) { - String format= CompareMessages.getString("CompareViewerSwitchingPane.Titleformat"); //$NON-NLS-1$ - String t= MessageFormat.format(format, new String[] { fTitle, fTitleArgument } ); - setText(t); - } else - setText(fTitle); - } else { - setText(""); //$NON-NLS-1$ - } - } - - /** - * Returns the current input of this pane or null if the pane has no input. - * - * @return an Object that is the input to this pane or null if the pane has no input. - */ - public Object getInput() { - return fInput; - } - - /** - * Returns a viewer which is able to display the given input. - * If no viewer can be found, null is returned. - * The additional argument oldViewer represents the viewer currently installed - * in the pane (or null if no viewer is installed). - * It can be returned from this method if the current viewer can deal with the - * input (and no new viewer must be created). - * - * @param oldViewer the currently installed viewer or null - * @param input the input object for which a viewer must be determined or null - * @return a viewer for the given input, or null if no viewer can be determined - */ - abstract protected Viewer getViewer(Viewer oldViewer, Object input); -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/EditionSelectionDialog.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/EditionSelectionDialog.java deleted file mode 100644 index 229101703..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/EditionSelectionDialog.java +++ /dev/null @@ -1,1128 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.ResourceBundle; -import java.util.Date; -import java.util.List; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.HashSet; -import java.util.Calendar; -import java.util.Comparator; -import java.text.*; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.*; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.widgets.Widget; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Tree; -import org.eclipse.swt.widgets.TreeItem; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.TableItem; -import org.eclipse.swt.widgets.Item; -import org.eclipse.swt.widgets.Button; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.viewers.*; -import org.eclipse.jface.util.Assert; -import org.eclipse.jface.dialogs.*; - -import org.eclipse.core.runtime.CoreException; - -import org.eclipse.compare.internal.*; -import org.eclipse.compare.structuremergeviewer.*; - - -/** - * A dialog where one input element can be compared against - * a list of historic variants (editions) of the same input element. - * The dialog can be used to implement functions like "Compare/Replace with Version" or - * "Compare/Replace from Local History" on workspace resources. - *

- * In addition it is possible to specify a subsection of the input element - * (e.g. a method in a Java source file) by means of a "path". - * In this case the dialog compares only the subsection (as specified by the path) - * with the corresponding subsection in the list of editions. - * Only those editions are shown where the subsection differs from the same subsection in - * another edition thereby minimizing the number of presented variants. - * This functionality can be used to implement "Replace from Local History" - * for the Java language. - *

- * Subsections of an input element are determined by first finding an - * IStructureCreator for the input's type. - * Then the method locate is used to extract the subsection. - *

- * Each edition (variant in the list of variants) must implement the IModificationDate interface - * so that the dialog can sort the editions and present them in a tree structure where every - * node corresponds one day. - *

- * The functionality is surfaced in a single function selectEdition. - *

- * Clients may instantiate this class; it is not intended to be subclassed. - *

- * - * @see IModificationDate - * @see ITypedElement - */ -public class EditionSelectionDialog extends ResizableDialog { - - /** - * An item in an underlying edition. - */ - private static class Pair { - - private ITypedElement fEdition; - private ITypedElement fItem; - private String fContent; - private IStructureCreator fStructureCreator; - private boolean fHasError= false; - - Pair(IStructureCreator structureCreator, ITypedElement edition, ITypedElement item) { - fStructureCreator= structureCreator; - fEdition= edition; - fItem= item; - } - - Pair(IStructureCreator structureCreator, ITypedElement edition) { - this(structureCreator, edition, edition); - } - - ITypedElement getEdition() { - return fEdition; - } - - ITypedElement getItem() { - return fItem; - } - - /* - * The content is lazily loaded - */ - private String getContent() { - if (fContent == null) { - if (fStructureCreator != null) - fContent= fStructureCreator.getContents(fItem, false); - else { - if (fItem instanceof IStreamContentAccessor) { - IStreamContentAccessor sca= (IStreamContentAccessor) fItem; - try { - fContent= Utilities.readString(sca); - } catch (CoreException ex) { - // NeedWork - } - } - } - if (fContent == null) - fContent= ""; //$NON-NLS-1$ - } - return fContent; - } - - public boolean equals(Object other) { - if (other != null && other.getClass() == getClass()) { - if (getContent().equals(((Pair)other).getContent())) - return true; - } - return super.equals(other); - } - } - - // Configuration options - private CompareConfiguration fCompareConfiguration; - private ArrayList fArrayList= new ArrayList(); - /** use a side-by-side compare viewer */ - private boolean fCompare= true; - /** show target on right hand side */ - private boolean fTargetIsRight= false; - /** hide entries which have identical content */ - private boolean fHideIdentical= true; - /** add mode if true, otherwise replace mode */ - private boolean fAddMode= false; - /** compare mode if true, otherwise replace/add mode */ - private boolean fCompareMode= false; - /** perform structure compare on editions */ - private boolean fStructureCompare= false; - /** allow for multiple selection */ - private boolean fMultiSelect= false; - - /** - * Maps from members to their corresponding editions. - * Has only a single entry if dialog is used in "Replace" (and not "Add") mode. - */ - private HashMap fMemberEditions; - /** - * Maps from members to their corresponding selected edition. - */ - private HashMap fMemberSelection; - /** The editions of the current selected member */ - private List fCurrentEditions; - private Thread fThread; - private Pair fTargetPair; - /** The selected edition in the edition viewer */ - private ITypedElement fSelectedItem; - private String fTitleArg; - private Image fTitleImage; - - // SWT controls - private CompareViewerSwitchingPane fContentPane; - private Button fCommitButton; - private Table fMemberTable; - private CompareViewerPane fMemberPane; - private Tree fEditionTree; - private CompareViewerPane fEditionPane; - private Image fDateImage; - private Image fTimeImage; - private CompareViewerSwitchingPane fStructuredComparePane; - - /** - * Creates a new modal, resizable dialog. - * Various titles, icons, and labels are configured from the given resource bundle. - * The following resource keys are used: - *
-	 *	key         type          description
-	 *	title       String        dialog title
-	 *	width       Integer       initial width of dialog
-	 *	height      Integer       initial height of dialog
-	 *	treeTitleFormat   MessageFormat pane title for edition tree; arg 0 is the target
-	 *	dateIcon    String        icon for node in edition tree; path relative to plugin
-	 *	timeIcon    String        icon for leaf in edition tree; path relative to plugin
-	 *	todayFormat MessageFormat format string if date is todays date; arg 0 is date
-	 *	yesterdayFormat MessageFormat format string if date is yesterdays date; arg 0 is date
-	 *	dayFormat   MessageFormat format string if date is any other date; arg 0 is date
-	 *	editionLabel String       label for editions side of compare viewer; arg 0 is the date
-	 *	targetLabel  String       label for target side of compare viewer 
-	 *  buttonLabel  String       label for OK button; default is IDialogConstants.OK_LABEL
-	 * 
- * - * @param parent if not null the new dialog stays on top of this parent shell - * @param bundle ResourceBundle to configure the dialog - */ - public EditionSelectionDialog(Shell parent, ResourceBundle bundle) { - super(parent, bundle); - } - - private CompareConfiguration getCompareConfiguration() { - if (fCompareConfiguration == null) { - fCompareConfiguration= new CompareConfiguration(); - fCompareConfiguration.setLeftEditable(false); - fCompareConfiguration.setRightEditable(false); - } - return fCompareConfiguration; - } - - /** - * Sets an additional and optional argument for the edition pane's title. - * - * @param titleArgument an optional argument for the edition pane's title - * @since 2.0 - */ - public void setEditionTitleArgument(String titleArgument) { - fTitleArg= titleArgument; - } - - /** - * Sets an optional image for the edition pane's title. - * - * @param titleImage an optional image for the edition pane's title - * @since 2.0 - */ - public void setEditionTitleImage(Image titleImage) { - fTitleImage= titleImage; - } - - /** - * Select the previous edition (presenting a UI). - * - * @param target the input object against which the editions are compared; must not be null - * @param inputEditions the list of editions (element type: ITypedElements) - * @param ppath If null dialog shows full input; if non null it extracts a subsection - * @return returns the selected edition or null if error occurred. - * The returned ITypedElement is one of the original editions - * if path was null; otherwise - * it is an ITypedElement returned from IStructureCreator.locate(path, item) - * @since 2.0 - */ - public ITypedElement selectPreviousEdition(final ITypedElement target, ITypedElement[] inputEditions, Object ppath) { - Assert.isNotNull(target); - fTargetPair= new Pair(null, target); - - // sort input editions - final int count= inputEditions.length; - final IModificationDate[] editions= new IModificationDate[count]; - for (int i= 0; i < count; i++) - editions[i]= (IModificationDate) inputEditions[i]; - if (count > 1) - internalSort(editions); - - // find StructureCreator if ppath is not null - IStructureCreator structureCreator= null; - if (ppath != null) { - String type= target.getType(); - StructureCreatorDescriptor scd= CompareUIPlugin.getDefault().getStructureCreator(type); - if (scd != null) - structureCreator= scd.createStructureCreator(); - } - - if (fAddMode) { - // does not work in add mode - return null; - } - - if (structureCreator != null) { - Pair pair= createPair(structureCreator, ppath, target); - if (pair != null) - fTargetPair= pair; - else - ppath= null; // couldn't extract item because of error - } - - // from front (newest) to back (oldest) - for (int i= 0; i < count; i++) { - - ITypedElement edition= (ITypedElement) editions[i]; - Pair pair= null; - - if (structureCreator != null && ppath != null) { - // extract sub element from edition - pair= createPair(structureCreator, ppath, edition); - } else { - pair= new Pair(null, edition); - } - - if (pair != null && pair.fHasError) - return null; - - if (pair != null && !fTargetPair.equals(pair)) { - return pair.fItem; - } - } - - // nothing found - return null; - } - - /** - * Presents this modal dialog with the functionality described in the class comment above. - * - * @param target the input object against which the editions are compared; must not be null - * @param inputEditions the list of editions (element type: ITypedElements) - * @param ppath If null dialog shows full input; if non null it extracts a subsection - * @return returns the selected edition or null if dialog was cancelled. - * The returned ITypedElement is one of the original editions - * if path was null; otherwise - * it is an ITypedElement returned from IStructureCreator.locate(path, item) - */ - public ITypedElement selectEdition(final ITypedElement target, ITypedElement[] inputEditions, Object ppath) { - - Assert.isNotNull(target); - fTargetPair= new Pair(null, target); - - // sort input editions - final int count= inputEditions.length; - final IModificationDate[] editions= new IModificationDate[count]; - for (int i= 0; i < count; i++) - editions[i]= (IModificationDate) inputEditions[i]; - if (count > 1) - internalSort(editions); - - // find StructureCreator if ppath is not null - IStructureCreator structureCreator= null; - if (ppath != null) { - String type= target.getType(); - StructureCreatorDescriptor scd= CompareUIPlugin.getDefault().getStructureCreator(type); - if (scd != null) - structureCreator= scd.createStructureCreator(); - } - - if (!fAddMode) { - // replace mode - - if (structureCreator != null) { - Pair pair= createPair(structureCreator, ppath, target); - if (pair != null) - fTargetPair= pair; - else - ppath= null; // couldn't extract item because of error - } - - // set the left and right labels for the compare viewer - String targetLabel= getTargetLabel(target, fTargetPair.getItem()); - if (fTargetIsRight) - getCompareConfiguration().setRightLabel(targetLabel); - else - getCompareConfiguration().setLeftLabel(targetLabel); - - if (structureCreator != null && ppath != null) { // extract sub element - - final IStructureCreator sc= structureCreator; - final Object path= ppath; - - // construct the comparer thread - // and perform the background extract - fThread= new Thread() { - public void run() { - - // from front (newest) to back (oldest) - for (int i= 0; i < count; i++) { - - if (fEditionTree == null || fEditionTree.isDisposed()) - break; - ITypedElement edition= (ITypedElement) editions[i]; - - // extract sub element from edition - Pair pair= createPair(sc, path, edition); - if (pair != null) - sendPair(pair); - } - sendPair(null); - } - }; - } else { - // create tree widget - create(); - - // from front (newest) to back (oldest) - for (int i= 0; i < count; i++) - addMemberEdition(new Pair(null, (ITypedElement) editions[i])); - } - - } else { - // add mode - final Object container= ppath; - Assert.isNotNull(container); - - if (structureCreator == null) - return null; // error - - // extract all elements of container - final HashSet current= new HashSet(); - IStructureComparator sco= structureCreator.locate(container, target); - if (sco != null) { - Object[] children= sco.getChildren(); - if (children != null) - for (int i= 0; i < children.length; i++) - current.add(children[i]); - } - - final IStructureCreator sc= structureCreator; - - // construct the comparer thread - // and perform the background extract - fThread= new Thread() { - public void run() { - - // from front (newest) to back (oldest) - for (int i= 0; i < count; i++) { - - if (fEditionTree == null || fEditionTree.isDisposed()) - break; - ITypedElement edition= (ITypedElement) editions[i]; - - IStructureComparator sco2= sc.locate(container, edition); - if (sco2 != null) { - Object[] children= sco2.getChildren(); - if (children != null) { - for (int i2= 0; i2 < children.length; i2++) { - ITypedElement child= (ITypedElement) children[i2]; - if (!current.contains(child)) - sendPair(new Pair(sc, edition, child)); - } - } - } - } - sendPair(null); - } - }; - } - - open(); - - if (getReturnCode() == OK) - return fSelectedItem; - return null; - } - - private Pair createPair(IStructureCreator sc, Object path, ITypedElement input) { - IStructureComparator scmp= sc.locate(path, input); - if (scmp == null && sc.getStructure(input) == null) { // parse error - Pair p= new Pair(sc, input); - p.fHasError= true; - return p; - } - if (scmp instanceof ITypedElement) - return new Pair(sc, input, (ITypedElement) scmp); - return null; - } - - /** - * Controls whether identical entries are shown or not (default). - * This method must be called before selectEdition. - * - * @param hide if true identical entries are hidden; otherwise they are shown. - * @since 2.0 - */ - public void setHideIdenticalEntries(boolean hide) { - fHideIdentical= hide; - } - - /** - * Controls whether workspace target is on the left (the default) or right hand side. - * - * @param isRight if true target is shown on right hand side. - * @since 2.0 - */ - public void setTargetIsRight(boolean isRight) { - fTargetIsRight= isRight; - } - - /** - * Controls whether the EditionSelectionDialog is in 'add' mode - * or 'replace' mode (the default). - * - * @param addMode if true dialog is in 'add' mode. - * @since 2.0 - */ - public void setAddMode(boolean addMode) { - fAddMode= addMode; - fMultiSelect= addMode; - } - - /** - * Controls whether the EditionSelectionDialog is in 'compare' mode - * or 'add/replace' (the default) mode. - * - * @param compareMode if true dialog is in 'add' mode. - * @since 2.0 - */ - public void setCompareMode(boolean compareMode) { - fCompareMode= compareMode; - fStructureCompare= fCompareMode && !fAddMode; - } - - /** - * Returns the input target that has been specified with the most recent call - * to selectEdition. If a not null path was specified this method - * returns a subsection of this target (IStructureCreator.locate(path, target)) - * instead of the input target. - *

- * For example if the target is a Java compilation unit and path specifies - * a method, the value returned from getTarget will be the method not the compilation unit. - * - * @return the last specified target or a subsection thereof. - */ - public ITypedElement getTarget() { - return fTargetPair.getItem(); - } - - /** - * Returns the editions that have been selected with the most - * recent call to selectEdition. - * - * @return the selected editions as an array. - * @since 2.1 - */ - public ITypedElement[] getSelection() { - ArrayList result= new ArrayList(); - if (fMemberSelection != null) { - Iterator iter= fArrayList.iterator(); - for (int i= 0; iter.hasNext(); i++) { - Object edition= iter.next(); - Object item= fMemberSelection.get(edition); - if (item != null) - result.add(item); - } - } else if (fSelectedItem != null) - result.add(fSelectedItem); - return (ITypedElement[]) result.toArray(new ITypedElement[result.size()]); - } - - /** - * Returns a label for identifying the target side of a compare viewer. - * This implementation extracts the value for the key "targetLabel" from the resource bundle - * and passes it as the format argument to MessageFormat.format. - * The single format argument for MessageFormat.format ("{0}" in the format string) - * is the name of the given input element. - *

- * Subclasses may override to create their own label. - *

- * - * @param target the target element for which a label must be returned - * @param item if a path has been specified in selectEdition a sub element of the given target; otherwise the same as target - * @return a label the target side of a compare viewer - */ - protected String getTargetLabel(ITypedElement target, ITypedElement item) { - String format= null; - if (target instanceof ResourceNode) - format= Utilities.getString(fBundle, "workspaceTargetLabel", null); //$NON-NLS-1$ - if (format == null) - format= Utilities.getString(fBundle, "targetLabel"); //$NON-NLS-1$ - if (format == null) - format= "x{0}"; //$NON-NLS-1$ - - return MessageFormat.format(format, new Object[] { target.getName() }); - } - - /** - * Returns a label for identifying the edition side of a compare viewer. - * This implementation extracts the value for the key "editionLabel" from the resource bundle - * and passes it as the format argument to MessageFormat.format. - * The single format argument for MessageFormat.format ("{0}" in the format string) - * is the formatted modification date of the given input element. - *

- * Subclasses may override to create their own label. - *

- * - * @param selectedEdition the selected edition for which a label must be returned - * @param item if a path has been specified in selectEdition a sub element of the given selectedEdition; otherwise the same as selectedEdition - * @return a label for the edition side of a compare viewer - */ - protected String getEditionLabel(ITypedElement selectedEdition, ITypedElement item) { - String format= null; - if (selectedEdition instanceof ResourceNode) - format= Utilities.getString(fBundle, "workspaceEditionLabel", null); //$NON-NLS-1$ - else if (selectedEdition instanceof HistoryItem) - format= Utilities.getString(fBundle, "historyEditionLabel", null); //$NON-NLS-1$ - if (format == null) - format= Utilities.getString(fBundle, "editionLabel"); //$NON-NLS-1$ - if (format == null) - format= "x{0}"; //$NON-NLS-1$ - - - String date= ""; //$NON-NLS-1$ - if (selectedEdition instanceof IModificationDate) { - long modDate= ((IModificationDate)selectedEdition).getModificationDate(); - date= DateFormat.getDateTimeInstance().format(new Date(modDate)); - } - - return MessageFormat.format(format, new Object[] { date }); - } - - /** - * Returns a label for identifying a node in the edition tree viewer. - * This implementation extracts the value for the key "workspaceTreeFormat" or - * "treeFormat" (in that order) from the resource bundle - * and passes it as the format argument to MessageFormat.format. - * The single format argument for MessageFormat.format ("{0}" in the format string) - * is the formatted modification date of the given input element. - *

- * Subclasses may override to create their own label. - *

- * - * @param edition the edition for which a label must be returned - * @param item if a path has been specified in edition a sub element of the given edition; otherwise the same as edition - * @param date this date will be returned as part of the formatted string - * @return a label of a node in the edition tree viewer - * @since 2.0 - */ - protected String getShortEditionLabel(ITypedElement edition, ITypedElement item, Date date) { - String format= null; - if (edition instanceof ResourceNode) - format= Utilities.getString(fBundle, "workspaceTreeFormat", null); //$NON-NLS-1$ - if (format == null) - format= Utilities.getString(fBundle, "treeFormat", null); //$NON-NLS-1$ - if (format == null) - format= "x{0}"; //$NON-NLS-1$ - - String ds= DateFormat.getTimeInstance().format(date); - return MessageFormat.format(format, new Object[] { ds }); - } - - /** - * Returns an image for identifying the edition side of a compare viewer. - * This implementation extracts the value for the key "editionLabel" from the resource bundle - * and passes it as the format argument to MessageFormat.format. - * The single format argument for MessageFormat.format ("{0}" in the format string) - * is the formatted modification date of the given input element. - *

- * Subclasses may override to create their own label. - *

- * - * @param selectedEdition the selected edition for which a label must be returned - * @param item if a path has been specified in selectEdition a sub element of the given selectedEdition; otherwise the same as selectedEdition - * @return a label the edition side of a compare viewer - * @since 2.0 - */ - protected Image getEditionImage(ITypedElement selectedEdition, ITypedElement item) { - if (selectedEdition instanceof ResourceNode) - return selectedEdition.getImage(); - if (selectedEdition instanceof HistoryItem) { - if (fTimeImage == null) { - String iconName= Utilities.getString(fBundle, "timeIcon", "obj16/resource_obj.gif"); //$NON-NLS-1$ //$NON-NLS-2$ - ImageDescriptor id= CompareUIPlugin.getImageDescriptor(iconName); - if (id != null) - fTimeImage= id.createImage(); - } - return fTimeImage; - } - return null; - } - - /* (non Javadoc) - * Creates SWT control tree. - */ - protected synchronized Control createDialogArea(Composite parent2) { - - Composite parent= (Composite) super.createDialogArea(parent2); - - getShell().setText(Utilities.getString(fBundle, "title")); //$NON-NLS-1$ - - Splitter vsplitter= new Splitter(parent, SWT.VERTICAL); - vsplitter.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL - | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_VERTICAL)); - - vsplitter.addDisposeListener( - new DisposeListener() { - public void widgetDisposed(DisposeEvent e) { - if (fCompareConfiguration != null) { - fCompareConfiguration.dispose(); - fCompareConfiguration= null; - } - if (fDateImage != null) { - fDateImage.dispose(); - fDateImage= null; - } - if (fTimeImage != null) { - fTimeImage.dispose(); - fTimeImage= null; - } - } - } - ); - - if (fAddMode) { - // we need two panes: the left for the elements, the right one for the editions - Splitter hsplitter= new Splitter(vsplitter, SWT.HORIZONTAL); - - fMemberPane= new CompareViewerPane(hsplitter, SWT.BORDER | SWT.FLAT); - fMemberPane.setText(Utilities.getString(fBundle, "memberPaneTitle")); //$NON-NLS-1$ - - int flags= SWT.H_SCROLL + SWT.V_SCROLL; - if (fMultiSelect) - flags|= SWT.CHECK; - fMemberTable= new Table(fMemberPane, flags); - fMemberTable.addSelectionListener( - new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - if (e.detail == SWT.CHECK) { - if (e.item instanceof TableItem) { - TableItem ti= (TableItem) e.item; - Object data= ti.getData(); - if (ti.getChecked()) - fArrayList.add(data); - else - fArrayList.remove(data); - - if (fCommitButton != null) - fCommitButton.setEnabled(fArrayList.size() > 0); - - fMemberTable.setSelection(new TableItem[] { ti }); - } - } - handleMemberSelect(e.item); - } - } - ); - fMemberPane.setContent(fMemberTable); - fMemberTable.setFocus(); - - fEditionPane= new CompareViewerPane(hsplitter, SWT.BORDER | SWT.FLAT); - } else { - if (fStructureCompare) { - // we need two panes: the left for the elements, the right one for the structured diff - Splitter hsplitter= new Splitter(vsplitter, SWT.HORIZONTAL); - - fEditionPane= new CompareViewerPane(hsplitter, SWT.BORDER | SWT.FLAT); - fStructuredComparePane= new CompareViewerSwitchingPane(hsplitter, SWT.BORDER | SWT.FLAT, true) { - protected Viewer getViewer(Viewer oldViewer, Object input) { - if (input instanceof ICompareInput) - return CompareUI.findStructureViewer(oldViewer, (ICompareInput)input, this, getCompareConfiguration()); - return null; - } - }; - fStructuredComparePane.addSelectionChangedListener( - new ISelectionChangedListener() { - public void selectionChanged(SelectionChangedEvent e) { - feedInput2(e.getSelection()); - } - } - ); - } else { - // only a single pane showing the editions - fEditionPane= new CompareViewerPane(vsplitter, SWT.BORDER | SWT.FLAT); - } - if (fTitleArg == null) - fTitleArg= fTargetPair.getItem().getName(); - String titleFormat= Utilities.getString(fBundle, "treeTitleFormat"); //$NON-NLS-1$ - String title= MessageFormat.format(titleFormat, new String[] { fTitleArg }); - fEditionPane.setText(title); - if (fTitleImage != null) - fEditionPane.setImage(fTitleImage); - } - - fEditionTree= new Tree(fEditionPane, SWT.H_SCROLL + SWT.V_SCROLL); - fEditionTree.addSelectionListener( - new SelectionAdapter() { -// public void widgetDefaultSelected(SelectionEvent e) { -// handleDefaultSelected(); -// } - public void widgetSelected(SelectionEvent e) { - feedInput(e.item); - } - } - ); - fEditionPane.setContent(fEditionTree); - - // now start the thread (and forget about it) - if (fThread != null) { - fThread.start(); - fThread= null; - } - - fContentPane= new CompareViewerSwitchingPane(vsplitter, SWT.BORDER | SWT.FLAT) { - protected Viewer getViewer(Viewer oldViewer, Object input) { - return CompareUI.findContentViewer(oldViewer, input, this, getCompareConfiguration()); - } - }; - vsplitter.setWeights(new int[] { 30, 70 }); - - applyDialogFont(parent); - return parent; - } - - /* (non-Javadoc) - * Method declared on Dialog. - */ - protected void createButtonsForButtonBar(Composite parent) { - String buttonLabel= Utilities.getString(fBundle, "buttonLabel", IDialogConstants.OK_LABEL); //$NON-NLS-1$ - if (fCompareMode) { - // only a 'Done' button - createButton(parent, IDialogConstants.CANCEL_ID, buttonLabel, false); - } else { - // a 'Cancel' and a 'Add/Replace' button - fCommitButton= createButton(parent, IDialogConstants.OK_ID, buttonLabel, true); - fCommitButton.setEnabled(false); - createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); - } - } - - /** - * Overidden to disable dismiss on double click in compare mode. - * @since 2.0 - */ - protected void okPressed() { - if (fCompareMode) { - // don't dismiss dialog - } else - super.okPressed(); - } - - //---- private stuff ---------------------------------------------------------------------------------------- - - /* - * Asynchroneously sends a Pair (or null) to the UI thread. - */ - private void sendPair(final Pair pair) { - if (fEditionTree != null && !fEditionTree.isDisposed()) { - Display display= fEditionTree.getDisplay(); - display.asyncExec( - new Runnable() { - public void run() { - addMemberEdition(pair); - } - } - ); - } - } - - private static void internalSort(IModificationDate[] keys) { - Arrays.sort(keys, new Comparator() { - public int compare(Object o1, Object o2) { - IModificationDate d1= (IModificationDate) o1; - IModificationDate d2= (IModificationDate) o2; - long d= d2.getModificationDate() - d1.getModificationDate(); - if (d < 0) - return -1; - if (d > 0) - return 1; - return 0; - } - }); - } - - /* - * Adds the given Pair to the member editions. - * If HIDE_IDENTICAL is true the new Pair is only added if its contents - * is different from the preceeding Pair. - * If the argument is null the message "No Editions found" is shown - * in the member or edition viewer. - */ - private void addMemberEdition(Pair pair) { - - if (pair == null) { // end of list of pairs - if (fMemberTable != null) { - if (!fMemberTable.isDisposed() && fMemberTable.getItemCount() == 0) { - if (fMultiSelect) { - fMemberTable.dispose(); - fMemberTable= new Table(fMemberPane, SWT.NONE); - fMemberPane.setContent(fMemberTable); - } - TableItem ti= new TableItem(fMemberTable, SWT.NONE); - ti.setText(Utilities.getString(fBundle, "noAdditionalMembersMessage")); //$NON-NLS-1$ - } - return; - } - if (fEditionTree != null && !fEditionTree.isDisposed() && fEditionTree.getItemCount() == 0) { - TreeItem ti= new TreeItem(fEditionTree, SWT.NONE); - ti.setText(Utilities.getString(fBundle, "notFoundInLocalHistoryMessage")); //$NON-NLS-1$ - } - return; - } - - if (fMemberEditions == null) - fMemberEditions= new HashMap(); - if (fMultiSelect && fMemberSelection == null) - fMemberSelection= new HashMap(); - - ITypedElement item= pair.getItem(); - List editions= (List) fMemberEditions.get(item); - if (editions == null) { - editions= new ArrayList(); - fMemberEditions.put(item, editions); - if (fMemberTable != null && !fMemberTable.isDisposed()) { - ITypedElement te= item; - String name= te.getName(); - - // find position - TableItem[] items= fMemberTable.getItems(); - int where= items.length; - for (int i= 0; i < where; i++) { - String n= items[i].getText(); - if (n.compareTo(name) > 0) { - where= i; - break; - } - } - - TableItem ti= new TableItem(fMemberTable, where, SWT.NULL); - ti.setImage(te.getImage()); - ti.setText(name); - ti.setData(editions); - } - } - if (fHideIdentical) { - Pair last= fTargetPair; - int size= editions.size(); - if (size > 0) - last= (Pair) editions.get(size-1); - if (last != null && last.equals(pair)) - return; // don't add since the new one is equal to old - } - editions.add(pair); - - if (!fAddMode || editions == fCurrentEditions) - addEdition(pair); - } - - /* - * Returns the number of s since Jan 1st, 1970. - * The given date is converted to GMT and daylight saving is taken into account too. - */ - private long dayNumber(long date) { - int ONE_DAY_MS= 24*60*60 * 1000; // one day in milli seconds - - Calendar calendar= Calendar.getInstance(); - long localTimeOffset= calendar.get(Calendar.ZONE_OFFSET) + calendar.get(Calendar.DST_OFFSET); - - return (date + localTimeOffset) / ONE_DAY_MS; - } - - /* - * Adds the given Pair to the edition tree. - * It takes care of creating tree nodes for different dates. - */ - private void addEdition(Pair pair) { - if (fEditionTree == null || fEditionTree.isDisposed()) - return; - - // find last day - TreeItem[] days= fEditionTree.getItems(); - TreeItem lastDay= null; - if (days.length > 0) - lastDay= days[days.length-1]; - - boolean first= lastDay == null; - - ITypedElement edition= pair.getEdition(); - ITypedElement item= pair.getItem(); - - long ldate= ((IModificationDate)edition).getModificationDate(); - long day= dayNumber(ldate); - Date date= new Date(ldate); - if (lastDay == null || day != dayNumber(((Date)lastDay.getData()).getTime())) { - lastDay= new TreeItem(fEditionTree, SWT.NONE); - if (fDateImage == null) { - String iconName= Utilities.getString(fBundle, "dateIcon", "obj16/day_obj.gif"); //$NON-NLS-2$ //$NON-NLS-1$ - ImageDescriptor id= CompareUIPlugin.getImageDescriptor(iconName); - if (id != null) - fDateImage= id.createImage(); - } - lastDay.setImage(fDateImage); - String df= DateFormat.getDateInstance().format(date); - long today= dayNumber(System.currentTimeMillis()); - - String formatKey; - if (day == today) - formatKey= "todayFormat"; //$NON-NLS-1$ - else if (day == today-1) - formatKey= "yesterdayFormat"; //$NON-NLS-1$ - else - formatKey= "dayFormat"; //$NON-NLS-1$ - String pattern= Utilities.getString(fBundle, formatKey); - if (pattern != null) - df= MessageFormat.format(pattern, new String[] { df }); - lastDay.setText(df); - lastDay.setData(date); - } - TreeItem ti= new TreeItem(lastDay, SWT.NONE); - ti.setImage(getEditionImage(edition, item)); - - String s= getShortEditionLabel(edition, item, date); - if (pair.fHasError) { - String pattern= Utilities.getString(fBundle, "parseErrorFormat"); //$NON-NLS-1$ - s= MessageFormat.format(pattern, new String[] { s } ); - } - ti.setText(s); - - ti.setData(pair); - - // determine selected TreeItem - TreeItem selection= first ? ti : null; - if (fMemberSelection != null) { - Object selected= fMemberSelection.get(fCurrentEditions); - if (selected != null) { - if (selected == pair.getItem()) - selection= ti; - else - selection= null; - } - } - if (selection != null) { - fEditionTree.setSelection(new TreeItem[] { selection }); - if (!fAddMode) - fEditionTree.setFocus(); - feedInput(selection); - } - - if (first) // expand first node - lastDay.setExpanded(true); - } - - /* - * Feeds selection from member viewer to edition viewer. - */ - private void handleMemberSelect(Widget w) { - Object data= w.getData(); - if (data instanceof List) { - List editions= (List) data; - if (editions != fCurrentEditions) { - fCurrentEditions= editions; - fEditionTree.removeAll(); - - String pattern= Utilities.getString(fBundle, "treeTitleFormat"); //$NON-NLS-1$ - String title= MessageFormat.format(pattern, new Object[] { ((Item)w).getText() }); - fEditionPane.setText(title); - - Iterator iter= editions.iterator(); - while (iter.hasNext()) { - Object item= iter.next(); - if (item instanceof Pair) - addEdition((Pair) item); - } - } - } - } - - private void setInput(Object input) { - if (!fCompare && input instanceof ICompareInput) { - ICompareInput ci= (ICompareInput) input; - if (fTargetIsRight) - input= ci.getLeft(); - else - input= ci.getRight(); - } - fContentPane.setInput(input); - if (fStructuredComparePane != null) - fStructuredComparePane.setInput(input); - } - - /* - * Feeds selection from edition viewer to content (and structure) viewer. - */ - private void feedInput(Widget w) { - Object input= w.getData(); - boolean isOK= false; - if (input instanceof Pair) { - Pair pair= (Pair) input; - fSelectedItem= pair.getItem(); - isOK= !pair.fHasError; - - ITypedElement edition= pair.getEdition(); - String editionLabel= getEditionLabel(edition, fSelectedItem); - Image editionImage= getEditionImage(edition, fSelectedItem); - - if (fAddMode) { - if (fMemberSelection != null) - fMemberSelection.put(fCurrentEditions, fSelectedItem); - setInput(fSelectedItem); - fContentPane.setText(editionLabel); - fContentPane.setImage(editionImage); - } else { - getCompareConfiguration(); - if (fTargetIsRight) { - fCompareConfiguration.setLeftLabel(editionLabel); - fCompareConfiguration.setLeftImage(editionImage); - setInput(new DiffNode(fSelectedItem, fTargetPair.getItem())); - } else { - fCompareConfiguration.setRightLabel(editionLabel); - fCompareConfiguration.setRightImage(editionImage); - setInput(new DiffNode(fTargetPair.getItem(), fSelectedItem)); - } - } - } else { - fSelectedItem= null; - setInput(null); - } - if (fCommitButton != null) { - if (fMultiSelect) - fCommitButton.setEnabled(isOK && fSelectedItem != null && fArrayList.size() > 0); - else - fCommitButton.setEnabled(isOK && fSelectedItem != null && fTargetPair.getItem() != fSelectedItem); - } - } - - /* - * Feeds selection from structure viewer to content viewer. - */ - private void feedInput2(ISelection sel) { - if (sel instanceof IStructuredSelection) { - IStructuredSelection ss= (IStructuredSelection) sel; - if (ss.size() == 1) - fContentPane.setInput(ss.getFirstElement()); - } - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/HistoryItem.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/HistoryItem.java deleted file mode 100644 index 3c9dff749..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/HistoryItem.java +++ /dev/null @@ -1,109 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare; - -import java.io.InputStream; -import java.io.BufferedInputStream; - -import org.eclipse.swt.graphics.Image; - -import org.eclipse.compare.internal.IResourceProvider; -import org.eclipse.core.resources.IEncodedStorage; -import org.eclipse.core.resources.IFileState; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; - -/** - * A combination IFileState and ITypedElement that can be used as - * an input to a compare viewer or other places where an IStreamContentAccessor - * is needed. - *

- *

- * Clients may instantiate this class; it is not intended to be subclassed. - *

- */ -public class HistoryItem implements IEncodedStreamContentAccessor, ITypedElement, IModificationDate, IResourceProvider { - - private ITypedElement fBase; - private IFileState fFileState; - - /** - * Creates a HistoryItem object which combines the given IFileState - * and ITypedElement into an object - * which is suitable as input for a compare viewer or ReplaceWithEditionDialog. - * - * @param base the implementation of the ITypedElement interface delegates to this base ITypedElement - * @param fileState the IFileState from which the streamable contents and the modification time is derived from - */ - public HistoryItem(ITypedElement base, IFileState fileState) { - fBase= base; - fFileState= fileState; - } - - /* (non-Javadoc) - * see ITypedElement.getName - */ - public String getName() { - return fBase.getName(); - } - - /* (non-Javadoc) - * see ITypedElement.getImage - */ - public Image getImage() { - return fBase.getImage(); - } - - /* (non-Javadoc) - * see ITypedElement.getType - */ - public String getType() { - return fBase.getType(); - } - - /* (non-Javadoc) - * see IModificationDate.getModificationDate - */ - public long getModificationDate() { - return fFileState.getModificationTime(); - } - - /* (non-Javadoc) - * see IStreamContentAccessor.getContents - */ - public InputStream getContents() throws CoreException { - return new BufferedInputStream(fFileState.getContents()); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.IEncodedStreamContentAccessor#getCharset() - */ - public String getCharset() throws CoreException { - String charset= fFileState.getCharset(); - if (charset == null) { - IResource resource= getResource(); - if (resource instanceof IEncodedStorage) - charset= ((IEncodedStorage)resource).getCharset(); - } - return charset; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.internal.IResourceProvider#getResource() - */ - public IResource getResource() { - IPath fullPath= fFileState.getFullPath(); - return ResourcesPlugin.getWorkspace().getRoot().findMember(fullPath); - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/ICompareNavigator.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/ICompareNavigator.java deleted file mode 100644 index d0d3e06a1..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/ICompareNavigator.java +++ /dev/null @@ -1,34 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2003, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare; - -/** - * A ICompareNavigator is used to navigate through the individual - * differences of a CompareEditorInput. - *

- * Please note: the following might change before the final release of Eclipse 3.0. - * You can retrieve an object implementing the ICompareNavigator from a - * CompareEditorInput by calling getAdapter(ICompareNavigator) - * on the CompareEditorInput. - *

- * @since 3.0 - */ -public interface ICompareNavigator { - - /** - * Starting from the current selection selectChange selects and reveals the next (previous) change. - * If the end (or beginning) is reached, the method returns true. - * - * @param next if true the next change is selected, otherwise the previous change - * @return returns true if end (beginning) is reached, false otherwise - */ - public boolean selectChange(boolean next); -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/IContentChangeListener.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/IContentChangeListener.java deleted file mode 100644 index 16aa27c0b..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/IContentChangeListener.java +++ /dev/null @@ -1,30 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare; - -/** - * An IContentChangeListener is informed about content changes of a - * IContentChangeNotifier. - *

- * Clients may implement this interface. - *

- * - * @see IContentChangeNotifier - */ -public interface IContentChangeListener { - - /** - * Called whenever the content of the given source has changed. - * - * @param source the source whose contents has changed - */ - void contentChanged(IContentChangeNotifier source); -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/IContentChangeNotifier.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/IContentChangeNotifier.java deleted file mode 100644 index 55641c97d..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/IContentChangeNotifier.java +++ /dev/null @@ -1,39 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare; - -/** - * Interface common to all objects that provide a means for registering - * for content change notification. - *

- * Clients may implement this interface. - *

- * - * @see IContentChangeListener - */ -public interface IContentChangeNotifier { - - /** - * Adds a content change listener to this notifier. - * Has no effect if an identical listener is already registered. - * - * @param listener a content changed listener - */ - void addContentChangeListener(IContentChangeListener listener); - - /** - * Removes the given content changed listener from this notifier. - * Has no effect if the listener is not registered. - * - * @param listener a content changed listener - */ - void removeContentChangeListener(IContentChangeListener listener); -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/IEditableContent.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/IEditableContent.java deleted file mode 100644 index 4d031e69c..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/IEditableContent.java +++ /dev/null @@ -1,70 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare; - -/** - * Common interface for objects with editable contents. - * Typically it is implemented by objects that also implement - * the IStreamContentAccessor interface. - *

- * Clients may implement this interface. - *

- * Note that implementing IEditableContent does not - * automatically mean that it is editable. An object is only editable if - * it implements IEditableContent and the isEditable method returns true. - * - * @see IStreamContentAccessor - */ -public interface IEditableContent { - - /** - * Returns true if this object can be modified. - * If it returns false the other methods of this API must not be called. - * - * @return true if this object can be modified - */ - boolean isEditable(); - - /** - * Replaces the current content with the given new bytes. - * - * @param newContent this new contents replaces the old contents - */ - void setContent(byte[] newContent); - - /** - * This method is called on a parent to add or remove a child, - * or to copy the contents of a child. - * - * What to do is encoded in the two arguments as follows: - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
add:dest == nullsrc != null
remove:dest != nullsrc == null
copy:dest != nullsrc != null
- * @param dest the existing child of this object to be replaced; if null a new child can be added. - * @param src the new child to be added or replaced; if null an existing child can be removed. - * @return the argument dest - */ - ITypedElement replace(ITypedElement dest, ITypedElement src); -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/IEncodedStreamContentAccessor.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/IEncodedStreamContentAccessor.java deleted file mode 100644 index 95aa6f5c9..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/IEncodedStreamContentAccessor.java +++ /dev/null @@ -1,39 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare; - -import org.eclipse.core.runtime.CoreException; - -/** - * Extension for IStreamContentAccessor. Extends the original - * concept of a IStreamContentAccessor to answer the Charset (encoding) used for the stream. - * - * @since 3.0 - */ -public interface IEncodedStreamContentAccessor extends IStreamContentAccessor { - - /** - * Returns the name of a charset encoding to be used when decoding this - * stream accessor's contents into characters. Returns null if a proper - * encoding cannot be determined. - *

- * Note: this method does not check whether the result is a supported - * charset name. Callers should be prepared to handle - * UnsupportedEncodingException where this charset is used. - *

- * @return the name of a charset, or null - * @exception CoreException if an error happens while determining - * the charset. See any refinements for more information. - * @see IStreamContentAccessor#getContents - * @since 3.0 - */ - String getCharset() throws CoreException; -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/IModificationDate.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/IModificationDate.java deleted file mode 100644 index 1ddeb2b78..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/IModificationDate.java +++ /dev/null @@ -1,31 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare; - -/** - * Common interface for objects with a modification date. The modification date - * can be used in the UI to give the user a general idea of how old an object is. - *

- * Clients may implement this interface. - *

- */ -public interface IModificationDate { - - /** - * Returns the modification time of this object. - *

- * Note that this value should only be used to give the user a general idea of how - * old the object is. - * - * @return the time of last modification, in milliseconds since January 1, 1970, 00:00:00 GMT - */ - long getModificationDate(); -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/IPropertyChangeNotifier.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/IPropertyChangeNotifier.java deleted file mode 100644 index f4ed5212c..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/IPropertyChangeNotifier.java +++ /dev/null @@ -1,41 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare; - -import org.eclipse.jface.util.IPropertyChangeListener; - -/** - * Interface common to all objects that provide a means for registering - * for property change notification. - *

- * Clients may implement this interface. - *

- * - * @see org.eclipse.jface.util.IPropertyChangeListener - */ -public interface IPropertyChangeNotifier { - - /** - * Adds a listener for property changes to this notifier. - * Has no effect if an identical listener is already registered. - * - * @param listener a property change listener - */ - void addPropertyChangeListener(IPropertyChangeListener listener); - - /** - * Removes the given content change listener from this notifier. - * Has no effect if the identical listener is not registered. - * - * @param listener a property change listener - */ - void removePropertyChangeListener(IPropertyChangeListener listener); -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/IStreamContentAccessor.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/IStreamContentAccessor.java deleted file mode 100644 index 453bc6a4e..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/IStreamContentAccessor.java +++ /dev/null @@ -1,36 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare; - -import java.io.InputStream; - -import org.eclipse.core.runtime.CoreException; - -/** - * An IStreamContentAccessor object represents a set of bytes which can be - * accessed by means of a stream. - *

- * Clients may implement this interface, or use the standard implementation, - * BufferedContent. - * - * @see BufferedContent - */ -public interface IStreamContentAccessor { - /** - * Returns an open InputStream for this object which can be used to retrieve the object's content. - * The client is responsible for closing the stream when finished. - * Returns null if this object has no streamable contents. - * - * @return an input stream containing the contents of this object - * @exception CoreException if the contents of this object could not be accessed - */ - InputStream getContents() throws CoreException; -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/IStreamMerger.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/IStreamMerger.java deleted file mode 100644 index bf4c6b072..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/IStreamMerger.java +++ /dev/null @@ -1,69 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare; - -import java.io.InputStream; -import java.io.OutputStream; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; - -/** - * This interface defines a single operation for performing a three-way merge on three - * input streams. The merged result is written to an output stream. - *

- * Clients must implement this interface when contributing new mergers to the - * org.eclipse.compare.streamMergers extension point. - *

- * - * @since 3.0 - */ -public interface IStreamMerger { - - /** - * Indicates the successful completion of the merge operation (value IStatus.OK) - */ - public static final int OK= IStatus.OK; - - /** - * Indicates that a change conflict prevented the merge from successful completion (value 1) - */ - public static final int CONFLICT= 1; - - /** - * Status code describing an internal error (value 2) - */ - public static final int INTERNAL_ERROR= 2; - - /** - * Performs a merge operation on the given input streams and writes the merge result to the output stream. - * On success a status IStatus.OK is returned, on error a status IStatus.ERROR. - * If the merge operation cannot deal with conflicts, the code of the error status has the value IStreamMerger.CONFLICT. - * For text oriented mergers the encoding for the input and output streams is honored. - * It is the responsibility of callers to close input and output streams. - * - * @param output the byte stream to which the merge result is written; the merger will not close the stream - * @param outputEncoding the encoding to use when writing to the output stream - * @param ancestor the byte stream from which the common ancestor is read - * @param ancestorEncoding the encoding of the ancestor input byte stream - * @param target the byte stream containing the target of the merge - * @param targetEncoding the encoding of the target input byte stream - * @param other the byte stream containing the target of the merge - * @param otherEncoding the encoding of the other input byte stream - * @param monitor reports progress of the merge operation - * @return returns the completion status of the operation - */ - IStatus merge(OutputStream output, String outputEncoding, - InputStream ancestor, String ancestorEncoding, - InputStream target, String targetEncoding, - InputStream other, String otherEncoding, - IProgressMonitor monitor); -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/ITypedElement.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/ITypedElement.java deleted file mode 100644 index 6717c8da2..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/ITypedElement.java +++ /dev/null @@ -1,68 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare; - -import org.eclipse.swt.graphics.Image; - -/** - * Interface for getting the name, image, and type for an object. - *

- * These methods are typically used to present an input object in the compare UI - * (getName and getImage) - * and for finding a viewer for a given input type (getType). - *

- * Clients may implement this interface. - */ -public interface ITypedElement { - - /** - * Type for a folder input (value "FOLDER"). - * Folders are comparison elements that have no contents, only a name and children. - */ - public static final String FOLDER_TYPE= "FOLDER"; //$NON-NLS-1$ - - /** - * Type for an element whose actual type is text (value "txt"). - */ - public static final String TEXT_TYPE= "txt"; //$NON-NLS-1$ - - /** - * Type for an element whose actual type could not - * be determined. (value "???"). - */ - public static final String UNKNOWN_TYPE= "???"; //$NON-NLS-1$ - - /** - * Returns the name of this object. - * The name is used when displaying this object in the UI. - * - * @return the name of this object - */ - String getName(); - - /** - * Returns an image for this object. - * This image is used when displaying this object in the UI. - * - * @return the image of this object or null if this type of input has no image - */ - Image getImage(); - - /** - * Returns the type of this object. For objects with a file name - * this is typically the file extension. For folders its the constant - * FOLDER_TYPE. - * The type is used for determining a suitable viewer for this object. - * - * @return the type of this object - */ - String getType(); -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/IViewerCreator.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/IViewerCreator.java deleted file mode 100644 index 91433c80c..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/IViewerCreator.java +++ /dev/null @@ -1,34 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare; - -import org.eclipse.swt.widgets.Composite; - -import org.eclipse.jface.viewers.Viewer; - -/** - * A factory object for Viewer. - *

- * This interface is only required when creating a Viewer from a plugin.xml file. - * Since Viewers have no default constructor they cannot be - * instantiated directly with Class.forName. - */ -public interface IViewerCreator { - - /** - * Creates a new viewer under the given SWT parent control. - * - * @param parent the SWT parent control under which to create the viewer's SWT control - * @param config a compare configuration the newly created viewer might want to use - * @return a new viewer - */ - Viewer createViewer(Composite parent, CompareConfiguration config); -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/NavigationAction.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/NavigationAction.java deleted file mode 100644 index 69d3df826..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/NavigationAction.java +++ /dev/null @@ -1,94 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare; - -import java.util.ResourceBundle; -import org.eclipse.jface.action.Action; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; - -import org.eclipse.compare.internal.CompareMessages; -import org.eclipse.compare.internal.CompareUIPlugin; -import org.eclipse.compare.internal.Utilities; - - -/** - * A NavigationAction is used to navigate through the individual - * differences of a CompareEditorInput. - *

- * Clients may instantiate this class; it is not intended to be subclassed. - *

- * @since 2.0 - */ -public class NavigationAction extends Action { - - private boolean fNext; - private CompareEditorInput fCompareEditorInput; - - - /** - * Creates a NavigationAction. - * - * @param next if true action goes to the next difference; otherwise to the previous difference. - */ - public NavigationAction(boolean next) { - this(CompareUI.getResourceBundle(), next); - } - - /** - * Creates a NavigationAction that initializes its attributes - * from the given ResourceBundle. - * - * @param bundle is used to initialize the action - * @param next if true action goes to the next difference; otherwise to the previous difference. - */ - public NavigationAction(ResourceBundle bundle, boolean next) { - Utilities.initAction(this, bundle, next ? "action.Next." : "action.Previous."); //$NON-NLS-2$ //$NON-NLS-1$ - fNext= next; - } - - public void run() { - if (fCompareEditorInput != null) { - Object adapter= fCompareEditorInput.getAdapter(ICompareNavigator.class); - if (adapter instanceof ICompareNavigator) { - boolean atEnd= ((ICompareNavigator)adapter).selectChange(fNext); - Shell shell= CompareUIPlugin.getShell(); - if (atEnd && shell != null) { - - Display display= shell.getDisplay(); - if (display != null) - display.beep(); - - String title; - String message; - if (fNext) { - title= CompareMessages.getString("CompareNavigator.atEnd.title"); //$NON-NLS-1$ - message= CompareMessages.getString("CompareNavigator.atEnd.message"); //$NON-NLS-1$ - } else { - title= CompareMessages.getString("CompareNavigator.atBeginning.title"); //$NON-NLS-1$ - message= CompareMessages.getString("CompareNavigator.atBeginning.message"); //$NON-NLS-1$ - } - MessageDialog.openInformation(shell, title, message); - } - } - } - } - - /** - * Sets the CompareEditorInput on which this action operates. - * - * @param input the CompareEditorInput on which this action operates; if null action does nothing - */ - public void setCompareEditorInput(CompareEditorInput input) { - fCompareEditorInput= input; - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/ResourceNode.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/ResourceNode.java deleted file mode 100644 index 36380c4ae..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/ResourceNode.java +++ /dev/null @@ -1,215 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare; - -import java.io.*; -import java.util.ArrayList; - -import org.eclipse.swt.graphics.Image; - -import org.eclipse.jface.util.Assert; - -import org.eclipse.core.resources.*; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; -import org.eclipse.compare.internal.IResourceProvider; -import org.eclipse.compare.internal.Utilities; -import org.eclipse.compare.structuremergeviewer.IStructureComparator; - -/** - * A ResourceNode wrappers an IResources so that it can be used - * as input for the differencing engine (interfaces IStructureComparator and ITypedElement) - * and the ReplaceWithEditionDialog (interfaces ITypedElement and IModificationDate). - *

- * Clients may instantiate this class; it is not intended to be subclassed. - *

- * - * @see EditionSelectionDialog - */ -public class ResourceNode extends BufferedContent - implements IEncodedStreamContentAccessor, IStructureComparator, ITypedElement, - IEditableContent, IModificationDate, IResourceProvider { - - private IResource fResource; - private ArrayList fChildren; - - - /** - * Creates a ResourceNode for the given resource. - * - * @param resource the resource - */ - public ResourceNode(IResource resource) { - fResource= resource; - Assert.isNotNull(resource); - } - - /** - * Returns the corresponding resource for this object. - * - * @return the corresponding resource - */ - public IResource getResource() { - return fResource; - } - - /* (non Javadoc) - * see IStreamContentAccessor.getContents - */ - public InputStream getContents() throws CoreException { - if (fResource instanceof IStorage) - return super.getContents(); - return null; - } - - /* (non Javadoc) - * see IModificationDate.getModificationDate - */ - public long getModificationDate() { - IPath path= fResource.getLocation(); - File file= path.toFile(); - return file.lastModified(); - } - - /* (non Javadoc) - * see ITypedElement.getName - */ - public String getName() { - if (fResource != null) - return fResource.getName(); - return null; - } - - /* (non Javadoc) - * see ITypedElement.getType - */ - public String getType() { - if (fResource instanceof IContainer) - return ITypedElement.FOLDER_TYPE; - if (fResource != null) { - String s= fResource.getFileExtension(); - if (s != null) - return s; - } - return ITypedElement.UNKNOWN_TYPE; - } - - /* (non Javadoc) - * see ITypedElement.getImage - */ - public Image getImage() { - return CompareUI.getImage(fResource); - } - - /* - * Returns true if the other object is of type ITypedElement - * and their names are identical. The content is not considered. - */ - public boolean equals(Object other) { - if (other instanceof ITypedElement) { - String otherName= ((ITypedElement)other).getName(); - return getName().equals(otherName); - } - return super.equals(other); - } - - /** - * Returns the hash code of the name. - * @return a hash code value for this object. - */ - public int hashCode() { - return getName().hashCode(); - } - - /* (non Javadoc) - * see IStructureComparator.getChildren - */ - public Object[] getChildren() { - if (fChildren == null) { - fChildren= new ArrayList(); - if (fResource instanceof IContainer) { - try { - IResource members[]= ((IContainer)fResource).members(); - for (int i= 0; i < members.length; i++) { - IStructureComparator child= createChild(members[i]); - if (child != null) - fChildren.add(child); - } - } catch (CoreException ex) { - // NeedWork - } - } - } - return fChildren.toArray(); - } - - /** - * This hook method is called from getChildren once for every - * member of a container resource. This implementation - * creates a new ResourceNode for the given child resource. - * Clients may override this method to create a different type of - * IStructureComparator or to filter children by returning null. - * - * @param child the child resource for which a IStructureComparator must be returned - * @return a ResourceNode for the given child or null - */ - protected IStructureComparator createChild(IResource child) { - return new ResourceNode(child); - } - - /** - * Returns an open stream if the corresponding resource implements the - * IStorage interface. Otherwise the value null is returned. - * - * @return a buffered input stream containing the contents of this storage - * @exception CoreException if the contents of this storage could not be accessed - */ - protected InputStream createStream() throws CoreException { - if (fResource instanceof IStorage) { - InputStream is= null; - IStorage storage= (IStorage) fResource; - try { - is= storage.getContents(); - } catch (CoreException e) { - if (e.getStatus().getCode() == IResourceStatus.OUT_OF_SYNC_LOCAL) { - fResource.refreshLocal(IResource.DEPTH_INFINITE, null); - is= storage.getContents(); - } else - throw e; - } - if (is != null) - return new BufferedInputStream(is); - } - return null; - } - - /* (non Javadoc) - * see IEditableContent.isEditable - */ - public boolean isEditable() { - return true; - } - - /* (non Javadoc) - * see IEditableContent.replace - */ - public ITypedElement replace(ITypedElement child, ITypedElement other) { - return child; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.IEncodedStreamContentAccessor#getCharset() - */ - public String getCharset() { - return Utilities.getCharset(fResource); - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/Splitter.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/Splitter.java deleted file mode 100644 index 4fb46d6b1..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/Splitter.java +++ /dev/null @@ -1,129 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare; - -import org.eclipse.swt.widgets.*; -import org.eclipse.swt.custom.SashForm; - -/** - * The Splitter adds support for nesting to a SashForm. - *

- * If Splitters are nested directly: - *

- * - * @since 2.1 - */ -public class Splitter extends SashForm { - - private static final String VISIBILITY= "org.eclipse.compare.internal.visibility"; //$NON-NLS-1$ - - /** - * Constructs a new instance of this class given its parent - * and a style value describing its behavior and appearance. - *

- * The style value is either one of the style constants defined in - * class SWT which is applicable to instances of this - * class, or must be built by bitwise OR'ing together - * (that is, using the int "|" operator) two or more - * of those SWT style constants. The class description - * lists the style constants that are applicable to the class. - * Style bits are also inherited from superclasses. - *

- * - * @param parent a widget which will be the parent of the new instance (cannot be null) - * @param style the style of widget to construct - * - * @exception IllegalArgumentException - * @exception org.eclipse.swt.SWTException - */ - public Splitter(Composite parent, int style) { - super(parent, style); - } - - /** - * Sets the visibility of the given child in this Splitter. If this change - * affects the visibility state of the whole Splitter, and if the Splitter - * is directly nested in one or more Splitters, this method recursively - * propagates the new state upward. - * - * @param child the child control for which the visibility is changed - * @param visible the new visibility state - */ - public void setVisible(Control child, boolean visible) { - - boolean wasEmpty= isEmpty(); - - child.setVisible(visible); - child.setData(VISIBILITY, new Boolean(visible)); - - if (wasEmpty != isEmpty()) { - // recursively walk up - Composite parent= getParent(); - if (parent instanceof Splitter) { - Splitter sp= (Splitter) parent; - sp.setVisible(this, visible); - sp.layout(); - } - } else { - layout(); - } - } - - /* (non-Javadoc) - * Recursively calls setMaximizedControl for all direct parents that are - * itself Splitters. - */ - public void setMaximizedControl(Control control) { - if (control == null || control == getMaximizedControl()) - super.setMaximizedControl(null); - else - super.setMaximizedControl(control); - - // recursively walk upward - Composite parent= getParent(); - if (parent instanceof Splitter) - ((Splitter) parent).setMaximizedControl(this); - else - layout(true); - } - - /* (non-Javadoc) - * Returns true if Splitter has no children or if all children are invisible. - */ - private boolean isEmpty() { - Control[] controls= getChildren(); - for (int i= 0; i < controls.length; i++) - if (isVisible(controls[i])) - return false; - return true; - } - - /* (non-Javadoc) - * Returns the visibility state of the given child control. If the - * control is a Sash, this method always returns false. - */ - private boolean isVisible(Control child) { - if (child instanceof Sash) - return false; - Object data= child.getData(VISIBILITY); - if (data instanceof Boolean) - return ((Boolean)data).booleanValue(); - return true; - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/ZipFileStructureCreator.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/ZipFileStructureCreator.java deleted file mode 100644 index 15a1851dc..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/ZipFileStructureCreator.java +++ /dev/null @@ -1,322 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare; - -import java.io.*; -import java.util.*; -import java.util.zip.*; - -import org.eclipse.core.runtime.CoreException; - -import org.eclipse.swt.graphics.Image; - -import org.eclipse.jface.util.Assert; - -import org.eclipse.compare.internal.*; -import org.eclipse.compare.structuremergeviewer.*; - - -/** - * This implementation of the IStructureCreator interface - * makes the contents of a zip archive available as a - * hierarchical structure of IStructureComparators. - *

- * It is used when comparing the internal structure of a zip archive. - * - * @since 2.0 - */ -public class ZipFileStructureCreator implements IStructureCreator { - - /** - * Common base class for ZipFolder and ZipFile - */ - static abstract class ZipResource implements IStructureComparator, ITypedElement { - - private String fName; - - ZipResource(String name) { - fName= name; - } - - public String getName() { - return fName; - } - - public Image getImage() { - return CompareUI.getImage(getType()); - } - - /* - * Returns true if other is ITypedElement and names are equal. - * @see IComparator#equals - */ - public boolean equals(Object other) { - if (other instanceof ITypedElement) - return fName.equals(((ITypedElement) other).getName()); - return super.equals(other); - } - - public int hashCode() { - return fName.hashCode(); - } - } - - static class ZipFolder extends ZipResource { - - private HashMap fChildren= new HashMap(10); - - ZipFolder(String name) { - super(name); - } - - public String getType() { - return ITypedElement.FOLDER_TYPE; - } - - public Object[] getChildren() { - Object[] children= new Object[fChildren.size()]; - Iterator iter= fChildren.values().iterator(); - for (int i= 0; iter.hasNext(); i++) - children[i]= iter.next(); - return children; - } - - ZipFile createContainer(String path) { - String entry= path; - int pos= path.indexOf('/'); - if (pos < 0) - pos= path.indexOf('\\'); - if (pos >= 0) { - entry= path.substring(0, pos); - path= path.substring(pos + 1); - } else if (entry.length() > 0) { - if (CompareUIPlugin.getDefault().filter(path, false, true)) - return null; - ZipFile ze= new ZipFile(entry); - fChildren.put(entry, ze); - return ze; - } else - return null; - - ZipFolder folder= null; - if (fChildren != null) { - Object o= fChildren.get(entry); - if (o instanceof ZipFolder) - folder= (ZipFolder) o; - } - - if (folder == null) { - if (path.length() > 0 && CompareUIPlugin.getDefault().filter(path, true, true)) - return null; - folder= new ZipFolder(entry); - fChildren.put(entry, folder); - } - - return folder.createContainer(path); - } - } - - static class ZipFile extends ZipResource implements IStreamContentAccessor { - - private byte[] fContents; - - ZipFile(String name) { - super(name); - } - - public String getType() { - String s= this.getName(); - int pos= s.lastIndexOf('.'); - if (pos >= 0) - return s.substring(pos + 1); - return ITypedElement.UNKNOWN_TYPE; - } - - public Object[] getChildren() { - return null; - } - - public InputStream getContents() { - if (fContents == null) - fContents= new byte[0]; - return new ByteArrayInputStream(fContents); - } - - byte[] getBytes() { - return fContents; - } - - void setBytes(byte[] buffer) { - fContents= buffer; - } - - void appendBytes(byte[] buffer, int length) { - if (length > 0) { - int oldLen= 0; - if (fContents != null) - oldLen= fContents.length; - byte[] newBuf= new byte[oldLen + length]; - if (oldLen > 0) - System.arraycopy(fContents, 0, newBuf, 0, oldLen); - System.arraycopy(buffer, 0, newBuf, oldLen, length); - fContents= newBuf; - } - } - } - - private String fTitle; - - /** - * Create a new ZipFileStructureCreator. - */ - public ZipFileStructureCreator() { - this(Utilities.getString("ZipStructureCreator.name")); //$NON-NLS-1$ - } - - /** - * Create a new ZipFileStructureCreator with the given title. - * The title is returned by the method getName(). - * @param title the title of this strcuture creator - */ - public ZipFileStructureCreator(String title) { - fTitle= title; - } - - public String getName() { - return fTitle; - } - - public IStructureComparator getStructure(Object input) { - - InputStream is= null; - - if (input instanceof IStreamContentAccessor) { - IStreamContentAccessor sca= (IStreamContentAccessor) input; - try { - is= sca.getContents(); - } catch (CoreException ex) { - // NeedWork - } - } - - if (is == null) - return null; - - ZipInputStream zip= new ZipInputStream(is); - ZipFolder root= new ZipFolder(""); //$NON-NLS-1$ - try { - for (;;) { - ZipEntry entry= zip.getNextEntry(); - if (entry == null) - break; - - ZipFile ze= root.createContainer(entry.getName()); - if (ze != null) { - int length= (int) entry.getSize(); - if (length >= 0) { - byte[] buffer= new byte[length]; - int offset= 0; - - do { - int n= zip.read(buffer, offset, length); - offset += n; - length -= n; - } while (length > 0); - - ze.setBytes(buffer); - } else { - byte[] buffer= new byte[1024]; - int n; - do { - n= zip.read(buffer, 0, 1024); - ze.appendBytes(buffer, n); - } while (n >= 0); - } - } - zip.closeEntry(); - } - } catch (IOException ex) { - return null; - } finally { - try { - zip.close(); - } catch (IOException ex) { - // silently ignored - } - } - - if (root.fChildren.size() == 1) { - Iterator iter= root.fChildren.values().iterator(); - return (IStructureComparator) iter.next(); - } - return root; - } - - public String getContents(Object o, boolean ignoreWhitespace) { - if (o instanceof ZipFile) { - byte[] bytes= ((ZipFile)o).getBytes(); - if (bytes != null) - return new String(bytes); - return ""; //$NON-NLS-1$ - } - return null; - } - - /** - * Returns false since we cannot update a zip archive. - * @return false - */ - public boolean canSave() { - return false; - } - - /** - * Called whenever a copy operation has been performed on a tree node. - * This implementation throws an AssertionFailedException - * since we cannot update a zip archive. - * - * @param structure the node for which to save the new content - * @param input the object from which the structure tree was created in getStructure - */ - public void save(IStructureComparator structure, Object input) { - Assert.isTrue(false); // Cannot update zip archive - } - - public IStructureComparator locate(Object path, Object source) { - return null; - } - - /** - * Returns false since this IStructureCreator - * cannot rewrite the diff tree in order to fold certain combinations of - * additons and deletions. - *

- * Note: this method is for internal use only. Clients should not call this method. - * @return false - */ - public boolean canRewriteTree() { - return false; - } - - /** - * Empty implementation since this IStructureCreator - * cannot rewrite the diff tree in order to fold certain combinations of - * additons and deletions. - *

- * Note: this method is for internal use only. Clients should not call this method. - * @param differencer - * @param root - */ - public void rewriteTree(Differencer differencer, IDiffContainer root) { - // empty default implementation - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ContentMergeViewer.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ContentMergeViewer.java deleted file mode 100644 index b5a54ba89..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ContentMergeViewer.java +++ /dev/null @@ -1,1043 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ - -package org.eclipse.compare.contentmergeviewer; - -import java.util.ResourceBundle; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; -import org.eclipse.swt.custom.CLabel; -import org.eclipse.ui.IKeyBindingService; -import org.eclipse.ui.IWorkbenchPartSite; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.CoreException; - -import org.eclipse.jface.util.*; -import org.eclipse.jface.action.*; -import org.eclipse.jface.dialogs.*; -import org.eclipse.jface.viewers.ContentViewer; -import org.eclipse.jface.viewers.IContentProvider; -import org.eclipse.jface.viewers.ISelection; - -import org.eclipse.compare.*; -import org.eclipse.compare.structuremergeviewer.*; -import org.eclipse.compare.internal.*; - -/** - * An abstract compare and merge viewer with two side-by-side content areas - * and an optional content area for the ancestor. The implementation makes no - * assumptions about the content type. - *

- * ContentMergeViewer - *

- * A ContentMergeViewer accesses its - * model by means of a content provider which must implement the - * IMergeViewerContentProvider interface. - *

- *

- * Clients may wish to use the standard concrete subclass TextMergeViewer, - * or define their own subclass. - * - * @see IMergeViewerContentProvider - * @see TextMergeViewer - */ -public abstract class ContentMergeViewer extends ContentViewer - implements IPropertyChangeNotifier, ISavable { - - class SaveAction extends MergeViewerAction { - - SaveAction(boolean left) { - super(true, false, false); - Utilities.initAction(this, getResourceBundle(), "action.save."); //$NON-NLS-1$ - } - - public void run() { - saveContent(getInput()); - } - } - - /** - * Property names. - */ - private static final String ANCESTOR_ENABLED= ComparePreferencePage.INITIALLY_SHOW_ANCESTOR_PANE; - - /* package */ static final int HORIZONTAL= 1; - /* package */ static final int VERTICAL= 2; - - static final double HSPLIT= 0.5; - static final double VSPLIT= 0.3; - - private class ContentMergeViewerLayout extends Layout { - - public Point computeSize(Composite c, int w, int h, boolean force) { - return new Point(100, 100); - } - - public void layout(Composite composite, boolean force) { - - // determine some derived sizes - int headerHeight= fLeftLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).y; - Rectangle r= composite.getClientArea(); - - int centerWidth= getCenterWidth(); - int width1= (int)((r.width-centerWidth)*fHSplit); - int width2= r.width-width1-centerWidth; - - int height1= 0; - int height2= 0; - if (fAncestorEnabled && fShowAncestor) { - height1= (int)((r.height-(2*headerHeight))*fVSplit); - height2= r.height-(2*headerHeight)-height1; - } else { - height1= 0; - height2= r.height-headerHeight; - } - - int y= 0; - - if (fAncestorEnabled && fShowAncestor) { - fAncestorLabel.setBounds(0, y, r.width, headerHeight); - fAncestorLabel.setVisible(true); - y+= headerHeight; - handleResizeAncestor(0, y, r.width, height1); - y+= height1; - } else { - fAncestorLabel.setVisible(false); - handleResizeAncestor(0, 0, 0, 0); - } - - fLeftLabel.getSize(); // without this resizing would not always work - - if (centerWidth > 3) { - fLeftLabel.setBounds(0, y, width1+1, headerHeight); - fDirectionLabel.setVisible(true); - fDirectionLabel.setBounds(width1+1, y, centerWidth-1, headerHeight); - fRightLabel.setBounds(width1+centerWidth, y, width2, headerHeight); - } else { - fLeftLabel.setBounds(0, y, width1, headerHeight); - fDirectionLabel.setVisible(false); - fRightLabel.setBounds(width1, y, r.width-width1, headerHeight); - } - - y+= headerHeight; - - if (fCenter != null && !fCenter.isDisposed()) - fCenter.setBounds(width1, y, centerWidth, height2); - - handleResizeLeftRight(0, y, width1, centerWidth, width2, height2); - } - } - - class Resizer extends MouseAdapter implements MouseMoveListener { - - Control fControl; - int fX, fY; - int fWidth1, fWidth2; - int fHeight1, fHeight2; - int fDirection; - boolean fLiveResize; - boolean fIsDown; - - public Resizer(Control c, int dir) { - fDirection= dir; - fControl= c; - fLiveResize= !(fControl instanceof Sash); - updateCursor(c, dir); - fControl.addMouseListener(this); - fControl.addMouseMoveListener(this); - fControl.addDisposeListener( - new DisposeListener() { - public void widgetDisposed(DisposeEvent e) { - fControl= null; - } - } - ); - } - - public void mouseDoubleClick(MouseEvent e) { - if ((fDirection & HORIZONTAL) != 0) - fHSplit= HSPLIT; - if ((fDirection & VERTICAL) != 0) - fVSplit= VSPLIT; - fComposite.layout(true); - } - - public void mouseDown(MouseEvent e) { - Composite parent= fControl.getParent(); - - Point s= parent.getSize(); - Point as= fAncestorLabel.getSize(); - Point ys= fLeftLabel.getSize(); - Point ms= fRightLabel.getSize(); - - fWidth1= ys.x; - fWidth2= ms.x; - fHeight1= fLeftLabel.getLocation().y-as.y; - fHeight2= s.y-(fLeftLabel.getLocation().y+ys.y); - - fX= e.x; - fY= e.y; - fIsDown= true; - } - - public void mouseUp(MouseEvent e) { - fIsDown= false; - if (!fLiveResize) - resize(e); - } - - public void mouseMove(MouseEvent e) { - if (fIsDown && fLiveResize) - resize(e); - } - - private void resize(MouseEvent e) { - int dx= e.x-fX; - int dy= e.y-fY; - - int centerWidth= fCenter.getSize().x; - - if (fWidth1 + dx > centerWidth && fWidth2 - dx > centerWidth) { - fWidth1+= dx; - fWidth2-= dx; - if ((fDirection & HORIZONTAL) != 0) - fHSplit= (double)fWidth1/(double)(fWidth1+fWidth2); - } - if (fHeight1 + dy > centerWidth && fHeight2 - dy > centerWidth) { - fHeight1+= dy; - fHeight2-= dy; - if ((fDirection & VERTICAL) != 0) - fVSplit= (double)fHeight1/(double)(fHeight1+fHeight2); - } - - fComposite.layout(true); - fControl.getDisplay().update(); - } - } - - /** Style bits for top level composite */ - private int fStyles; - private ResourceBundle fBundle; - private CompareConfiguration fCompareConfiguration; - private IPropertyChangeListener fPropertyChangeListener; - private ICompareInputChangeListener fCompareInputChangeListener; - private ListenerList fListenerList; - boolean fConfirmSave= true; - - private double fHSplit= HSPLIT; // width ratio of left and right panes - private double fVSplit= VSPLIT; // height ratio of ancestor and bottom panes - - private boolean fAncestorEnabled= true; // show ancestor in case of conflicts - /* package */ boolean fShowAncestor= false; // if current input has conflicts - private boolean fIsThreeWay= false; - private ActionContributionItem fAncestorItem; - - private Action fCopyLeftToRightAction; // copy from left to right - private Action fCopyRightToLeftAction; // copy from right to left - - MergeViewerAction fLeftSaveAction; - MergeViewerAction fRightSaveAction; - - private IKeyBindingService fKeyBindingService; - - // SWT widgets - /* package */ Composite fComposite; - private CLabel fAncestorLabel; - private CLabel fLeftLabel; - private CLabel fRightLabel; - /* package */ CLabel fDirectionLabel; - /* package */ Control fCenter; - - //---- SWT resources to be disposed - private Image fRightArrow; - private Image fLeftArrow; - private Image fBothArrow; - Cursor fNormalCursor; - private Cursor fHSashCursor; - private Cursor fVSashCursor; - private Cursor fHVSashCursor; - - //---- end - - /** - * Creates a new content merge viewer and initializes with a resource bundle and a - * configuration. - * - * @param style SWT style bits - * @param bundle the resource bundle - * @param cc the configuration object - */ - protected ContentMergeViewer(int style, ResourceBundle bundle, CompareConfiguration cc) { - fStyles= style; - fBundle= bundle; - - fAncestorEnabled= Utilities.getBoolean(cc, ANCESTOR_ENABLED, fAncestorEnabled); - fConfirmSave= Utilities.getBoolean(cc, CompareEditor.CONFIRM_SAVE_PROPERTY, fConfirmSave); - - setContentProvider(new MergeViewerContentProvider(cc)); - - fCompareInputChangeListener= new ICompareInputChangeListener() { - public void compareInputChanged(ICompareInput input) { - ContentMergeViewer.this.internalRefresh(input); - } - }; - - fCompareConfiguration= cc; - if (fCompareConfiguration != null) { - fPropertyChangeListener= new IPropertyChangeListener() { - public void propertyChange(PropertyChangeEvent event) { - ContentMergeViewer.this.propertyChange(event); - } - }; - fCompareConfiguration.addPropertyChangeListener(fPropertyChangeListener); - } - - fLeftSaveAction= new SaveAction(true); - fLeftSaveAction.setEnabled(false); - fRightSaveAction= new SaveAction(false); - fRightSaveAction.setEnabled(false); - } - - //---- hooks --------------------- - - /** - * Returns the viewer's name. - * - * @return the viewer's name - */ - public String getTitle() { - return Utilities.getString(getResourceBundle(), "title"); //$NON-NLS-1$ - } - - /** - * Creates the SWT controls for the ancestor, left, and right - * content areas of this compare viewer. - * Implementations typically hold onto the controls - * so that they can be initialized with the input objects in method - * updateContent. - * - * @param composite the container for the three areas - */ - abstract protected void createControls(Composite composite); - - /** - * Lays out the ancestor area of the compare viewer. - * It is called whenever the viewer is resized or when the sashes between - * the areas are moved to adjust the size of the areas. - * - * @param x the horizontal position of the ancestor area within its container - * @param y the vertical position of the ancestor area within its container - * @param width the width of the ancestor area - * @param height the height of the ancestor area - */ - abstract protected void handleResizeAncestor(int x, int y, int width, int height); - - /** - * Lays out the left and right areas of the compare viewer. - * It is called whenever the viewer is resized or when the sashes between - * the areas are moved to adjust the size of the areas. - * - * @param x the horizontal position of the left area within its container - * @param y the vertical position of the left and right area within its container - * @param leftWidth the width of the left area - * @param centerWidth the width of the gap between the left and right areas - * @param rightWidth the width of the right area - * @param height the height of the left and right areas - */ - abstract protected void handleResizeLeftRight(int x, int y, int leftWidth, int centerWidth, - int rightWidth, int height); - - /** - * Contributes items to the given ToolBarManager. - * It is called when this viewer is installed in its container and if the container - * has a ToolBarManager. - * The ContentMergeViewer implementation of this method does nothing. - * Subclasses may reimplement. - * - * @param toolBarManager the toolbar manager to contribute to - */ - protected void createToolItems(ToolBarManager toolBarManager) { - // empty implementation - } - - /** - * Initializes the controls of the three content areas with the given input objects. - * - * @param ancestor the input for the ancestor area - * @param left the input for the left area - * @param right the input for the right area - */ - abstract protected void updateContent(Object ancestor, Object left, Object right); - - /** - * Copies the content of one side to the other side. - * Called from the (internal) actions for copying the sides of the viewer's input object. - * - * @param leftToRight if true, the left side is copied to the right side; - * if false, the right side is copied to the left side - */ - abstract protected void copy(boolean leftToRight); - - /** - * Returns the byte contents of the left or right side. If the viewer - * has no editable content null can be returned. - * - * @param left if true, the byte contents of the left area is returned; - * if false, the byte contents of the right area - * @return the content as an array of bytes, or null - */ - abstract protected byte[] getContents(boolean left); - - //---------------------------- - - /** - * Returns the resource bundle of this viewer. - * - * @return the resource bundle - */ - protected ResourceBundle getResourceBundle() { - return fBundle; - } - - /** - * Returns the compare configuration of this viewer, - * or null if this viewer does not yet have a configuration. - * - * @return the compare configuration, or null if none - */ - protected CompareConfiguration getCompareConfiguration() { - return fCompareConfiguration; - } - - /** - * The ContentMergeViewer implementation of this - * ContentViewer method - * checks to ensure that the content provider is an IMergeViewerContentProvider. - * @param contentProvider the contentprovider to set. Must implement IMergeViewerContentProvider. - */ - public void setContentProvider(IContentProvider contentProvider) { - Assert.isTrue(contentProvider instanceof IMergeViewerContentProvider); - super.setContentProvider(contentProvider); - } - - /* package */ IMergeViewerContentProvider getMergeContentProvider() { - return (IMergeViewerContentProvider) getContentProvider(); - } - - /** - * The ContentMergeViewer implementation of this - * Viewer method returns the empty selection. Subclasses may override. - * @return empty selection. - */ - public ISelection getSelection() { - return new ISelection() { - public boolean isEmpty() { - return true; - } - }; - } - - /* - * The ContentMergeViewer implementation of this - * Viewer method does nothing. Subclasses may reimplement. - */ - public void setSelection(ISelection selection, boolean reveal) { - // empty implementation - } - - /* package */ void propertyChange(PropertyChangeEvent event) { - - String key= event.getProperty(); - - if (key.equals(ANCESTOR_ENABLED)) { - fAncestorEnabled= Utilities.getBoolean(getCompareConfiguration(), ANCESTOR_ENABLED, fAncestorEnabled); - fComposite.layout(true); - - updateCursor(fLeftLabel, VERTICAL); - updateCursor(fDirectionLabel, HORIZONTAL | VERTICAL); - updateCursor(fRightLabel, VERTICAL); - - return; - } - } - - void updateCursor(Control c, int dir) { - if (!(c instanceof Sash)) { - Cursor cursor= null; - switch (dir) { - case VERTICAL: - if (fAncestorEnabled) { - if (fVSashCursor == null) fVSashCursor= new Cursor(c.getDisplay(), SWT.CURSOR_SIZENS); - cursor= fVSashCursor; - } else { - if (fNormalCursor == null) fNormalCursor= new Cursor(c.getDisplay(), SWT.CURSOR_ARROW); - cursor= fNormalCursor; - } - break; - case HORIZONTAL: - if (fHSashCursor == null) fHSashCursor= new Cursor(c.getDisplay(), SWT.CURSOR_SIZEWE); - cursor= fHSashCursor; - break; - case VERTICAL + HORIZONTAL: - if (fAncestorEnabled) { - if (fHVSashCursor == null) fHVSashCursor= new Cursor(c.getDisplay(), SWT.CURSOR_SIZEALL); - cursor= fHVSashCursor; - } else { - if (fHSashCursor == null) fHSashCursor= new Cursor(c.getDisplay(), SWT.CURSOR_SIZEWE); - cursor= fHSashCursor; - } - break; - } - if (cursor != null) - c.setCursor(cursor); - } - } - - void setAncestorVisibility(boolean visible, boolean enabled) { - if (fAncestorItem != null) { - Action action= (Action) fAncestorItem.getAction(); - if (action != null) { - action.setChecked(visible); - action.setEnabled(enabled); - } - } - if (fCompareConfiguration != null) - fCompareConfiguration.setProperty(ANCESTOR_ENABLED, new Boolean(visible)); - } - - //---- input - - /* package */ boolean isThreeWay() { - return fIsThreeWay; - } - - /** - * Internal hook method called when the input to this viewer is - * initially set or subsequently changed. - *

- * The ContentMergeViewer implementation of this Viewer - * method tries to save the old input by calling doSave(...) and - * then calls internalRefresh(...). - * - * @param input the new input of this viewer, or null if there is no new input - * @param oldInput the old input element, or null if there was previously no input - */ - protected final void inputChanged(Object input, Object oldInput) { - - if (input != oldInput) - if (oldInput instanceof ICompareInput) - ((ICompareInput)oldInput).removeCompareInputChangeListener(fCompareInputChangeListener); - - boolean success= doSave(input, oldInput); - - if (input != oldInput) - if (input instanceof ICompareInput) - ((ICompareInput)input).addCompareInputChangeListener(fCompareInputChangeListener); - - if (success) { - setLeftDirty(false); - setRightDirty(false); - } - - if (input != oldInput) - internalRefresh(input); - } - - /** - * This method is called from the Viewer method inputChanged - * to save any unsaved changes of the old input. - *

- * The ContentMergeViewer implementation of this - * method calls saveContent(...). If confirmation has been turned on - * with setConfirmSave(true), a confirmation alert is posted before saving. - *

- * Clients can override this method and are free to decide whether - * they want to call the inherited method. - * @param newInput the new input of this viewer, or null if there is no new input - * @param oldInput the old input element, or null if there was previously no input - * @return true if saving was successful, or if the user didn't want to save (by pressing 'NO' in the confirmation dialog). - * @since 2.0 - */ - protected boolean doSave(Object newInput, Object oldInput) { - - // before setting the new input we have to save the old - if (fLeftSaveAction.isEnabled() || fRightSaveAction.isEnabled()) { - - // post alert - if (fConfirmSave) { - Shell shell= fComposite.getShell(); - - MessageDialog dialog= new MessageDialog(shell, - Utilities.getString(getResourceBundle(), "saveDialog.title"), //$NON-NLS-1$ - null, // accept the default window icon - Utilities.getString(getResourceBundle(), "saveDialog.message"), //$NON-NLS-1$ - MessageDialog.QUESTION, - new String[] { - IDialogConstants.YES_LABEL, - IDialogConstants.NO_LABEL, - }, - 0); // default button index - - switch (dialog.open()) { // open returns index of pressed button - case 0: - saveContent(oldInput); - break; - case 1: - setLeftDirty(false); - setRightDirty(false); - break; - case 2: - throw new ViewerSwitchingCancelled(); - } - } else - saveContent(oldInput); - return true; - } - return false; - } - - /** - * Controls whether doSave(Object, Object) asks for confirmation before saving - * the old input with saveContent(Object). - * @param enable a value of true enables confirmation - * @since 2.0 - */ - public void setConfirmSave(boolean enable) { - fConfirmSave= enable; - } - - /* (non Javadoc) - * see Viewer.refresh - */ - public void refresh() { - internalRefresh(getInput()); - } - - private void internalRefresh(Object input) { - - IMergeViewerContentProvider content= getMergeContentProvider(); - if (content != null) { - Object ancestor= content.getAncestorContent(input); - if (input instanceof ICompareInput) - fIsThreeWay= (((ICompareInput)input).getKind() & Differencer.DIRECTION_MASK) != 0; - else - fIsThreeWay= ancestor != null; - - if (fAncestorItem != null) - fAncestorItem.setVisible(fIsThreeWay); - - boolean oldFlag= fShowAncestor; - fShowAncestor= fIsThreeWay && content.showAncestor(input); - - if (fAncestorEnabled && oldFlag != fShowAncestor) - fComposite.layout(true); - - ToolBarManager tbm= CompareViewerPane.getToolBarManager(fComposite.getParent()); - if (tbm != null) { - updateToolItems(); - tbm.update(true); - tbm.getControl().getParent().layout(true); - } - - updateHeader(); - - Object left= content.getLeftContent(input); - Object right= content.getRightContent(input); - updateContent(ancestor, left, right); - } - } - - //---- layout & SWT control creation - - /** - * Builds the SWT controls for the three areas of a compare/merge viewer. - *

- * Calls the hooks createControls and createToolItems - * to let subclasses build the specific content areas and to add items to - * an enclosing toolbar. - *

- * This method must only be called in the constructor of subclasses. - * - * @param parent the parent control - * @return the new control - */ - protected final Control buildControl(Composite parent) { - - fComposite= new Composite(parent, fStyles) { - public boolean setFocus() { - return internalSetFocus(); - } - }; - fComposite.setData(CompareUI.COMPARE_VIEWER_TITLE, getTitle()); - - hookControl(fComposite); // hook help & dispose listener - - fComposite.setLayout(new ContentMergeViewerLayout()); - - int style= SWT.SHADOW_OUT; - fAncestorLabel= new CLabel(fComposite, style); - - fLeftLabel= new CLabel(fComposite, style); - new Resizer(fLeftLabel, VERTICAL); - - fDirectionLabel= new CLabel(fComposite, style); - fDirectionLabel.setAlignment(SWT.CENTER); - new Resizer(fDirectionLabel, HORIZONTAL | VERTICAL); - - fRightLabel= new CLabel(fComposite, style); - new Resizer(fRightLabel, VERTICAL); - - if (fCenter == null || fCenter.isDisposed()) - fCenter= createCenter(fComposite); - - createControls(fComposite); - - IWorkbenchPartSite ps= Utilities.findSite(fComposite); - fKeyBindingService= ps != null ? ps.getKeyBindingService() : null; - - ToolBarManager tbm= CompareViewerPane.getToolBarManager(parent); - if (tbm != null) { - tbm.removeAll(); - - // define groups - tbm.add(new Separator("modes")); //$NON-NLS-1$ - tbm.add(new Separator("merge")); //$NON-NLS-1$ - tbm.add(new Separator("navigation")); //$NON-NLS-1$ - - CompareConfiguration cc= getCompareConfiguration(); - - if (cc.isRightEditable()) { - fCopyLeftToRightAction= - new Action() { - public void run() { - copy(true); - } - }; - Utilities.initAction(fCopyLeftToRightAction, getResourceBundle(), "action.CopyLeftToRight."); //$NON-NLS-1$ - tbm.appendToGroup("merge", fCopyLeftToRightAction); //$NON-NLS-1$ - Utilities.registerAction(fKeyBindingService, fCopyLeftToRightAction, "org.eclipse.compare.copyAllLeftToRight"); //$NON-NLS-1$ - } - - if (cc.isLeftEditable()) { - fCopyRightToLeftAction= - new Action() { - public void run() { - copy(false); - } - }; - Utilities.initAction(fCopyRightToLeftAction, getResourceBundle(), "action.CopyRightToLeft."); //$NON-NLS-1$ - tbm.appendToGroup("merge", fCopyRightToLeftAction); //$NON-NLS-1$ - Utilities.registerAction(fKeyBindingService, fCopyRightToLeftAction, "org.eclipse.compare.copyAllRightToLeft"); //$NON-NLS-1$ - } - - Action a= new ChangePropertyAction(fBundle, fCompareConfiguration, "action.EnableAncestor.", ANCESTOR_ENABLED); //$NON-NLS-1$ - a.setChecked(fAncestorEnabled); - fAncestorItem= new ActionContributionItem(a); - fAncestorItem.setVisible(false); - tbm.appendToGroup("modes", fAncestorItem); //$NON-NLS-1$ - - createToolItems(tbm); - updateToolItems(); - - tbm.update(true); - } - - return fComposite; - } - - /* package */ boolean internalSetFocus() { - return false; - } - - /* package */ int getCenterWidth() { - return 3; - } - - /* package */ boolean getAncestorEnabled() { - return fAncestorEnabled; - } - - /* package */ Control createCenter(Composite parent) { - Sash sash= new Sash(parent, SWT.VERTICAL); - new Resizer(sash, HORIZONTAL); - return sash; - } - - /* package */ Control getCenter() { - return fCenter; - } - - /* - * @see Viewer.getControl() - */ - public Control getControl() { - return fComposite; - } - - /* - * Called on the viewer disposal. - * Unregisters from the compare configuration. - * Clients may extend if they have to do additional cleanup. - */ - protected void handleDispose(DisposeEvent event) { - - if (fKeyBindingService != null) { - if (fCopyLeftToRightAction != null) - fKeyBindingService.unregisterAction(fCopyLeftToRightAction); - if (fCopyRightToLeftAction != null) - fKeyBindingService.unregisterAction(fCopyRightToLeftAction); - fKeyBindingService= null; - } - - Object input= getInput(); - if (input instanceof ICompareInput) - ((ICompareInput)input).removeCompareInputChangeListener(fCompareInputChangeListener); - - if (fCompareConfiguration != null && fPropertyChangeListener != null) { - fCompareConfiguration.removePropertyChangeListener(fPropertyChangeListener); - fPropertyChangeListener= null; - } - - fAncestorLabel= null; - fLeftLabel= null; - fDirectionLabel= null; - fRightLabel= null; - fCenter= null; - - if (fRightArrow != null) { - fRightArrow.dispose(); - fRightArrow= null; - } - if (fLeftArrow != null) { - fLeftArrow.dispose(); - fLeftArrow= null; - } - if (fBothArrow != null) { - fBothArrow.dispose(); - fBothArrow= null; - } - - if (fNormalCursor != null) { - fNormalCursor.dispose(); - fNormalCursor= null; - } - if (fHSashCursor != null) { - fHSashCursor.dispose(); - fHSashCursor= null; - } - if (fVSashCursor != null) { - fVSashCursor.dispose(); - fVSashCursor= null; - } - if (fHVSashCursor != null) { - fHVSashCursor.dispose(); - fHVSashCursor= null; - } - - super.handleDispose(event); - } - - /** - * Updates the enabled state of the toolbar items. - *

- * This method is called whenever the state of the items needs updating. - *

- * Subclasses may extend this method, although this is generally not required. - */ - protected void updateToolItems() { - - IMergeViewerContentProvider content= getMergeContentProvider(); - - Object input= getInput(); - - if (fCopyLeftToRightAction != null) { - boolean enable= content.isRightEditable(input); -// if (enable && input instanceof ICompareInput) { -// ITypedElement e= ((ICompareInput) input).getLeft(); -// if (e == null) -// enable= false; -// } - fCopyLeftToRightAction.setEnabled(enable); - } - - if (fCopyRightToLeftAction != null) { - boolean enable= content.isLeftEditable(input); -// if (enable && input instanceof ICompareInput) { -// ITypedElement e= ((ICompareInput) input).getRight(); -// if (e == null) -// enable= false; -// } - fCopyRightToLeftAction.setEnabled(enable); - } - } - - /** - * Updates the headers of the three areas - * by querying the content provider for a name and image for - * the three sides of the input object. - *

- * This method is called whenever the header must be updated. - *

- * Subclasses may extend this method, although this is generally not required. - */ - protected void updateHeader() { - - IMergeViewerContentProvider content= getMergeContentProvider(); - Object input= getInput(); - - if (fAncestorLabel != null) { - fAncestorLabel.setImage(content.getAncestorImage(input)); - fAncestorLabel.setText(content.getAncestorLabel(input)); - } - if (fLeftLabel != null) { - fLeftLabel.setImage(content.getLeftImage(input)); - fLeftLabel.setText(content.getLeftLabel(input)); - } - if (fRightLabel != null) { - fRightLabel.setImage(content.getRightImage(input)); - fRightLabel.setText(content.getRightLabel(input)); - } - } - -// private Image loadImage(String name) { -// ImageDescriptor id= ImageDescriptor.createFromFile(ContentMergeViewer.class, name); -// if (id != null) -// return id.createImage(); -// return null; -// } - - /* - * Calculates the height of the header. - */ - /* package */ int getHeaderHeight() { - int headerHeight= fLeftLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).y; - headerHeight= Math.max(headerHeight, fDirectionLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).y); - return headerHeight; - } - - //---- merge direction - - /* - * Returns true if both sides are editable. - */ - /* package */ boolean canToggleMergeDirection() { - IMergeViewerContentProvider content= getMergeContentProvider(); - Object input= getInput(); - return content.isLeftEditable(input) && content.isRightEditable(input); - } - - //---- dirty state & saving state - - /* (non Javadoc) - * see IPropertyChangeNotifier.addPropertyChangeListener - */ - public void addPropertyChangeListener(IPropertyChangeListener listener) { - if (fListenerList == null) - fListenerList= new ListenerList(); - fListenerList.add(listener); - } - - /* (non Javadoc) - * see IPropertyChangeNotifier.removePropertyChangeListener - */ - public void removePropertyChangeListener(IPropertyChangeListener listener) { - if (fListenerList != null) { - fListenerList.remove(listener); - if (fListenerList.isEmpty()) - fListenerList= null; - } - } - - /* package */ void fireDirtyState(boolean state) { - Utilities.firePropertyChange(fListenerList, this, CompareEditorInput.DIRTY_STATE, null, new Boolean(state)); - } - - /** - * Sets the dirty state of the left side of this viewer. - * If the new value differs from the old - * all registered listener are notified with - * a PropertyChangeEvent with the - * property name CompareEditorInput.DIRTY_STATE. - * - * @param dirty the state of the left side dirty flag - */ - protected void setLeftDirty(boolean dirty) { - if (fLeftSaveAction.isEnabled() != dirty) { - fLeftSaveAction.setEnabled(dirty); - fireDirtyState(dirty); - } - } - - /** - * Sets the dirty state of the right side of this viewer. - * If the new value differs from the old - * all registered listener are notified with - * a PropertyChangeEvent with the - * property name CompareEditorInput.DIRTY_STATE. - * - * @param dirty the state of the right side dirty flag - */ - protected void setRightDirty(boolean dirty) { - if (fRightSaveAction.isEnabled() != dirty) { - fRightSaveAction.setEnabled(dirty); - fireDirtyState(dirty); - } - } - - /* - * Save the viewers's content. - * Note: this method is for internal use only. Clients should not call this method. - * @since 2.0 - */ - public void save(IProgressMonitor pm) throws CoreException { - saveContent(getInput()); - } - - /* - * Save modified content back to input elements via the content provider. - */ - /* package */ void saveContent(Object oldInput) { - - // write back modified contents - IMergeViewerContentProvider content= (IMergeViewerContentProvider) getContentProvider(); - - boolean leftEmpty= content.getLeftContent(oldInput) == null; - boolean rightEmpty= content.getRightContent(oldInput) == null; - - if (fCompareConfiguration.isLeftEditable() && fLeftSaveAction.isEnabled()) { - byte[] bytes= getContents(true); - if (leftEmpty && bytes != null && bytes.length == 0) - bytes= null; - setLeftDirty(false); - content.saveLeftContent(oldInput, bytes); - } - - if (fCompareConfiguration.isRightEditable() && fRightSaveAction.isEnabled()) { - byte[] bytes= getContents(false); - if (rightEmpty && bytes != null && bytes.length == 0) - bytes= null; - setRightDirty(false); - content.saveRightContent(oldInput, bytes); - } - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/IDocumentRange.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/IDocumentRange.java deleted file mode 100644 index fedb53161..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/IDocumentRange.java +++ /dev/null @@ -1,54 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.contentmergeviewer; - -import org.eclipse.jface.text.Position; -import org.eclipse.jface.text.IDocument; - - -/** - * Defines a subrange in a document. - *

- * It is used by text viewers that can work on a subrange of a document. For example, - * a text viewer for Java compilation units might use this to restrict the view - * to a single method. - *

- *

- * Clients may implement this interface. - *

- * - * @see TextMergeViewer - * @see org.eclipse.compare.structuremergeviewer.DocumentRangeNode - */ -public interface IDocumentRange { - - /** - * The position category typically used for an IDocumentRange position - * (value "DocumentRangeCategory"). - * @since 2.0 - */ - public static final String RANGE_CATEGORY= "DocumentRangeCategory"; //$NON-NLS-1$ - - /** - * Returns the underlying document. - * - * @return the underlying document - */ - IDocument getDocument(); - - /** - * Returns a position that specifies a subrange in the underlying document, - * or null if this document range spans the whole underlying document. - * - * @return a position that specifies a subrange in the underlying document, or null - */ - Position getRange(); -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/IMergeViewerContentProvider.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/IMergeViewerContentProvider.java deleted file mode 100644 index 31d78b570..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/IMergeViewerContentProvider.java +++ /dev/null @@ -1,155 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.contentmergeviewer; - -import org.eclipse.swt.graphics.Image; -import org.eclipse.jface.viewers.IContentProvider; - - -/** - * A content provider that mediates between a ContentMergeViewer's model - * and the viewer itself. - *

- * Clients may implement this interface. - *

- * - * @see ContentMergeViewer - */ -public interface IMergeViewerContentProvider extends IContentProvider { - - //---- ancestor side - - /** - * Returns the label for the ancestor side of a ContentMergeViewer. - * - * @param input the input object of the ContentMergeViewer - * @return the label for the ancestor side of a ContentMergeViewer - */ - String getAncestorLabel(Object input); - - /** - * Returns an optional image for the ancestor side of a ContentMergeViewer. - * - * @param input the input object of the ContentMergeViewer - * @return the image for the ancestor side of a ContentMergeViewer, - * or null if none - */ - Image getAncestorImage(Object input); - - /** - * Returns the contents for the ancestor side of a ContentMergeViewer. - * The interpretation of the returned object depends on the concrete ContentMergeViewer. - * - * @param input the input object of the ContentMergeViewer - * @return the content for the ancestor side of a ContentMergeViewer, - * or null if none - */ - Object getAncestorContent(Object input); - - /** - * Returns whether the ancestor side of the given input element should be shown. - * @param input the merge viewer's input - * @return true if the ancestor side of the given input element should be shown - */ - boolean showAncestor(Object input); - - //---- left side - - /** - * Returns the label for the left side of a ContentMergeViewer. - * - * @param input the input object of the ContentMergeViewer - * @return the label for the left side of a ContentMergeViewer - */ - String getLeftLabel(Object input); - - /** - * Returns an optional image for the left side of a ContentMergeViewer. - * - * @param input the input object of the ContentMergeViewer - * @return the image for the left side of a ContentMergeViewer, - * or null if none - */ - Image getLeftImage(Object input); - - /** - * Returns the contents for the left side of a ContentMergeViewer. - * The interpretation of the returned object depends on the concrete ContentMergeViewer. - * - * @param input the input object of the ContentMergeViewer - * @return the content for the left side of a ContentMergeViewer, - * or null if none - */ - Object getLeftContent(Object input); - - /** - * Returns whether the left side is editable. - * - * @param input the input object of the ContentMergeViewer - * @return true if the left side of a ContentMergeViewer is editable - */ - boolean isLeftEditable(Object input); - - /** - * Saves new contents for the left side of the ContentMergeViewer. - * - * @param input the input object of the ContentMergeViewer - * @param bytes the new contents to save for the left side - */ - void saveLeftContent(Object input, byte[] bytes); - - //---- right side - - /** - * Returns the label for the right side of a ContentMergeViewer. - * - * @param input the input object of the ContentMergeViewer - * @return the label for the right side of a ContentMergeViewer - */ - String getRightLabel(Object input); - - /** - * Returns an optional image for the right side of a ContentMergeViewer. - * - * @param input the input object of the ContentMergeViewer - * @return the image for the right side of a ContentMergeViewer, - * or null if none - */ - Image getRightImage(Object input); - - /** - * Returns the contents for the right side of a ContentMergeViewer. - * The interpretation of the returned object depends on the concrete ContentMergeViewer. - * - * @param input the input object of the ContentMergeViewer - * @return the content for the right side of a ContentMergeViewer, - * or null if none - */ - Object getRightContent(Object input); - - /** - * Returns whether the right side is editable. - * - * @param input the input object of the ContentMergeViewer - * @return true if the right side of a ContentMergeViewer is editable - */ - boolean isRightEditable(Object input); - - /** - * Saves new contents for the right side of the ContentMergeViewer. - * - * @param input the input object of the ContentMergeViewer - * @param bytes the new contents to save for the right side - */ - void saveRightContent(Object input, byte[] bytes); -} - - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ITokenComparator.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ITokenComparator.java deleted file mode 100644 index 43f03f1f4..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/ITokenComparator.java +++ /dev/null @@ -1,57 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.contentmergeviewer; - -import org.eclipse.compare.rangedifferencer.IRangeComparator; - - -/** - * For performing a so-called "token compare" on a line of text. - * This interface extends the IRangeComparator interface - * so that it can be used by the TextMergeViewer. - *

- * TextMergeViewer activates the token compare when navigating into - * a range of differing lines. At first the lines are selected as a block. - * When navigating into this block the token compare shows for every line - * the differing token by selecting them. - *

- * TextMergeViewer's default token comparator works on characters separated - * by whitespace. If a different strategy is needed (for example, to use Java tokens in - * a Java-aware merge viewer), clients may create their own token - * comparators by implementing this interface (and overriding the - * TextMergeViewer.createTokenComparator factory method). - *

- * - * @see TextMergeViewer - */ -public interface ITokenComparator extends IRangeComparator { - - /** - * Returns the start character position of the token with the given index. - * If the index is out of range (but not negative) the character position - * behind the last character (the length of the input string) is returned. - * - * @param index index of the token for which to return the start position - * @return the start position of the token with the given index - * @throws java.lang.IndexOutOfBoundsException if index is negative - */ - int getTokenStart(int index); - - /** - * Returns the character length of the token with the given index. - * If the index is out of range (but not negative) the value 0 is returned. - * - * @param index index of the token for which to return the start position - * @return the character length of the token with the given index - * @throws java.lang.IndexOutOfBoundsException if index is negative - */ - int getTokenLength(int index); -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewer.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewer.java deleted file mode 100644 index f145e12e1..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewer.java +++ /dev/null @@ -1,4303 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - * channingwalton@mac.com - curved line code - *******************************************************************************/ -package org.eclipse.compare.contentmergeviewer; - -import java.util.List; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Map; -import java.util.HashMap; -import java.util.ResourceBundle; -import java.text.MessageFormat; - -import java.io.UnsupportedEncodingException; -import java.lang.reflect.InvocationTargetException; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.*; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.RGB; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Cursor; -import org.eclipse.swt.widgets.*; -import org.eclipse.swt.custom.*; - -import org.eclipse.jface.action.*; -import org.eclipse.jface.resource.ColorRegistry; -import org.eclipse.jface.resource.JFaceResources; -import org.eclipse.jface.text.*; -import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.operation.IRunnableWithProgress; - -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.CoreException; - -import org.eclipse.ui.IActionBars; -import org.eclipse.ui.IKeyBindingService; -import org.eclipse.ui.IWorkbenchPartSite; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.actions.ActionFactory; -import org.eclipse.ui.help.WorkbenchHelp; -import org.eclipse.ui.progress.IProgressService; - -import org.eclipse.compare.*; -import org.eclipse.compare.internal.ICompareContextIds; -import org.eclipse.compare.internal.MergeSourceViewer; -import org.eclipse.compare.internal.BufferedCanvas; -import org.eclipse.compare.internal.MergeViewerContentProvider; -import org.eclipse.compare.internal.Utilities; -import org.eclipse.compare.internal.TokenComparator; -import org.eclipse.compare.internal.DocLineComparator; -import org.eclipse.compare.internal.ComparePreferencePage; -import org.eclipse.compare.internal.INavigatable; -import org.eclipse.compare.internal.CompareNavigator; -import org.eclipse.compare.internal.DocumentManager; -import org.eclipse.compare.internal.CompareMessages; -import org.eclipse.compare.rangedifferencer.*; -import org.eclipse.compare.structuremergeviewer.*; - -/** - * A text merge viewer uses the RangeDifferencer to perform a - * textual, line-by-line comparison of two (or three) input documents. - * It is based on the ContentMergeViewer and uses TextViewers - * to implement the ancestor, left, and right content areas. - *

- * In the three-way compare case ranges of differing lines are highlighted and framed - * with different colors to show whether the difference is an incoming, outgoing, or conflicting change. - * The TextMergeViewer supports the notion of a current "differing range" - * and provides toolbar buttons to navigate from one range to the next (or previous). - *

- * If there is a current "differing range" and the underlying document is editable - * the TextMergeViewer enables actions in context menu and toolbar to - * copy a range from one side to the other side, thereby performing a merge operation. - *

- * In addition to a line-by-line comparison the TextMergeViewer - * uses a token based compare on differing lines. - * The token compare is activated when navigating into - * a range of differing lines. At first the lines are selected as a block. - * When navigating into this block the token compare shows for every line - * the differing token by selecting them. - *

- * The TextMergeViewer's default token compare works on characters separated - * by whitespace. If a different strategy is needed (for example, Java tokens in - * a Java-aware merge viewer), clients can create their own token - * comparators by implementing the ITokenComparator interface and overriding the - * TextMergeViewer.createTokenComparator factory method). - *

- * Access to the TextMergeViewer's model is by means of an - * IMergeViewerContentProvider. Its getXContent methods must return - * either an IDocument, an IDocumentRange, or an IStreamContentAccessor. - * In the IDocumentRange case the TextMergeViewer - * works on a subrange of a document. In the IStreamContentAccessor case - * a document is created internally and initialized from the stream. - *

- * A TextMergeViewer can be used as is. However clients may subclass - * to customize the behavior. For example a MergeTextViewer for Java would override - * the configureTextViewer method to configure the TextViewer for Java source code, - * the createTokenComparator method to create a Java specific tokenizer. - * - * @see org.eclipse.compare.rangedifferencer.RangeDifferencer - * @see org.eclipse.jface.text.TextViewer - * @see ITokenComparator - * @see IDocumentRange - * @see org.eclipse.compare.IStreamContentAccessor - */ -public class TextMergeViewer extends ContentMergeViewer { - - private static final boolean DEBUG= false; - - private static final boolean FIX_47640= true; - - private static final String[] GLOBAL_ACTIONS= { - ActionFactory.UNDO.getId(), - ActionFactory.REDO.getId(), - ActionFactory.CUT.getId(), - ActionFactory.COPY.getId(), - ActionFactory.PASTE.getId(), - ActionFactory.DELETE.getId(), - ActionFactory.SELECT_ALL.getId(), - ActionFactory.SAVE.getId() - }; - private static final String[] TEXT_ACTIONS= { - MergeSourceViewer.UNDO_ID, - MergeSourceViewer.REDO_ID, - MergeSourceViewer.CUT_ID, - MergeSourceViewer.COPY_ID, - MergeSourceViewer.PASTE_ID, - MergeSourceViewer.DELETE_ID, - MergeSourceViewer.SELECT_ALL_ID, - MergeSourceViewer.SAVE_ID - }; - - private static final String BUNDLE_NAME= "org.eclipse.compare.contentmergeviewer.TextMergeViewerResources"; //$NON-NLS-1$ - - // the following symbolic constants must match the IDs in Compare's plugin.xml - private static final String INCOMING_COLOR= "INCOMING_COLOR"; //$NON-NLS-1$ - private static final String OUTGOING_COLOR= "OUTGOING_COLOR"; //$NON-NLS-1$ - private static final String CONFLICTING_COLOR= "CONFLICTING_COLOR"; //$NON-NLS-1$ - private static final String RESOLVED_COLOR= "RESOLVED_COLOR"; //$NON-NLS-1$ - - // constants - /** Width of left and right vertical bar */ - private static final int MARGIN_WIDTH= 6; - /** Width of center bar */ - private static final int CENTER_WIDTH= 34; - /** Width of birds eye view */ - private static final int BIRDS_EYE_VIEW_WIDTH= 12; - /** Width of birds eye view */ - private static final int BIRDS_EYE_VIEW_INSET= 2; - /** */ - private static final int RESOLVE_SIZE= 5; - /** if true copying conflicts from one side to other concatenates both sides */ - private static final boolean APPEND_CONFLICT= true; - - /** line width of change borders */ - private static final int LW= 1; - /** Selects between smartTokenDiff and mergingTokenDiff */ - private static final boolean USE_MERGING_TOKEN_DIFF= false; - - // determines whether a change between left and right is considered incoming or outgoing - private boolean fLeftIsLocal; - private boolean fShowCurrentOnly= false; - private boolean fShowCurrentOnly2= false; - private int fMarginWidth= MARGIN_WIDTH; - private int fTopInset; - - // Colors - private RGB fBackground; - private RGB fForeground; - private boolean fPollSystemForeground= true; - private boolean fPollSystemBackground= true; - - private RGB SELECTED_INCOMING; - private RGB INCOMING; - private RGB INCOMING_FILL; - - private RGB SELECTED_CONFLICT; - private RGB CONFLICT; - private RGB CONFLICT_FILL; - - private RGB SELECTED_OUTGOING; - private RGB OUTGOING; - private RGB OUTGOING_FILL; - - private RGB RESOLVED; - - private boolean fEndOfDocReached; - private IDocumentListener fDocumentListener; - - private IPreferenceStore fPreferenceStore; - private IPropertyChangeListener fPreferenceChangeListener; - - /** All diffs for calculating scrolling position (includes line ranges without changes) */ - private ArrayList fAllDiffs; - /** Subset of above: just real differences. */ - private ArrayList fChangeDiffs; - /** The current diff */ - private Diff fCurrentDiff; - - private HashMap fNewAncestorRanges= new HashMap(); - private HashMap fNewLeftRanges= new HashMap(); - private HashMap fNewRightRanges= new HashMap(); - - private MergeSourceViewer fAncestor; - private MergeSourceViewer fLeft; - private MergeSourceViewer fRight; - - private int fLeftLineCount; - private int fRightLineCount; - - private String fLeftEncoding; - private String fRightEncoding; - - private boolean fInScrolling; - - private int fPts[]= new int[8]; // scratch area for polygon drawing - - private boolean fIgnoreAncestor= false; - private ActionContributionItem fIgnoreAncestorItem; - private boolean fHighlightRanges; - - private boolean fShowPseudoConflicts= false; - - private boolean fUseSplines= true; - private boolean fUseSingleLine= true; - private boolean fUseResolveUI= true; - - private String fSymbolicFontName; - - private ActionContributionItem fNextItem; // goto next difference - private ActionContributionItem fPreviousItem; // goto previous difference - private ActionContributionItem fCopyDiffLeftToRightItem; - private ActionContributionItem fCopyDiffRightToLeftItem; - - private IKeyBindingService fKeyBindingService; - - private boolean fSynchronizedScrolling= true; - private boolean fShowMoreInfo= false; - - private MergeSourceViewer fFocusPart; - - private boolean fSubDoc= true; - private IPositionUpdater fPositionUpdater; - private boolean fIsMotif; - private boolean fIsCarbon; - - private boolean fHasErrors; - - - // SWT widgets - private BufferedCanvas fAncestorCanvas; - private BufferedCanvas fLeftCanvas; - private BufferedCanvas fRightCanvas; - private Canvas fScrollCanvas; - private ScrollBar fVScrollBar; - private Canvas fBirdsEyeCanvas; - private Canvas fSummaryHeader; - private HeaderPainter fHeaderPainter; - - // SWT resources to be disposed - private Map fColors; - private Cursor fBirdsEyeCursor; - - // points for center curves - private double[] fBasicCenterCurve; - - private Button fCenterButton; - private Diff fButtonDiff; - - class HeaderPainter implements PaintListener { - - private static final int INSET= BIRDS_EYE_VIEW_INSET; - - private RGB fIndicatorColor; - private Color fSeparatorColor; - - public HeaderPainter() { - fSeparatorColor= fSummaryHeader.getDisplay().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW); - } - - /* - * Returns true on color change - */ - public boolean setColor(RGB color) { - RGB oldColor= fIndicatorColor; - fIndicatorColor= color; - if (color == null) - return oldColor != null; - if (oldColor != null) - return !color.equals(oldColor); - return true; - } - - private void drawBevelRect(GC gc, int x, int y, int w, int h, Color topLeft, Color bottomRight) { - gc.setForeground(topLeft); - gc.drawLine(x, y, x + w -1, y); - gc.drawLine(x, y, x, y + h -1); - - gc.setForeground(bottomRight); - gc.drawLine(x + w, y, x + w, y + h); - gc.drawLine(x, y + h, x + w, y + h); - } - - public void paintControl(PaintEvent e) { - - Point s= fSummaryHeader.getSize(); - - if (fIndicatorColor != null) { - Display d= fSummaryHeader.getDisplay(); - e.gc.setBackground(getColor(d, fIndicatorColor)); - int min= Math.min(s.x, s.y)-2*INSET; - Rectangle r= new Rectangle((s.x-min)/2, (s.y-min)/2, min, min); - e.gc.fillRectangle(r); - if (d != null) - drawBevelRect(e.gc, r.x, r.y, r.width -1, r.height -1, d.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW), d.getSystemColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW)); - - e.gc.setForeground(fSeparatorColor); - e.gc.setLineWidth(1); - e.gc.drawLine(0+1, s.y-1, s.x-1-1, s.y-1); - } - } - } - - /* - * The position updater used to adapt the positions representing - * the child document ranges to changes of the parent document. - */ - class ChildPositionUpdater extends DefaultPositionUpdater { - - /* - * Creates the position updated. - */ - protected ChildPositionUpdater(String category) { - super(category); - } - - /* - * Child document ranges cannot be deleted other then by calling - * freeChildDocument. - */ - protected boolean notDeleted() { - return true; - } - - /* - * If an insertion happens at a child document's start offset, the - * position is extended rather than shifted. Also, if something is added - * right behind the end of the position, the position is extended rather - * than kept stable. - */ - protected void adaptToInsert() { - - if (fPosition == fLeft.getRegion() || fPosition == fRight.getRegion()) { - int myStart= fPosition.offset; - int myEnd= fPosition.offset + fPosition.length; - myEnd= Math.max(myStart, myEnd); - - int yoursStart= fOffset; - int yoursEnd= fOffset + fReplaceLength -1; - yoursEnd= Math.max(yoursStart, yoursEnd); - - if (myEnd < yoursStart) - return; - - if (myStart <= yoursStart) - fPosition.length += fReplaceLength; - else - fPosition.offset += fReplaceLength; - } else { - super.adaptToInsert(); - } - } - } - - /* - * A Diff represents synchronized character ranges in two or three Documents. - * The MergeTextViewer uses Diffs to find differences in line and token ranges. - */ - /* package */ class Diff { - /** character range in ancestor document */ - Position fAncestorPos; - /** character range in left document */ - Position fLeftPos; - /** character range in right document */ - Position fRightPos; - /** if this is a TokenDiff fParent points to the enclosing LineDiff */ - Diff fParent; - /** if Diff has been resolved */ - boolean fResolved; - int fDirection; - boolean fIsToken= false; - /** child token diffs */ - ArrayList fDiffs; - boolean fIsWhitespace= false; - - /* - * Create Diff from two ranges and an optional parent diff. - */ - Diff(Diff parent, int dir, IDocument ancestorDoc, Position aRange, int ancestorStart, int ancestorEnd, - IDocument leftDoc, Position lRange, int leftStart, int leftEnd, - IDocument rightDoc, Position rRange, int rightStart, int rightEnd) { - fParent= parent != null ? parent : this; - fDirection= dir; - - fLeftPos= createPosition(leftDoc, lRange, leftStart, leftEnd); - fRightPos= createPosition(rightDoc, rRange, rightStart, rightEnd); - if (ancestorDoc != null) - fAncestorPos= createPosition(ancestorDoc, aRange, ancestorStart, ancestorEnd); - } - - Position getPosition(char type) { - switch (type) { - case 'A': - return fAncestorPos; - case 'L': - return fLeftPos; - case 'R': - return fRightPos; - } - return null; - } - - boolean isInRange(char type, int pos) { - Position p= getPosition(type); - return (pos >= p.offset) && (pos < (p.offset+p.length)); - } - - String changeType() { - boolean leftEmpty= fLeftPos.length == 0; - boolean rightEmpty= fRightPos.length == 0; - - if (fDirection == RangeDifference.LEFT) { - if (!leftEmpty && rightEmpty) - return CompareMessages.getString("TextMergeViewer.changeType.addition"); //$NON-NLS-1$ - if (leftEmpty && !rightEmpty) - return CompareMessages.getString("TextMergeViewer.changeType.deletion"); //$NON-NLS-1$ - } else { - if (leftEmpty && !rightEmpty) - return CompareMessages.getString("TextMergeViewer.changeType.addition"); //$NON-NLS-1$ - if (!leftEmpty && rightEmpty) - return CompareMessages.getString("TextMergeViewer.changeType.deletion"); //$NON-NLS-1$ - } - return CompareMessages.getString("TextMergeViewer.changeType.change"); //$NON-NLS-1$ - } - - Image getImage() { - int code= Differencer.CHANGE; - switch (fDirection) { - case RangeDifference.RIGHT: - code+= Differencer.LEFT; - break; - case RangeDifference.LEFT: - code+= Differencer.RIGHT; - break; - case RangeDifference.ANCESTOR: - case RangeDifference.CONFLICT: - code+= Differencer.CONFLICTING; - break; - } - if (code != 0) - return getCompareConfiguration().getImage(code); - return null; - } - - Position createPosition(IDocument doc, Position range, int start, int end) { - try { - int l= end-start; - if (range != null) { - int dl= range.length; - if (l > dl) - l= dl; - } else { - int dl= doc.getLength(); - if (start+l > dl) - l= dl-start; - } - - Position p= null; - try { - p= new Position(start, l); - } catch (RuntimeException ex) { - // silently ignored - } - - try { - doc.addPosition(IDocumentRange.RANGE_CATEGORY, p); - } catch (BadPositionCategoryException ex) { - // silently ignored - } - return p; - } catch (BadLocationException ee) { - // silently ignored - } - return null; - } - - void add(Diff d) { - if (fDiffs == null) - fDiffs= new ArrayList(); - fDiffs.add(d); - } - - boolean isDeleted() { - if (fAncestorPos != null && fAncestorPos.isDeleted()) - return true; - return fLeftPos.isDeleted() || fRightPos.isDeleted(); - } - - void setResolved(boolean r) { - fResolved= r; - if (r) - fDiffs= null; - } - - boolean isResolved() { - if (!fResolved && fDiffs != null) { - Iterator e= fDiffs.iterator(); - while (e.hasNext()) { - Diff d= (Diff) e.next(); - if (!d.isResolved()) - return false; - } - return true; - } - return fResolved; - } - -// private boolean isIncoming() { -// switch (fDirection) { -// case RangeDifference.RIGHT: -// if (fLeftIsLocal) -// return true; -// break; -// case RangeDifference.LEFT: -// if (!fLeftIsLocal) -// return true; -// break; -// } -// return false; -// } - - private boolean isIncomingOrConflicting() { - switch (fDirection) { - case RangeDifference.RIGHT: - if (fLeftIsLocal) - return true; - break; - case RangeDifference.LEFT: - if (!fLeftIsLocal) - return true; - break; - case RangeDifference.CONFLICT: - return true; - } - return false; - } - -// private boolean isUnresolvedIncoming() { -// if (fResolved) -// return false; -// return isIncoming(); -// } - - private boolean isUnresolvedIncomingOrConflicting() { - if (fResolved) - return false; - return isIncomingOrConflicting(); - } - - Position getPosition(MergeSourceViewer w) { - if (w == fLeft) - return fLeftPos; - if (w == fRight) - return fRightPos; - if (w == fAncestor) - return fAncestorPos; - return null; - } - - /* - * Returns true if given character range overlaps with this Diff. - */ - boolean overlaps(MergeSourceViewer w, int start, int end) { - Position h= getPosition(w); - if (h != null) { - int ds= h.getOffset(); - int de= ds + h.getLength(); - if ((start < de) && (end >= ds)) - return true; - } - return false; - } - - int getMaxDiffHeight(boolean withAncestor) { - Point region= new Point(0, 0); - int h= fLeft.getLineRange(fLeftPos, region).y; - if (withAncestor) - h= Math.max(h, fAncestor.getLineRange(fAncestorPos, region).y); - return Math.max(h, fRight.getLineRange(fRightPos, region).y); - } - - int getAncestorHeight() { - Point region= new Point(0, 0); - return fAncestor.getLineRange(fAncestorPos, region).y; - } - - int getLeftHeight() { - Point region= new Point(0, 0); - return fLeft.getLineRange(fLeftPos, region).y; - } - - int getRightHeight() { - Point region= new Point(0, 0); - return fRight.getLineRange(fRightPos, region).y; - } - } - - //---- MergeTextViewer - - /** - * Creates a text merge viewer under the given parent control. - * - * @param parent the parent control - * @param configuration the configuration object - */ - public TextMergeViewer(Composite parent, CompareConfiguration configuration) { - this(parent, SWT.NULL, configuration); - } - - /** - * Creates a text merge viewer under the given parent control. - * - * @param parent the parent control - * @param style SWT style bits for top level composite of this viewer - * @param configuration the configuration object - */ - public TextMergeViewer(Composite parent, int style, CompareConfiguration configuration) { - super(style, ResourceBundle.getBundle(BUNDLE_NAME), configuration); - - fSymbolicFontName= getClass().getName(); - - String platform= SWT.getPlatform(); - fIsMotif= "motif".equals(platform); //$NON-NLS-1$ - fIsCarbon= "carbon".equals(platform); //$NON-NLS-1$ - - if (fIsMotif) - fMarginWidth= 0; - - Display display= parent.getDisplay(); - - fPreferenceChangeListener= new IPropertyChangeListener() { - public void propertyChange(PropertyChangeEvent event) { - TextMergeViewer.this.propertyChange(event); - } - }; - - fPreferenceStore= configuration.getPreferenceStore(); - if (fPreferenceStore != null) { - fPreferenceStore.addPropertyChangeListener(fPreferenceChangeListener); - - checkForColorUpdate(display); - - fLeftIsLocal= Utilities.getBoolean(configuration, "LEFT_IS_LOCAL", false); //$NON-NLS-1$ - fSynchronizedScrolling= fPreferenceStore.getBoolean(ComparePreferencePage.SYNCHRONIZE_SCROLLING); - fShowMoreInfo= fPreferenceStore.getBoolean(ComparePreferencePage.SHOW_MORE_INFO); - fShowPseudoConflicts= fPreferenceStore.getBoolean(ComparePreferencePage.SHOW_PSEUDO_CONFLICTS); - //fUseSplines= fPreferenceStore.getBoolean(ComparePreferencePage.USE_SPLINES); - fUseSingleLine= fPreferenceStore.getBoolean(ComparePreferencePage.USE_SINGLE_LINE); - //fUseResolveUI= fPreferenceStore.getBoolean(ComparePreferencePage.USE_RESOLVE_UI); - } - - fDocumentListener= new IDocumentListener() { - - public void documentAboutToBeChanged(DocumentEvent e) { - // nothing to do - } - - public void documentChanged(DocumentEvent e) { - TextMergeViewer.this.documentChanged(e); - } - }; - - buildControl(parent); - - INavigatable nav= new INavigatable() { - public boolean gotoDifference(boolean next) { - return navigate(next, false, false); - } - }; - fComposite.setData(INavigatable.NAVIGATOR_PROPERTY, nav); - - fBirdsEyeCursor= new Cursor(parent.getDisplay(), SWT.CURSOR_HAND); - - JFaceResources.getFontRegistry().addListener(fPreferenceChangeListener); - JFaceResources.getColorRegistry().addListener(fPreferenceChangeListener); - updateFont(); - } - - private void updateFont() { - Font f= JFaceResources.getFont(fSymbolicFontName); - if (f != null) { - if (fAncestor != null) - fAncestor.setFont(f); - if (fLeft != null) - fLeft.setFont(f); - if (fRight != null) - fRight.setFont(f); - } - } - - private void checkForColorUpdate(Display display) { - if (fPollSystemForeground) { - RGB fg= display.getSystemColor(SWT.COLOR_LIST_FOREGROUND).getRGB(); - if (fForeground == null || !fg.equals(fForeground)) { - fForeground= fg; - updateColors(display); - } - } - if (fPollSystemBackground) { - RGB bg= display.getSystemColor(SWT.COLOR_LIST_BACKGROUND).getRGB(); - if (fBackground == null || !bg.equals(fBackground)) { - fBackground= bg; - updateColors(display); - } - } - } - - /** - * Sets the viewer's background color to the given RGB value. - * If the value is null the system's default background color is used. - * @param background the background color or null to use the system's default background color - * @since 2.0 - */ - public void setBackgroundColor(RGB background) { - fPollSystemBackground= (background == null); - fBackground= background; - updateColors(null); - } - - private RGB getBackground(Display display) { - if (fBackground != null) - return fBackground; - if (display == null) - display= fComposite.getDisplay(); - return display.getSystemColor(SWT.COLOR_LIST_BACKGROUND).getRGB(); - } - - /** - * Sets the viewer's foreground color to the given RGB value. - * If the value is null the system's default foreground color is used. - * @param foreground the foreground color or null to use the system's default foreground color - * @since 2.0 - */ - public void setForegroundColor(RGB foreground) { - fPollSystemForeground= (foreground == null); - fForeground= foreground; - updateColors(null); - } - - private void updateColors(Display display) { - - if (display == null) - display= fComposite.getDisplay(); - - Color color= null; - if (fBackground != null) - color= getColor(display, fBackground); - - if (fAncestor != null) - fAncestor.setBackgroundColor(color); - if (fLeft != null) - fLeft.setBackgroundColor(color); - if (fRight != null) - fRight.setBackgroundColor(color); - - ColorRegistry registry= JFaceResources.getColorRegistry(); - - RGB bg= getBackground(display); - SELECTED_INCOMING= registry.getRGB(INCOMING_COLOR); - if (SELECTED_INCOMING == null) - SELECTED_INCOMING= new RGB(0, 0, 255); // BLUE - INCOMING= interpolate(SELECTED_INCOMING, bg, 0.6); - INCOMING_FILL= interpolate(SELECTED_INCOMING, bg, 0.97); - - SELECTED_OUTGOING= registry.getRGB(OUTGOING_COLOR); - if (SELECTED_OUTGOING == null) - SELECTED_OUTGOING= new RGB(0, 0, 0); // BLACK - OUTGOING= interpolate(SELECTED_OUTGOING, bg, 0.6); - OUTGOING_FILL= interpolate(SELECTED_OUTGOING, bg, 0.97); - - SELECTED_CONFLICT= registry.getRGB(CONFLICTING_COLOR); - if (SELECTED_CONFLICT == null) - SELECTED_CONFLICT= new RGB(255, 0, 0); // RED - CONFLICT= interpolate(SELECTED_CONFLICT, bg, 0.6); - CONFLICT_FILL= interpolate(SELECTED_CONFLICT, bg, 0.97); - - RESOLVED= registry.getRGB(RESOLVED_COLOR); - if (RESOLVED == null) - RESOLVED= new RGB(0, 255, 0); // GREEN - - refreshBirdsEyeView(); - invalidateLines(); - - updateAllDiffBackgrounds(display); - } - - /** - * Invalidates the current presentation by invalidating the three text viewers. - * @since 2.0 - */ - public void invalidateTextPresentation() { - if (fAncestor != null) - fAncestor.invalidateTextPresentation(); - if (fLeft != null) - fLeft.invalidateTextPresentation(); - if (fRight != null) - fRight.invalidateTextPresentation(); - } - - /** - * Configures the passed text viewer. - * This method is called after the three text viewers have been created for the - * content areas. - * The TextMergeViewer implementation of this method does nothing. - * Subclasses may reimplement to provide a specific configuration for the text viewer. - * - * @param textViewer the text viewer to configure - */ - protected void configureTextViewer(TextViewer textViewer) { - // empty impl - } - - /** - * Creates an ITokenComparator which is used to show the - * intra line differences. - * The TextMergeViewer implementation of this method returns a - * tokenizer that breaks a line into words separated by whitespace. - * Subclasses may reimplement to provide a specific tokenizer. - * @param line the line for which to create the ITokenComparator - * @return a ITokenComparator which is used for a second level token compare. - */ - protected ITokenComparator createTokenComparator(String line) { - return new TokenComparator(line); - } - - /** - * Returns a document partitioner which is suitable for the underlying content type. - * This method is only called if the input provided by the content provider is a - * IStreamContentAccessor and an internal document must be created. This - * document is initialized with the partitioner returned from this method. - *

- * The TextMergeViewer implementation of this method returns - * null. Subclasses may reimplement to create a partitioner for a - * specific content type. - * - * @return a document partitioner, or null - */ - protected IDocumentPartitioner getDocumentPartitioner() { - return null; - } - - /** - * Called on the viewer disposal. - * Unregisters from the compare configuration. - * Clients may extend if they have to do additional cleanup. - * @param event - */ - protected void handleDispose(DisposeEvent event) { - - if (fKeyBindingService != null) { - IAction a; - if (fNextItem != null) { - a= fNextItem.getAction(); - if (a != null) - fKeyBindingService.unregisterAction(a); - } - if (fPreviousItem != null) { - a= fPreviousItem.getAction(); - if (a != null) - fKeyBindingService.unregisterAction(a); - } - if (fCopyDiffLeftToRightItem != null) { - a= fCopyDiffLeftToRightItem.getAction(); - if (a != null) - fKeyBindingService.unregisterAction(a); - } - if (fCopyDiffRightToLeftItem != null) { - a= fCopyDiffRightToLeftItem.getAction(); - if (a != null) - fKeyBindingService.unregisterAction(a); - } - fKeyBindingService= null; - } - - Object input= getInput(); - DocumentManager.remove(getDocument2('A', input)); - DocumentManager.remove(getDocument2('L', input)); - DocumentManager.remove(getDocument2('R', input)); - - if (DEBUG) - DocumentManager.dump(); - - if (fPreferenceChangeListener != null) { - JFaceResources.getFontRegistry().removeListener(fPreferenceChangeListener); - JFaceResources.getColorRegistry().removeListener(fPreferenceChangeListener); - if (fPreferenceStore != null) - fPreferenceStore.removePropertyChangeListener(fPreferenceChangeListener); - fPreferenceChangeListener= null; - } - - fLeftCanvas= null; - fRightCanvas= null; - fVScrollBar= null; - fBirdsEyeCanvas= null; - fSummaryHeader= null; - - unsetDocument(fAncestor); - unsetDocument(fLeft); - unsetDocument(fRight); - - if (fColors != null) { - Iterator i= fColors.values().iterator(); - while (i.hasNext()) { - Color color= (Color) i.next(); - if (!color.isDisposed()) - color.dispose(); - } - fColors= null; - } - - if (fBirdsEyeCursor != null) { - fBirdsEyeCursor.dispose(); - fBirdsEyeCursor= null; - } - - super.handleDispose(event); - } - - //------------------------------------------------------------------------------------------------------------- - //--- internal ------------------------------------------------------------------------------------------------ - //------------------------------------------------------------------------------------------------------------- - - /* - * Creates the specific SWT controls for the content areas. - * Clients must not call or override this method. - */ - protected void createControls(Composite composite) { - - WorkbenchHelp.setHelp(composite, ICompareContextIds.TEXT_MERGE_VIEW); - - // 1st row - if (fMarginWidth > 0) { - fAncestorCanvas= new BufferedCanvas(composite, SWT.NONE) { - public void doPaint(GC gc) { - paintSides(gc, fAncestor, fAncestorCanvas, false); - } - }; - fAncestorCanvas.addMouseListener( - new MouseAdapter() { - public void mouseDown(MouseEvent e) { - setCurrentDiff2(handleMouseInSides(fAncestorCanvas, fAncestor, e.y), false); - } - } - ); - } - - fAncestor= createPart(composite); - fAncestor.setEditable(false); - - fSummaryHeader= new Canvas(composite, SWT.NONE); - fHeaderPainter= new HeaderPainter(); - fSummaryHeader.addPaintListener(fHeaderPainter); - updateResolveStatus(); - - // 2nd row - if (fMarginWidth > 0) { - fLeftCanvas= new BufferedCanvas(composite, SWT.NONE) { - public void doPaint(GC gc) { - paintSides(gc, fLeft, fLeftCanvas, false); - } - }; - fLeftCanvas.addMouseListener( - new MouseAdapter() { - public void mouseDown(MouseEvent e) { - setCurrentDiff2(handleMouseInSides(fLeftCanvas, fLeft, e.y), false); - } - } - ); - } - - fLeft= createPart(composite); - fLeft.getTextWidget().getVerticalBar().setVisible(!fSynchronizedScrolling); - fLeft.addAction(MergeSourceViewer.SAVE_ID, fLeftSaveAction); - - fRight= createPart(composite); - fRight.getTextWidget().getVerticalBar().setVisible(!fSynchronizedScrolling); - fRight.addAction(MergeSourceViewer.SAVE_ID, fRightSaveAction); - - hsynchViewport(fAncestor, fLeft, fRight); - hsynchViewport(fLeft, fAncestor, fRight); - hsynchViewport(fRight, fAncestor, fLeft); - - if (fMarginWidth > 0) { - fRightCanvas= new BufferedCanvas(composite, SWT.NONE) { - public void doPaint(GC gc) { - paintSides(gc, fRight, fRightCanvas, fSynchronizedScrolling); - } - }; - fRightCanvas.addMouseListener( - new MouseAdapter() { - public void mouseDown(MouseEvent e) { - setCurrentDiff2(handleMouseInSides(fRightCanvas, fRight, e.y), false); - } - } - ); - } - - fScrollCanvas= new Canvas(composite, SWT.V_SCROLL); - Rectangle trim= fLeft.getTextWidget().computeTrim(0, 0, 0, 0); - fTopInset= trim.y; - - fVScrollBar= fScrollCanvas.getVerticalBar(); - fVScrollBar.setIncrement(1); - fVScrollBar.setVisible(true); - fVScrollBar.addListener(SWT.Selection, - new Listener() { - public void handleEvent(Event e) { - int vpos= ((ScrollBar)e.widget).getSelection(); - scrollVertical(vpos, vpos, vpos, null); - workaround65205(); - } - } - ); - - fBirdsEyeCanvas= new BufferedCanvas(composite, SWT.NONE) { - public void doPaint(GC gc) { - paintBirdsEyeView(this, gc); - } - }; - fBirdsEyeCanvas.addMouseListener( - new MouseAdapter() { - public void mouseDown(MouseEvent e) { - setCurrentDiff2(handlemouseInBirdsEyeView(fBirdsEyeCanvas, e.y), true); - } - } - ); - fBirdsEyeCanvas.addMouseMoveListener( - new MouseMoveListener() { - - private Cursor fLastCursor; - - public void mouseMove(MouseEvent e) { - Cursor cursor= null; - Diff diff= handlemouseInBirdsEyeView(fBirdsEyeCanvas, e.y); - if (diff != null && diff.fDirection != RangeDifference.NOCHANGE) - cursor= fBirdsEyeCursor; - if (fLastCursor != cursor) { - fBirdsEyeCanvas.setCursor(cursor); - fLastCursor= cursor; - } - } - } - ); - } - - private void hsynchViewport(final TextViewer tv1, final TextViewer tv2, final TextViewer tv3) { - final StyledText st1= tv1.getTextWidget(); - final StyledText st2= tv2.getTextWidget(); - final StyledText st3= tv3.getTextWidget(); - final ScrollBar sb1= st1.getHorizontalBar(); - sb1.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - if (fSynchronizedScrolling) { - int max= sb1.getMaximum()-sb1.getThumb(); - double v= 0.0; - if (max > 0) - v= (float)sb1.getSelection() / (float)max; - if (st2.isVisible()) { - ScrollBar sb2= st2.getHorizontalBar(); - st2.setHorizontalPixel((int)((sb2.getMaximum()-sb2.getThumb()) * v)); - } - if (st3.isVisible()) { - ScrollBar sb3= st3.getHorizontalBar(); - st3.setHorizontalPixel((int)((sb3.getMaximum()-sb3.getThumb()) * v)); - } - workaround65205(); - } - } - }); - } - - /** - * A workaround for bug #65205. - * On MacOS X a Display.update() is required to flush pending paint requests after - * programmatical scolling. - */ - private void workaround65205() { - if (fIsCarbon && fComposite != null && !fComposite.isDisposed()) - fComposite.getDisplay().update(); - } - - private void setCurrentDiff2(Diff diff, boolean reveal) { - if (diff != null && diff.fDirection != RangeDifference.NOCHANGE) { - //fCurrentDiff= null; - setCurrentDiff(diff, reveal); - } - } - - private Diff handleMouseInSides(Canvas canvas, MergeSourceViewer tp, int my) { - - int lineHeight= tp.getTextWidget().getLineHeight(); - int visibleHeight= tp.getViewportHeight(); - - if (! fHighlightRanges) - return null; - - if (fChangeDiffs != null) { - int shift= tp.getVerticalScrollOffset() + (2-LW); - - Point region= new Point(0, 0); - Iterator e= fChangeDiffs.iterator(); - while (e.hasNext()) { - Diff diff= (Diff) e.next(); - if (diff.isDeleted()) - continue; - - if (fShowCurrentOnly2 && !isCurrentDiff(diff)) - continue; - - tp.getLineRange(diff.getPosition(tp), region); - int y= (region.x * lineHeight) + shift; - int h= region.y * lineHeight; - - if (y+h < 0) - continue; - if (y >= visibleHeight) - break; - - if (my >= y && my < y+h) - return diff; - } - } - return null; - } - - private Diff getDiffUnderMouse(Canvas canvas, int mx, int my, Rectangle r) { - - if (! fSynchronizedScrolling) - return null; - - int lineHeight= fLeft.getTextWidget().getLineHeight(); - int visibleHeight= fRight.getViewportHeight(); - - Point size= canvas.getSize(); - int w= size.x; - - if (! fHighlightRanges) - return null; - - if (fChangeDiffs != null) { - int lshift= fLeft.getVerticalScrollOffset(); - int rshift= fRight.getVerticalScrollOffset(); - - Point region= new Point(0, 0); - - Iterator e= fChangeDiffs.iterator(); - while (e.hasNext()) { - Diff diff= (Diff) e.next(); - if (diff.isDeleted()) - continue; - - if (fShowCurrentOnly2 && !isCurrentDiff(diff)) - continue; - - fLeft.getLineRange(diff.fLeftPos, region); - int ly= (region.x * lineHeight) + lshift; - int lh= region.y * lineHeight; - - fRight.getLineRange(diff.fRightPos, region); - int ry= (region.x * lineHeight) + rshift; - int rh= region.y * lineHeight; - - if (Math.max(ly+lh, ry+rh) < 0) - continue; - if (Math.min(ly, ry) >= visibleHeight) - break; - - int cx= (w-RESOLVE_SIZE)/2; - int cy= ((ly+lh/2) + (ry+rh/2) - RESOLVE_SIZE)/2; - if (my >= cy && my < cy+RESOLVE_SIZE && mx >= cx && mx < cx+RESOLVE_SIZE) { - if (r != null) { - int SIZE= fIsCarbon ? 30 : 20; - r.x= cx+(RESOLVE_SIZE-SIZE)/2; - r.y= cy+(RESOLVE_SIZE-SIZE)/2; - r.width= SIZE; - r.height= SIZE; - } - return diff; - } - } - } - return null; - } - - private Diff handlemouseInBirdsEyeView(Canvas canvas, int my) { - int yy, hh; - - Point size= canvas.getSize(); - - int virtualHeight= fSynchronizedScrolling ? getVirtualHeight() : getRightHeight(); - if (virtualHeight < getViewportHeight()) - return null; - - int y= 0; - if (fAllDiffs != null) { - Iterator e= fAllDiffs.iterator(); - for (int i= 0; e.hasNext(); i++) { - Diff diff= (Diff) e.next(); - int h= fSynchronizedScrolling ? diff.getMaxDiffHeight(fShowAncestor) - : diff.getRightHeight(); - if (useChange(diff.fDirection) && !diff.fIsWhitespace) { - - yy= (y*size.y)/virtualHeight; - hh= (h*size.y)/virtualHeight; - if (hh < 3) - hh= 3; - - if (my >= yy && my < yy+hh) - return diff; - } - y+= h; - } - } - return null; - } - - private void paintBirdsEyeView(Canvas canvas, GC gc) { - - Color c; - Rectangle r= new Rectangle(0, 0, 0, 0); - int yy, hh; - - Point size= canvas.getSize(); - - int virtualHeight= fSynchronizedScrolling ? getVirtualHeight() : getRightHeight(); - if (virtualHeight < getViewportHeight()) - return; - - Display display= canvas.getDisplay(); - int y= 0; - if (fAllDiffs != null) { - Iterator e= fAllDiffs.iterator(); - for (int i= 0; e.hasNext(); i++) { - Diff diff= (Diff) e.next(); - int h= fSynchronizedScrolling ? diff.getMaxDiffHeight(fShowAncestor) - : diff.getRightHeight(); - - if (useChange(diff.fDirection) && !diff.fIsWhitespace) { - - yy= (y*size.y)/virtualHeight; - hh= (h*size.y)/virtualHeight; - if (hh < 3) - hh= 3; - - c= getColor(display, getFillColor(diff)); - if (c != null) { - gc.setBackground(c); - gc.fillRectangle(BIRDS_EYE_VIEW_INSET, yy, size.x-(2*BIRDS_EYE_VIEW_INSET),hh); - } - c= getColor(display, getStrokeColor(diff)); - if (c != null) { - gc.setForeground(c); - r.x= BIRDS_EYE_VIEW_INSET; - r.y= yy; - r.width= size.x-(2*BIRDS_EYE_VIEW_INSET)-1; - r.height= hh; - if (diff == fCurrentDiff || - (fCurrentDiff != null && diff == fCurrentDiff.fParent)) { - gc.setLineWidth(2); - r.x++; - r.y++; - r.width--; - r.height--; - } else { - gc.setLineWidth(1); - } - gc.drawRectangle(r); - } - } - - y+= h; - } - } - } - - private void refreshBirdsEyeView() { - if (fBirdsEyeCanvas != null) - fBirdsEyeCanvas.redraw(); - } - - /* - * Called whenever setFocus() is called on the ContentViewer's top level SWT Composite. - * This implementation sets the focus to the first enabled text widget. - */ - /* package */ boolean internalSetFocus() { - if (fFocusPart == null) { - if (fLeft != null && fLeft.getEnabled()) { - fFocusPart= fLeft; - } else if (fRight != null && fRight.getEnabled()) { - fFocusPart= fRight; - } else if (fAncestor != null && fAncestor.getEnabled()) { - fFocusPart= fAncestor; - } - } - if (fFocusPart != null) { - StyledText st= fFocusPart.getTextWidget(); - if (st != null) - return st.setFocus(); - } - return false; // could not set focus - } - - - class HoverResizer extends Resizer { - Canvas fCanvas; - public HoverResizer(Canvas c, int dir) { - super(c, dir); - fCanvas= c; - } - public void mouseMove(MouseEvent e) { - if (!fIsDown && fUseSingleLine && showResolveUI() && handleMouseMoveOverCenter(fCanvas, e.x, e.y)) - return; - super.mouseMove(e); - } - } - - /* - * Creates the central Canvas. - * Called from ContentMergeViewer. - */ - /* package */ Control createCenter(Composite parent) { - if (fSynchronizedScrolling) { - final Canvas canvas= new BufferedCanvas(parent, SWT.NONE) { - public void doPaint(GC gc) { - paintCenter(this, gc); - } - }; - if (fUseResolveUI) { - - new HoverResizer(canvas, HORIZONTAL); - - fCenterButton= new Button(canvas, fIsCarbon ? SWT.FLAT : SWT.PUSH); - if (fNormalCursor == null) fNormalCursor= new Cursor(canvas.getDisplay(), SWT.CURSOR_ARROW); - fCenterButton.setCursor(fNormalCursor); - fCenterButton.setText("<"); //$NON-NLS-1$ - fCenterButton.pack(); - fCenterButton.setVisible(false); - fCenterButton.addSelectionListener( - new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - fCenterButton.setVisible(false); - if (fButtonDiff != null) { - setCurrentDiff(fButtonDiff, false); - copy(fCurrentDiff, false, fCurrentDiff.fDirection == RangeDifference.CONFLICT); - } - } - } - ); - } else { - new Resizer(canvas, HORIZONTAL); - } - - return canvas; - } - return super.createCenter(parent); - } - - private boolean handleMouseMoveOverCenter(Canvas canvas, int x, int y) { - Rectangle r= new Rectangle(0, 0, 0, 0); - Diff diff= getDiffUnderMouse(canvas, x, y, r); - if (diff != null && !diff.isUnresolvedIncomingOrConflicting()) - diff= null; - if (diff != fButtonDiff) { - if (diff != null) { - if (fLeft.isEditable()) { - fButtonDiff= diff; - fCenterButton.setText("<"); //$NON-NLS-1$ - String tt= fCopyDiffRightToLeftItem.getAction().getToolTipText(); - fCenterButton.setToolTipText(tt); - fCenterButton.setBounds(r); - fCenterButton.setVisible(true); - } else if (fRight.isEditable()) { - fButtonDiff= diff; - fCenterButton.setText(">"); //$NON-NLS-1$ - String tt= fCopyDiffLeftToRightItem.getAction().getToolTipText(); - fCenterButton.setToolTipText(tt); - fCenterButton.setBounds(r); - fCenterButton.setVisible(true); - } else - fButtonDiff= null; - } else { - fCenterButton.setVisible(false); - fButtonDiff= null; - } - } - return fButtonDiff != null; - } - - /* - * Returns width of central canvas. - * Overridden from ContentMergeViewer. - */ - /* package */ int getCenterWidth() { - if (fSynchronizedScrolling) - return CENTER_WIDTH; - return super.getCenterWidth(); - } - - /* - * Creates and initializes a text part. - */ - private MergeSourceViewer createPart(Composite parent) { - - final MergeSourceViewer part= new MergeSourceViewer(parent, getResourceBundle()); - final StyledText te= part.getTextWidget(); - - if (!fConfirmSave) - part.hideSaveAction(); - - te.addPaintListener( - new PaintListener() { - public void paintControl(PaintEvent e) { - paint(e, part); - } - } - ); - te.addKeyListener( - new KeyAdapter() { - public void keyPressed(KeyEvent e) { - handleSelectionChanged(part); - } - } - ); - te.addMouseListener( - new MouseAdapter() { - public void mouseDown(MouseEvent e) { - //syncViewport(part); - handleSelectionChanged(part); - } - } - ); - - te.addFocusListener( - new FocusAdapter() { - public void focusGained(FocusEvent fe) { - fFocusPart= part; - connectGlobalActions(fFocusPart); - } - public void focusLost(FocusEvent fe) { - connectGlobalActions(null); - } - } - ); - - part.addViewportListener( - new IViewportListener() { - public void viewportChanged(int verticalPosition) { - syncViewport(part); - } - } - ); - - Font font= JFaceResources.getFont(fSymbolicFontName); - if (font != null) - te.setFont(font); - - if (fBackground != null) // not default - te.setBackground(getColor(parent.getDisplay(), fBackground)); - - configureTextViewer(part); - - return part; - } - - private void connectGlobalActions(MergeSourceViewer part) { - IActionBars actionBars= Utilities.findActionBars(fComposite); - if (actionBars != null) { - for (int i= 0; i < GLOBAL_ACTIONS.length; i++) { - IAction action= null; - if (part != null) { - action= part.getAction(TEXT_ACTIONS[i]); - if (action == null && TEXT_ACTIONS[i].equals(MergeSourceViewer.SAVE_ID)) { - if (part == fLeft) - action= fLeftSaveAction; - else - action= fRightSaveAction; - } - } - actionBars.setGlobalActionHandler(GLOBAL_ACTIONS[i], action); - } - actionBars.updateActionBars(); - } - } - - ITypedElement getLeg(char type, Object input) { - if (input instanceof ICompareInput) { - switch (type) { - case 'A': - return ((ICompareInput)input).getAncestor(); - case 'L': - return ((ICompareInput)input).getLeft(); - case 'R': - return ((ICompareInput)input).getRight(); - } - } - return null; - } - - IDocument getDocument(char type, Object input) { - ITypedElement te= getLeg(type, input); - if (te instanceof IDocument) - return (IDocument) te; - if (te instanceof IDocumentRange) - return ((IDocumentRange) te).getDocument(); - if (te instanceof IStreamContentAccessor) - return DocumentManager.get(te); - return null; - } - - IDocument getDocument2(char type, Object input) { - IDocument doc= getDocument(type, input); - if (doc != null) - return doc; - - if (input instanceof IDiffElement) { - IDiffContainer parent= ((IDiffElement)input).getParent(); - return getDocument(type, parent); - } - return null; - } - - /* - * Returns true if the given inputs map to the same documents - */ - boolean sameDoc(char type, Object newInput, Object oldInput) { - IDocument newDoc= getDocument2(type, newInput); - IDocument oldDoc= getDocument2(type, oldInput); - return newDoc == oldDoc; - } - - /** - * Overridden to prevent save confirmation if new input is sub document of current input. - * @param newInput the new input of this viewer, or null if there is no new input - * @param oldInput the old input element, or null if there was previously no input - * @return true if saving was successful, or if the user didn't want to save (by pressing 'NO' in the confirmation dialog). - * @since 2.0 - */ - protected boolean doSave(Object newInput, Object oldInput) { - - if (oldInput != null && newInput != null) { - // check whether underlying documents have changed. - if (sameDoc('A', newInput, oldInput) && - sameDoc('L', newInput, oldInput) && - sameDoc('R', newInput, oldInput)) { - if (DEBUG) System.out.println("----- Same docs !!!!"); //$NON-NLS-1$ - return false; - } - } - - if (DEBUG) System.out.println("***** New docs !!!!"); //$NON-NLS-1$ - - IDocument aDoc= getDocument2('A', oldInput); - DocumentManager.remove(aDoc); - IDocument lDoc= getDocument2('L', oldInput); - DocumentManager.remove(lDoc); - IDocument rDoc= getDocument2('R', oldInput); - DocumentManager.remove(rDoc); - - if (DEBUG) - DocumentManager.dump(); - - return super.doSave(newInput, oldInput); - } - - private ITypedElement getParent(char type) { - Object input= getInput(); - if (input instanceof IDiffElement) { - IDiffContainer parent= ((IDiffElement)input).getParent(); - return getLeg(type, parent); - } - return null; - } - - /* - * Initializes the text viewers of the three content areas with the given input objects. - * Subclasses may extend. - */ - protected void updateContent(Object ancestor, Object left, Object right) { - - boolean emptyInput= (ancestor == null && left == null && right == null); - - Object input= getInput(); - - Position leftRange= null; - Position rightRange= null; - - // if one side is empty use container - if (FIX_47640 && !emptyInput && (left == null || right == null)) { - if (input instanceof IDiffElement) { - IDiffContainer parent= ((IDiffElement)input).getParent(); - if (parent instanceof ICompareInput) { - ICompareInput ci= (ICompareInput) parent; - - if (ci.getAncestor() instanceof IDocumentRange - || ci.getLeft() instanceof IDocumentRange - || ci.getRight() instanceof IDocumentRange) { - - if (left instanceof IDocumentRange) - leftRange= ((IDocumentRange)left).getRange(); - if (right instanceof IDocumentRange) - rightRange= ((IDocumentRange)right).getRange(); - - ancestor= ci.getAncestor(); - left= ci.getLeft(); - right= ci.getRight(); - } - } - } - } - - int n= 0; - if (left != null) - n++; - if (right != null) - n++; - fHighlightRanges= n > 1; - - // clear stuff - fCurrentDiff= null; - fChangeDiffs= null; - fAllDiffs= null; - fEndOfDocReached= false; - fHasErrors= false; // start with no errors - - CompareConfiguration cc= getCompareConfiguration(); - IMergeViewerContentProvider cp= getMergeContentProvider(); - - if (cp instanceof MergeViewerContentProvider) { - MergeViewerContentProvider mcp= (MergeViewerContentProvider) cp; - mcp.setAncestorError(null); - mcp.setLeftError(null); - mcp.setRightError(null); - } - - // set new documents - setDocument(fLeft, 'L', left); - fLeftLineCount= fLeft.getLineCount(); - fLeftEncoding= getEncoding(left); - - setDocument(fRight, 'R', right); - fRightLineCount= fRight.getLineCount(); - fRightEncoding= getEncoding(right); - - setDocument(fAncestor, 'A', ancestor); - - updateHeader(); - updateControls(); - updateToolItems(); - - if (!fHasErrors) - doDiff(); - - fRight.setEditable(cc.isRightEditable() && cp.isRightEditable(input)); - fLeft.setEditable(cc.isLeftEditable() && cp.isLeftEditable(input)); - - invalidateLines(); - updateVScrollBar(); - refreshBirdsEyeView(); - - if (!fHasErrors && !emptyInput && !fComposite.isDisposed()) { - Diff selectDiff= null; - if (FIX_47640) { - if (leftRange != null) - selectDiff= findDiff('L', leftRange); - else if (rightRange != null) - selectDiff= findDiff('R', rightRange); - } - if (selectDiff != null) - setCurrentDiff(selectDiff, true); - else - selectFirstDiff(); - } - } - - private Diff findDiff(char c, Position range) { - - MergeSourceViewer v; - int start= range.getOffset(); - int end= start + range.getLength(); - if (c == 'L') - v= fLeft; - else if (c == 'R') - v= fRight; - else - return null; - - if (fChangeDiffs != null) { - Iterator iter= fChangeDiffs.iterator(); - while (iter.hasNext()) { - Diff diff= (Diff) iter.next(); - if (diff.isDeleted() || diff.fDirection == RangeDifference.NOCHANGE) - continue; - if (diff.overlaps(v, start, end)) - return diff; - } - } - return null; - } - - private static String getEncoding(Object o) { - String encoding= null; - if (o instanceof IEncodedStreamContentAccessor) { - try { - encoding= ((IEncodedStreamContentAccessor)o).getCharset(); - } catch (CoreException e) { - // ignored - } - } - if (encoding == null) - encoding= ResourcesPlugin.getEncoding(); - return encoding; - } - - private void updateDiffBackground(Diff diff) { - - if (! fHighlightRanges) - return; - - if (diff == null || diff.fIsToken) - return; - - if (fShowCurrentOnly && !isCurrentDiff(diff)) - return; - - Color c= getColor(null, getFillColor(diff)); - if (c == null) - return; - - if (isThreeWay()) - fAncestor.setLineBackground(diff.fAncestorPos, c); - fLeft.setLineBackground(diff.fLeftPos, c); - fRight.setLineBackground(diff.fRightPos, c); - } - - private void updateAllDiffBackgrounds(Display display) { - if (fChangeDiffs != null) { - boolean threeWay= isThreeWay(); - Iterator iter= fChangeDiffs.iterator(); - while (iter.hasNext()) { - Diff diff= (Diff) iter.next(); - Color c= getColor(display, getFillColor(diff)); - if (threeWay) - fAncestor.setLineBackground(diff.fAncestorPos, c); - fLeft.setLineBackground(diff.fLeftPos, c); - fRight.setLineBackground(diff.fRightPos, c); - } - } - } - - boolean isCurrentDiff(Diff diff) { - if (diff == null) - return false; - if (diff == fCurrentDiff) - return true; - if (fCurrentDiff != null && fCurrentDiff.fParent == diff) - return true; - return false; - } - - /* - * Called whenver one of the documents changes. - * Sets the dirty state of this viewer and updates the lines. - * Implements IDocumentListener. - */ - private void documentChanged(DocumentEvent e) { - - IDocument doc= e.getDocument(); - - if (doc == fLeft.getDocument()) { - setLeftDirty(true); - } else if (doc == fRight.getDocument()) { - setRightDirty(true); - } - - updateLines(doc); - } - - /* - * This method is called if a range of text on one side is copied into an empty subdocument - * on the other side. The method returns the position where the subdocument is placed into the base document. - * This default implementation determines the position by using the text range differencer. - * However this position is not always optimal for specific types of text. - * So subclasses (which are aware of the type of text they are dealing with) - * may override this method to find a better position where to insert a newly added - * piece of text. - * @param type the side for which the insertion position should be determined: 'A' for ancestor, 'L' for left hand side, 'R' for right hand side. - * @param input the current input object of this viewer - * @since 2.0 - */ - protected int findInsertionPosition(char type, ICompareInput input) { - - ITypedElement other= null; - char otherType= 0; - - switch (type) { - case 'A': - other= input.getLeft(); - otherType= 'L'; - if (other == null) { - other= input.getRight(); - otherType= 'R'; - } - break; - case 'L': - other= input.getRight(); - otherType= 'R'; - if (other == null) { - other= input.getAncestor(); - otherType= 'A'; - } - break; - case 'R': - other= input.getLeft(); - otherType= 'L'; - if (other == null) { - other= input.getAncestor(); - otherType= 'A'; - } - break; - } - - if (other instanceof IDocumentRange) { - IDocumentRange dr= (IDocumentRange) other; - Position p= dr.getRange(); - Diff diff= findDiff(otherType, p.offset); - if (diff != null) { - switch (type) { - case 'A': - if (diff.fAncestorPos != null) - return diff.fAncestorPos.offset; - break; - case 'L': - if (diff.fLeftPos != null) - return diff.fLeftPos.offset; - break; - case 'R': - if (diff.fRightPos != null) - return diff.fRightPos.offset; - break; - } - } - } - return 0; - } - - private void setError(char type, String message) { - IMergeViewerContentProvider cp= getMergeContentProvider(); - if (cp instanceof MergeViewerContentProvider) { - MergeViewerContentProvider mcp= (MergeViewerContentProvider) cp; - switch (type) { - case 'A': - mcp.setAncestorError(message); - break; - case 'L': - mcp.setLeftError(message); - break; - case 'R': - mcp.setRightError(message); - break; - } - } - fHasErrors= true; - } - - /* - * Returns true if a new Document could be installed. - */ - private boolean setDocument(MergeSourceViewer tp, char type, Object o) { - - if (tp == null) - return false; - - IDocument newDoc= null; - Position range= null; - - if (o instanceof IDocumentRange) { - newDoc= ((IDocumentRange)o).getDocument(); - range= ((IDocumentRange)o).getRange(); - - } else if (o instanceof IDocument) { - newDoc= (IDocument) o; - - } else if (o instanceof IStreamContentAccessor) { - - newDoc= DocumentManager.get(o); - if (newDoc == null) { - IStreamContentAccessor sca= (IStreamContentAccessor) o; - String s= null; - - try { - s= Utilities.readString(sca); - } catch (CoreException ex) { - setError(type, ex.getMessage()); - } - - newDoc= new Document(s != null ? s : ""); //$NON-NLS-1$ - DocumentManager.put(o, newDoc); - IDocumentPartitioner partitioner= getDocumentPartitioner(); - if (partitioner != null) { - newDoc.setDocumentPartitioner(partitioner); - partitioner.connect(newDoc); - } - } - } else if (o == null) { // deletion on one side - - ITypedElement parent= getParent(type); // we try to find an insertion position within the deletion's parent - - if (parent instanceof IDocumentRange) { - newDoc= ((IDocumentRange)parent).getDocument(); - newDoc.addPositionCategory(IDocumentRange.RANGE_CATEGORY); - Object input= getInput(); - range= getNewRange(type, input); - if (range == null) { - int pos= 0; - if (input instanceof ICompareInput) - pos= findInsertionPosition(type, (ICompareInput)input); - range= new Position(pos, 0); - try { - newDoc.addPosition(IDocumentRange.RANGE_CATEGORY, range); - } catch (BadPositionCategoryException ex) { - // silently ignored - if (DEBUG) System.out.println("BadPositionCategoryException: " + ex); //$NON-NLS-1$ - } catch (BadLocationException ex) { - // silently ignored - if (DEBUG) System.out.println("BadLocationException: " + ex); //$NON-NLS-1$ - } - addNewRange(type, input, range); - } - } else if (parent instanceof IDocument) { - newDoc= ((IDocumentRange)o).getDocument(); - } - } - - boolean enabled= true; - if (newDoc == null) { - //System.out.println("setDocument: create new Document"); - newDoc= new Document(""); //$NON-NLS-1$ - enabled= false; - } - - IDocument oldDoc= tp.getDocument(); - - if (newDoc != oldDoc) { - - // got a new document - - unsetDocument(tp); - - if (newDoc != null) { - newDoc.addPositionCategory(IDocumentRange.RANGE_CATEGORY); - if (fPositionUpdater == null) - fPositionUpdater= new ChildPositionUpdater(IDocumentRange.RANGE_CATEGORY); - else - newDoc.removePositionUpdater(fPositionUpdater); - newDoc.addPositionUpdater(fPositionUpdater); - } - - // install new document - if (newDoc != null) { - - tp.setRegion(range); - if (fSubDoc) { - if (range != null) { - IRegion r= normalizeDocumentRegion(newDoc, toRegion(range)); - tp.setDocument(newDoc, r.getOffset(), r.getLength()); - } else - tp.setDocument(newDoc); - } else - tp.setDocument(newDoc); - - tp.rememberDocument(newDoc); - newDoc.addDocumentListener(fDocumentListener); - //LeakTester.add(newDoc); - } - - } else { // same document but different range - - tp.setRegion(range); - if (fSubDoc) { - if (range != null) { - IRegion r= normalizeDocumentRegion(newDoc, toRegion(range)); - tp.setVisibleRegion(r.getOffset(), r.getLength()); - } else - tp.resetVisibleRegion(); - } else - tp.resetVisibleRegion(); - } - - tp.setEnabled(enabled); - - return enabled; - } - - private Position getNewRange(char type, Object input) { - switch (type) { - case 'A': - return (Position) fNewAncestorRanges.get(input); - case 'L': - return (Position) fNewLeftRanges.get(input); - case 'R': - return (Position) fNewRightRanges.get(input); - } - return null; - } - - private void addNewRange(char type, Object input, Position range) { - switch (type) { - case 'A': - fNewAncestorRanges.put(input, range); - break; - case 'L': - fNewLeftRanges.put(input, range); - break; - case 'R': - fNewRightRanges.put(input, range); - break; - } - } - - private void unsetDocument(MergeSourceViewer tp) { - IDocument oldDoc= tp.getDocument(); - if (oldDoc == null) { - oldDoc= tp.getRememberedDocument(); -// if (oldDoc != null) -// System.err.println("TextMergeViewer.unsetDocument: would leak"); - } - if (oldDoc != null) { - tp.rememberDocument(null); - // deinstall old positions - if (fPositionUpdater != null) - oldDoc.removePositionUpdater(fPositionUpdater); - try { - oldDoc.removePositionCategory(IDocumentRange.RANGE_CATEGORY); - } catch (BadPositionCategoryException ex) { - // NeedWork - } - - oldDoc.removeDocumentListener(fDocumentListener); - //LeakTester.remove(oldDoc); - } - } - - /** - * Returns the contents of the underlying document as an array of bytes using the current workbench encoding. - * - * @param left if true the contents of the left side is returned; otherwise the right side - * @return the contents of the left or right document or null - */ - protected byte[] getContents(boolean left) { - MergeSourceViewer v= left ? fLeft : fRight; - if (v != null) { - IDocument d= v.getDocument(); - if (d != null) { - String contents= d.get(); - if (contents != null) { - byte[] bytes; - try { - bytes= contents.getBytes(left ? fLeftEncoding : fRightEncoding); - } catch(UnsupportedEncodingException ex) { - // use default encoding - bytes= contents.getBytes(); - } - return bytes; - } - } - } - return null; - } - - private IRegion normalizeDocumentRegion(IDocument doc, IRegion region) { - - if (region == null || doc == null) - return region; - - int maxLength= doc.getLength(); - - int start= region.getOffset(); - if (start < 0) - start= 0; - else if (start > maxLength) - start= maxLength; - - int length= region.getLength(); - if (length < 0) - length= 0; - else if (start + length > maxLength) - length= maxLength - start; - - return new Region(start, length); - } - - protected final void handleResizeAncestor(int x, int y, int width, int height) { - if (width > 0) { - Rectangle trim= fLeft.getTextWidget().computeTrim(0, 0, 0, 0); - int scrollbarHeight= trim.height; - if (Utilities.okToUse(fAncestorCanvas)) - fAncestorCanvas.setVisible(true); - if (fAncestor.isControlOkToUse()) - fAncestor.getTextWidget().setVisible(true); - - if (fAncestorCanvas != null) { - fAncestorCanvas.setBounds(x, y, fMarginWidth, height-scrollbarHeight); - x+= fMarginWidth; - width-= fMarginWidth; - } - fAncestor.getTextWidget().setBounds(x, y, width, height); - } else { - if (Utilities.okToUse(fAncestorCanvas)) - fAncestorCanvas.setVisible(false); - if (fAncestor.isControlOkToUse()) { - StyledText t= fAncestor.getTextWidget(); - t.setVisible(false); - t.setBounds(0, 0, 0, 0); - if (fFocusPart == fAncestor) { - fFocusPart= fLeft; - fFocusPart.getTextWidget().setFocus(); - } - } - } - } - - /* - * Lays out everything. - */ - protected final void handleResizeLeftRight(int x, int y, int width1, int centerWidth, int width2, int height) { - - if (fBirdsEyeCanvas != null) - width2-= BIRDS_EYE_VIEW_WIDTH; - - Rectangle trim= fLeft.getTextWidget().computeTrim(0, 0, 0, 0); - int scrollbarHeight= trim.height + trim.x; - - Composite composite= (Composite) getControl(); - - int leftTextWidth= width1; - if (fLeftCanvas != null) { - fLeftCanvas.setBounds(x, y, fMarginWidth, height-scrollbarHeight); - x+= fMarginWidth; - leftTextWidth-= fMarginWidth; - } - - fLeft.getTextWidget().setBounds(x, y, leftTextWidth, height); - x+= leftTextWidth; - - if (fCenter == null || fCenter.isDisposed()) - fCenter= createCenter(composite); - fCenter.setBounds(x, y, centerWidth, height-scrollbarHeight); - x+= centerWidth; - - if (!fSynchronizedScrolling) { // canvas is to the left of text - if (fRightCanvas != null) { - fRightCanvas.setBounds(x, y, fMarginWidth, height-scrollbarHeight); - fRightCanvas.redraw(); - x+= fMarginWidth; - } - // we draw the canvas to the left of the text widget - } - - int scrollbarWidth= 0; - if (fSynchronizedScrolling && fScrollCanvas != null) { - trim= fLeft.getTextWidget().computeTrim(0, 0, 0, 0); - scrollbarWidth= trim.width + 2*trim.x; - } - int rightTextWidth= width2-scrollbarWidth; - if (fRightCanvas != null) - rightTextWidth-= fMarginWidth; - fRight.getTextWidget().setBounds(x, y, rightTextWidth, height); - x+= rightTextWidth; - - if (fSynchronizedScrolling) { - if (fRightCanvas != null) { // canvas is to the right of the text - fRightCanvas.setBounds(x, y, fMarginWidth, height-scrollbarHeight); - x+= fMarginWidth; - } - if (fScrollCanvas != null) - fScrollCanvas.setBounds(x, y, scrollbarWidth, height-scrollbarHeight); - } - - if (fBirdsEyeCanvas != null) { - int verticalScrollbarButtonHeight= scrollbarWidth; - int horizontalScrollbarButtonHeight= scrollbarHeight; - if (fIsCarbon) { - verticalScrollbarButtonHeight+= 2; - horizontalScrollbarButtonHeight= 18; - } - if (fSummaryHeader != null) - fSummaryHeader.setBounds(x+scrollbarWidth, y, BIRDS_EYE_VIEW_WIDTH, verticalScrollbarButtonHeight); - y+= verticalScrollbarButtonHeight; - fBirdsEyeCanvas.setBounds(x+scrollbarWidth, y, BIRDS_EYE_VIEW_WIDTH, height-(2*verticalScrollbarButtonHeight+horizontalScrollbarButtonHeight)); - } - - // doesn't work since TextEditors don't have their correct size yet. - updateVScrollBar(); - refreshBirdsEyeView(); - } - - /* - * Track selection changes to update the current Diff. - */ - private void handleSelectionChanged(MergeSourceViewer tw) { - Point p= tw.getSelectedRange(); - Diff d= findDiff(tw, p.x, p.x+p.y); - updateStatus(d); - setCurrentDiff(d, false); // don't select or reveal - } - - private static IRegion toRegion(Position position) { - if (position != null) - return new Region(position.getOffset(), position.getLength()); - return null; - } - - //---- the differencing - - private static int maxWork(IRangeComparator a, IRangeComparator l, IRangeComparator r) { - int ln= l.getRangeCount(); - int rn= r.getRangeCount(); - if (a != null) { - int an= a.getRangeCount(); - return (2 * Math.max(an, ln)) + (2 * Math.max(an, rn)); - } - return 2 * Math.max(ln, rn); - } - - /** - * Perform a two level 2- or 3-way diff. - * The first level is based on line comparison, the second level on token comparison. - */ - private void doDiff() { - - fAllDiffs= new ArrayList(); - fChangeDiffs= new ArrayList(); - fCurrentDiff= null; - - IDocument aDoc= null; - IDocument lDoc= fLeft.getDocument(); - IDocument rDoc= fRight.getDocument(); - if (lDoc == null || rDoc == null) - return; - - Position aRegion= null; - Position lRegion= fLeft.getRegion(); - Position rRegion= fRight.getRegion(); - - boolean threeWay= isThreeWay(); - - if (threeWay && !fIgnoreAncestor) { - aDoc= fAncestor.getDocument(); - aRegion= fAncestor.getRegion(); - } - - fAncestor.resetLineBackground(); - fLeft.resetLineBackground(); - fRight.resetLineBackground(); - - boolean ignoreWhiteSpace= Utilities.getBoolean(getCompareConfiguration(), CompareConfiguration.IGNORE_WHITESPACE, false); - - DocLineComparator sright= new DocLineComparator(rDoc, toRegion(rRegion), ignoreWhiteSpace); - DocLineComparator sleft= new DocLineComparator(lDoc, toRegion(lRegion), ignoreWhiteSpace); - DocLineComparator sancestor= null; - if (aDoc != null) - sancestor= new DocLineComparator(aDoc, toRegion(aRegion), ignoreWhiteSpace); - - if (!fSubDoc && rRegion != null && lRegion != null) { - // we have to add a diff for the ignored lines - - int astart= 0; - int as= 0; - if (aRegion != null) { - astart= aRegion.getOffset(); - as= Math.max(0, astart-1); - } - int ys= Math.max(0, lRegion.getOffset()-1); - int ms= Math.max(0, rRegion.getOffset()-1); - - if (as > 0 || ys > 0 || ms > 0) { - Diff diff= new Diff(null, RangeDifference.NOCHANGE, - aDoc, aRegion, 0, astart, - lDoc, lRegion, 0, lRegion.getOffset(), - rDoc, rRegion, 0, rRegion.getOffset()); - fAllDiffs.add(diff); - } - } - - final ResourceBundle bundle= getResourceBundle(); - - final Object[] result= new Object[1]; - final DocLineComparator sa= sancestor, sl= sleft, sr= sright; - IRunnableWithProgress runnable= new IRunnableWithProgress() { - public void run(IProgressMonitor monitor) throws InterruptedException, InvocationTargetException { - String progressTitle= Utilities.getString(bundle, "compareProgressTask.title"); //$NON-NLS-1$ - monitor.beginTask(progressTitle, maxWork(sa, sl, sr)); - try { - result[0]= RangeDifferencer.findRanges(monitor, sa, sl, sr); - } catch (OutOfMemoryError ex) { - System.gc(); - throw new InvocationTargetException(ex); - } - if (monitor.isCanceled()) { // cancelled - throw new InterruptedException(); - } - monitor.done(); - } - }; - IProgressService progressService= PlatformUI.getWorkbench().getProgressService(); - - RangeDifference[] e= null; - try { - progressService.run(true, true, runnable); - e= (RangeDifference[]) result[0]; - } catch (InvocationTargetException ex) { - String title= Utilities.getString(bundle, "tooComplexError.title"); //$NON-NLS-1$ - String format= Utilities.getString(bundle, "tooComplexError.format"); //$NON-NLS-1$ - String msg= MessageFormat.format(format, new Object[] { Integer.toString(progressService.getLongOperationTime()/1000) } ); - MessageDialog.openError(fComposite.getShell(), title, msg); - e= null; - } catch (InterruptedException ex) { - // - } - - if (e == null) { - // we create a NOCHANGE range for the whole document - Diff diff= new Diff(null, RangeDifference.NOCHANGE, - aDoc, aRegion, 0, aDoc != null ? aDoc.getLength() : 0, - lDoc, lRegion, 0, lDoc.getLength(), - rDoc, rRegion, 0, rDoc.getLength()); - - fAllDiffs.add(diff); - } else { - for (int i= 0; i < e.length; i++) { - String a= null, s= null, d= null; - RangeDifference es= e[i]; - - int kind= es.kind(); - - int ancestorStart= 0; - int ancestorEnd= 0; - if (sancestor != null) { - ancestorStart= sancestor.getTokenStart(es.ancestorStart()); - ancestorEnd= getTokenEnd2(sancestor, es.ancestorStart(), es.ancestorLength()); - } - - int leftStart= sleft.getTokenStart(es.leftStart()); - int leftEnd= getTokenEnd2(sleft, es.leftStart(), es.leftLength()); - - int rightStart= sright.getTokenStart(es.rightStart()); - int rightEnd= getTokenEnd2(sright, es.rightStart(), es.rightLength()); - - Diff diff= new Diff(null, kind, - aDoc, aRegion, ancestorStart, ancestorEnd, - lDoc, lRegion, leftStart, leftEnd, - rDoc, rRegion, rightStart, rightEnd); - - fAllDiffs.add(diff); // remember all range diffs for scrolling - - if (ignoreWhiteSpace) { - if (sancestor != null) - a= extract2(aDoc, sancestor, es.ancestorStart(), es.ancestorLength()); - s= extract2(lDoc, sleft, es.leftStart(), es.leftLength()); - d= extract2(rDoc, sright, es.rightStart(), es.rightLength()); - - if ((a == null || a.trim().length() == 0) && s.trim().length() == 0 && d.trim().length() == 0) { - diff.fIsWhitespace= true; - continue; - } - } - - if (useChange(kind)) { - fChangeDiffs.add(diff); // here we remember only the real diffs - updateDiffBackground(diff); - - if (s == null) - s= extract2(lDoc, sleft, es.leftStart(), es.leftLength()); - if (d == null) - d= extract2(rDoc, sright, es.rightStart(), es.rightLength()); - - if (s.length() > 0 && d.length() > 0) { - if (a == null && sancestor != null) - a= extract2(aDoc, sancestor, es.ancestorStart(), es.ancestorLength()); - if (USE_MERGING_TOKEN_DIFF) - mergingTokenDiff(diff, aDoc, a, rDoc, d, lDoc, s); - else - simpleTokenDiff(diff, aDoc, a, rDoc, d, lDoc, s); - } - } - } - } - - if (!fSubDoc && rRegion != null && lRegion != null) { - // we have to add a diff for the ignored lines - - int aEnd= 0; - int aLen= 0; - if (aRegion != null && aDoc != null) { - aEnd= aRegion.getOffset()+aRegion.getLength(); - aLen= aDoc.getLength(); - } - Diff diff= new Diff(null, RangeDifference.NOCHANGE, - aDoc, aRegion, aEnd, aLen, - lDoc, lRegion, lRegion.getOffset()+lRegion.getLength(), lDoc.getLength(), - rDoc, rRegion, rRegion.getOffset()+rRegion.getLength(), rDoc.getLength()); - fAllDiffs.add(diff); - } - } - - private Diff findDiff(char type, int pos) { - - IDocument aDoc= null; - IDocument lDoc= fLeft.getDocument(); - IDocument rDoc= fRight.getDocument(); - if (lDoc == null || rDoc == null) - return null; - - Position aRegion= null; - Position lRegion= null; - Position rRegion= null; - - boolean threeWay= isThreeWay(); - - if (threeWay && !fIgnoreAncestor) - aDoc= fAncestor.getDocument(); - - boolean ignoreWhiteSpace= Utilities.getBoolean(getCompareConfiguration(), CompareConfiguration.IGNORE_WHITESPACE, false); - - DocLineComparator sright= new DocLineComparator(rDoc, toRegion(rRegion), ignoreWhiteSpace); - DocLineComparator sleft= new DocLineComparator(lDoc, toRegion(lRegion), ignoreWhiteSpace); - DocLineComparator sancestor= null; - if (aDoc != null) - sancestor= new DocLineComparator(aDoc, toRegion(aRegion), ignoreWhiteSpace); - - final ResourceBundle bundle= getResourceBundle(); - - final Object[] result= new Object[1]; - final DocLineComparator sa= sancestor, sl= sleft, sr= sright; - IRunnableWithProgress runnable= new IRunnableWithProgress() { - public void run(IProgressMonitor monitor) throws InterruptedException, InvocationTargetException { - String progressTitle= Utilities.getString(bundle, "compareProgressTask.title"); //$NON-NLS-1$ - monitor.beginTask(progressTitle, maxWork(sa, sl, sr)); - try { - result[0]= RangeDifferencer.findRanges(monitor, sa, sl, sr); - } catch (OutOfMemoryError ex) { - System.gc(); - throw new InvocationTargetException(ex); - } - if (monitor.isCanceled()) { // cancelled - throw new InterruptedException(); - } - monitor.done(); - } - }; - IProgressService progressService= PlatformUI.getWorkbench().getProgressService(); - - RangeDifference[] e= null; - try { - progressService.run(true, true, runnable); - e= (RangeDifference[]) result[0]; - } catch (InvocationTargetException ex) { - String title= Utilities.getString(bundle, "tooComplexError.title"); //$NON-NLS-1$ - String format= Utilities.getString(bundle, "tooComplexError.format"); //$NON-NLS-1$ - String msg= MessageFormat.format(format, new Object[] { Integer.toString(progressService.getLongOperationTime()/1000) } ); - MessageDialog.openError(fComposite.getShell(), title, msg); - e= null; - } catch (InterruptedException ex) { - // - } - - if (e != null) { - for (int i= 0; i < e.length; i++) { - RangeDifference es= e[i]; - - int kind= es.kind(); - - int ancestorStart= 0; - int ancestorEnd= 0; - if (sancestor != null) { - ancestorStart= sancestor.getTokenStart(es.ancestorStart()); - ancestorEnd= getTokenEnd2(sancestor, es.ancestorStart(), es.ancestorLength()); - } - - int leftStart= sleft.getTokenStart(es.leftStart()); - int leftEnd= getTokenEnd2(sleft, es.leftStart(), es.leftLength()); - - int rightStart= sright.getTokenStart(es.rightStart()); - int rightEnd= getTokenEnd2(sright, es.rightStart(), es.rightLength()); - - Diff diff= new Diff(null, kind, - aDoc, aRegion, ancestorStart, ancestorEnd, - lDoc, lRegion, leftStart, leftEnd, - rDoc, rRegion, rightStart, rightEnd); - - if (diff.isInRange(type, pos)) - return diff; - } - } - - return null; - } - - /* - * Returns true if kind of change should be shown. - */ - private boolean useChange(int kind) { - if (kind == RangeDifference.NOCHANGE) - return false; - if (kind == RangeDifference.ANCESTOR) - return fShowPseudoConflicts; - return true; - } - - private int getTokenEnd(ITokenComparator tc, int start, int count) { - if (count <= 0) - return tc.getTokenStart(start); - int index= start + count - 1; - return tc.getTokenStart(index) + tc.getTokenLength(index); - } - - private static int getTokenEnd2(ITokenComparator tc, int start, int length) { - return tc.getTokenStart(start + length); - } - - /* - * Returns the content of lines in the specified range as a String. - * This includes the line separators. - * - * @param doc the document from which to extract the characters - * @param start index of first line - * @param length number of lines - * @return the contents of the specified line range as a String - */ - private String extract2(IDocument doc, ITokenComparator tc, int start, int length) { - int count= tc.getRangeCount(); - if (length > 0 && count > 0) { - -// -// int startPos= tc.getTokenStart(start); -// int endPos= startPos; -// -// if (length > 1) -// endPos= tc.getTokenStart(start + (length-1)); -// endPos+= tc.getTokenLength(start + (length-1)); -// - - int startPos= tc.getTokenStart(start); - int endPos; - - if (length == 1) { - endPos= startPos + tc.getTokenLength(start); - } else { - endPos= tc.getTokenStart(start + length); - } - - try { - return doc.get(startPos, endPos - startPos); - } catch (BadLocationException e) { - // silently ignored - } - - } - return ""; //$NON-NLS-1$ - } - - /* - * Performs a token based 3-way diff on the character range specified by the given baseDiff. - */ - private void simpleTokenDiff(final Diff baseDiff, - IDocument ancestorDoc, String a, - IDocument rightDoc, String d, - IDocument leftDoc, String s) { - - int ancestorStart= 0; - ITokenComparator sa= null; - if (ancestorDoc != null) { - ancestorStart= baseDiff.fAncestorPos.getOffset(); - sa= createTokenComparator(a); - } - - int rightStart= baseDiff.fRightPos.getOffset(); - ITokenComparator sm= createTokenComparator(d); - - int leftStart= baseDiff.fLeftPos.getOffset(); - ITokenComparator sy= createTokenComparator(s); - - RangeDifference[] e= RangeDifferencer.findRanges(sa, sy, sm); - for (int i= 0; i < e.length; i++) { - RangeDifference es= e[i]; - int kind= es.kind(); - if (kind != RangeDifference.NOCHANGE) { - - int ancestorStart2= ancestorStart; - int ancestorEnd2= ancestorStart; - if (ancestorDoc != null) { - ancestorStart2 += sa.getTokenStart(es.ancestorStart()); - ancestorEnd2 += getTokenEnd(sa, es.ancestorStart(), es.ancestorLength()); - } - - int leftStart2= leftStart + sy.getTokenStart(es.leftStart()); - int leftEnd2= leftStart + getTokenEnd(sy, es.leftStart(), es.leftLength()); - - int rightStart2= rightStart + sm.getTokenStart(es.rightStart()); - int rightEnd2= rightStart + getTokenEnd(sm, es.rightStart(), es.rightLength()); - - Diff diff= new Diff(baseDiff, kind, - ancestorDoc, null, ancestorStart2, ancestorEnd2, - leftDoc, null, leftStart2, leftEnd2, - rightDoc, null, rightStart2, rightEnd2); - - // ensure that token diff is smaller than basediff - int leftS= baseDiff.fLeftPos.offset; - int leftE= baseDiff.fLeftPos.offset+baseDiff.fLeftPos.length; - int rightS= baseDiff.fRightPos.offset; - int rightE= baseDiff.fRightPos.offset+baseDiff.fRightPos.length; - if (leftS != leftStart2 || leftE != leftEnd2 || - rightS != rightStart2 || rightE != rightEnd2) { - diff.fIsToken= true; - // add to base Diff - baseDiff.add(diff); - } - } - } - } - - /* - * Performs a "smart" token based 3-way diff on the character range specified by the given baseDiff. - * It is "smart" because it tries to minimize the number of token diffs by merging them. - */ - private void mergingTokenDiff(Diff baseDiff, - IDocument ancestorDoc, String a, - IDocument rightDoc, String d, - IDocument leftDoc, String s) { - ITokenComparator sa= null; - int ancestorStart= 0; - if (ancestorDoc != null) { - sa= createTokenComparator(a); - ancestorStart= baseDiff.fAncestorPos.getOffset(); - } - - int rightStart= baseDiff.fRightPos.getOffset(); - ITokenComparator sm= createTokenComparator(d); - - int leftStart= baseDiff.fLeftPos.getOffset(); - ITokenComparator sy= createTokenComparator(s); - - RangeDifference[] r= RangeDifferencer.findRanges(sa, sy, sm); - for (int i= 0; i < r.length; i++) { - RangeDifference es= r[i]; - // determine range of diffs in one line - int start= i; - int leftLine= -1; - int rightLine= -1; - try { - leftLine= leftDoc.getLineOfOffset(leftStart+sy.getTokenStart(es.leftStart())); - rightLine= rightDoc.getLineOfOffset(rightStart+sm.getTokenStart(es.rightStart())); - } catch (BadLocationException e) { - // silently ignored - } - i++; - for (; i < r.length; i++) { - es= r[i]; - try { - if (leftLine != leftDoc.getLineOfOffset(leftStart+sy.getTokenStart(es.leftStart()))) - break; - if (rightLine != rightDoc.getLineOfOffset(rightStart+sm.getTokenStart(es.rightStart()))) - break; - } catch (BadLocationException e) { - // silently ignored - } - } - int end= i; - - // find first diff from left - RangeDifference first= null; - for (int ii= start; ii < end; ii++) { - es= r[ii]; - if (useChange(es.kind())) { - first= es; - break; - } - } - - // find first diff from mine - RangeDifference last= null; - for (int ii= end-1; ii >= start; ii--) { - es= r[ii]; - if (useChange(es.kind())) { - last= es; - break; - } - } - - if (first != null && last != null) { - - int ancestorStart2= 0; - int ancestorEnd2= 0; - if (ancestorDoc != null) { - ancestorStart2= ancestorStart+sa.getTokenStart(first.ancestorStart()); - ancestorEnd2= ancestorStart+getTokenEnd(sa, last.ancestorStart(), last.ancestorLength()); - } - - int leftStart2= leftStart+sy.getTokenStart(first.leftStart()); - int leftEnd2= leftStart+getTokenEnd(sy, last.leftStart(), last.leftLength()); - - int rightStart2= rightStart+sm.getTokenStart(first.rightStart()); - int rightEnd2= rightStart+getTokenEnd(sm, last.rightStart(), last.rightLength()); - Diff diff= new Diff(baseDiff, first.kind(), - ancestorDoc, null, ancestorStart2, ancestorEnd2+1, - leftDoc, null, leftStart2, leftEnd2+1, - rightDoc, null, rightStart2, rightEnd2+1); - diff.fIsToken= true; - baseDiff.add(diff); - } - } - } - - //---- update UI stuff - - private void updateControls() { - - boolean leftToRight= false; - boolean rightToLeft= false; - - updateStatus(fCurrentDiff); - updateResolveStatus(); - - if (fCurrentDiff != null) { - IMergeViewerContentProvider cp= getMergeContentProvider(); - if (cp != null) { - rightToLeft= cp.isLeftEditable(getInput()); - leftToRight= cp.isRightEditable(getInput()); - } - } - - if (fDirectionLabel != null) { - if (fHighlightRanges && fCurrentDiff != null && isThreeWay() && !fIgnoreAncestor) { - fDirectionLabel.setImage(fCurrentDiff.getImage()); - } else { - fDirectionLabel.setImage(null); - } - } - - if (fCopyDiffLeftToRightItem != null) - ((Action)fCopyDiffLeftToRightItem.getAction()).setEnabled(leftToRight); - if (fCopyDiffRightToLeftItem != null) - ((Action)fCopyDiffRightToLeftItem.getAction()).setEnabled(rightToLeft); - - boolean enableNavigation= false; - if (fCurrentDiff == null && fChangeDiffs != null && fChangeDiffs.size() > 0) - enableNavigation= true; - else if (fChangeDiffs != null && fChangeDiffs.size() > 1) - enableNavigation= true; - else if (fCurrentDiff != null && fCurrentDiff.fDiffs != null) - enableNavigation= true; - else if (fCurrentDiff != null && fCurrentDiff.fIsToken) - enableNavigation= true; - - if (fNextItem != null) { - IAction a= fNextItem.getAction(); - a.setEnabled(enableNavigation); - } - if (fPreviousItem != null) { - IAction a= fPreviousItem.getAction(); - a.setEnabled(enableNavigation); - } - } - - private void updateResolveStatus() { - - RGB rgb= null; - - if (showResolveUI()) { - // we only show red or green if there is at least one incoming or conflicting change - int incomingOrConflicting= 0; - int unresolvedIncoming= 0; - int unresolvedConflicting= 0; - - if (fChangeDiffs != null) { - Iterator e= fChangeDiffs.iterator(); - while (e.hasNext()) { - Diff d= (Diff) e.next(); - if (d.isIncomingOrConflicting() /* && useChange(d.fDirection) && !d.fIsWhitespace */) { - incomingOrConflicting++; - if (!d.fResolved) { - if (d.fDirection == RangeDifference.CONFLICT) { - unresolvedConflicting++; - break; // we can stop here because a conflict has the maximum priority - } - unresolvedIncoming++; - } - } - } - } - - if (incomingOrConflicting > 0) { - if (unresolvedConflicting > 0) - rgb= SELECTED_CONFLICT; - else if (unresolvedIncoming > 0) - rgb= SELECTED_INCOMING; - else - rgb= RESOLVED; - } - } - - if (fHeaderPainter.setColor(rgb)) - fSummaryHeader.redraw(); - } - - private void updateStatus(Diff diff) { - - if (! fShowMoreInfo) - return; - - IActionBars bars= Utilities.findActionBars(fComposite); - if (bars == null) - return; - IStatusLineManager slm= bars.getStatusLineManager(); - if (slm == null) - return; - - String diffDescription; - - if (diff == null) { - diffDescription= CompareMessages.getString("TextMergeViewer.diffDescription.noDiff.format"); //$NON-NLS-1$ - } else { - - if (diff.fIsToken) // we don't show special info for token diffs - diff= diff.fParent; - - String format= CompareMessages.getString("TextMergeViewer.diffDescription.diff.format"); //$NON-NLS-1$ - diffDescription= MessageFormat.format(format, - new String[] { - getDiffType(diff), // 0: diff type - getDiffNumber(diff), // 1: diff number - getDiffRange(fLeft, diff.fLeftPos), // 2: left start line - getDiffRange(fRight, diff.fRightPos) // 3: left end line - } - ); - } - - String format= CompareMessages.getString("TextMergeViewer.statusLine.format"); //$NON-NLS-1$ - String s= MessageFormat.format(format, - new String[] { - getCursorPosition(fLeft), // 0: left column - getCursorPosition(fRight), // 1: right column - diffDescription // 2: diff description - } - ); - - slm.setMessage(s); - } - - private void clearStatus() { - - IActionBars bars= Utilities.findActionBars(fComposite); - if (bars == null) - return; - IStatusLineManager slm= bars.getStatusLineManager(); - if (slm == null) - return; - - slm.setMessage(null); - } - - private String getDiffType(Diff diff) { - String s= ""; //$NON-NLS-1$ - switch(diff.fDirection) { - case RangeDifference.LEFT: - s= CompareMessages.getString("TextMergeViewer.direction.outgoing"); //$NON-NLS-1$ - break; - case RangeDifference.RIGHT: - s= CompareMessages.getString("TextMergeViewer.direction.incoming"); //$NON-NLS-1$ - break; - case RangeDifference.CONFLICT: - s= CompareMessages.getString("TextMergeViewer.direction.conflicting"); //$NON-NLS-1$ - break; - } - String format= CompareMessages.getString("TextMergeViewer.diffType.format"); //$NON-NLS-1$ - return MessageFormat.format(format, new String[] { s, diff.changeType() } ); - } - - private String getDiffNumber(Diff diff) { - // find the diff's number - int diffNumber= 0; - if (fChangeDiffs != null) { - Iterator e= fChangeDiffs.iterator(); - while (e.hasNext()) { - Diff d= (Diff) e.next(); - diffNumber++; - if (d == diff) - break; - } - } - return Integer.toString(diffNumber); - } - - private String getDiffRange(MergeSourceViewer v, Position pos) { - Point p= v.getLineRange(pos, new Point(0, 0)); - int startLine= p.x+1; - int endLine= p.x+p.y; - - String format; - if (endLine < startLine) - format= CompareMessages.getString("TextMergeViewer.beforeLine.format"); //$NON-NLS-1$ - else - format= CompareMessages.getString("TextMergeViewer.range.format"); //$NON-NLS-1$ - return MessageFormat.format(format, - new String[] { Integer.toString(startLine), - Integer.toString(endLine) } ); - } - - /* - * Returns a description of the cursor position. - * - * @return a description of the cursor position - */ - private String getCursorPosition(MergeSourceViewer v) { - if (v != null) { - StyledText styledText= v.getTextWidget(); - - IDocument document= v.getDocument(); - if (document != null) { - int offset= v.getVisibleRegion().getOffset(); - int caret= offset + styledText.getCaretOffset(); - - try { - - int line=document.getLineOfOffset(caret); - - int lineOffset= document.getLineOffset(line); - int occurrences= 0; - for (int i= lineOffset; i < caret; i++) - if ('\t' == document.getChar(i)) - ++ occurrences; - - int tabWidth= styledText.getTabs(); - int column= caret - lineOffset + (tabWidth -1) * occurrences; - - String format= CompareMessages.getString("TextMergeViewer.cursorPosition.format"); //$NON-NLS-1$ - return MessageFormat.format(format, - new String[] { Integer.toString(line + 1), Integer.toString(column + 1) } ); - - } catch (BadLocationException x) { - // silently ignored - } - } - } - return ""; //$NON-NLS-1$ - } - - protected void updateHeader() { - - super.updateHeader(); - - updateControls(); - } - - /* - * Creates the two items for copying a difference range from one side to the other - * and adds them to the given toolbar manager. - */ - protected void createToolItems(ToolBarManager tbm) { - - IWorkbenchPartSite ps= Utilities.findSite(fComposite); - fKeyBindingService= ps != null ? ps.getKeyBindingService() : null; - - final String ignoreAncestorActionKey= "action.IgnoreAncestor."; //$NON-NLS-1$ - Action ignoreAncestorAction= new Action() { - public void run() { - setIgnoreAncestor(! fIgnoreAncestor); - Utilities.initToggleAction(this, getResourceBundle(), ignoreAncestorActionKey, fIgnoreAncestor); - } - }; - ignoreAncestorAction.setChecked(fIgnoreAncestor); - Utilities.initAction(ignoreAncestorAction, getResourceBundle(), ignoreAncestorActionKey); - Utilities.initToggleAction(ignoreAncestorAction, getResourceBundle(), ignoreAncestorActionKey, fIgnoreAncestor); - - fIgnoreAncestorItem= new ActionContributionItem(ignoreAncestorAction); - fIgnoreAncestorItem.setVisible(false); - tbm.appendToGroup("modes", fIgnoreAncestorItem); //$NON-NLS-1$ - - tbm.add(new Separator()); - - Action a= new Action() { - public void run() { - navigate(true, true, true); - } - }; - Utilities.initAction(a, getResourceBundle(), "action.NextDiff."); //$NON-NLS-1$ - fNextItem= new ActionContributionItem(a); - tbm.appendToGroup("navigation", fNextItem); //$NON-NLS-1$ - Utilities.registerAction(fKeyBindingService, a, "org.eclipse.compare.selectNextChange"); //$NON-NLS-1$ - - a= new Action() { - public void run() { - navigate(false, true, true); - } - }; - Utilities.initAction(a, getResourceBundle(), "action.PrevDiff."); //$NON-NLS-1$ - fPreviousItem= new ActionContributionItem(a); - tbm.appendToGroup("navigation", fPreviousItem); //$NON-NLS-1$ - Utilities.registerAction(fKeyBindingService, a, "org.eclipse.compare.selectPreviousChange"); //$NON-NLS-1$ - - - CompareConfiguration cc= getCompareConfiguration(); - - if (cc.isRightEditable()) { - a= new Action() { - public void run() { - copyDiffLeftToRight(); - } - }; - Utilities.initAction(a, getResourceBundle(), "action.CopyDiffLeftToRight."); //$NON-NLS-1$ - fCopyDiffLeftToRightItem= new ActionContributionItem(a); - fCopyDiffLeftToRightItem.setVisible(true); - tbm.appendToGroup("merge", fCopyDiffLeftToRightItem); //$NON-NLS-1$ - Utilities.registerAction(fKeyBindingService, a, "org.eclipse.compare.copyLeftToRight"); //$NON-NLS-1$ - } - - if (cc.isLeftEditable()) { - a= new Action() { - public void run() { - copyDiffRightToLeft(); - } - }; - Utilities.initAction(a, getResourceBundle(), "action.CopyDiffRightToLeft."); //$NON-NLS-1$ - fCopyDiffRightToLeftItem= new ActionContributionItem(a); - fCopyDiffRightToLeftItem.setVisible(true); - tbm.appendToGroup("merge", fCopyDiffRightToLeftItem); //$NON-NLS-1$ - Utilities.registerAction(fKeyBindingService, a, "org.eclipse.compare.copyRightToLeft"); //$NON-NLS-1$ - } - } - - /* package */ void propertyChange(PropertyChangeEvent event) { - - String key= event.getProperty(); - - if (key.equals(CompareConfiguration.IGNORE_WHITESPACE) - || key.equals(ComparePreferencePage.SHOW_PSEUDO_CONFLICTS)) { - - fShowPseudoConflicts= fPreferenceStore.getBoolean(ComparePreferencePage.SHOW_PSEUDO_CONFLICTS); - - // clear stuff - fCurrentDiff= null; - fChangeDiffs= null; - fAllDiffs= null; - - doDiff(); - - updateControls(); - invalidateLines(); - updateVScrollBar(); - refreshBirdsEyeView(); - - selectFirstDiff(); - -// } else if (key.equals(ComparePreferencePage.USE_SPLINES)) { -// fUseSplines= fPreferenceStore.getBoolean(ComparePreferencePage.USE_SPLINES); -// invalidateLines(); - - } else if (key.equals(ComparePreferencePage.USE_SINGLE_LINE)) { - fUseSingleLine= fPreferenceStore.getBoolean(ComparePreferencePage.USE_SINGLE_LINE); -// fUseResolveUI= fUseSingleLine; - fBasicCenterCurve= null; - updateResolveStatus(); - invalidateLines(); - -// } else if (key.equals(ComparePreferencePage.USE_RESOLVE_UI)) { -// fUseResolveUI= fPreferenceStore.getBoolean(ComparePreferencePage.USE_RESOLVE_UI); -// updateResolveStatus(); -// invalidateLines(); - - } else if (key.equals(fSymbolicFontName)) { - updateFont(); - invalidateLines(); - - } else if (key.equals(INCOMING_COLOR) || key.equals(OUTGOING_COLOR) || key.equals(CONFLICTING_COLOR) || key.equals(RESOLVED_COLOR)) { - updateColors(null); - invalidateLines(); - - } else if (key.equals(ComparePreferencePage.SYNCHRONIZE_SCROLLING)) { - - boolean b= fPreferenceStore.getBoolean(ComparePreferencePage.SYNCHRONIZE_SCROLLING); - if (b != fSynchronizedScrolling) - toggleSynchMode(); - - } else if (key.equals(ComparePreferencePage.SHOW_MORE_INFO)) { - - boolean b= fPreferenceStore.getBoolean(ComparePreferencePage.SHOW_MORE_INFO); - if (b != fShowMoreInfo) { - fShowMoreInfo= b; - if (fShowMoreInfo) - updateStatus(fCurrentDiff); - else - clearStatus(); - } - - } else - super.propertyChange(event); - } - - private void setIgnoreAncestor(boolean ignore) { - if (ignore != fIgnoreAncestor) { - fIgnoreAncestor= ignore; - setAncestorVisibility(false, !fIgnoreAncestor); - - // clear stuff - fCurrentDiff= null; - fChangeDiffs= null; - fAllDiffs= null; - - doDiff(); - - invalidateLines(); - updateVScrollBar(); - refreshBirdsEyeView(); - - selectFirstDiff(); - } - } - - private void selectFirstDiff() { - - if (fLeft == null || fRight == null) { - return; - } - if (fLeft.getDocument() == null || fRight.getDocument() == null) { - return; - } - - Diff firstDiff= null; - if (CompareNavigator.getDirection(fComposite)) - firstDiff= findNext(fRight, fChangeDiffs, -1, -1, false); - else - firstDiff= findPrev(fRight, fChangeDiffs, 9999999, 9999999, false); - setCurrentDiff(firstDiff, true); - } - - private void toggleSynchMode() { - fSynchronizedScrolling= ! fSynchronizedScrolling; - - scrollVertical(0, 0, 0, null); - - // throw away central control (Sash or Canvas) - Control center= getCenter(); - if (center != null && !center.isDisposed()) - center.dispose(); - - fLeft.getTextWidget().getVerticalBar().setVisible(!fSynchronizedScrolling); - fRight.getTextWidget().getVerticalBar().setVisible(!fSynchronizedScrolling); - - fComposite.layout(true); - } - - protected void updateToolItems() { - - if (fIgnoreAncestorItem != null) - fIgnoreAncestorItem.setVisible(isThreeWay()); - - if (fCopyDiffLeftToRightItem != null) { - IAction a= fCopyDiffLeftToRightItem.getAction(); - if (a != null) - a.setEnabled(a.isEnabled() && !fHasErrors); - } - if (fCopyDiffRightToLeftItem != null) { - IAction a= fCopyDiffRightToLeftItem.getAction(); - if (a != null) - a.setEnabled(a.isEnabled() && !fHasErrors); - } - - super.updateToolItems(); - } - - //---- painting lines - - private void updateLines(IDocument d) { - - boolean left= false; - boolean right= false; - - // FIXME: this optimization is incorrect because - // it doesn't take replace operations into account where - // the old and new line count does not differ - if (d == fLeft.getDocument()) { - int l= fLeft.getLineCount(); - left= fLeftLineCount != l; - fLeftLineCount= l; - } else if (d == fRight.getDocument()) { - int l= fRight.getLineCount(); - right= fRightLineCount != l; - fRightLineCount= l; - } - - if (left || right) { - - if (left) { - if (fLeftCanvas != null) - fLeftCanvas.redraw(); - } else { - if (fRightCanvas != null) - fRightCanvas.redraw(); - } - Control center= getCenter(); - if (center != null) - center.redraw(); - - updateVScrollBar(); - refreshBirdsEyeView(); - } - } - - private void invalidateLines() { - if (isThreeWay()) { - if (Utilities.okToUse(fAncestorCanvas)) - fAncestorCanvas.redraw(); - if (fAncestor != null && fAncestor.isControlOkToUse()) - fAncestor.getTextWidget().redraw(); - } - - if (Utilities.okToUse(fLeftCanvas)) - fLeftCanvas.redraw(); - - if (fLeft != null && fLeft.isControlOkToUse()) - fLeft.getTextWidget().redraw(); - - if (Utilities.okToUse(getCenter())) - getCenter().redraw(); - - if (fRight != null && fRight.isControlOkToUse()) - fRight.getTextWidget().redraw(); - - if (Utilities.okToUse(fRightCanvas)) - fRightCanvas.redraw(); - } - - private boolean showResolveUI() { - if (!fUseResolveUI || !isThreeWay() || fIgnoreAncestor) - return false; - CompareConfiguration cc= getCompareConfiguration(); - if (cc == null) - return false; - // we only enable the new resolve ui if exactly one side is editable - boolean l= cc.isLeftEditable(); - boolean r= cc.isRightEditable(); - //return (l && !r) || (r && !l); - return l || r; - } - - private void paintCenter(Canvas canvas, GC g) { - - Display display= canvas.getDisplay(); - - checkForColorUpdate(display); - - if (! fSynchronizedScrolling) - return; - - int lineHeight= fLeft.getTextWidget().getLineHeight(); - int visibleHeight= fRight.getViewportHeight(); - - Point size= canvas.getSize(); - int x= 0; - int w= size.x; - - g.setBackground(canvas.getBackground()); - g.fillRectangle(x+1, 0, w-2, size.y); - - if (!fIsMotif) { - // draw thin line between center ruler and both texts - g.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW)); - g.fillRectangle(0, 0, 1, size.y); - g.fillRectangle(w-1, 0, 1, size.y); - } - - if (! fHighlightRanges) - return; - - boolean showResolveUI= showResolveUI(); - - if (fChangeDiffs != null) { - int lshift= fLeft.getVerticalScrollOffset(); - int rshift= fRight.getVerticalScrollOffset(); - - Point region= new Point(0, 0); - - Iterator e= fChangeDiffs.iterator(); - while (e.hasNext()) { - Diff diff= (Diff) e.next(); - if (diff.isDeleted()) - continue; - - if (fShowCurrentOnly2 && !isCurrentDiff(diff)) - continue; - - fLeft.getLineRange(diff.fLeftPos, region); - int ly= (region.x * lineHeight) + lshift; - int lh= region.y * lineHeight; - - fRight.getLineRange(diff.fRightPos, region); - int ry= (region.x * lineHeight) + rshift; - int rh= region.y * lineHeight; - - if (Math.max(ly+lh, ry+rh) < 0) - continue; - if (Math.min(ly, ry) >= visibleHeight) - break; - - fPts[0]= x; fPts[1]= ly; fPts[2]= w; fPts[3]= ry; - fPts[6]= x; fPts[7]= ly+lh; fPts[4]= w; fPts[5]= ry+rh; - - Color fillColor= getColor(display, getFillColor(diff)); - Color strokeColor= getColor(display, getStrokeColor(diff)); - - if (fUseSingleLine) { - int w2= 3; - - g.setBackground(fillColor); - g.fillRectangle(0, ly, w2, lh); // left - g.fillRectangle(w-w2, ry, w2, rh); // right - - g.setLineWidth(LW); - g.setForeground(strokeColor); - g.drawRectangle(0-1, ly, w2, lh); // left - g.drawRectangle(w-w2, ry, w2, rh); // right - - if (fUseSplines) { - int[] points= getCenterCurvePoints(w2, ly+lh/2, w-w2, ry+rh/2); - for (int i= 1; i < points.length; i++) - g.drawLine(w2+i-1, points[i-1], w2+i, points[i]); - } else { - g.drawLine(w2, ly+lh/2, w-w2, ry+rh/2); - } - } else { - // two lines - if (fUseSplines) { - g.setBackground(fillColor); - - g.setLineWidth(LW); - g.setForeground(strokeColor); - - int[] topPoints= getCenterCurvePoints(fPts[0], fPts[1], fPts[2], fPts[3]); - int[] bottomPoints= getCenterCurvePoints(fPts[6], fPts[7], fPts[4], fPts[5]); - g.setForeground(fillColor); - g.drawLine(0, bottomPoints[0], 0, topPoints[0]); - for (int i= 1; i < bottomPoints.length; i++) { - g.setForeground(fillColor); - g.drawLine(i, bottomPoints[i], i, topPoints[i]); - g.setForeground(strokeColor); - g.drawLine(i-1, topPoints[i-1], i, topPoints[i]); - g.drawLine(i-1, bottomPoints[i-1], i, bottomPoints[i]); - } - } else { - g.setBackground(fillColor); - g.fillPolygon(fPts); - - g.setLineWidth(LW); - g.setForeground(strokeColor); - g.drawLine(fPts[0], fPts[1], fPts[2], fPts[3]); - g.drawLine(fPts[6], fPts[7], fPts[4], fPts[5]); - } - } - - if (fUseSingleLine && showResolveUI && diff.isUnresolvedIncomingOrConflicting()) { - // draw resolve state - int cx= (w-RESOLVE_SIZE)/2; - int cy= ((ly+lh/2) + (ry+rh/2) - RESOLVE_SIZE)/2; - - g.setBackground(fillColor); - g.fillRectangle(cx, cy, RESOLVE_SIZE, RESOLVE_SIZE); - - g.setForeground(strokeColor); - g.drawRectangle(cx, cy, RESOLVE_SIZE, RESOLVE_SIZE); - } - } - } - } - - private int[] getCenterCurvePoints(int startx, int starty, int endx, int endy) { - if (fBasicCenterCurve == null) - buildBaseCenterCurve(endx-startx); - double height= endy - starty; - height= height/2; - int width= endx-startx; - int[] points= new int[width]; - for (int i= 0; i < width; i++) { - points[i]= (int) (-height * fBasicCenterCurve[i] + height + starty); - } - return points; - } - - private void buildBaseCenterCurve(int w) { - double width= w; - fBasicCenterCurve= new double[getCenterWidth()]; - for (int i= 0; i < getCenterWidth(); i++) { - double r= i / width; - fBasicCenterCurve[i]= Math.cos(Math.PI * r); - } - } - - private void paintSides(GC g, MergeSourceViewer tp, Canvas canvas, boolean right) { - - Display display= canvas.getDisplay(); - - int lineHeight= tp.getTextWidget().getLineHeight(); - int visibleHeight= tp.getViewportHeight(); - - Point size= canvas.getSize(); - int x= 0; - int w= fMarginWidth; - int w2= w/2; - - g.setBackground(canvas.getBackground()); - g.fillRectangle(x, 0, w, size.y); - - if (!fIsMotif) { - // draw thin line between ruler and text - g.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW)); - if (right) - g.fillRectangle(0, 0, 1, size.y); - else - g.fillRectangle(size.x-1, 0, 1, size.y); - } - - if (! fHighlightRanges) - return; - - if (fChangeDiffs != null) { - int shift= tp.getVerticalScrollOffset() + (2-LW); - - Point region= new Point(0, 0); - Iterator e= fChangeDiffs.iterator(); - while (e.hasNext()) { - Diff diff= (Diff) e.next(); - if (diff.isDeleted()) - continue; - - if (fShowCurrentOnly2 && !isCurrentDiff(diff)) - continue; - - tp.getLineRange(diff.getPosition(tp), region); - int y= (region.x * lineHeight) + shift; - int h= region.y * lineHeight; - - if (y+h < 0) - continue; - if (y >= visibleHeight) - break; - - g.setBackground(getColor(display, getFillColor(diff))); - if (right) - g.fillRectangle(x, y, w2, h); - else - g.fillRectangle(x+w2, y, w2, h); - - g.setLineWidth(LW); - g.setForeground(getColor(display, getStrokeColor(diff))); - if (right) - g.drawRectangle(x-1, y-1, w2, h); - else - g.drawRectangle(x+w2, y-1, w2, h); - } - } - } - - private void paint(PaintEvent event, MergeSourceViewer tp) { - - if (! fHighlightRanges) - return; - if (fChangeDiffs == null) - return; - - Control canvas= (Control) event.widget; - GC g= event.gc; - - Display display= canvas.getDisplay(); - - int lineHeight= tp.getTextWidget().getLineHeight(); - int w= canvas.getSize().x; - int shift= tp.getVerticalScrollOffset() + (2-LW); - int maxh= event.y+event.height; // visibleHeight - - //if (fIsMotif) - shift+= fTopInset; - - Point range= new Point(0, 0); - - Iterator e= fChangeDiffs.iterator(); - while (e.hasNext()) { - Diff diff= (Diff) e.next(); - if (diff.isDeleted()) - continue; - - if (fShowCurrentOnly && !isCurrentDiff(diff)) - continue; - - tp.getLineRange(diff.getPosition(tp), range); - int y= (range.x * lineHeight) + shift; - int h= range.y * lineHeight; - - if (y+h < event.y) - continue; - if (y > maxh) - break; - - g.setBackground(getColor(display, getStrokeColor(diff))); - g.fillRectangle(0, y-1, w, LW); - g.fillRectangle(0, y+h-1, w, LW); - } - } - - private RGB getFillColor(Diff diff) { - boolean selected= fCurrentDiff != null && fCurrentDiff.fParent == diff; - - RGB selected_fill= getBackground(null); - - if (isThreeWay() && !fIgnoreAncestor) { - switch (diff.fDirection) { - case RangeDifference.RIGHT: - if (fLeftIsLocal) - return selected ? selected_fill : INCOMING_FILL; - return selected ? selected_fill : OUTGOING_FILL; - case RangeDifference.ANCESTOR: - return selected ? selected_fill : CONFLICT_FILL; - case RangeDifference.LEFT: - if (fLeftIsLocal) - return selected ? selected_fill : OUTGOING_FILL; - return selected ? selected_fill : INCOMING_FILL; - case RangeDifference.CONFLICT: - return selected ? selected_fill : CONFLICT_FILL; - } - return null; - } - return selected ? selected_fill : OUTGOING_FILL; - } - - private RGB getStrokeColor(Diff diff) { - boolean selected= fCurrentDiff != null && fCurrentDiff.fParent == diff; - - if (isThreeWay() && !fIgnoreAncestor) { - switch (diff.fDirection) { - case RangeDifference.RIGHT: - if (fLeftIsLocal) - return selected ? SELECTED_INCOMING : INCOMING; - return selected ? SELECTED_OUTGOING : OUTGOING; - case RangeDifference.ANCESTOR: - return selected ? SELECTED_CONFLICT : CONFLICT; - case RangeDifference.LEFT: - if (fLeftIsLocal) - return selected ? SELECTED_OUTGOING : OUTGOING; - return selected ? SELECTED_INCOMING : INCOMING; - case RangeDifference.CONFLICT: - return selected ? SELECTED_CONFLICT : CONFLICT; - } - return null; - } - return selected ? SELECTED_OUTGOING : OUTGOING; - } - - private Color getColor(Display display, RGB rgb) { - if (rgb == null) - return null; - if (fColors == null) - fColors= new HashMap(20); - Color c= (Color) fColors.get(rgb); - if (c == null) { - c= new Color(display, rgb); - fColors.put(rgb, c); - } - return c; - } - - static RGB interpolate(RGB fg, RGB bg, double scale) { - if (fg != null && bg != null) - return new RGB( - (int)((1.0-scale) * fg.red + scale * bg.red), - (int)((1.0-scale) * fg.green + scale * bg.green), - (int)((1.0-scale) * fg.blue + scale * bg.blue) - ); - if (fg != null) - return fg; - if (bg != null) - return bg; - return new RGB(128, 128, 128); // a gray - } - - //---- Navigating and resolving Diffs - - /* - * Returns true if end (or beginning) of document reached. - */ - private boolean navigate(boolean down, boolean wrap, boolean deep) { - - Diff diff= null; - - for (;;) { - - if (fChangeDiffs != null) { - MergeSourceViewer part= fFocusPart; - if (part == null) - part= fRight; - - if (part != null) { - Point s= part.getSelectedRange(); - if (down) - diff= findNext(part, fChangeDiffs, s.x, s.x+s.y, deep); - else - diff= findPrev(part, fChangeDiffs, s.x, s.x+s.y, deep); - } - } - - if (diff == null) { // at end or beginning - if (wrap) { - if (!fEndOfDocReached) { - fEndOfDocReached= true; - if (! endOfDocumentReached(down)) - return true; - } - fEndOfDocReached= false; - if (fChangeDiffs != null && fChangeDiffs.size() > 0) { - if (down) - diff= (Diff) fChangeDiffs.get(0); - else - diff= (Diff) fChangeDiffs.get(fChangeDiffs.size()-1); - } - } else { - fEndOfDocReached= false; - return true; - } - } - - setCurrentDiff(diff, true); - - if (diff != null && diff.fDirection == RangeDifference.ANCESTOR - && !getAncestorEnabled()) - continue; - - break; - } - - return false; - } - - private boolean endOfDocumentReached(boolean down) { - Control c= getControl(); - if (Utilities.okToUse(c)) { - - c.getDisplay().beep(); - - String key= down ? "atEnd" : "atBeginning"; //$NON-NLS-1$ //$NON-NLS-2$ - return MessageDialog.openQuestion(c.getShell(), - CompareMessages.getString("TextMergeViewer."+key+".title"), //$NON-NLS-1$ //$NON-NLS-2$ - CompareMessages.getString("TextMergeViewer."+key+".message")); //$NON-NLS-1$ //$NON-NLS-2$ - } - return false; - } - - /* - * Find the Diff that overlaps with the given TextPart's text range. - * If the range doesn't overlap with any range null - * is returned. - */ - private Diff findDiff(MergeSourceViewer tp, int rangeStart, int rangeEnd) { - if (fChangeDiffs != null) { - Iterator e= fChangeDiffs.iterator(); - while (e.hasNext()) { - Diff diff= (Diff) e.next(); - if (diff.overlaps(tp, rangeStart, rangeEnd)) - return diff; - } - } - return null; - } - - private static Diff findNext(MergeSourceViewer tp, List v, int start, int end, boolean deep) { - for (int i= 0; i < v.size(); i++) { - Diff diff= (Diff) v.get(i); - Position p= diff.getPosition(tp); - if (p != null) { - int startOffset= p.getOffset(); - if (end < startOffset) // <= - return diff; - if (deep && diff.fDiffs != null) { - Diff d= null; - int endOffset= startOffset + p.getLength(); - if (start == startOffset && (end == endOffset || end == endOffset-1)) { - d= findNext(tp, diff.fDiffs, start-1, start-1, deep); - } else if (end < endOffset) { - d= findNext(tp, diff.fDiffs, start, end, deep); - } - if (d != null) - return d; - } - } - } - return null; - } - - private static Diff findPrev(MergeSourceViewer tp, List v, int start, int end, boolean deep) { - for (int i= v.size()-1; i >= 0; i--) { - Diff diff= (Diff) v.get(i); - Position p= diff.getPosition(tp); - if (p != null) { - int startOffset= p.getOffset(); - int endOffset= startOffset + p.getLength(); - if (start > endOffset) - return diff; - if (deep && diff.fDiffs != null) { - Diff d= null; - if (start == startOffset && end == endOffset) { - d= findPrev(tp, diff.fDiffs, end, end, deep); - } else if (start >= startOffset) { - d= findPrev(tp, diff.fDiffs, start, end, deep); - } - if (d != null) - return d; - } - } - } - return null; - } - - /* - * Set the currently active Diff and update the toolbars controls and lines. - * If revealAndSelect is true the Diff is revealed and - * selected in both TextParts. - */ - private void setCurrentDiff(Diff d, boolean revealAndSelect) { - -// if (d == fCurrentDiff) -// return; - - if (fCenterButton != null) - fCenterButton.setVisible(false); - - fEndOfDocReached= false; - - Diff oldDiff= fCurrentDiff; - - if (d != null && revealAndSelect) { - - // before we set fCurrentDiff we change the selection - // so that the paint code uses the old background colors - // otherwise selection isn't drawn correctly - if (isThreeWay() && !fIgnoreAncestor) - fAncestor.setSelection(d.fAncestorPos); - fLeft.setSelection(d.fLeftPos); - fRight.setSelection(d.fRightPos); - - // now switch diffs - fCurrentDiff= d; - revealDiff(d, d.fIsToken); - } else { - fCurrentDiff= d; - } - - Diff d1= oldDiff != null ? oldDiff.fParent : null; - Diff d2= fCurrentDiff != null ? fCurrentDiff.fParent : null; - if (d1 != d2) { - updateDiffBackground(d1); - updateDiffBackground(d2); - } - - updateControls(); - invalidateLines(); - refreshBirdsEyeView(); - } - - /* - * Smart determines whether - */ - private void revealDiff(Diff d, boolean smart) { - - boolean ancestorIsVisible= false; - boolean leftIsVisible= false; - boolean rightIsVisible= false; - - if (smart) { - Point region= new Point(0, 0); - // find the starting line of the diff in all text widgets - int ls= fLeft.getLineRange(d.fLeftPos, region).x; - int rs= fRight.getLineRange(d.fRightPos, region).x; - - if (isThreeWay() && !fIgnoreAncestor) { - int as= fAncestor.getLineRange(d.fAncestorPos, region).x; - if (as >= fAncestor.getTopIndex() && as <= fAncestor.getBottomIndex()) - ancestorIsVisible= true; - } - - if (ls >= fLeft.getTopIndex() && ls <= fLeft.getBottomIndex()) - leftIsVisible= true; - - if (rs >= fRight.getTopIndex() && rs <= fRight.getBottomIndex()) - rightIsVisible= true; - } - - // vertical scrolling - if (!leftIsVisible || !rightIsVisible) { - int avpos= 0, lvpos= 0, rvpos= 0; - - MergeSourceViewer allButThis= null; - if (leftIsVisible) { - avpos= lvpos= rvpos= realToVirtualPosition(fLeft, fLeft.getTopIndex()); - allButThis= fLeft; - } else if (rightIsVisible) { - avpos= lvpos= rvpos= realToVirtualPosition(fRight, fRight.getTopIndex()); - allButThis= fRight; - } else if (ancestorIsVisible) { - avpos= lvpos= rvpos= realToVirtualPosition(fAncestor, fAncestor.getTopIndex()); - allButThis= fAncestor; - } else { - if (fAllDiffs != null) { - int vpos= 0; - Iterator e= fAllDiffs.iterator(); - for (int i= 0; e.hasNext(); i++) { - Diff diff= (Diff) e.next(); - if (diff == d) - break; - if (fSynchronizedScrolling) { - vpos+= diff.getMaxDiffHeight(fShowAncestor); - } else { - avpos+= diff.getAncestorHeight(); - lvpos+= diff.getLeftHeight(); - rvpos+= diff.getRightHeight(); - } - } - if (fSynchronizedScrolling) - avpos= lvpos= rvpos= vpos; - } - int delta= fRight.getViewportLines()/4; - avpos-= delta; - if (avpos < 0) - avpos= 0; - lvpos-= delta; - if (lvpos < 0) - lvpos= 0; - rvpos-= delta; - if (rvpos < 0) - rvpos= 0; - } - - scrollVertical(avpos, lvpos, rvpos, allButThis); - - if (fVScrollBar != null) - fVScrollBar.setSelection(avpos); - } - - // horizontal scrolling - if (d.fIsToken) { - // we only scroll horizontally for token diffs - reveal(fAncestor, d.fAncestorPos); - reveal(fLeft, d.fLeftPos); - reveal(fRight, d.fRightPos); - } else { - // in all other cases we reset the horizontal offset - hscroll(fAncestor); - hscroll(fLeft); - hscroll(fRight); - } - } - - private static void reveal(MergeSourceViewer v, Position p) { - if (v != null && p != null) { - StyledText st= v.getTextWidget(); - if (st != null) { - Rectangle r= st.getClientArea(); - if (!r.isEmpty()) // workaround for #7320: Next diff scrolls when going into current diff - v.revealRange(p.offset, p.length); - } - } - } - - private static void hscroll(MergeSourceViewer v) { - if (v != null) { - StyledText st= v.getTextWidget(); - if (st != null) - st.setHorizontalIndex(0); - } - } - - //-------------------------------------------------------------------------------- - - void copyAllUnresolved(boolean leftToRight) { - if (fChangeDiffs != null && isThreeWay() && !fIgnoreAncestor) { - IRewriteTarget target= leftToRight ? fRight.getRewriteTarget() : fLeft.getRewriteTarget(); - boolean compoundChangeStarted= false; - Iterator e= fChangeDiffs.iterator(); - try { - while (e.hasNext()) { - Diff diff= (Diff) e.next(); - switch (diff.fDirection) { - case RangeDifference.LEFT: - if (leftToRight) { - if (!compoundChangeStarted) { - target.beginCompoundChange(); - compoundChangeStarted= true; - } - copy(diff, leftToRight); - } - break; - case RangeDifference.RIGHT: - if (!leftToRight) { - if (!compoundChangeStarted) { - target.beginCompoundChange(); - compoundChangeStarted= true; - } - copy(diff, leftToRight); - } - break; - default: - continue; - } - } - } finally { - if (compoundChangeStarted) { - target.endCompoundChange(); - } - } - } - } - - /* - * Copy whole document from one side to the other. - */ - protected void copy(boolean leftToRight) { - - if (showResolveUI()) { - copyAllUnresolved(leftToRight); - invalidateLines(); - return; - } - - if (leftToRight) { - if (fLeft.getEnabled()) { - // copy text - String text= fLeft.getTextWidget().getText(); - fRight.getTextWidget().setText(text); - fRight.setEnabled(true); - } else { - // delete - fRight.getTextWidget().setText(""); //$NON-NLS-1$ - fRight.setEnabled(false); - } - fRightLineCount= fRight.getLineCount(); - setRightDirty(true); - } else { - if (fRight.getEnabled()) { - // copy text - String text= fRight.getTextWidget().getText(); - fLeft.getTextWidget().setText(text); - fLeft.setEnabled(true); - } else { - // delete - fLeft.getTextWidget().setText(""); //$NON-NLS-1$ - fLeft.setEnabled(false); - } - fLeftLineCount= fLeft.getLineCount(); - setLeftDirty(true); - } - doDiff(); - invalidateLines(); - updateVScrollBar(); - selectFirstDiff(); - refreshBirdsEyeView(); - } - - private void copyDiffLeftToRight() { - copy(fCurrentDiff, true, false); - } - - private void copyDiffRightToLeft() { - copy(fCurrentDiff, false, false); - } - - /* - * Copy the contents of the given diff from one side to the other. - */ - private void copy(Diff diff, boolean leftToRight, boolean gotoNext) { - if (copy(diff, leftToRight)) { - if (gotoNext) { - navigate(true, true, true); - } else { - revealDiff(diff, true); - updateControls(); - } - } - } - - /* - * Copy the contents of the given diff from one side to the other but - * doesn't reveal anything. - * Returns true if copy was succesful. - */ - private boolean copy(Diff diff, boolean leftToRight) { - - if (diff != null && !diff.isResolved()) { - - Position fromPos= null; - Position toPos= null; - IDocument fromDoc= null; - IDocument toDoc= null; - - if (leftToRight) { - fRight.setEnabled(true); - fromPos= diff.fLeftPos; - toPos= diff.fRightPos; - fromDoc= fLeft.getDocument(); - toDoc= fRight.getDocument(); - } else { - fLeft.setEnabled(true); - fromPos= diff.fRightPos; - toPos= diff.fLeftPos; - fromDoc= fRight.getDocument(); - toDoc= fLeft.getDocument(); - } - - if (fromDoc != null) { - - int fromStart= fromPos.getOffset(); - int fromLen= fromPos.getLength(); - - int toStart= toPos.getOffset(); - int toLen= toPos.getLength(); - - try { - String s= null; - - switch (diff.fDirection) { - case RangeDifference.RIGHT: - case RangeDifference.LEFT: - s= fromDoc.get(fromStart, fromLen); - break; - case RangeDifference.ANCESTOR: - break; - case RangeDifference.CONFLICT: - if (APPEND_CONFLICT) { - s= toDoc.get(toStart, toLen); - s+= fromDoc.get(fromStart, fromLen); - } else - s= fromDoc.get(fromStart, fromLen); - break; - } - if (s != null) { - toDoc.replace(toStart, toLen, s); - toPos.setOffset(toStart); - toPos.setLength(s.length()); - } - - } catch (BadLocationException e) { - // silently ignored - } - } - - diff.setResolved(true); - updateResolveStatus(); - - return true; - } - return false; - } - - //---- scrolling - - /* - * Calculates virtual height (in lines) of views by adding the maximum of corresponding diffs. - */ - private int getVirtualHeight() { - int h= 1; - if (fAllDiffs != null) { - Iterator e= fAllDiffs.iterator(); - for (int i= 0; e.hasNext(); i++) { - Diff diff= (Diff) e.next(); - h+= diff.getMaxDiffHeight(fShowAncestor); - } - } - return h; - } - - /* - * Calculates height (in lines) of right view by adding the height of the right diffs. - */ - private int getRightHeight() { - int h= 1; - if (fAllDiffs != null) { - Iterator e= fAllDiffs.iterator(); - for (int i= 0; e.hasNext(); i++) { - Diff diff= (Diff) e.next(); - h+= diff.getRightHeight(); - } - } - return h; - } - - /* - * The height of the TextEditors in lines. - */ - private int getViewportHeight() { - StyledText te= fLeft.getTextWidget(); - - int vh= te.getClientArea().height; - if (vh == 0) { - Rectangle trim= te.computeTrim(0, 0, 0, 0); - int scrollbarHeight= trim.height; - - int headerHeight= getHeaderHeight(); - - Composite composite= (Composite) getControl(); - Rectangle r= composite.getClientArea(); - - vh= r.height-headerHeight-scrollbarHeight; - } - - return vh / te.getLineHeight(); - } - - /* - * Returns the virtual position for the given view position. - */ - private int realToVirtualPosition(MergeSourceViewer w, int vpos) { - - if (! fSynchronizedScrolling || fAllDiffs == null) - return vpos; - - int viewPos= 0; // real view position - int virtualPos= 0; // virtual position - Point region= new Point(0, 0); - - Iterator e= fAllDiffs.iterator(); - while (e.hasNext()) { - Diff diff= (Diff) e.next(); - Position pos= diff.getPosition(w); - w.getLineRange(pos, region); - int realHeight= region.y; - int virtualHeight= diff.getMaxDiffHeight(fShowAncestor); - if (vpos <= viewPos + realHeight) { // OK, found! - vpos-= viewPos; // make relative to this slot - // now scale position within this slot to virtual slot - if (realHeight <= 0) - vpos= 0; - else - vpos= (vpos*virtualHeight)/realHeight; - return virtualPos+vpos; - } - viewPos+= realHeight; - virtualPos+= virtualHeight; - } - return virtualPos; - } - - private void scrollVertical(int avpos, int lvpos, int rvpos, MergeSourceViewer allBut) { - - int s= 0; - - if (fSynchronizedScrolling) { - s= getVirtualHeight() - rvpos; - int height= fRight.getViewportLines()/4; - if (s < 0) - s= 0; - if (s > height) - s= height; - } - - fInScrolling= true; - - if (isThreeWay() && allBut != fAncestor) { - if (fSynchronizedScrolling || allBut == null) { - int y= virtualToRealPosition(fAncestor, avpos+s)-s; - fAncestor.vscroll(y); - } - } - - if (allBut != fLeft) { - if (fSynchronizedScrolling || allBut == null) { - int y= virtualToRealPosition(fLeft, lvpos+s)-s; - fLeft.vscroll(y); - } - } - - if (allBut != fRight) { - if (fSynchronizedScrolling || allBut == null) { - int y= virtualToRealPosition(fRight, rvpos+s)-s; - fRight.vscroll(y); - } - } - - fInScrolling= false; - - if (isThreeWay() && fAncestorCanvas != null) - fAncestorCanvas.repaint(); - - if (fLeftCanvas != null) - fLeftCanvas.repaint(); - - Control center= getCenter(); - if (center instanceof BufferedCanvas) - ((BufferedCanvas)center).repaint(); - - if (fRightCanvas != null) - fRightCanvas.repaint(); - } - - /* - * Updates Scrollbars with viewports. - */ - private void syncViewport(MergeSourceViewer w) { - - if (fInScrolling) - return; - - int ix= w.getTopIndex(); - int ix2= w.getDocumentRegionOffset(); - - int viewPosition= realToVirtualPosition(w, ix-ix2); - - scrollVertical(viewPosition, viewPosition, viewPosition, w); // scroll all but the given views - - if (fVScrollBar != null) { - int value= Math.max(0, Math.min(viewPosition, getVirtualHeight() - getViewportHeight())); - fVScrollBar.setSelection(value); - //refreshBirdEyeView(); - } - } - - /** - */ - private void updateVScrollBar() { - - if (Utilities.okToUse(fVScrollBar) && fSynchronizedScrolling) { - int virtualHeight= getVirtualHeight(); - int viewPortHeight= getViewportHeight(); - int pageIncrement= viewPortHeight-1; - int thumb= (viewPortHeight > virtualHeight) ? virtualHeight : viewPortHeight; - - fVScrollBar.setPageIncrement(pageIncrement); - fVScrollBar.setMaximum(virtualHeight); - fVScrollBar.setThumb(thumb); - } - } - - /* - * maps given virtual position into a real view position of this view. - */ - private int virtualToRealPosition(MergeSourceViewer part, int v) { - - if (! fSynchronizedScrolling || fAllDiffs == null) - return v; - - int virtualPos= 0; - int viewPos= 0; - Point region= new Point(0, 0); - - Iterator e= fAllDiffs.iterator(); - while (e.hasNext()) { - Diff diff= (Diff) e.next(); - Position pos= diff.getPosition(part); - int viewHeight= part.getLineRange(pos, region).y; - int virtualHeight= diff.getMaxDiffHeight(fShowAncestor); - if (v < (virtualPos + virtualHeight)) { - v-= virtualPos; // make relative to this slot - if (viewHeight <= 0) { - v= 0; - } else { - v= (v*viewHeight)/virtualHeight; - } - return viewPos+v; - } - virtualPos+= virtualHeight; - viewPos+= viewHeight; - } - return viewPos; - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewerResources.properties b/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewerResources.properties deleted file mode 100644 index e9ea13317..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewerResources.properties +++ /dev/null @@ -1,98 +0,0 @@ -############################################################################### -# Copyright (c) 2000, 2004 IBM Corporation and others. -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Common Public License v1.0 -# which accompanies this distribution, and is available at -# http://www.eclipse.org/legal/cpl-v10.html -# -# Contributors: -# IBM Corporation - initial API and implementation -############################################################################### - -# @(#)TextMergeViewerResources.properties -# -# Resource strings for TextMergeViewer.java - -title= Text Compare - -saveDialog.title= Save Resource -saveDialog.message= Resource has been modified. Save changes? - -compareProgressTask.title= Computing Differences... - -tooComplexError.title= Error -tooComplexError.format= Too many differences. Turn on the ''Ignore White Space'' option or do a structure compare first. - -##################################################### -# Toolbar actions -##################################################### - -action.CopyLeftToRight.label=Copy Left to Right -action.CopyLeftToRight.tooltip=Copy All from Left to Right -action.CopyLeftToRight.image=copy_r_co.gif - -action.CopyRightToLeft.label=Copy Right to Left -action.CopyRightToLeft.tooltip=Copy All Non-Conflicting Changes from Right to Left -action.CopyRightToLeft.image=copy_l_co.gif - -action.CopyDiffLeftToRight.label=Copy Current Change to Right -action.CopyDiffLeftToRight.tooltip=Copy Current Change from Left to Right -action.CopyDiffLeftToRight.image=copycont_r_co.gif - -action.CopyDiffRightToLeft.label=Copy Current Change to Left -action.CopyDiffRightToLeft.tooltip=Copy Current Change from Right to Left -action.CopyDiffRightToLeft.image=copycont_l_co.gif - -action.NextDiff.label=Next -action.NextDiff.tooltip=Select Next Change -action.NextDiff.image=next_nav.gif - -action.PrevDiff.label=Previous -action.PrevDiff.tooltip=Select Previous Change -action.PrevDiff.image=prev_nav.gif - -action.EnableAncestor.label=Enable Ancestor Pane -action.EnableAncestor.tooltip.unchecked=Show Ancestor Pane -action.EnableAncestor.tooltip.checked=Hide Ancestor Pane -action.EnableAncestor.description.unchecked=Show Ancestor Pane -action.EnableAncestor.description.checked=Hide Ancestor Pane -action.EnableAncestor.image=ancestorpane_co.gif - -action.IgnoreAncestor.label=Ignore Ancestor -action.IgnoreAncestor.tooltip.unchecked=Two-Way Compare (Ignore Ancestor) -action.IgnoreAncestor.tooltip.checked=Three-Way Compare -action.IgnoreAncestor.description.unchecked=Two-Way Compare (Ignore Ancestor) -action.IgnoreAncestor.description.checked=Three-Way Compare -action.IgnoreAncestor.image=twowaycompare_co.gif - - -##################################################### -# Context menu actions -##################################################### - -action.undo.label=Undo@Ctrl+Z -action.undo.tooltip=Undo Last Operation - -action.redo.label=Redo@Ctrl+Y -action.redo.tooltip=Redo Last Operation - -action.cut.label=Cut@Ctrl+X -action.cut.tooltip=Cut Text Selection to Clipboard - -action.copy.label=Copy@Ctrl+C -action.copy.tooltip=Copy Text Selection to Clipboard - -action.paste.label=Paste@Ctrl+V -action.paste.tooltip=Replace Text Selection with Clipboard Contents - -action.delete.label=Delete -action.delete.tooltip=Delete Current Text Selection - -action.find.label=Find...@Ctrl+F -action.find.tooltip=Find Occurrence - -action.selectAll.label=Select All@Ctrl+A -action.selectAll.tooltip=Select All Changes - -action.save.label=Save@Ctrl+S -action.save.tooltip=Save Changes diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/package.html b/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/package.html deleted file mode 100644 index 9f606fb95..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/package.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - Package-level Javadoc - - -Support for compare and merge viewers which show the -content side-by-side. -

-Package Specification

- -The ContentMergeViewer is an abstract compare and merge viewer -with two side-by-side content areas and an optional content area for a -common ancestor (for three-way compare). Because the implementation makes -no assumptions about the content type it is a subclass responsibility to -deal with a specific type. Its subclass ImageMergeViewer in -package org.eclipse.compare.internal shows how to base a simple -mergeviewer for images on ContentMergeViewer. -

- -A ContentMergeViewer accesses its model by means of a content -provider which must implement the IMergeViewerContentProvider interface. -

- -The TextMergeViewer is the standard concrete subclass of -ContentMergeViewer for comparing and merging text content. -
-A text merge viewer uses the org.eclipse.compare.rangedifferencer.RangeDifferencer -to perform a textual, line-by-line comparison of two (or three) input documents. -For text lines that differ the TextMergeViewer uses an ITokenComparator -to find longest sequences of matching and non-matching tokens. -The TextMergeViewer's -default token compare works on characters separated by whitespace. If a -different strategy is needed (for example, Java tokens in a Java-aware -merge viewer), clients can create their own token comparators by implementing -the ITokenComparator interface. -

The TextMergeViewer not only works on whole documents but on -subranges of documents too. In this case the viewer's input must be an -IDocumentRange instead of an IDocument. - - - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/AbstractViewer.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/AbstractViewer.java deleted file mode 100644 index 84e8f945c..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/AbstractViewer.java +++ /dev/null @@ -1,38 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.Viewer; - - -public abstract class AbstractViewer extends Viewer { - - public void setInput(Object input) { - // empty default implementation - } - - public Object getInput() { - return null; - } - - public ISelection getSelection() { - return null; - } - - public void setSelection(ISelection s, boolean reveal) { - // empty default implementation - } - - public void refresh() { - // empty default implementation - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryAction.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryAction.java deleted file mode 100644 index 6708a0f69..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryAction.java +++ /dev/null @@ -1,139 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.util.ResourceBundle; -import java.lang.reflect.InvocationTargetException; - -import org.eclipse.swt.widgets.Shell; - -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.dialogs.ProgressMonitorDialog; -import org.eclipse.jface.viewers.ISelection; - -import org.eclipse.ui.actions.WorkspaceModifyOperation; -import org.eclipse.core.resources.*; -import org.eclipse.core.runtime.*; - - -public class AddFromHistoryAction extends BaseCompareAction { - - private static final String BUNDLE_NAME= "org.eclipse.compare.internal.AddFromHistoryAction"; //$NON-NLS-1$ - - public AddFromHistoryAction() { - // empty default implementation - } - - protected boolean isEnabled(ISelection selection) { - return Utilities.getResources(selection).length == 1; - } - - protected void run(ISelection selection) { - - ResourceBundle bundle= ResourceBundle.getBundle(BUNDLE_NAME); - String title= Utilities.getString(bundle, "title"); //$NON-NLS-1$ - - Shell parentShell= CompareUIPlugin.getShell(); - AddFromHistoryDialog dialog= null; - - Object[] s= Utilities.getResources(selection); - - for (int i= 0; i < s.length; i++) { - Object o= s[i]; - if (o instanceof IContainer) { - IContainer container= (IContainer) o; - - ProgressMonitorDialog pmdialog= new ProgressMonitorDialog(parentShell); - IProgressMonitor pm= pmdialog.getProgressMonitor(); - IFile[] states= null; - try { - states= container.findDeletedMembersWithHistory(IResource.DEPTH_INFINITE, pm); - } catch (CoreException ex) { - pm.done(); - } - - if (states == null || states.length <= 0) { - String msg= Utilities.getString(bundle, "noLocalHistoryError"); //$NON-NLS-1$ - MessageDialog.openInformation(parentShell, title, msg); - return; - } - - if (dialog == null) { - dialog= new AddFromHistoryDialog(parentShell, bundle); - dialog.setHelpContextId(ICompareContextIds.ADD_FROM_HISTORY_DIALOG); - } - - if (dialog.select(container, states)) { - - AddFromHistoryDialog.HistoryInput[] selected= dialog.getSelected(); - - if (selected != null && selected.length > 0) { - try { - updateWorkspace(bundle, parentShell, selected); - - } catch (InterruptedException x) { - // Do nothing. Operation has been canceled by user. - - } catch (InvocationTargetException x) { - String reason= x.getTargetException().getMessage(); - MessageDialog.openError(parentShell, title, Utilities.getFormattedString(bundle, "replaceError", reason)); //$NON-NLS-1$ - } - } - } - } - } - } - - void createContainers(IResource resource) throws CoreException { - IContainer container= resource.getParent(); - if (container instanceof IFolder) { - IFolder parent= (IFolder) container; - if (parent != null && !parent.exists()) { - createContainers(parent); - parent.create(false, true, null); - } - } - } - - private void updateWorkspace(final ResourceBundle bundle, Shell shell, - final AddFromHistoryDialog.HistoryInput[] selected) - throws InvocationTargetException, InterruptedException { - - WorkspaceModifyOperation operation= new WorkspaceModifyOperation() { - public void execute(IProgressMonitor pm) throws InvocationTargetException { - try { - String taskName= Utilities.getString(bundle, "taskName"); //$NON-NLS-1$ - pm.beginTask(taskName, selected.length); - - for (int i= 0; i < selected.length; i++) { - IFile file= selected[i].fFile; - IFileState fileState= selected[i].fFileState; - createContainers(file); - - SubProgressMonitor subMonitor= new SubProgressMonitor(pm, 1); - try { - file.create(fileState.getContents(), false, subMonitor); - } finally { - subMonitor.done(); - } - } - } catch (CoreException e) { - throw new InvocationTargetException(e); - } finally { - pm.done(); - } - } - }; - - ProgressMonitorDialog pmdialog= new ProgressMonitorDialog(shell); - pmdialog.run(false, true, operation); - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryAction.properties b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryAction.properties deleted file mode 100644 index 2b5c046ea..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryAction.properties +++ /dev/null @@ -1,45 +0,0 @@ -############################################################################### -# Copyright (c) 2000, 2004 IBM Corporation and others. -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Common Public License v1.0 -# which accompanies this distribution, and is available at -# http://www.eclipse.org/legal/cpl-v10.html -# -# Contributors: -# IBM Corporation - initial API and implementation -############################################################################### - -# @(#)AddFromHistoryAction.properties -# -# Resources for AddFromHistoryAction.java - -title= Restore from Local History - -memberPaneTitle= {0} - Available Files in Local History: - -treeTitleFormat= Local History of ''{0}'' -dateIcon= obj16/day_obj.gif -timeIcon= obj16/resource_obj.gif - -memberDescription= Check files to restore from local history: -editionDescription= Select an edition of a file: - -treeFormat= {0} -workspaceTreeFormat= {0} (Workspace File) -parseErrorFormat= {0} (Parse Error) - -editionLabel= Local History ({0}) -workspaceEditionLabel= Workspace File - -targetLabel= {0} - -todayFormat= Today ({0}) -yesterdayFormat= Yesterday ({0}) -dayFormat= {0} - -buttonLabel= Restore - -noLocalHistoryError= No deleted resources in local history for selected container. -replaceError=Cannot replace resource (reason: {0}). - -taskName=Restoring diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryDialog.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryDialog.java deleted file mode 100644 index 642c682f3..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/AddFromHistoryDialog.java +++ /dev/null @@ -1,475 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.io.*; -import java.text.*; -import java.util.*; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.layout.*; -import org.eclipse.swt.widgets.*; - -import org.eclipse.jface.dialogs.*; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.viewers.Viewer; - -import org.eclipse.core.resources.*; -import org.eclipse.core.runtime.*; - -import org.eclipse.compare.*; - - -public class AddFromHistoryDialog extends ResizableDialog { - - static class HistoryInput implements ITypedElement, IEncodedStreamContentAccessor, IModificationDate { - IFile fFile; - IFileState fFileState; - - HistoryInput(IFile file, IFileState fileState) { - fFile= file; - fFileState= fileState; - } - public InputStream getContents() throws CoreException { - return new BufferedInputStream(fFileState.getContents()); - } - public String getCharset() { - String charset= null; - try { - charset= fFileState.getCharset(); - } catch (CoreException e) { - // fall through - } - if (charset == null) - charset= Utilities.getCharset(fFile); - return charset; - } - public String getName() { - return fFile.getName(); - } - public String getType() { - return fFile.getFileExtension(); - } - public Image getImage() { - return CompareUI.getImage(fFile); - } - public long getModificationDate() { - return fFileState.getModificationTime(); - } - } - - static class FileHistory { - private IFile fFile; - private IFileState[] fStates; - private int fSelected; - - FileHistory(IFile file) { - fFile= file; - } - - IFile getFile() { - return fFile; - } - - IFileState[] getStates() { - if (fStates == null) { - try { - fStates= fFile.getHistory(new NullProgressMonitor()); - } catch (CoreException ex) { - // NeedWork - } - } - return fStates; - } - - IFileState getSelectedState() { - return getStates()[fSelected]; - } - - void setSelected(IFileState state) { - for (int i= 0; i < fStates.length; i++) { - if (fStates[i] == state) { - fSelected= i; - return; - } - } - } - - HistoryInput getHistoryInput() { - return new HistoryInput(fFile, getSelectedState()); - } - - boolean isSelected(int index) { - return index == fSelected; - } - } - - private CompareConfiguration fCompareConfiguration; - private ArrayList fArrayList= new ArrayList(); - private FileHistory fCurrentFileHistory; - - // SWT controls - private CompareViewerSwitchingPane fContentPane; - private Button fCommitButton; - private Table fMemberTable; - private CompareViewerPane fMemberPane; - private Tree fEditionTree; - private CompareViewerPane fEditionPane; - private Image fDateImage; - private Image fTimeImage; - - - public AddFromHistoryDialog(Shell parent, ResourceBundle bundle) { - super(parent, bundle); - - String iconName= Utilities.getString(fBundle, "dateIcon", "obj16/day_obj.gif"); //$NON-NLS-2$ //$NON-NLS-1$ - ImageDescriptor id= CompareUIPlugin.getImageDescriptor(iconName); - if (id != null) - fDateImage= id.createImage(); - iconName= Utilities.getString(fBundle, "timeIcon", "obj16/resource_obj.gif"); //$NON-NLS-1$ //$NON-NLS-2$ - id= CompareUIPlugin.getImageDescriptor(iconName); - if (id != null) - fTimeImage= id.createImage(); - } - - public boolean select(IContainer root, IFile[] inputFiles) { - - create(); // create widgets - - String format= Utilities.getString(fBundle, "memberPaneTitle"); //$NON-NLS-1$ - String title= MessageFormat.format(format, new Object[] { root.getName() }); - fMemberPane.setImage(CompareUI.getImage(root)); - fMemberPane.setText(title); - - // sort input files - final int count= inputFiles.length; - final IFile[] files= new IFile[count]; - for (int i= 0; i < count; i++) - files[i]= inputFiles[i]; - if (count > 1) - internalSort(files, 0, count-1); - - - String prefix= root.getFullPath().toString(); - - if (fMemberTable != null && !fMemberTable.isDisposed()) { - for (int i= 0; i < files.length; i++) { - IFile file= files[i]; - String path= file.getFullPath().toString(); - if (path.startsWith(prefix)) - path= path.substring(prefix.length()+1); - TableItem ti= new TableItem(fMemberTable, SWT.NONE); - ti.setImage(CompareUI.getImage(file)); - ti.setText(path); - ti.setData(new FileHistory(file)); - } - } - - open(); - - return (getReturnCode() == OK) && (fArrayList.size() > 0); - } - - HistoryInput[] getSelected() { - HistoryInput[] selected= new HistoryInput[fArrayList.size()]; - Iterator iter= fArrayList.iterator(); - for (int i= 0; iter.hasNext(); i++) { - FileHistory h= (FileHistory) iter.next(); - selected[i]= h.getHistoryInput(); - } - return selected; - } - - protected synchronized Control createDialogArea(Composite parent2) { - - Composite parent= (Composite) super.createDialogArea(parent2); - - getShell().setText(Utilities.getString(fBundle, "title")); //$NON-NLS-1$ - - org.eclipse.compare.Splitter vsplitter= new org.eclipse.compare.Splitter(parent, SWT.VERTICAL); - vsplitter.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL - | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_VERTICAL)); - - vsplitter.addDisposeListener( - new DisposeListener() { - public void widgetDisposed(DisposeEvent e) { - if (fDateImage != null) - fDateImage.dispose(); - if (fTimeImage != null) - fTimeImage.dispose(); - } - } - ); - - // we need two panes: the left for the elements, the right one for the editions - Splitter hsplitter= new Splitter(vsplitter, SWT.HORIZONTAL); - - Composite c= new Composite(hsplitter, SWT.NONE); - GridLayout layout= new GridLayout(); - layout.marginWidth= 0; - layout.marginHeight= 2; - layout.verticalSpacing= 2; - layout.numColumns= 1; - c.setLayout(layout); - Label l1= new Label(c, SWT.NONE); - l1.setText(Utilities.getString(fBundle, "memberDescription")); //$NON-NLS-1$ - fMemberPane= new CompareViewerPane(c, SWT.BORDER | SWT.FLAT); - GridData gd= new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL); - fMemberPane.setLayoutData(gd); - - fMemberTable= new Table(fMemberPane, SWT.CHECK | SWT.H_SCROLL | SWT.V_SCROLL); - fMemberTable.addSelectionListener( - new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - if (e.detail == SWT.CHECK) { - if (e.item instanceof TableItem) { - TableItem ti= (TableItem) e.item; - if (ti.getChecked()) - fArrayList.add(ti.getData()); - else - fArrayList.remove(ti.getData()); - - if (fCommitButton != null) - fCommitButton.setEnabled(fArrayList.size() > 0); - } - } else { - handleMemberSelect(e.item); - } - } - } - ); - - fMemberPane.setContent(fMemberTable); - - c= new Composite(hsplitter, SWT.NONE); - layout= new GridLayout(); - layout.marginWidth= 0; - layout.marginHeight= 2; - layout.verticalSpacing= 2; - layout.numColumns= 1; - c.setLayout(layout); - Label l2= new Label(c, SWT.NONE); - l2.setText(Utilities.getString(fBundle, "editionDescription")); //$NON-NLS-1$ - fEditionPane= new CompareViewerPane(c, SWT.BORDER | SWT.FLAT); - gd= new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL); - fEditionPane.setLayoutData(gd); - - fEditionTree= new Tree(fEditionPane, SWT.H_SCROLL | SWT.V_SCROLL); - fEditionTree.addSelectionListener( - new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - feedContent(e.item); - } - } - ); - fEditionPane.setContent(fEditionTree); - - applyDialogFont(parent); // to avoid applying font to compare viewer - fContentPane= new CompareViewerSwitchingPane(vsplitter, SWT.BORDER | SWT.FLAT) { - protected Viewer getViewer(Viewer oldViewer, Object input) { - return CompareUI.findContentViewer(oldViewer, input, this, fCompareConfiguration); - } - }; - vsplitter.setWeights(new int[] { 30, 70 }); - - return parent; - } - - /* - * Feeds selection from member viewer to edition viewer. - */ - private void handleMemberSelect(Widget w) { - Object data= null; - if (w != null) - data= w.getData(); - if (data instanceof FileHistory) { - - FileHistory h= (FileHistory) data; - fCurrentFileHistory= h; - - IFile file= h.getFile(); - IFileState[] states= h.getStates(); - - fEditionPane.setImage(CompareUI.getImage(file)); - String pattern= Utilities.getString(fBundle, "treeTitleFormat"); //$NON-NLS-1$ - String title= MessageFormat.format(pattern, new Object[] { file.getName() }); - fEditionPane.setText(title); - - if (fEditionTree != null) { - fEditionTree.setRedraw(false); - fEditionTree.removeAll(); - for (int i= 0; i < states.length; i++) { - addEdition(new HistoryInput(file, states[i]), h.isSelected(i)); - } - fEditionTree.setRedraw(true); - } - } else - fCurrentFileHistory= null; - } - - /* - * Adds the given Pair to the edition tree. - * It takes care of creating tree nodes for different dates. - */ - private void addEdition(HistoryInput input, boolean isSelected) { - if (fEditionTree == null || fEditionTree.isDisposed()) - return; - - IFileState state= input.fFileState; - - // find last day - TreeItem[] days= fEditionTree.getItems(); - TreeItem lastDay= null; - if (days.length > 0) - lastDay= days[days.length-1]; - - long ldate= state.getModificationTime(); - long day= dayNumber(ldate); - Date date= new Date(ldate); - if (lastDay == null || day != dayNumber(((Date)lastDay.getData()).getTime())) { - lastDay= new TreeItem(fEditionTree, SWT.NONE); - lastDay.setImage(fDateImage); - String df= DateFormat.getDateInstance().format(date); - long today= dayNumber(System.currentTimeMillis()); - - String formatKey; - if (day == today) - formatKey= "todayFormat"; //$NON-NLS-1$ - else if (day == today-1) - formatKey= "yesterdayFormat"; //$NON-NLS-1$ - else - formatKey= "dayFormat"; //$NON-NLS-1$ - String pattern= Utilities.getString(fBundle, formatKey); - if (pattern != null) - df= MessageFormat.format(pattern, new String[] { df }); - lastDay.setText(df); - lastDay.setData(date); - } - TreeItem ti= new TreeItem(lastDay, SWT.NONE); - ti.setImage(fTimeImage); - ti.setText(DateFormat.getTimeInstance().format(date)); - ti.setData(input); - - if (isSelected) { - lastDay.setExpanded(true); - fEditionTree.setSelection(new TreeItem[] { ti }); - feedContent(ti); - } - } - - /* - * Returns the number of s since Jan 1st, 1970. - * The given date is converted to GMT and daylight saving is taken into account too. - */ - private long dayNumber(long date) { - int ONE_DAY_MS= 24*60*60 * 1000; // one day in milli seconds - - Calendar calendar= Calendar.getInstance(); - long localTimeOffset= calendar.get(Calendar.ZONE_OFFSET) + calendar.get(Calendar.DST_OFFSET); - - return (date + localTimeOffset) / ONE_DAY_MS; - } - - /* - * Feeds the tree viewer's selection to the contentviewer - */ - private void feedContent(Widget w) { - if (fContentPane != null && !fContentPane.isDisposed()) { - Object o= w.getData(); - if (o instanceof HistoryInput) { - HistoryInput selected= (HistoryInput) o; - fContentPane.setInput(selected); - fContentPane.setText(getEditionLabel(selected)); - fContentPane.setImage(fTimeImage); - - if (fCurrentFileHistory != null) - fCurrentFileHistory.setSelected(selected.fFileState); - } else { - fContentPane.setInput(null); - } - } - } - - protected String getEditionLabel(HistoryInput input) { - String format= Utilities.getString(fBundle, "historyEditionLabel", null); //$NON-NLS-1$ - if (format == null) - format= Utilities.getString(fBundle, "editionLabel"); //$NON-NLS-1$ - if (format == null) - format= "x{0}"; //$NON-NLS-1$ - - long modDate= input.getModificationDate(); - String date= DateFormat.getDateTimeInstance().format(new Date(modDate)); - - return MessageFormat.format(format, new Object[] { date }); - } - - /* (non-Javadoc) - * Method declared on Dialog. - */ - protected void createButtonsForButtonBar(Composite parent) { - String buttonLabel= Utilities.getString(fBundle, "buttonLabel", IDialogConstants.OK_LABEL); //$NON-NLS-1$ - // a 'Cancel' and a 'Add' button - fCommitButton= createButton(parent, IDialogConstants.OK_ID, buttonLabel, true); - fCommitButton.setEnabled(false); - createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); - } - - /* - * Returns true if the pathname of f1 comes after f2 - */ - private static boolean greaterThan(IFile f1, IFile f2) { - String[] ss1= f1.getFullPath().segments(); - String[] ss2= f2.getFullPath().segments(); - int l1= ss1.length; - int l2= ss2.length; - int n= Math.max(l1, l2); - - for (int i= 0; i < n; i++) { - String s1= i < l1 ? ss1[i] : ""; //$NON-NLS-1$ - String s2= i < l2 ? ss2[i] : ""; //$NON-NLS-1$ - int rc= s1.compareToIgnoreCase(s2); - if (rc != 0) - return rc < 0; - } - return false; - } - - private static void internalSort(IFile[] keys, int left, int right) { - - int original_left= left; - int original_right= right; - - IFile mid= keys[(left + right) / 2]; - do { - while (greaterThan(keys[left], mid)) - left++; - - while (greaterThan(mid, keys[right])) - right--; - - if (left <= right) { - IFile tmp= keys[left]; - keys[left]= keys[right]; - keys[right]= tmp; - left++; - right--; - } - } while (left <= right); - - if (original_left < right) - internalSort(keys, original_left, right); - - if (left < original_right) - internalSort(keys, left, original_right); - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BaseCompareAction.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BaseCompareAction.java deleted file mode 100644 index 7771b93d3..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BaseCompareAction.java +++ /dev/null @@ -1,43 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.jface.action.IAction; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.ui.IActionDelegate; - - -public abstract class BaseCompareAction implements IActionDelegate { - - private ISelection fSelection; - - /* (non-Javadoc) - * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction) - */ - final public void run(IAction action) { - run(fSelection); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection) - */ - final public void selectionChanged(IAction action, ISelection selection) { - fSelection= selection; - if (action != null) - action.setEnabled(isEnabled(fSelection)); - } - - protected boolean isEnabled(ISelection selection) { - return false; - } - - abstract protected void run(ISelection selection); -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewer.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewer.java deleted file mode 100644 index 708bd181e..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewer.java +++ /dev/null @@ -1,117 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.io.*; -import java.util.ResourceBundle; -import java.text.MessageFormat; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.*; -import org.eclipse.ui.help.WorkbenchHelp; - -import org.eclipse.core.runtime.CoreException; -import org.eclipse.compare.*; -import org.eclipse.compare.structuremergeviewer.ICompareInput; - -/** - * A simple compare viewer for binary files. - * Shows the position of the first non-matching byte. - */ -public class BinaryCompareViewer extends AbstractViewer { - - private static final String BUNDLE_NAME= "org.eclipse.compare.internal.BinaryCompareViewerResources"; //$NON-NLS-1$ - - private static final int EOF= -1; - private Label fControl; - private ICompareInput fInput; - private ResourceBundle fBundle; - private boolean fLeftIsLocal; - - - public BinaryCompareViewer(Composite parent, CompareConfiguration cc) { - - WorkbenchHelp.setHelp(parent, ICompareContextIds.BINARY_COMPARE_VIEW); - - fBundle= ResourceBundle.getBundle(BUNDLE_NAME); - - fControl= new Label(parent, SWT.WRAP); - fControl.setData(CompareUI.COMPARE_VIEWER_TITLE, Utilities.getString(fBundle, "title")); //$NON-NLS-1$ - - fLeftIsLocal= Utilities.getBoolean(cc, "LEFT_IS_LOCAL", false); //$NON-NLS-1$ - } - - public Control getControl() { - return fControl; - } - - public void setInput(Object input) { - if (fControl != null && input instanceof ICompareInput) { - fInput= (ICompareInput) input; - - InputStream left= null; - InputStream right= null; - - String message= null; - try { - left= getStream(fInput.getLeft()); - right= getStream(fInput.getRight()); - - if (left != null && right != null) { - int pos= 0; - while (true) { - int l= left.read(); - int r= right.read(); - if (l != r) { - String format= Utilities.getString(fBundle, "diffMessageFormat"); //$NON-NLS-1$ - message= MessageFormat.format(format, new String[] { Integer.toString(pos) } ); - break; - } - if (l == EOF) - break; - pos++; - } - } else if (left == null && right == null) { - message= Utilities.getString(fBundle, "deleteConflictMessage"); //$NON-NLS-1$ - } else if (left == null) { - if (fLeftIsLocal) - message= Utilities.getString(fBundle, "deletedMessage"); //$NON-NLS-1$ - else - message= Utilities.getString(fBundle, "addedMessage"); //$NON-NLS-1$ - } else if (right == null) { - if (fLeftIsLocal) - message= Utilities.getString(fBundle, "addedMessage"); //$NON-NLS-1$ - else - message= Utilities.getString(fBundle, "deletedMessage"); //$NON-NLS-1$ - } - } catch (CoreException ex) { - message= Utilities.getString(fBundle, "errorMessage"); //$NON-NLS-1$ - } catch (IOException ex) { - message= Utilities.getString(fBundle, "errorMessage"); //$NON-NLS-1$ - } finally { - Utilities.close(left); - Utilities.close(right); - } - if (message != null) - fControl.setText(message); - } - } - - public Object getInput() { - return fInput; - } - - private InputStream getStream(ITypedElement input) throws CoreException { - if (input instanceof IStreamContentAccessor) - return ((IStreamContentAccessor)input).getContents(); - return null; - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewerCreator.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewerCreator.java deleted file mode 100644 index 8c98ec6ff..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewerCreator.java +++ /dev/null @@ -1,29 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.swt.widgets.Composite; -import org.eclipse.jface.viewers.Viewer; - -import org.eclipse.compare.*; - -/** - * A factory object for the BinaryCompareViewer. - * This indirection is necessary because only objects with a default - * constructor can be created via an extension point - * (this precludes Viewers). - */ -public class BinaryCompareViewerCreator implements IViewerCreator { - - public Viewer createViewer(Composite parent, CompareConfiguration mp) { - return new BinaryCompareViewer(parent, mp); - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewerResources.properties b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewerResources.properties deleted file mode 100644 index dbfc7d70e..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BinaryCompareViewerResources.properties +++ /dev/null @@ -1,22 +0,0 @@ -############################################################################### -# Copyright (c) 2000, 2003 IBM Corporation and others. -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Common Public License v1.0 -# which accompanies this distribution, and is available at -# http://www.eclipse.org/legal/cpl-v10.html -# -# Contributors: -# IBM Corporation - initial API and implementation -############################################################################### - -# @(#)BinaryCompareViewerResources.properties -# -# Resource strings for BinaryCompareViewer.java - -title= Binary Compare - -diffMessageFormat= First bytes differ at position {0} -deleteConflictMessage= Delete Conflict -addedMessage= Added Resource -deletedMessage= Removed Resource -errorMessage= Internal Error diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BufferedCanvas.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BufferedCanvas.java deleted file mode 100644 index 3e20f3d67..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BufferedCanvas.java +++ /dev/null @@ -1,98 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.swt.*; -import org.eclipse.swt.widgets.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.events.*; - -/** - * A Canvas which reduces flicker by drawing in an off screen buffer. - */ -public abstract class BufferedCanvas extends Canvas { - - //private static final boolean USE_DOUBLE_BUFFER= !"carbon".equals(SWT.getPlatform()); //$NON-NLS-1$ - private static final boolean USE_DOUBLE_BUFFER= true; - - /** The drawable for double buffering */ - Image fBuffer; - - public BufferedCanvas(Composite parent, int flags) { - super(parent, flags + SWT.NO_BACKGROUND); - - addPaintListener( - new PaintListener() { - public void paintControl(PaintEvent event) { - doubleBufferPaint(event.gc); - } - } - ); - - addDisposeListener( - new DisposeListener() { - public void widgetDisposed(DisposeEvent e) { - if (fBuffer != null) { - fBuffer.dispose(); - fBuffer= null; - } - } - } - ); - } - - public void repaint() { - if (!isDisposed()) { - GC gc= new GC(this); - doubleBufferPaint(gc); - gc.dispose(); - } - } - - /* - * Double buffer drawing. - */ - void doubleBufferPaint(GC dest) { - - if (!USE_DOUBLE_BUFFER) { - doPaint(dest); - return; - } - - Point size= getSize(); - - if (size.x <= 1 || size.y <= 1) // we test for <= 1 because on X11 controls have initial size 1,1 - return; - - if (fBuffer != null) { - Rectangle r= fBuffer.getBounds(); - if (r.width != size.x || r.height != size.y) { - fBuffer.dispose(); - fBuffer= null; - } - } - if (fBuffer == null) - fBuffer= new Image(getDisplay(), size.x, size.y); - - GC gc= new GC(fBuffer); - try { - gc.setBackground(getBackground()); - gc.fillRectangle(0, 0, size.x, size.y); - doPaint(gc); - } finally { - gc.dispose(); - } - - dest.drawImage(fBuffer, 0, 0); - } - - abstract public void doPaint(GC gc); -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BufferedResourceNode.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BufferedResourceNode.java deleted file mode 100644 index 4ab61058b..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/BufferedResourceNode.java +++ /dev/null @@ -1,128 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.io.*; - -import org.eclipse.core.resources.*; -import org.eclipse.core.runtime.*; -import org.eclipse.compare.*; -import org.eclipse.compare.structuremergeviewer.IStructureComparator; - -/** - * A buffer for a workspace resource. - */ -public class BufferedResourceNode extends ResourceNode { - - private boolean fDirty= false; - private IFile fDeleteFile; - - /** - * Creates a ResourceNode for the given resource. - * - * @param resource the resource - */ - public BufferedResourceNode(IResource resource) { - super(resource); - } - - /* - * Returns true if buffer contains uncommitted changes. - */ - public boolean isDirty() { - return fDirty; - } - - protected IStructureComparator createChild(IResource child) { - return new BufferedResourceNode(child); - } - - public void setContent(byte[] contents) { - fDirty= true; - super.setContent(contents); - } - - /* - * Commits buffered contents to resource. - */ - public void commit(IProgressMonitor pm) throws CoreException { - if (fDirty) { - - if (fDeleteFile != null) { - fDeleteFile.delete(true, true, pm); - return; - } - - IResource resource= getResource(); - if (resource instanceof IFile) { - - byte[] bytes= getContent(); - ByteArrayInputStream is= new ByteArrayInputStream(bytes); - try { - IFile file= (IFile) resource; - if (file.exists()) - file.setContents(is, false, true, pm); - else - file.create(is, false, pm); - fDirty= false; - } finally { - if (is != null) - try { - is.close(); - } catch(IOException ex) { - // Silently ignored - } - } - } - } - } - - public ITypedElement replace(ITypedElement child, ITypedElement other) { - - if (child == null) { // add resource - // create a node without a resource behind it! - IResource resource= getResource(); - if (resource instanceof IFolder) { - IFolder folder= (IFolder) resource; - IFile file= folder.getFile(other.getName()); - child= new BufferedResourceNode(file); - } - } - - if (other == null) { // delete resource - IResource resource= getResource(); - if (resource instanceof IFolder) { - IFolder folder= (IFolder) resource; - IFile file= folder.getFile(child.getName()); - if (file != null && file.exists()) { - fDeleteFile= file; - fDirty= true; - } - } - return null; - } - - if (other instanceof IStreamContentAccessor && child instanceof IEditableContent) { - IEditableContent dst= (IEditableContent) child; - - try { - InputStream is= ((IStreamContentAccessor)other).getContents(); - byte[] bytes= Utilities.readBytes(is); - if (bytes != null) - dst.setContent(bytes); - } catch (CoreException ex) { - // NeedWork - } - } - return child; - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ChangePropertyAction.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ChangePropertyAction.java deleted file mode 100644 index 824ed3e1c..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ChangePropertyAction.java +++ /dev/null @@ -1,53 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.util.ResourceBundle; - -import org.eclipse.jface.action.Action; -import org.eclipse.compare.CompareConfiguration; - -/** - * Toggles a boolean property of an ICompareConfiguration. - */ -public class ChangePropertyAction extends Action { - - private CompareConfiguration fCompareConfiguration; - private String fPropertyKey; - private ResourceBundle fBundle; - private String fPrefix; - - - public ChangePropertyAction(ResourceBundle bundle, CompareConfiguration cc, String rkey, String pkey) { - fPropertyKey= pkey; - fBundle= bundle; - fPrefix= rkey; - Utilities.initAction(this, fBundle, fPrefix); - setCompareConfiguration(cc); - } - - public void run() { - boolean b= !Utilities.getBoolean(fCompareConfiguration, fPropertyKey, false); - setChecked(b); - if (fCompareConfiguration != null) - fCompareConfiguration.setProperty(fPropertyKey, new Boolean(b)); - } - - public void setChecked(boolean state) { - super.setChecked(state); - Utilities.initToggleAction(this, fBundle, fPrefix, state); - } - - public void setCompareConfiguration(CompareConfiguration cc) { - fCompareConfiguration= cc; - setChecked(Utilities.getBoolean(fCompareConfiguration, fPropertyKey, false)); - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareAction.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareAction.java deleted file mode 100644 index 7495c6158..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareAction.java +++ /dev/null @@ -1,59 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.jface.action.IAction; -import org.eclipse.jface.viewers.ISelection; - -import org.eclipse.ui.IObjectActionDelegate; -import org.eclipse.ui.IWorkbenchPage; -import org.eclipse.ui.IWorkbenchPart; -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.CompareUI; - - -/* - * The "Compare with each other" action - */ -public class CompareAction extends BaseCompareAction implements IObjectActionDelegate { - - private ResourceCompareInput fInput; - private IWorkbenchPage fWorkbenchPage; - - - public void run(ISelection selection) { - if (fInput != null) { - fInput.setSelection(selection); - fInput.initializeCompareConfiguration(); - CompareUI.openCompareEditorOnPage(fInput, fWorkbenchPage); - fInput= null; // don't reuse this input! - } - } - - protected boolean isEnabled(ISelection selection) { - if (fInput == null) { - CompareConfiguration cc= new CompareConfiguration(); - // buffered merge mode: don't ask for confirmation - // when switching between modified resources - cc.setProperty(CompareEditor.CONFIRM_SAVE_PROPERTY, new Boolean(false)); - - // uncomment following line to have separate outline view - //cc.setProperty(CompareConfiguration.USE_OUTLINE_VIEW, new Boolean(true)); - - fInput= new ResourceCompareInput(cc); - } - return fInput.isEnabled(selection); - } - - public void setActivePart(IAction action, IWorkbenchPart targetPart) { - fWorkbenchPage= targetPart.getSite().getPage(); - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareDialog.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareDialog.java deleted file mode 100644 index 3116aca44..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareDialog.java +++ /dev/null @@ -1,124 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.lang.reflect.InvocationTargetException; - -import org.eclipse.compare.CompareEditorInput; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.OperationCanceledException; - -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.dialogs.ProgressMonitorDialog; -import org.eclipse.jface.util.Assert; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; - -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Shell; - -import org.eclipse.ui.actions.WorkspaceModifyOperation; - - -public class CompareDialog extends ResizableDialog implements IPropertyChangeListener { - - private CompareEditorInput fCompareEditorInput; - private Button fCommitButton; - - - CompareDialog(Shell shell, CompareEditorInput input) { - super(shell, null); - - Assert.isNotNull(input); - fCompareEditorInput= input; - fCompareEditorInput.addPropertyChangeListener(this); - setHelpContextId(ICompareContextIds.COMPARE_DIALOG); - } - - public boolean close() { - if (super.close()) { - if (fCompareEditorInput != null) - fCompareEditorInput.addPropertyChangeListener(this); - return true; - } - return false; - } - - /* (non-Javadoc) - * Method declared on Dialog. - */ - protected void createButtonsForButtonBar(Composite parent) { - fCommitButton= createButton(parent, IDialogConstants.OK_ID, Utilities.getString("CompareDialog.commitAction.label"), true); //$NON-NLS-1$ - fCommitButton.setEnabled(false); - createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); - } - - public void propertyChange(PropertyChangeEvent event) { - if (fCommitButton != null && fCompareEditorInput != null) - fCommitButton.setEnabled(fCompareEditorInput.isSaveNeeded()); - } - - /* (non-Javadoc) - * Method declared on Dialog. - */ - protected Control createDialogArea(Composite parent2) { - - Composite parent= (Composite) super.createDialogArea(parent2); - - Control c= fCompareEditorInput.createContents(parent); - c.setLayoutData(new GridData(GridData.FILL_BOTH)); - - Shell shell= c.getShell(); - shell.setText(fCompareEditorInput.getTitle()); - shell.setImage(fCompareEditorInput.getTitleImage()); - applyDialogFont(parent); - return parent; - } - - /* (non-Javadoc) - * Method declared on Window. - */ - public int open() { - - int rc= super.open(); - - if (rc == OK && fCompareEditorInput.isSaveNeeded()) { - - WorkspaceModifyOperation operation= new WorkspaceModifyOperation() { - public void execute(IProgressMonitor pm) throws CoreException { - fCompareEditorInput.saveChanges(pm); - } - }; - - Shell shell= getParentShell(); - ProgressMonitorDialog pmd= new ProgressMonitorDialog(shell); - try { - operation.run(pmd.getProgressMonitor()); - - } catch (InterruptedException x) { - // NeedWork - } catch (OperationCanceledException x) { - // NeedWork - } catch (InvocationTargetException x) { - String title= Utilities.getString("CompareDialog.saveErrorTitle"); //$NON-NLS-1$ - String msg= Utilities.getString("CompareDialog.saveErrorMessage"); //$NON-NLS-1$ - MessageDialog.openError(shell, title, msg + x.getTargetException().getMessage()); - } - } - - return rc; - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditor.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditor.java deleted file mode 100644 index 9be68cb7d..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditor.java +++ /dev/null @@ -1,260 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.lang.reflect.InvocationTargetException; - -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.widgets.*; - -import org.eclipse.jface.dialogs.ErrorDialog; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.util.*; - -import org.eclipse.ui.*; -import org.eclipse.ui.actions.WorkspaceModifyOperation; -import org.eclipse.ui.help.WorkbenchHelp; -import org.eclipse.ui.part.EditorPart; -import org.eclipse.ui.views.contentoutline.IContentOutlinePage; - -import org.eclipse.core.resources.IMarker; -import org.eclipse.core.runtime.*; - -import org.eclipse.compare.*; - - -/** - * A CompareEditor takes a ICompareEditorInput as input. - * Most functionality is delegated to the ICompareEditorInput. - */ -public class CompareEditor extends EditorPart implements IReusableEditor { - - /** - * Internal property change listener for handling changes in the editor's input. - */ - class PropertyChangeListener implements IPropertyChangeListener { - /* - * @see IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent) - */ - public void propertyChange(PropertyChangeEvent event) { - CompareEditor.this.propertyChange(event); - } - } - - public final static String CONFIRM_SAVE_PROPERTY= "org.eclipse.compare.internal.CONFIRM_SAVE_PROPERTY"; //$NON-NLS-1$ - - private IActionBars fActionBars; - /** The editor's property change listener. */ - private IPropertyChangeListener fPropertyChangeListener= new PropertyChangeListener(); - /** the SWT control */ - private Control fControl; - /** the outline page */ - private CompareOutlinePage fOutlinePage; - /** enable outline */ - - - public CompareEditor() { - // empty default implementation - } - - /* (non-Javadoc) - * Method declared on IAdaptable - */ - public Object getAdapter(Class key) { - - if (key.equals(IContentOutlinePage.class)) { - Object object= getCompareConfiguration().getProperty(CompareConfiguration.USE_OUTLINE_VIEW); - if (object instanceof Boolean && ((Boolean)object).booleanValue()) { - IEditorInput input= getEditorInput(); - if (input instanceof CompareEditorInput) { - fOutlinePage= new CompareOutlinePage((CompareEditorInput) input); - return fOutlinePage; - } - } - } - return super.getAdapter(key); - } - - /* package */ CompareConfiguration getCompareConfiguration() { - IEditorInput input= getEditorInput(); - if (input instanceof CompareEditorInput) - return ((CompareEditorInput)input).getCompareConfiguration(); - return null; - } - - public void init(IEditorSite site, IEditorInput input) throws PartInitException { - - if (!(input instanceof CompareEditorInput)) - throw new PartInitException(Utilities.getString("CompareEditor.invalidInput")); //$NON-NLS-1$ - - setSite(site); - setInput(input); - } - - public void setInput(IEditorInput input) { - try { - doSetInput(input); - } catch (CoreException x) { - String title= Utilities.getString("CompareEditor.error.setinput.title"); //$NON-NLS-1$ - String msg= Utilities.getString("CompareEditor.error.setinput.message"); //$NON-NLS-1$ - ErrorDialog.openError(getSite().getShell(), title, msg, x.getStatus()); - } - } - - public void doSetInput(IEditorInput input) throws CoreException { - - if (!(input instanceof CompareEditorInput)) { - IStatus s= new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, IStatus.OK, Utilities.getString("CompareEditor.invalidInput"), null); //$NON-NLS-1$ - throw new CoreException(s); - } - - IEditorInput oldInput= getEditorInput(); - if (oldInput instanceof IPropertyChangeNotifier) - ((IPropertyChangeNotifier)input).removePropertyChangeListener(fPropertyChangeListener); - - super.setInput(input); - - CompareEditorInput cei= (CompareEditorInput) input; - - setTitleImage(cei.getTitleImage()); - setPartName(cei.getTitle()); // was setTitle(cei.getTitle()); - - if (input instanceof IPropertyChangeNotifier) - ((IPropertyChangeNotifier)input).addPropertyChangeListener(fPropertyChangeListener); - - if (oldInput != null) { - if (fControl != null && !fControl.isDisposed()) { - Point oldSize= fControl.getSize(); - Composite parent= fControl.getParent(); - fControl.dispose(); - createPartControl(parent); - if (fControl != null) - fControl.setSize(oldSize); - } - } - } - - public IActionBars getActionBars() { - return fActionBars; - } - - public void setActionBars(IActionBars actionBars) { - fActionBars= actionBars; - } - - /* - * @see IDesktopPart#createPartControl(Composite) - */ - public void createPartControl(Composite parent) { - parent.setData(this); - - IEditorInput input= getEditorInput(); - if (input instanceof CompareEditorInput) { - fControl= ((CompareEditorInput) input).createContents(parent); - WorkbenchHelp.setHelp(fControl, ICompareContextIds.COMPARE_EDITOR); - } - } - - /* - * @see DesktopPart#dispose - */ - public void dispose() { - - IEditorInput input= getEditorInput(); - if (input instanceof IPropertyChangeNotifier) - ((IPropertyChangeNotifier)input).removePropertyChangeListener(fPropertyChangeListener); - - super.dispose(); - - fPropertyChangeListener= null; - } - - /* - * @see IDesktopPart#setFocus - */ - public void setFocus() { - IEditorInput input= getEditorInput(); - if (input instanceof CompareEditorInput) - ((CompareEditorInput)input).setFocus(); - } - - /* - * @see IEditorPart#isSaveAsAllowed() - */ - public boolean isSaveAsAllowed() { - return false; - } - - public void gotoMarker(IMarker marker) { - // empty default implemenatation - } - - /** - * Always throws an AssertionFailedException. - */ - /* - * @see IEditorPart#doSaveAs() - */ - public void doSaveAs() { - Assert.isTrue(false); // Save As not supported for CompareEditor - } - - /* - * @see IEditorPart#doSave() - */ - public void doSave(IProgressMonitor progressMonitor) { - - final IEditorInput input= getEditorInput(); - - WorkspaceModifyOperation operation= new WorkspaceModifyOperation() { - public void execute(IProgressMonitor pm) throws CoreException { - if (input instanceof CompareEditorInput) - ((CompareEditorInput)input).saveChanges(pm); - } - }; - - Shell shell= getSite().getShell(); - - try { - - operation.run(progressMonitor); - - firePropertyChange(PROP_DIRTY); - - } catch (InterruptedException x) { - // NeedWork - } catch (OperationCanceledException x) { - // NeedWork - } catch (InvocationTargetException x) { - String title= Utilities.getString("CompareEditor.saveError.title"); //$NON-NLS-1$ - String reason= x.getTargetException().getMessage(); - MessageDialog.openError(shell, title, Utilities.getFormattedString("CompareEditor.cantSaveError", reason)); //$NON-NLS-1$ - } - } - - /* - * @see IEditorPart#isDirty() - */ - public boolean isDirty() { - IEditorInput input= getEditorInput(); - if (input instanceof CompareEditorInput) - return ((CompareEditorInput)input).isSaveNeeded(); - return false; - } - - public void propertyChange(PropertyChangeEvent event) { - Object old_value= event.getOldValue(); - Object new_value= event.getNewValue(); - if (old_value == null || new_value == null || !old_value.equals(new_value)) - firePropertyChange(PROP_DIRTY); - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditorContributor.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditorContributor.java deleted file mode 100644 index 672b1327d..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareEditorContributor.java +++ /dev/null @@ -1,106 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.util.ResourceBundle; - -import org.eclipse.jface.action.*; - -import org.eclipse.ui.*; -import org.eclipse.ui.actions.ActionFactory; -import org.eclipse.ui.help.WorkbenchHelp; -import org.eclipse.ui.part.EditorActionBarContributor; - -import org.eclipse.compare.*; - - -public class CompareEditorContributor extends EditorActionBarContributor { - - private IEditorPart fActiveEditorPart= null; - - private IgnoreWhiteSpaceAction fIgnoreWhitespace; - private NavigationAction fNext; - private NavigationAction fPrevious; - - private NavigationAction fToolbarNext; - private NavigationAction fToolbarPrevious; - - - public CompareEditorContributor() { - ResourceBundle bundle= CompareUI.getResourceBundle(); - - fIgnoreWhitespace= new IgnoreWhiteSpaceAction(bundle, null); - WorkbenchHelp.setHelp(fIgnoreWhitespace, ICompareContextIds.IGNORE_WHITESPACE_ACTION); - - fNext= new NavigationAction(bundle, true); - WorkbenchHelp.setHelp(fNext, ICompareContextIds.GLOBAL_NEXT_DIFF_ACTION); - - fPrevious= new NavigationAction(bundle, false); - WorkbenchHelp.setHelp(fPrevious, ICompareContextIds.GLOBAL_PREVIOUS_DIFF_ACTION); - - fToolbarNext= new NavigationAction(bundle, true); - WorkbenchHelp.setHelp(fToolbarNext, ICompareContextIds.NEXT_DIFF_ACTION); - - fToolbarPrevious= new NavigationAction(bundle, false); - WorkbenchHelp.setHelp(fToolbarPrevious, ICompareContextIds.PREVIOUS_DIFF_ACTION); - } - - /* - * @see EditorActionBarContributor#contributeToToolBar(IToolBarManager) - */ - public void contributeToToolBar(IToolBarManager tbm) { - tbm.add(new Separator()); - tbm.add(fIgnoreWhitespace); - tbm.add(fToolbarNext); - tbm.add(fToolbarPrevious); - } - - /* - * @see EditorActionBarContributor#contributeToMenu(IMenuManager) - */ - public void contributeToMenu(IMenuManager menuManager) { - // empty implementation - } - - public void setActiveEditor(IEditorPart targetEditor) { - - if (fActiveEditorPart == targetEditor) - return; - - fActiveEditorPart= targetEditor; - - if (fActiveEditorPart != null) { - IEditorInput input= fActiveEditorPart.getEditorInput(); - if (input instanceof CompareEditorInput) { - CompareEditorInput compareInput= (CompareEditorInput) input; - fNext.setCompareEditorInput(compareInput); - fPrevious.setCompareEditorInput(compareInput); - // Begin fix http://bugs.eclipse.org/bugs/show_bug.cgi?id=20105 - fToolbarNext.setCompareEditorInput(compareInput); - fToolbarPrevious.setCompareEditorInput(compareInput); - // End fix http://bugs.eclipse.org/bugs/show_bug.cgi?id=20105 - } - } - - if (targetEditor instanceof CompareEditor) { - IActionBars actionBars= getActionBars(); - - CompareEditor editor= (CompareEditor) targetEditor; - editor.setActionBars(actionBars); - - actionBars.setGlobalActionHandler(ActionFactory.NEXT.getId(), fNext); - actionBars.setGlobalActionHandler(ActionFactory.PREVIOUS.getId(), fPrevious); - - CompareConfiguration cc= editor.getCompareConfiguration(); - fIgnoreWhitespace.setCompareConfiguration(cc); - } - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareFilter.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareFilter.java deleted file mode 100644 index abcea3bae..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareFilter.java +++ /dev/null @@ -1,397 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.text.MessageFormat; -import java.util.StringTokenizer; - -import org.eclipse.core.resources.*; -import org.eclipse.core.resources.IWorkspace; -import org.eclipse.core.runtime.IStatus; - - -public class CompareFilter { - private static final char[][] NO_CHAR_CHAR= new char[0][]; - - private char[][] fExtraResourceFileFilters; - private String[] fExtraResourceFolderFilters; - - - public CompareFilter() { - // nothing to do - } - - /* - * Returns true if path matches filter, that is if path should be filtered. - */ - public boolean filter(String path0, boolean folder, boolean isArchive) { - if (!folder && fExtraResourceFileFilters != null) { - char[] name= path0.toCharArray(); - for (int i= 0, l= fExtraResourceFileFilters.length; i < l; i++) - if (match(fExtraResourceFileFilters[i], name, true)) - return true; - } - if (folder && fExtraResourceFolderFilters != null) { - for (int i= 0, l= fExtraResourceFolderFilters.length; i < l; i++) - if (fExtraResourceFolderFilters[0].equals(path0)) - return true; - } - return false; - } - - public static String validateResourceFilters(String text) { - IWorkspace workspace= ResourcesPlugin.getWorkspace(); - String[] filters= getTokens(text, ","); //$NON-NLS-1$ - for (int i= 0; i < filters.length; i++) { - String fileName= filters[i].replace('*', 'x'); - int resourceType= IResource.FILE; - int lastCharacter= fileName.length() - 1; - if (lastCharacter >= 0 && fileName.charAt(lastCharacter) == '/') { - fileName= fileName.substring(0, lastCharacter); - resourceType= IResource.FOLDER; - } - IStatus status= workspace.validateName(fileName, resourceType); - if (status.matches(IStatus.ERROR)) { - String format= Utilities.getString("ComparePreferencePage.filter.invalidsegment.error"); //$NON-NLS-1$ - return MessageFormat.format(format, new String[] { status.getMessage() } ); - } - } - return null; - } - - public void setFilters(String filterSequence) { - char[][] filters= filterSequence != null && filterSequence.length() > 0 - ? splitAndTrimOn(',', filterSequence.toCharArray()) - : null; - if (filters == null) { - fExtraResourceFileFilters= null; - fExtraResourceFolderFilters= null; - } else { - int fileCount= 0, folderCount= 0; - for (int i= 0, l= filters.length; i < l; i++) { - char[] f= filters[i]; - if (f.length == 0) - continue; - if (f[f.length - 1] == '/') - folderCount++; - else - fileCount++; - } - fExtraResourceFileFilters= new char[fileCount][]; - fExtraResourceFolderFilters= new String[folderCount]; - for (int i= 0, l= filters.length; i < l; i++) { - char[] f= filters[i]; - if (f.length == 0) - continue; - if (f[f.length - 1] == '/') - fExtraResourceFolderFilters[--folderCount]= new String(subarray(f, 0, f.length - 1)); - else - fExtraResourceFileFilters[--fileCount]= f; - } - } - } - - ///////// - - private static String[] getTokens(String text, String separator) { - StringTokenizer tok= new StringTokenizer(text, separator); //$NON-NLS-1$ - int nTokens= tok.countTokens(); - String[] res= new String[nTokens]; - for (int i= 0; i < res.length; i++) - res[i]= tok.nextToken().trim(); - return res; - } - - /** - * Answers true if the pattern matches the given name, false otherwise. - * This char[] pattern matching accepts wild-cards '*' and '?'. - * - * When not case sensitive, the pattern is assumed to already be - * lowercased, the name will be lowercased character per character as - * comparing. If name is null, the answer is false. If pattern is null, the - * answer is true if name is not null.

For example: - *

    - *
  1. - * - *
    -	 *  pattern = { '?', 'b', '*' } name = { 'a', 'b', 'c' , 'd' } isCaseSensitive = true result => true
    -	 * 
    - * - * - *
  2. - *
  3. - * - *
    -	 *  pattern = { '?', 'b', '?' } name = { 'a', 'b', 'c' , 'd' } isCaseSensitive = true result => false
    -	 * 
    - * - * - *
  4. - *
  5. - * - *
    -	 *  pattern = { 'b', '*' } name = { 'a', 'b', 'c' , 'd' } isCaseSensitive = true result => false
    -	 * 
    - * - * - *
  6. - *
- * - * @param pattern - * the given pattern - * @param name - * the given name - * @param isCaseSensitive - * flag to know whether or not the matching should be case - * sensitive - * @return true if the pattern matches the given name, false otherwise - */ - private boolean match(char[] pattern, char[] name, boolean isCaseSensitive) { - if (name == null) - return false; // null name cannot match - if (pattern == null) - return true; // null pattern is equivalent to '*' - return match(pattern, 0, pattern.length, name, 0, name.length, isCaseSensitive); - } - - /** - * Answers true if the a sub-pattern matches the subpart of the given name, - * false otherwise. char[] pattern matching, accepting wild-cards '*' and - * '?'. Can match only subset of name/pattern. end positions are - * non-inclusive. The subpattern is defined by the patternStart and - * pattternEnd positions. When not case sensitive, the pattern is assumed - * to already be lowercased, the name will be lowercased character per - * character as comparing.

For example: - *
    - *
  1. - * - *
    -	 *  pattern = { '?', 'b', '*' } patternStart = 1 patternEnd = 3 name = { 'a', 'b', 'c' , 'd' } nameStart = 1 nameEnd = 4 isCaseSensitive = true result => true
    -	 * 
    - * - * - *
  2. - *
  3. - * - *
    -	 *  pattern = { '?', 'b', '*' } patternStart = 1 patternEnd = 2 name = { 'a', 'b', 'c' , 'd' } nameStart = 1 nameEnd = 2 isCaseSensitive = true result => false
    -	 * 
    - * - * - *
  4. - *
- * - * @param pattern - * the given pattern - * @param patternStart - * the given pattern start - * @param patternEnd - * the given pattern end - * @param name - * the given name - * @param nameStart - * the given name start - * @param nameEnd - * the given name end - * @param isCaseSensitive - * flag to know if the matching should be case sensitive - * @return true if the a sub-pattern matches the subpart of the given name, - * false otherwise - */ - private boolean match(char[] pattern, int patternStart, int patternEnd, char[] name, int nameStart, int nameEnd, - boolean isCaseSensitive) { - if (name == null) - return false; // null name cannot match - if (pattern == null) - return true; // null pattern is equivalent to '*' - int iPattern= patternStart; - int iName= nameStart; - if (patternEnd < 0) - patternEnd= pattern.length; - if (nameEnd < 0) - nameEnd= name.length; - /* check first segment */ - char patternChar= 0; - while ((iPattern < patternEnd) && (patternChar= pattern[iPattern]) != '*') { - if (iName == nameEnd) - return false; - if (patternChar != (isCaseSensitive ? name[iName] : Character.toLowerCase(name[iName])) && patternChar != '?') { - return false; - } - iName++; - iPattern++; - } - /* check sequence of star+segment */ - int segmentStart; - if (patternChar == '*') { - segmentStart= ++iPattern; // skip star - } else { - segmentStart= 0; // force iName check - } - int prefixStart= iName; - checkSegment : while (iName < nameEnd) { - if (iPattern == patternEnd) { - iPattern= segmentStart; // mismatch - restart current segment - iName= ++prefixStart; - continue checkSegment; - } - /* segment is ending */ - if ((patternChar= pattern[iPattern]) == '*') { - segmentStart= ++iPattern; // skip start - if (segmentStart == patternEnd) { - return true; - } - prefixStart= iName; - continue checkSegment; - } - /* check current name character */ - if ((isCaseSensitive ? name[iName] : Character.toLowerCase(name[iName])) != patternChar && patternChar != '?') { - iPattern= segmentStart; // mismatch - restart current segment - iName= ++prefixStart; - continue checkSegment; - } - iName++; - iPattern++; - } - return (segmentStart == patternEnd) || (iName == nameEnd && iPattern == patternEnd) - || (iPattern == patternEnd - 1 && pattern[iPattern] == '*'); - } - - /** - * Return a new array which is the split of the given array using the given - * divider and triming each subarray to remove whitespaces equals to ' '. - *

For example: - *
    - *
  1. - * - *
    -	 *  divider = 'b' array = { 'a' , 'b', 'b', 'a', 'b', 'a' } result => { { 'a' }, { }, { 'a' }, { 'a' } }
    -	 * 
    - * - * - *
  2. - *
  3. - * - *
    -	 *  divider = 'c' array = { 'a' , 'b', 'b', 'a', 'b', 'a' } result => { { 'a', 'b', 'b', 'a', 'b', 'a' } }
    -	 * 
    - * - * - *
  4. - *
  5. - * - *
    -	 *  divider = 'b' array = { 'a' , ' ', 'b', 'b', 'a', 'b', 'a' } result => { { 'a' }, { }, { 'a' }, { 'a' } }
    -	 * 
    - * - * - *
  6. - *
  7. - * - *
    -	 *  divider = 'c' array = { ' ', ' ', 'a' , 'b', 'b', 'a', 'b', 'a', ' ' } result => { { 'a', 'b', 'b', 'a', 'b', 'a' } }
    -	 * 
    - * - * - *
  8. - *
- * - * @param divider - * the given divider - * @param array - * the given array - * @return a new array which is the split of the given array using the - * given divider and triming each subarray to remove whitespaces - * equals to ' ' - */ - private char[][] splitAndTrimOn(char divider, char[] array) { - int length= array == null ? 0 : array.length; - if (length == 0) - return NO_CHAR_CHAR; - int wordCount= 1; - for (int i= 0; i < length; i++) - if (array[i] == divider) - wordCount++; - char[][] split= new char[wordCount][]; - int last= 0, currentWord= 0; - for (int i= 0; i < length; i++) { - if (array[i] == divider) { - int start= last, end= i - 1; - while (start < i && array[start] == ' ') - start++; - while (end > start && array[end] == ' ') - end--; - split[currentWord]= new char[end - start + 1]; - System.arraycopy(array, start, split[currentWord++], 0, end - start + 1); - last= i + 1; - } - } - int start= last, end= length - 1; - while (start < length && array[start] == ' ') - start++; - while (end > start && array[end] == ' ') - end--; - split[currentWord]= new char[end - start + 1]; - System.arraycopy(array, start, split[currentWord++], 0, end - start + 1); - return split; - } - - /** - * Answers a new array which is a copy of the given array starting at the - * given start and ending at the given end. The given start is inclusive - * and the given end is exclusive. Answers null if start is greater than - * end, if start is lower than 0 or if end is greater than the length of - * the given array. If end equals -1, it is converted to the array length. - *

For example: - *
    - *
  1. - * - *
    -	 *  array = { 'a' , 'b' } start = 0 end = 1 result => { 'a' }
    -	 * 
    - * - * - *
  2. - *
  3. - * - *
    -	 *  array = { 'a', 'b' } start = 0 end = -1 result => { 'a' , 'b' }
    -	 * 
    - * - * - *
  4. - *
- * - * @param array - * the given array - * @param start - * the given starting index - * @param end - * the given ending index - * @return a new array which is a copy of the given array starting at the - * given start and ending at the given end - * @exception NullPointerException - * if the given array is null - */ - private char[] subarray(char[] array, int start, int end) { - if (end == -1) - end= array.length; - if (start > end) - return null; - if (start < 0) - return null; - if (end > array.length) - return null; - char[] result= new char[end - start]; - System.arraycopy(array, start, result, 0, end - start); - return result; - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareMessages.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareMessages.java deleted file mode 100644 index bc2d1464f..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareMessages.java +++ /dev/null @@ -1,33 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.util.MissingResourceException; -import java.util.ResourceBundle; - -public class CompareMessages { - - private static final String RESOURCE_BUNDLE= "org.eclipse.compare.internal.CompareMessages";//$NON-NLS-1$ - - private static ResourceBundle fgResourceBundle= ResourceBundle.getBundle(RESOURCE_BUNDLE); - - private CompareMessages() { - // nothing to do - } - - public static String getString(String key) { - try { - return fgResourceBundle.getString(key); - } catch (MissingResourceException e) { - return "!" + key + "!";//$NON-NLS-2$ //$NON-NLS-1$ - } - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareMessages.properties b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareMessages.properties deleted file mode 100644 index eb3dd5c8f..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareMessages.properties +++ /dev/null @@ -1,58 +0,0 @@ -############################################################################### -# Copyright (c) 2000, 2004 IBM Corporation and others. -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Common Public License v1.0 -# which accompanies this distribution, and is available at -# http://www.eclipse.org/legal/cpl-v10.html -# -# Contributors: -# IBM Corporation - initial API and implementation -############################################################################### - -ComparePlugin.internal_error= Internal Error -ExceptionDialog.seeErrorLogMessage= See error log for details. - -# -# Title format for CompareViewerSwitchingPane -# -CompareViewerSwitchingPane.Titleformat= {0} ({1}) - -# -# Title message for StructureDiffViewer if no structural differences could be found -# -StructureDiffViewer.NoStructuralDifferences= No Structural Differences -StructureDiffViewer.StructureError= Cannot Compare Structures - -# -# TextMergeViewer -# -TextMergeViewer.cursorPosition.format= {0} : {1} - -TextMergeViewer.beforeLine.format= before line {0} -TextMergeViewer.range.format= {0} : {1} - -TextMergeViewer.changeType.addition= addition -TextMergeViewer.changeType.deletion= deletion -TextMergeViewer.changeType.change= change - -TextMergeViewer.direction.outgoing= outgoing -TextMergeViewer.direction.incoming= incoming -TextMergeViewer.direction.conflicting= conflicting - -TextMergeViewer.diffType.format= {0} {1} - -TextMergeViewer.diffDescription.noDiff.format= no diff -TextMergeViewer.diffDescription.diff.format= {0} #{1} (Left: {2}, Right: {3}) -TextMergeViewer.statusLine.format= Left: {0}, Right: {1}, {2} - -TextMergeViewer.atEnd.title= Go to Next Difference -TextMergeViewer.atEnd.message= End of document reached. Continue from beginning? - -TextMergeViewer.atBeginning.title= Go to Previous Difference -TextMergeViewer.atBeginning.message= Beginning of document reached. Continue from end? - -CompareNavigator.atEnd.title= Go to Next Difference -CompareNavigator.atEnd.message= Last difference reached. - -CompareNavigator.atBeginning.title= Go to Previous Difference -CompareNavigator.atBeginning.message= First difference reached. diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareNavigator.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareNavigator.java deleted file mode 100644 index 295f4cc7c..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareNavigator.java +++ /dev/null @@ -1,158 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.swt.widgets.Control; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.compare.CompareEditorInput; -import org.eclipse.compare.*; - -/** - * Supports cross-pane navigation through differences. - * XXX: Design is as it is because the feature had to be added without touching API. - */ -public class CompareNavigator implements ICompareNavigator { - - private boolean fLastDirection= true; - private CompareViewerSwitchingPane[] fPanes; - // Fix for http://dev.eclipse.org/bugs/show_bug.cgi?id=20106 - private boolean fNextFirstTime= true; - - public CompareNavigator(CompareViewerSwitchingPane[] panes) { - fPanes= panes; - } - - public CompareViewerSwitchingPane[] getPanes() { - return fPanes; - } - - public boolean selectChange(boolean next) { - - fLastDirection= next; - - // Fix for http://dev.eclipse.org/bugs/show_bug.cgi?id=20106 - if (next && fNextFirstTime && mustOpen()) { - fNextFirstTime= false; - openElement(); - } - - // find most down stream CompareViewerPane - int n= 0; - INavigatable[] navigators= new INavigatable[4]; - for (int i= 0; i < fPanes.length; i++) { - navigators[n]= getNavigator(fPanes[i]); - if (navigators[n] != null) - n++; - } - - while (n > 0) { - n--; - if (navigators[n].gotoDifference(next)) { - // at end of this navigator - continue; - } - // not at end - return false; - } - - return true; - } - - private static INavigatable getNavigator(CompareViewerSwitchingPane pane) { - if (pane == null) - return null; - if (pane.isEmpty()) - return null; - Viewer viewer= pane.getViewer(); - if (viewer == null) - return null; - Control control= viewer.getControl(); - if (control == null) - return null; - Object data= control.getData(INavigatable.NAVIGATOR_PROPERTY); - if (data instanceof INavigatable) - return (INavigatable) data; - return null; - } - - private static CompareNavigator findNavigator(Control c) { - while (c != null && !c.isDisposed()) { // PR 1GEUVV2 - Object data= c.getData(); - if (data instanceof CompareEditorInput) { - CompareEditorInput cei= (CompareEditorInput) data; - Object adapter= cei.getAdapter(CompareNavigator.class); - if (adapter instanceof CompareNavigator) - return (CompareNavigator)adapter; - } - c= c.getParent(); - } - return null; - } - - private boolean resetDirection() { - boolean last= fLastDirection; - fLastDirection= true; - return last; - } - - public static boolean getDirection(Control c) { - CompareNavigator nav= findNavigator(c); - if (nav != null) - return nav.resetDirection(); - return true; - } - - /* - * Fix for http://dev.eclipse.org/bugs/show_bug.cgi?id=20106 - */ - private boolean mustOpen() { - if (fPanes == null || fPanes.length == 0) - return false; - for (int i= 1; i < fPanes.length; i++) { - CompareViewerSwitchingPane pane= fPanes[i]; - if (pane != null && pane.getInput() != null) - return false; - } - return true; - } - - /* - * Fix for http://dev.eclipse.org/bugs/show_bug.cgi?id=20106 - */ - private void openElement() { - if (fPanes == null || fPanes.length == 0) - return; - IOpenable openable= getOpenable(fPanes[0]); - if (openable != null) { - openable.openSelected(); - } - } - - /* - * Fix for http://dev.eclipse.org/bugs/show_bug.cgi?id=20106 - */ - private static IOpenable getOpenable(CompareViewerSwitchingPane pane) { - if (pane == null) - return null; - if (pane.isEmpty()) - return null; - Viewer viewer= pane.getViewer(); - if (viewer == null) - return null; - Control control= viewer.getControl(); - if (control == null) - return null; - Object data= control.getData(IOpenable.OPENABLE_PROPERTY); - if (data instanceof IOpenable) - return (IOpenable) data; - return null; - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareOutlinePage.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareOutlinePage.java deleted file mode 100644 index bc599075d..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareOutlinePage.java +++ /dev/null @@ -1,106 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.ui.IActionBars; -import org.eclipse.ui.views.contentoutline.IContentOutlinePage; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.*; - -import org.eclipse.jface.util.ListenerList; -import org.eclipse.jface.viewers.*; - -import org.eclipse.compare.CompareEditorInput; - -/** - */ -public class CompareOutlinePage implements IContentOutlinePage { - - private Control fControl; - private ListenerList fListeners= new ListenerList(); - private ISelection fSelection; - //private IActionBars fActionBars; - private CompareEditorInput fCompareEditorInput; - - CompareOutlinePage(CompareEditorInput input) { - fCompareEditorInput= input; - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.IPage#createControl(org.eclipse.swt.widgets.Composite) - */ - public void createControl(Composite parent) { - if (fCompareEditorInput != null) { - fControl= fCompareEditorInput.createOutlineContents(parent, SWT.VERTICAL); - } - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.IPage#dispose() - */ - public void dispose() { - if (fControl != null) - fControl.dispose(); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.IPage#getControl() - */ - public Control getControl() { - return fControl; - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.IPage#setActionBars(org.eclipse.ui.IActionBars) - */ - public void setActionBars(IActionBars actionBars) { - //fActionBars= actionBars; - //if (fControl != null) - // fControl.setData("actionBars", actionBars); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.part.IPage#setFocus() - */ - public void setFocus() { - if (fControl != null) - fControl.setFocus(); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener) - */ - public void addSelectionChangedListener(ISelectionChangedListener listener) { - fListeners.add(listener); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection() - */ - public ISelection getSelection() { - return fSelection; - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener) - */ - public void removeSelectionChangedListener(ISelectionChangedListener listener) { - fListeners.remove(listener); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection) - */ - public void setSelection(ISelection selection) { - fSelection= selection; - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ComparePreferencePage.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ComparePreferencePage.java deleted file mode 100644 index 3fcd49cf0..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ComparePreferencePage.java +++ /dev/null @@ -1,389 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.io.*; -import java.util.*; - -import org.eclipse.ui.*; -import org.eclipse.ui.help.WorkbenchHelp; -import org.eclipse.ui.texteditor.AbstractTextEditor; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.*; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.layout.*; -import org.eclipse.swt.widgets.*; - -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.preference.*; -import org.eclipse.jface.util.*; - -import org.eclipse.compare.*; -import org.eclipse.compare.contentmergeviewer.TextMergeViewer; -import org.eclipse.compare.structuremergeviewer.*; - - -public class ComparePreferencePage extends PreferencePage implements IWorkbenchPreferencePage { - - class FakeInput implements ITypedElement, IEncodedStreamContentAccessor { - static final String UTF_16= "UTF-16"; //$NON-NLS-1$ - String fContent; - - FakeInput(String name) { - fContent= loadPreviewContentFromFile(name); - } - public Image getImage() { - return null; - } - public String getName() { - return "no name"; //$NON-NLS-1$ - } - public String getType() { - return "no type"; //$NON-NLS-1$ - } - public InputStream getContents() { - return new ByteArrayInputStream(Utilities.getBytes(fContent, UTF_16)); - } - public String getCharset() { - return UTF_16; - } - } - - private static final String PREFIX= CompareUIPlugin.PLUGIN_ID + "."; //$NON-NLS-1$ - public static final String OPEN_STRUCTURE_COMPARE= PREFIX + "OpenStructureCompare"; //$NON-NLS-1$ - public static final String SYNCHRONIZE_SCROLLING= PREFIX + "SynchronizeScrolling"; //$NON-NLS-1$ - public static final String SHOW_PSEUDO_CONFLICTS= PREFIX + "ShowPseudoConflicts"; //$NON-NLS-1$ - public static final String INITIALLY_SHOW_ANCESTOR_PANE= PREFIX + "InitiallyShowAncestorPane"; //$NON-NLS-1$ - public static final String PREF_SAVE_ALL_EDITORS= PREFIX + "SaveAllEditors"; //$NON-NLS-1$ - public static final String SHOW_MORE_INFO= PREFIX + "ShowMoreInfo"; //$NON-NLS-1$ - public static final String IGNORE_WHITESPACE= PREFIX + "IgnoreWhitespace"; //$NON-NLS-1$ - //public static final String USE_SPLINES= PREFIX + "UseSplines"; //$NON-NLS-1$ - public static final String USE_SINGLE_LINE= PREFIX + "UseSingleLine"; //$NON-NLS-1$ - //public static final String USE_RESOLVE_UI= PREFIX + "UseResolveUI"; //$NON-NLS-1$ - public static final String PATH_FILTER= PREFIX + "PathFilter"; //$NON-NLS-1$ - - - private TextMergeViewer fPreviewViewer; - private IPropertyChangeListener fPreferenceChangeListener; - private CompareConfiguration fCompareConfiguration; - private OverlayPreferenceStore fOverlayStore; - private Map fCheckBoxes= new HashMap(); - private Text fFilters; - private SelectionListener fCheckBoxListener; - - - public final OverlayPreferenceStore.OverlayKey[] fKeys= new OverlayPreferenceStore.OverlayKey[] { - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, OPEN_STRUCTURE_COMPARE), - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, SYNCHRONIZE_SCROLLING), - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, SHOW_PSEUDO_CONFLICTS), - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, INITIALLY_SHOW_ANCESTOR_PANE), - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, SHOW_MORE_INFO), - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, IGNORE_WHITESPACE), - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PREF_SAVE_ALL_EDITORS), - - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND), - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT), - - //new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, USE_SPLINES), - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, USE_SINGLE_LINE), - //new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, USE_RESOLVE_UI), - new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, PATH_FILTER), - }; - - - public static void initDefaults(IPreferenceStore store) { - store.setDefault(OPEN_STRUCTURE_COMPARE, true); - store.setDefault(SYNCHRONIZE_SCROLLING, true); - store.setDefault(SHOW_PSEUDO_CONFLICTS, false); - store.setDefault(INITIALLY_SHOW_ANCESTOR_PANE, false); - store.setDefault(SHOW_MORE_INFO, false); - store.setDefault(IGNORE_WHITESPACE, false); - store.setDefault(PREF_SAVE_ALL_EDITORS, false); - //store.setDefault(USE_SPLINES, false); - store.setDefault(USE_SINGLE_LINE, true); - //store.setDefault(USE_RESOLVE_UI, false); - store.setDefault(PATH_FILTER, ""); //$NON-NLS-1$ - - store.setDefault(AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT, true); - } - - public ComparePreferencePage() { - - //setDescription(Utilities.getString("ComparePreferencePage.description")); //$NON-NLS-1$ - - setPreferenceStore(CompareUIPlugin.getDefault().getPreferenceStore()); - - fOverlayStore= new OverlayPreferenceStore(getPreferenceStore(), fKeys); - fPreferenceChangeListener= new IPropertyChangeListener() { - public void propertyChange(PropertyChangeEvent event) { - String key= event.getProperty(); - if (key.equals(INITIALLY_SHOW_ANCESTOR_PANE)) { - boolean b= fOverlayStore.getBoolean(INITIALLY_SHOW_ANCESTOR_PANE); - if (fCompareConfiguration != null) { - fCompareConfiguration.setProperty(INITIALLY_SHOW_ANCESTOR_PANE, new Boolean(b)); - } - } - } - }; - fOverlayStore.addPropertyChangeListener(fPreferenceChangeListener); - } - - /* - * @see IWorkbenchPreferencePage#init() - */ - public void init(IWorkbench workbench) { - // empty - } - - /* - * @see PreferencePage#performOk() - */ - public boolean performOk() { - fOverlayStore.propagate(); - return true; - } - - /* - * @see PreferencePage#performDefaults() - */ - protected void performDefaults() { - - fOverlayStore.loadDefaults(); - initializeFields(); - - super.performDefaults(); - } - - /* - * @see DialogPage#dispose() - */ - public void dispose() { - - if (fOverlayStore != null) { - if (fPreferenceChangeListener != null) { - fOverlayStore.removePropertyChangeListener(fPreferenceChangeListener); - fPreferenceChangeListener= null; - } - fOverlayStore.stop(); - fOverlayStore= null; - } - - super.dispose(); - } - - static public boolean getSaveAllEditors() { - IPreferenceStore store= CompareUIPlugin.getDefault().getPreferenceStore(); - return store.getBoolean(PREF_SAVE_ALL_EDITORS); - } - - static public void setSaveAllEditors(boolean value) { - IPreferenceStore store= CompareUIPlugin.getDefault().getPreferenceStore(); - store.setValue(PREF_SAVE_ALL_EDITORS, value); - } - - /* - * @see PreferencePage#createContents(Composite) - */ - protected Control createContents(Composite parent) { - - WorkbenchHelp.setHelp(parent, ICompareContextIds.COMPARE_PREFERENCE_PAGE); - - fOverlayStore.load(); - fOverlayStore.start(); - - TabFolder folder= new TabFolder(parent, SWT.NONE); - folder.setLayout(new TabFolderLayout()); - folder.setLayoutData(new GridData(GridData.FILL_BOTH)); - - TabItem item= new TabItem(folder, SWT.NONE); - item.setText(Utilities.getString("ComparePreferencePage.generalTab.label")); //$NON-NLS-1$ - //item.setImage(JavaPluginImages.get(JavaPluginImages.IMG_OBJS_CFILE)); - item.setControl(createGeneralPage(folder)); - - item= new TabItem(folder, SWT.NONE); - item.setText(Utilities.getString("ComparePreferencePage.textCompareTab.label")); //$NON-NLS-1$ - //item.setImage(JavaPluginImages.get(JavaPluginImages.IMG_OBJS_CFILE)); - item.setControl(createTextComparePage(folder)); - - initializeFields(); - Dialog.applyDialogFont(folder); - return folder; - } - - private Control createGeneralPage(Composite parent) { - Composite composite= new Composite(parent, SWT.NULL); - GridLayout layout= new GridLayout(); - layout.numColumns= 1; - composite.setLayout(layout); - - addCheckBox(composite, "ComparePreferencePage.structureCompare.label", OPEN_STRUCTURE_COMPARE, 0); //$NON-NLS-1$ - addCheckBox(composite, "ComparePreferencePage.showMoreInfo.label", SHOW_MORE_INFO, 0); //$NON-NLS-1$ - addCheckBox(composite, "ComparePreferencePage.ignoreWhitespace.label", IGNORE_WHITESPACE, 0); //$NON-NLS-1$ - - // a spacer - new Label(composite, SWT.NONE); - - addCheckBox(composite, "ComparePreferencePage.saveBeforePatching.label", PREF_SAVE_ALL_EDITORS, 0); //$NON-NLS-1$ - - // a spacer - new Label(composite, SWT.NONE); - - Label l= new Label(composite, SWT.WRAP); - l.setText(Utilities.getString("ComparePreferencePage.filter.description")); //$NON-NLS-1$ - - Composite c2= new Composite(composite, SWT.NONE); - c2.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - layout= new GridLayout(2, false); - layout.marginWidth= 0; - c2.setLayout(layout); - - l= new Label(c2, SWT.NONE); - l.setText(Utilities.getString("ComparePreferencePage.filter.label")); //$NON-NLS-1$ - - fFilters= new Text(c2, SWT.BORDER); - fFilters.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - fFilters.setText(fOverlayStore.getString(PATH_FILTER)); - fFilters.addModifyListener( - new ModifyListener() { - public void modifyText(ModifyEvent e) { - String filters= fFilters.getText(); - String message= CompareFilter.validateResourceFilters(filters); - setValid(message == null); - setMessage(null); - setErrorMessage(message); - fOverlayStore.setValue(PATH_FILTER, filters); - } - } - ); - - return composite; - } - - private Control createTextComparePage(Composite parent) { - - Composite composite= new Composite(parent, SWT.NULL); - GridLayout layout= new GridLayout(); - layout.numColumns= 1; - composite.setLayout(layout); - - addCheckBox(composite, "ComparePreferencePage.synchronizeScrolling.label", SYNCHRONIZE_SCROLLING, 0); //$NON-NLS-1$ - addCheckBox(composite, "ComparePreferencePage.initiallyShowAncestorPane.label", INITIALLY_SHOW_ANCESTOR_PANE, 0); //$NON-NLS-1$ - addCheckBox(composite, "ComparePreferencePage.showPseudoConflicts.label", SHOW_PSEUDO_CONFLICTS, 0); //$NON-NLS-1$ - - //addCheckBox(composite, "ComparePreferencePage.useSplines.label", USE_SPLINES, 0); //$NON-NLS-1$ - addCheckBox(composite, "ComparePreferencePage.useSingleLine.label", USE_SINGLE_LINE, 0); //$NON-NLS-1$ - //addCheckBox(composite, "ComparePreferencePage.useResolveUI.label", USE_RESOLVE_UI, 0); //$NON-NLS-1$ - - // a spacer - new Label(composite, SWT.NONE); - - Label previewLabel= new Label(composite, SWT.NULL); - previewLabel.setText(Utilities.getString("ComparePreferencePage.preview.label")); //$NON-NLS-1$ - - Control previewer= createPreviewer(composite); - GridData gd= new GridData(GridData.FILL_BOTH); - gd.widthHint= convertWidthInCharsToPixels(60); - gd.heightHint= convertHeightInCharsToPixels(13); - previewer.setLayoutData(gd); - - return composite; - } - - private Control createPreviewer(Composite parent) { - - fCompareConfiguration= new CompareConfiguration(fOverlayStore); - fCompareConfiguration.setAncestorLabel(Utilities.getString("ComparePreferencePage.ancestor.label")); //$NON-NLS-1$ - - fCompareConfiguration.setLeftLabel(Utilities.getString("ComparePreferencePage.left.label")); //$NON-NLS-1$ - fCompareConfiguration.setLeftEditable(false); - - fCompareConfiguration.setRightLabel(Utilities.getString("ComparePreferencePage.right.label")); //$NON-NLS-1$ - fCompareConfiguration.setRightEditable(false); - - fPreviewViewer= new TextMergeViewer(parent, SWT.BORDER, fCompareConfiguration); - - fPreviewViewer.setInput( - new DiffNode(Differencer.CONFLICTING, - new FakeInput("ComparePreferencePage.previewAncestor"), //$NON-NLS-1$ - new FakeInput("ComparePreferencePage.previewLeft"), //$NON-NLS-1$ - new FakeInput("ComparePreferencePage.previewRight") //$NON-NLS-1$ - ) - ); - - Control c= fPreviewViewer.getControl(); - c.addDisposeListener(new DisposeListener() { - public void widgetDisposed(DisposeEvent e) { - if (fCompareConfiguration != null) - fCompareConfiguration.dispose(); - } - }); - - return c; - } - - private void initializeFields() { - - Iterator e= fCheckBoxes.keySet().iterator(); - while (e.hasNext()) { - Button b= (Button) e.next(); - String key= (String) fCheckBoxes.get(b); - b.setSelection(fOverlayStore.getBoolean(key)); - } - - if (fFilters != null) - fFilters.setText(fOverlayStore.getString(PATH_FILTER)); - } - - // overlay stuff - - private Button addCheckBox(Composite parent, String labelKey, String key, int indentation) { - - String label= Utilities.getString(labelKey); - - Button checkBox= new Button(parent, SWT.CHECK); - checkBox.setText(label); - - GridData gd= new GridData(GridData.FILL_HORIZONTAL); - gd.horizontalIndent= indentation; - gd.horizontalSpan= 2; - checkBox.setLayoutData(gd); - - if (fCheckBoxListener == null) { - fCheckBoxListener= new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - Button button= (Button) e.widget; - fOverlayStore.setValue((String) fCheckBoxes.get(button), button.getSelection()); - } - }; - } - checkBox.addSelectionListener(fCheckBoxListener); - - fCheckBoxes.put(checkBox, key); - - return checkBox; - } - - private String loadPreviewContentFromFile(String key) { - - String preview= Utilities.getString(key); - String separator= System.getProperty("line.separator"); //$NON-NLS-1$ - StringBuffer buffer= new StringBuffer(); - for (int i= 0; i < preview.length(); i++) { - char c= preview.charAt(i); - if (c == '\n') - buffer.append(separator); - else - buffer.append(c); - } - return buffer.toString(); - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareUIPlugin.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareUIPlugin.java deleted file mode 100644 index d90b72759..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareUIPlugin.java +++ /dev/null @@ -1,1155 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.io.*; -import java.lang.reflect.InvocationTargetException; -import java.net.*; -import java.util.*; -import java.util.List; - -import org.eclipse.ui.*; -import org.eclipse.ui.model.IWorkbenchAdapter; -import org.eclipse.ui.plugin.AbstractUIPlugin; - -import org.eclipse.core.runtime.*; -import org.eclipse.core.runtime.content.IContentType; -import org.eclipse.core.runtime.content.IContentTypeManager; - -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.*; - -import org.eclipse.jface.dialogs.*; -import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.util.*; -import org.eclipse.jface.util.Assert; -import org.eclipse.jface.viewers.Viewer; - -import org.eclipse.compare.*; -import org.eclipse.compare.structuremergeviewer.*; -import org.osgi.framework.BundleContext; - - -/** - * The Compare UI plug-in defines the entry point to initiate a configurable - * compare operation on arbitrary resources. The result of the compare - * is opened into a compare editor where the details can be browsed and - * edited in dynamically selected structure and content viewers. - *

- * The Compare UI provides a registry for content and structure compare viewers, - * which is initialized from extensions contributed to extension points - * declared by this plug-in. - *

- * This class is the plug-in runtime class for the - * "org.eclipse.compare" plug-in. - *

- */ -public final class CompareUIPlugin extends AbstractUIPlugin { - - static class CompareRegistry { - - private final static String ID_ATTRIBUTE= "id"; //$NON-NLS-1$ - private final static String EXTENSIONS_ATTRIBUTE= "extensions"; //$NON-NLS-1$ - private final static String CONTENT_TYPE_ID_ATTRIBUTE= "contentTypeId"; //$NON-NLS-1$ - - private HashMap fIdMap; - private HashMap fExtensionMap; - private HashMap fContentTypeBindings; // maps content type bindings to datas - - - void register(IConfigurationElement element, Object data) { - String id= element.getAttribute(ID_ATTRIBUTE); - if (id != null) { - if (fIdMap == null) - fIdMap= new HashMap(); - fIdMap.put(id, data); - } - - String types= element.getAttribute(EXTENSIONS_ATTRIBUTE); - if (types != null) { - if (fExtensionMap == null) - fExtensionMap= new HashMap(); - StringTokenizer tokenizer= new StringTokenizer(types, ","); //$NON-NLS-1$ - while (tokenizer.hasMoreElements()) { - String extension= tokenizer.nextToken().trim(); - fExtensionMap.put(normalizeCase(extension), data); - } - } - } - - void createBinding(IConfigurationElement element, String idAttributeName) { - String type= element.getAttribute(CONTENT_TYPE_ID_ATTRIBUTE); - String id= element.getAttribute(idAttributeName); - if (id == null) - logErrorMessage(Utilities.getFormattedString("CompareUIPlugin.targetIdAttributeMissing", idAttributeName)); //$NON-NLS-1$ - if (type != null && id != null && fIdMap != null) { - Object o= fIdMap.get(id); - if (o != null) { - IContentType ct= fgContentTypeManager.getContentType(type); - if (ct != null) { - if (fContentTypeBindings == null) - fContentTypeBindings= new HashMap(); - fContentTypeBindings.put(ct, o); - } else { - logErrorMessage(Utilities.getFormattedString("CompareUIPlugin.contentTypeNotFound", type)); //$NON-NLS-1$ - } - } else { - logErrorMessage(Utilities.getFormattedString("CompareUIPlugin.targetNotFound", id)); //$NON-NLS-1$ - } - } - } - - Object search(IContentType type) { - if (type != null && fContentTypeBindings != null) { - Object b= fContentTypeBindings.get(type); - if (b != null) - return b; - Iterator iter= fContentTypeBindings.keySet().iterator(); - while (iter.hasNext()) { - IContentType ct= (IContentType) iter.next(); - if (type.isKindOf(ct)) { - return fContentTypeBindings.get(ct); - } - } - } - return null; - } - - Object search(String extension) { - if (fExtensionMap != null) - return fExtensionMap.get(normalizeCase(extension)); - return null; - } - } - - public static final String DTOOL_NEXT= "dlcl16/next_nav.gif"; //$NON-NLS-1$ - public static final String ETOOL_NEXT= "elcl16/next_nav.gif"; //$NON-NLS-1$ - public static final String CTOOL_NEXT= ETOOL_NEXT; - - public static final String DTOOL_PREV= "dlcl16/prev_nav.gif"; //$NON-NLS-1$ - public static final String ETOOL_PREV= "elcl16/prev_nav.gif"; //$NON-NLS-1$ - public static final String CTOOL_PREV= ETOOL_PREV; - - /** Status code describing an internal error */ - public static final int INTERNAL_ERROR= 1; - - private static boolean NORMALIZE_CASE= true; - - public static final String PLUGIN_ID= "org.eclipse.compare"; //$NON-NLS-1$ - - private static final String BINARY_TYPE= "binary"; //$NON-NLS-1$ - - private static final String STREAM_MERGER_EXTENSION_POINT= "streamMergers"; //$NON-NLS-1$ - private static final String STREAM_MERGER= "streamMerger"; //$NON-NLS-1$ - private static final String STREAM_MERGER_ID_ATTRIBUTE= "streamMergerId"; //$NON-NLS-1$ - private static final String STRUCTURE_CREATOR_EXTENSION_POINT= "structureCreators"; //$NON-NLS-1$ - private static final String STRUCTURE_CREATOR= "structureCreator"; //$NON-NLS-1$ - private static final String STRUCTURE_CREATOR_ID_ATTRIBUTE= "structureCreatorId"; //$NON-NLS-1$ - - private static final String VIEWER_TAG= "viewer"; //$NON-NLS-1$ - private static final String STRUCTURE_MERGE_VIEWER_EXTENSION_POINT= "structureMergeViewers"; //$NON-NLS-1$ - private static final String STRUCTURE_MERGE_VIEWER_ID_ATTRIBUTE= "structureMergeViewerId"; //$NON-NLS-1$ - private static final String CONTENT_MERGE_VIEWER_EXTENSION_POINT= "contentMergeViewers"; //$NON-NLS-1$ - private static final String CONTENT_MERGE_VIEWER_ID_ATTRIBUTE= "contentMergeViewerId"; //$NON-NLS-1$ - private static final String CONTENT_VIEWER_EXTENSION_POINT= "contentViewers"; //$NON-NLS-1$ - private static final String CONTENT_VIEWER_ID_ATTRIBUTE= "contentViewerId"; //$NON-NLS-1$ - - private static final String CONTENT_TYPE_BINDING= "contentTypeBinding"; //$NON-NLS-1$ - - - private static final String COMPARE_EDITOR= PLUGIN_ID + ".CompareEditor"; //$NON-NLS-1$ - - private static final String STRUCTUREVIEWER_ALIASES_PREFERENCE_NAME= "StructureViewerAliases"; //$NON-NLS-1$ - - // content type - private static final IContentTypeManager fgContentTypeManager= Platform.getContentTypeManager(); - - /** - * The plugin singleton. - */ - private static CompareUIPlugin fgComparePlugin; - - /** Maps type to icons */ - private static Map fgImages= new Hashtable(10); - /** Maps type to ImageDescriptors */ - private static Map fgImageDescriptors= new Hashtable(10); - /** Maps ImageDescriptors to Images */ - private static Map fgImages2= new Hashtable(10); - - private static List fgDisposeOnShutdownImages= new ArrayList(); - - private ResourceBundle fResourceBundle; - - private boolean fRegistriesInitialized; - private CompareRegistry fStreamMergers= new CompareRegistry(); - private CompareRegistry fStructureCreators= new CompareRegistry(); - private CompareRegistry fStructureMergeViewers= new CompareRegistry(); - private CompareRegistry fContentViewers= new CompareRegistry(); - private CompareRegistry fContentMergeViewers= new CompareRegistry(); - - private Map fStructureViewerAliases; - private CompareFilter fFilter; - private IPropertyChangeListener fPropertyChangeListener; - - /** - * Creates the CompareUIPlugin object and registers all - * structure creators, content merge viewers, and structure merge viewers - * contributed to this plug-in's extension points. - *

- * Note that instances of plug-in runtime classes are automatically created - * by the platform in the course of plug-in activation. - */ - public CompareUIPlugin() { - super(); - Assert.isTrue(fgComparePlugin == null); - fgComparePlugin= this; - } - - public void start(BundleContext context) throws Exception { - super.start(context); - ComparePreferencePage.initDefaults(getPreferenceStore()); - } - - public void stop(BundleContext context) throws Exception { - - IPreferenceStore ps= getPreferenceStore(); - rememberAliases(ps); - if (fPropertyChangeListener != null) { - ps.removePropertyChangeListener(fPropertyChangeListener); - fPropertyChangeListener= null; - } - - super.stop(context); - - if (fgDisposeOnShutdownImages != null) { - Iterator i= fgDisposeOnShutdownImages.iterator(); - while (i.hasNext()) { - Image img= (Image) i.next(); - if (!img.isDisposed()) - img.dispose(); - } - fgImages= null; - } - } - - /** - * Returns the singleton instance of this plug-in runtime class. - * - * @return the compare plug-in instance - */ - public static CompareUIPlugin getDefault() { - return fgComparePlugin; - } - - /** - * Returns this plug-in's resource bundle. - * - * @return the plugin's resource bundle - */ - public ResourceBundle getResourceBundle() { - if (fResourceBundle == null) - fResourceBundle= Platform.getResourceBundle(getBundle()); - return fResourceBundle; - } - - /** - * Returns this plug-in's unique identifier. - * - * @return the plugin's unique identifier - */ - public static String getPluginId() { - return getDefault().getBundle().getSymbolicName(); - } - - private void initializeRegistries() { - if (!fRegistriesInitialized) { - registerExtensions(); - fRegistriesInitialized= true; - } - } - - /** - * Registers all stream mergers, structure creators, content merge viewers, and structure merge viewers - * that are found in the XML plugin files. - */ - private void registerExtensions() { - IExtensionRegistry registry= Platform.getExtensionRegistry(); - - // collect all IStreamMergers - IConfigurationElement[] elements= registry.getConfigurationElementsFor(PLUGIN_ID, STREAM_MERGER_EXTENSION_POINT); - for (int i= 0; i < elements.length; i++) { - IConfigurationElement element= elements[i]; - if (STREAM_MERGER.equals(element.getName())) - fStreamMergers.register(element, new StreamMergerDescriptor(element)); - } - for (int i= 0; i < elements.length; i++) { - IConfigurationElement element= elements[i]; - if (CONTENT_TYPE_BINDING.equals(element.getName())) - fStreamMergers.createBinding(element, STREAM_MERGER_ID_ATTRIBUTE); - } - - // collect all IStructureCreators - elements= registry.getConfigurationElementsFor(PLUGIN_ID, STRUCTURE_CREATOR_EXTENSION_POINT); - for (int i= 0; i < elements.length; i++) { - IConfigurationElement element= elements[i]; - String name= element.getName(); - if (!CONTENT_TYPE_BINDING.equals(name)) { - if (!STRUCTURE_CREATOR.equals(name)) - logErrorMessage(Utilities.getFormattedString("CompareUIPlugin.unexpectedTag", name, STRUCTURE_CREATOR)); //$NON-NLS-1$ - fStructureCreators.register(element, new StructureCreatorDescriptor(element)); - } - } - for (int i= 0; i < elements.length; i++) { - IConfigurationElement element= elements[i]; - if (CONTENT_TYPE_BINDING.equals(element.getName())) - fStructureCreators.createBinding(element, STRUCTURE_CREATOR_ID_ATTRIBUTE); - } - - // collect all viewers which define the structure mergeviewer extension point - elements= registry.getConfigurationElementsFor(PLUGIN_ID, STRUCTURE_MERGE_VIEWER_EXTENSION_POINT); - for (int i= 0; i < elements.length; i++) { - IConfigurationElement element= elements[i]; - String name= element.getName(); - if (!CONTENT_TYPE_BINDING.equals(name)) { - if (!VIEWER_TAG.equals(name)) - logErrorMessage(Utilities.getFormattedString("CompareUIPlugin.unexpectedTag", name, VIEWER_TAG)); //$NON-NLS-1$ - fStructureMergeViewers.register(element, new ViewerDescriptor(element)); - } - } - for (int i= 0; i < elements.length; i++) { - IConfigurationElement element= elements[i]; - if (CONTENT_TYPE_BINDING.equals(element.getName())) - fStructureMergeViewers.createBinding(element, STRUCTURE_MERGE_VIEWER_ID_ATTRIBUTE); - } - - // collect all viewers which define the content mergeviewer extension point - elements= registry.getConfigurationElementsFor(PLUGIN_ID, CONTENT_MERGE_VIEWER_EXTENSION_POINT); - for (int i= 0; i < elements.length; i++) { - IConfigurationElement element= elements[i]; - String name= element.getName(); - if (!CONTENT_TYPE_BINDING.equals(name)) { - if (!VIEWER_TAG.equals(name)) - logErrorMessage(Utilities.getFormattedString("CompareUIPlugin.unexpectedTag", name, VIEWER_TAG)); //$NON-NLS-1$ - fContentMergeViewers.register(element, new ViewerDescriptor(element)); - } - } - for (int i= 0; i < elements.length; i++) { - IConfigurationElement element= elements[i]; - if (CONTENT_TYPE_BINDING.equals(element.getName())) - fContentMergeViewers.createBinding(element, CONTENT_MERGE_VIEWER_ID_ATTRIBUTE); - } - - // collect all viewers which define the content viewer extension point - elements= registry.getConfigurationElementsFor(PLUGIN_ID, CONTENT_VIEWER_EXTENSION_POINT); - for (int i= 0; i < elements.length; i++) { - IConfigurationElement element= elements[i]; - String name= element.getName(); - if (!CONTENT_TYPE_BINDING.equals(name)) { - if (!VIEWER_TAG.equals(name)) - logErrorMessage(Utilities.getFormattedString("CompareUIPlugin.unexpectedTag", name, VIEWER_TAG)); //$NON-NLS-1$ - fContentViewers.register(element, new ViewerDescriptor(element)); - } - } - for (int i= 0; i < elements.length; i++) { - IConfigurationElement element= elements[i]; - if (CONTENT_TYPE_BINDING.equals(element.getName())) - fContentViewers.createBinding(element, CONTENT_VIEWER_ID_ATTRIBUTE); - } - } - - public static IWorkbench getActiveWorkbench() { - CompareUIPlugin plugin= getDefault(); - if (plugin == null) - return null; - return plugin.getWorkbench(); - } - - public static IWorkbenchWindow getActiveWorkbenchWindow() { - IWorkbench workbench= getActiveWorkbench(); - if (workbench == null) - return null; - return workbench.getActiveWorkbenchWindow(); - } - - /** - * Returns the active workkbench page or null if - * no active workkbench page can be determined. - * - * @return the active workkbench page or null if - * no active workkbench page can be determined - */ - private static IWorkbenchPage getActivePage() { - IWorkbenchWindow window= getActiveWorkbenchWindow(); - if (window == null) - return null; - return window.getActivePage(); - } - - /** - * Returns the SWT Shell of the active workbench window or null if - * no workbench window is active. - * - * @return the SWT Shell of the active workbench window, or null if - * no workbench window is active - */ - public static Shell getShell() { - IWorkbenchWindow window= getActiveWorkbenchWindow(); - if (window == null) - return null; - return window.getShell(); - } - - /** - * Registers the given image for being disposed when this plug-in is shutdown. - * - * @param image the image to register for disposal - */ - public static void disposeOnShutdown(Image image) { - if (image != null) - fgDisposeOnShutdownImages.add(image); - } - - /** - * Performs the comparison described by the given input and opens a - * compare editor on the result. - * - * @param input the input on which to open the compare editor - * @param page the workbench page on which to create a new compare editor - * @param editor if not null the input is opened in this editor - * @see CompareEditorInput - */ - public void openCompareEditor(CompareEditorInput input, IWorkbenchPage page, IReusableEditor editor) { - - if (compareResultOK(input)) { - - if (editor != null) { // reuse the given editor - editor.setInput(input); - return; - } - - if (page == null) - page= getActivePage(); - if (page != null) { - // open new CompareEditor on page - try { - page.openEditor(input, COMPARE_EDITOR); - } catch (PartInitException e) { - MessageDialog.openError(getShell(), Utilities.getString("CompareUIPlugin.openEditorError"), e.getMessage()); //$NON-NLS-1$ - } - } else { - MessageDialog.openError(getShell(), - Utilities.getString("CompareUIPlugin.openEditorError"), //$NON-NLS-1$ - Utilities.getString("CompareUIPlugin.noActiveWorkbenchPage")); //$NON-NLS-1$ - } - } - } - - /** - * Performs the comparison described by the given input and opens a - * compare dialog on the result. - * - * @param input the input on which to open the compare editor - * @see CompareEditorInput - */ - public void openCompareDialog(final CompareEditorInput input) { - - if (compareResultOK(input)) { - CompareDialog dialog= new CompareDialog(getShell(), input); - dialog.open(); - } - } - - /* - * @return true if compare result is OK to show, false otherwise - */ - private boolean compareResultOK(CompareEditorInput input) { - final Shell shell= getShell(); - try { - - // run operation in separate thread and make it canceable - PlatformUI.getWorkbench().getProgressService().run(true, true, input); - - String message= input.getMessage(); - if (message != null) { - MessageDialog.openError(shell, Utilities.getString("CompareUIPlugin.compareFailed"), message); //$NON-NLS-1$ - return false; - } - - if (input.getCompareResult() == null) { - MessageDialog.openInformation(shell, Utilities.getString("CompareUIPlugin.dialogTitle"), Utilities.getString("CompareUIPlugin.noDifferences")); //$NON-NLS-2$ //$NON-NLS-1$ - return false; - } - - return true; - - } catch (InterruptedException x) { - // cancelled by user - } catch (InvocationTargetException x) { - MessageDialog.openError(shell, Utilities.getString("CompareUIPlugin.compareFailed"), x.getTargetException().getMessage()); //$NON-NLS-1$ - } - return false; - } - - /* - * Registers an image for the given type. - */ - private static void registerImage(String type, Image image, boolean dispose) { - fgImages.put(normalizeCase(type), image); - if (image != null && dispose) { - fgDisposeOnShutdownImages.add(image); - } - } - - /** - * Registers an image descriptor for the given type. - * - * @param type the type - * @param descriptor the image descriptor - */ - public static void registerImageDescriptor(String type, ImageDescriptor descriptor) { - fgImageDescriptors.put(normalizeCase(type), descriptor); - } - - public static ImageDescriptor getImageDescriptor(String relativePath) { - - URL installURL= null; - if (fgComparePlugin != null) - installURL= fgComparePlugin.getBundle().getEntry("/"); //$NON-NLS-1$ - - if (installURL != null) { - try { - URL url= new URL(installURL, Utilities.getIconPath(null) + relativePath); - return ImageDescriptor.createFromURL(url); - } catch (MalformedURLException e) { - Assert.isTrue(false); - } - } - return null; - } - - /** - * Returns a shared image for the given type, or a generic image if none - * has been registered for the given type. - *

- * Note: Images returned from this method will be automitically disposed - * of when this plug-in shuts down. Callers must not dispose of these - * images themselves. - *

- * - * @param type the type - * @return the image - */ - public static Image getImage(String type) { - - type= normalizeCase(type); - - boolean dispose= false; - Image image= null; - if (type != null) - image= (Image) fgImages.get(type); - if (image == null) { - ImageDescriptor id= (ImageDescriptor) fgImageDescriptors.get(type); - if (id != null) { - image= id.createImage(); - dispose= true; - } - - if (image == null) { - if (fgComparePlugin != null) { - if (ITypedElement.FOLDER_TYPE.equals(type)) { - image= getDefault().getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER); - //image= SharedImages.getImage(ISharedImages.IMG_OBJ_FOLDER); - } else { - image= createWorkbenchImage(type); - dispose= true; - } - } else { - id= (ImageDescriptor) fgImageDescriptors.get(normalizeCase("file")); //$NON-NLS-1$ - image= id.createImage(); - dispose= true; - } - } - if (image != null) - registerImage(type, image, dispose); - } - return image; - } - - /** - * Returns a shared image for the given adaptable. - * This convenience method queries the given adaptable - * for its IWorkbenchAdapter.getImageDescriptor, which it - * uses to create an image if it does not already have one. - *

- * Note: Images returned from this method will be automitically disposed - * of when this plug-in shuts down. Callers must not dispose of these - * images themselves. - *

- * - * @param adaptable the adaptable for which to find an image - * @return an image - */ - public static Image getImage(IAdaptable adaptable) { - if (adaptable != null) { - Object o= adaptable.getAdapter(IWorkbenchAdapter.class); - if (o instanceof IWorkbenchAdapter) { - ImageDescriptor id= ((IWorkbenchAdapter) o).getImageDescriptor(adaptable); - if (id != null) { - Image image= (Image)fgImages2.get(id); - if (image == null) { - image= id.createImage(); - try { - fgImages2.put(id, image); - } catch (NullPointerException ex) { - // NeedWork - } - fgDisposeOnShutdownImages.add(image); - - } - return image; - } - } - } - return null; - } - - private static Image createWorkbenchImage(String type) { - IEditorRegistry er= getDefault().getWorkbench().getEditorRegistry(); - ImageDescriptor id= er.getImageDescriptor("foo." + type); //$NON-NLS-1$ - return id.createImage(); - } - - /** - * Returns an structure creator descriptor for the given type. - * - * @param type the type for which to find a descriptor - * @return a descriptor for the given type, or null if no - * descriptor has been registered - */ - public StructureCreatorDescriptor getStructureCreator(String type) { - initializeRegistries(); - return (StructureCreatorDescriptor) fStructureCreators.search(type); - } - - /** - * Returns a stream merger for the given type. - * - * @param type the type for which to find a stream merger - * @return a stream merger for the given type, or null if no - * stream merger has been registered - */ - public IStreamMerger createStreamMerger(String type) { - initializeRegistries(); - StreamMergerDescriptor descriptor= (StreamMergerDescriptor) fStreamMergers.search(type); - if (descriptor != null) - return descriptor.createStreamMerger(); - return null; - } - - /** - * Returns a stream merger for the given content type. - * - * @param type the type for which to find a stream merger - * @return a stream merger for the given type, or null if no - * stream merger has been registered - */ - public IStreamMerger createStreamMerger(IContentType type) { - initializeRegistries(); - StreamMergerDescriptor descriptor= (StreamMergerDescriptor) fStreamMergers.search(type); - if (descriptor != null) - return descriptor.createStreamMerger(); - return null; - } - - /** - * Returns a structure compare viewer based on an old viewer and an input object. - * If the old viewer is suitable for showing the input, the old viewer - * is returned. Otherwise, the input's type is used to find a viewer descriptor in the registry - * which in turn is used to create a structure compare viewer under the given parent composite. - * If no viewer descriptor can be found null is returned. - * - * @param oldViewer a new viewer is only created if this old viewer cannot show the given input - * @param input the input object for which to find a structure viewer - * @param parent the SWT parent composite under which the new viewer is created - * @param configuration a configuration which is passed to a newly created viewer - * @return the compare viewer which is suitable for the given input object or null - */ - public Viewer findStructureViewer(Viewer oldViewer, ICompareInput input, Composite parent, - CompareConfiguration configuration) { - - if (input.getLeft() == null || input.getRight() == null) // we don't show the structure of additions or deletions - return null; - - // content type search - IContentType ctype= getCommonType(getContentTypes(input)); - if (ctype != null) { - initializeRegistries(); - Viewer viewer= getViewer(fStructureMergeViewers.search(ctype), oldViewer, parent, configuration); - if (viewer != null) - return viewer; - } - - // old style search - String[] types= getTypes(input); - String type= null; - if (isHomogenous(types)) { - type= normalizeCase(types[0]); - initializeRegistries(); - IViewerDescriptor vd= (IViewerDescriptor) fStructureMergeViewers.search(type); - if (vd == null) { - String alias= getStructureViewerAlias(type); - if (alias != null) - vd= (IViewerDescriptor) fStructureMergeViewers.search(alias); - } - if (vd != null) - return vd.createViewer(oldViewer, parent, configuration); - } - - // we didn't found any viewer so far. - // now we try to find a structurecreator for the generic StructureDiffViewer - - StructureCreatorDescriptor scc= null; - initializeRegistries(); - Object desc= fStructureCreators.search(ctype); // search for content type - if (desc instanceof StructureCreatorDescriptor) - scc= (StructureCreatorDescriptor) desc; - if (scc == null && type != null) - scc= getStructureCreator(type); // search for old-style type scheme - if (scc != null) { - IStructureCreator sc= scc.createStructureCreator(); - if (sc != null) { - StructureDiffViewer sdv= new StructureDiffViewer(parent, configuration); - sdv.setStructureCreator(sc); - return sdv; - } - } - return null; - } - - /** - * Returns a content compare viewer based on an old viewer and an input object. - * If the old viewer is suitable for showing the input the old viewer - * is returned. Otherwise the input's type is used to find a viewer descriptor in the registry - * which in turn is used to create a content compare viewer under the given parent composite. - * If no viewer descriptor can be found null is returned. - * - * @param oldViewer a new viewer is only created if this old viewer cannot show the given input - * @param in the input object for which to find a content viewer - * @param parent the SWT parent composite under which the new viewer is created - * @param cc a configuration which is passed to a newly created viewer - * @return the compare viewer which is suitable for the given input object or null - */ - public Viewer findContentViewer(Viewer oldViewer, Object in, Composite parent, CompareConfiguration cc) { - - if (in instanceof IStreamContentAccessor) { - String type= ITypedElement.TEXT_TYPE; - - if (in instanceof ITypedElement) { - ITypedElement tin= (ITypedElement) in; - - IContentType ct= getContentType(tin); - if (ct != null) { - initializeRegistries(); - Viewer viewer= getViewer(fContentViewers.search(ct), oldViewer, parent, cc); - if (viewer != null) - return viewer; - } - - String ty= tin.getType(); - if (ty != null) - type= ty; - } - - initializeRegistries(); - Viewer viewer= getViewer(fContentViewers.search(type), oldViewer, parent, cc); - if (viewer != null) - return viewer; - // fallback - return new SimpleTextViewer(parent); - } - - if (!(in instanceof ICompareInput)) - return null; - - ICompareInput input= (ICompareInput) in; - - IContentType ctype= getCommonType(getContentTypes(input)); - if (ctype != null) { - initializeRegistries(); - Viewer viewer= getViewer(fContentMergeViewers.search(ctype), oldViewer, parent, cc); - if (viewer != null) - return viewer; - } - - String[] types= getTypes(input); - String type= null; - if (isHomogenous(types)) - type= types[0]; - - if (ITypedElement.FOLDER_TYPE.equals(type)) - return null; - - if (type == null) { - int n= 0; - for (int i= 0; i < types.length; i++) - if (!ITypedElement.UNKNOWN_TYPE.equals(types[i])) { - n++; - if (type == null) - type= types[i]; // remember the first known type - } - if (n > 1) // don't use the type if there were more than one - type= null; - } - - if (type != null) { - initializeRegistries(); - Viewer viewer= getViewer(fContentMergeViewers.search(type), oldViewer, parent, cc); - if (viewer != null) - return viewer; - } - - // fallback - String leftType= guessType(input.getLeft()); - String rightType= guessType(input.getRight()); - - if (leftType != null || rightType != null) { - boolean right_text= rightType != null && ITypedElement.TEXT_TYPE.equals(rightType); - boolean left_text= leftType != null && ITypedElement.TEXT_TYPE.equals(leftType); - if ((leftType == null && right_text) || (left_text && rightType == null) || (left_text && right_text)) - type= ITypedElement.TEXT_TYPE; - else - type= BINARY_TYPE; - - initializeRegistries(); - IViewerDescriptor vd= (IViewerDescriptor) fContentMergeViewers.search(type); - if (vd != null) - return vd.createViewer(oldViewer, parent, cc); - } - return null; - } - - private static Viewer getViewer(Object descriptor, Viewer oldViewer, Composite parent, CompareConfiguration cc) { - if (descriptor instanceof IViewerDescriptor) - return ((IViewerDescriptor)descriptor).createViewer(oldViewer, parent, cc); - return null; - } - - private static String[] getTypes(ICompareInput input) { - ITypedElement ancestor= input.getAncestor(); - ITypedElement left= input.getLeft(); - ITypedElement right= input.getRight(); - - ArrayList tmp= new ArrayList(); - if (ancestor != null) { - String type= ancestor.getType(); - if (type != null) - tmp.add(normalizeCase(type)); - } - if (left != null) { - String type= left.getType(); - if (type != null) - tmp.add(normalizeCase(type)); - } - if (right != null) { - String type= right.getType(); - if (type != null) - tmp.add(normalizeCase(type)); - } - return (String[]) tmp.toArray(new String[tmp.size()]); - } - - private static IContentType[] getContentTypes(ICompareInput input) { - ITypedElement ancestor= input.getAncestor(); - ITypedElement left= input.getLeft(); - ITypedElement right= input.getRight(); - - ArrayList tmp= new ArrayList(); - IContentType type= getContentType(ancestor); - if (type != null) - tmp.add(type); - type= getContentType(left); - if (type != null) - tmp.add(type); - type= getContentType(right); - if (type != null) - tmp.add(type); - - return (IContentType[]) tmp.toArray(new IContentType[tmp.size()]); - } - - private static IContentType getContentType(ITypedElement element) { - if (element == null) - return null; - String name= element.getName(); - IContentType[] associated= fgContentTypeManager.findContentTypesFor(name); - if (associated.length > 0) - return associated[0]; - IContentType ct= null; - if (element instanceof IStreamContentAccessor) { - IStreamContentAccessor isa= (IStreamContentAccessor) element; - try { - InputStream is= isa.getContents(); - if (is != null) { - InputStream bis= new BufferedInputStream(is); - try { - ct= fgContentTypeManager.findContentTypeFor(is, name); - } catch (IOException e) { - // silently ignored - } - try { - bis.close(); - } catch (IOException e2) { - // silently ignored - } - } - } catch (CoreException e1) { - // silently ignored - } - } - return ct; - } - - /* - * Returns true if the given types are homogenous. - */ - private static boolean isHomogenous(String[] types) { - switch (types.length) { - case 1: - return true; - case 2: - return types[0].equals(types[1]); - case 3: - return types[0].equals(types[1]) && types[1].equals(types[2]); - } - return false; - } - - /* - * Returns the most specific content type that is common to the given inputs or null. - */ - private static IContentType getCommonType(IContentType[] types) { - Set s= null; - ArrayList l= null; - switch (types.length) { - case 1: - return types[0]; - case 2: - l= new ArrayList(); - s= toSet(l, types[0]); - s.retainAll(toSet(l, types[1])); - break; - case 3: - l= new ArrayList(); - s= toSet(l, types[0]); - s.retainAll(toSet(l, types[1])); - s.retainAll(toSet(l, types[2])); - break; - } - if (s != null && !s.isEmpty()) { - Iterator iter= l.iterator(); - while (iter.hasNext()) { - IContentType ct= (IContentType) iter.next(); - if (s.contains(ct)) - return ct; - } - } - return null; - } - - private static Set toSet(ArrayList l, IContentType ct) { - Set set= new HashSet(); - for (; ct != null; ct= ct.getBaseType()) { - l.add(ct); - set.add(ct); - } - return set; - } - - /* - * Guesses the file type of the given input. - * Returns ITypedElement.TEXT_TYPE if none of the first 10 lines is longer than 1000 bytes. - * Returns ITypedElement.UNKNOWN_TYPE otherwise. - * Returns null if the input isn't an IStreamContentAccessor. - */ - private static String guessType(ITypedElement input) { - if (input instanceof IStreamContentAccessor) { - IStreamContentAccessor sca= (IStreamContentAccessor) input; - InputStream is= null; - try { - is= sca.getContents(); - if (is == null) - return null; - int lineLength= 0; - int lines= 0; - while (lines < 10) { - int c= is.read(); - if (c == -1) // EOF - break; - if (c == '\n' || c == '\r') { // reset line length - lineLength= 0; - lines++; - } else - lineLength++; - if (lineLength > 1000) - return ITypedElement.UNKNOWN_TYPE; - } - return ITypedElement.TEXT_TYPE; - } catch (CoreException ex) { - // be silent and return UNKNOWN_TYPE - } catch (IOException ex) { - // be silent and return UNKNOWN_TYPE - } finally { - if (is != null) { - try { - is.close(); - } catch (IOException ex) { - // silently ignored - } - } - } - return ITypedElement.UNKNOWN_TYPE; - } - return null; - } - - private static String normalizeCase(String s) { - if (NORMALIZE_CASE && s != null) - return s.toUpperCase(); - return s; - } - - //---- alias mgmt - - private String getStructureViewerAlias(String type) { - return (String) getStructureViewerAliases().get(type); - } - - public void addStructureViewerAlias(String type, String alias) { - getStructureViewerAliases().put(normalizeCase(alias), normalizeCase(type)); - } - - private Map getStructureViewerAliases() { - if (fStructureViewerAliases == null) { - fStructureViewerAliases= new Hashtable(10); - String aliases= getPreferenceStore().getString(STRUCTUREVIEWER_ALIASES_PREFERENCE_NAME); - if (aliases != null && aliases.length() > 0) { - StringTokenizer st= new StringTokenizer(aliases, " "); //$NON-NLS-1$ - while (st.hasMoreTokens()) { - String pair= st.nextToken(); - int pos= pair.indexOf('.'); - if (pos > 0) { - String key= pair.substring(0, pos); - String alias= pair.substring(pos+1); - fStructureViewerAliases.put(key, alias); - } - } - } - } - return fStructureViewerAliases; - } - - public void removeAllStructureViewerAliases(String type) { - if (fStructureViewerAliases == null) - return; - String t= normalizeCase(type); - Set entrySet= fStructureViewerAliases.entrySet(); - for (Iterator iter= entrySet.iterator(); iter.hasNext(); ) { - Map.Entry entry= (Map.Entry)iter.next(); - if (entry.getValue().equals(t)) - iter.remove(); - } - } - - /* - * Converts the aliases into a single string before they are stored - * in the preference store. - * The format is: - * '.' ' ' '.' ... - */ - private void rememberAliases(IPreferenceStore ps) { - if (fStructureViewerAliases == null) - return; - StringBuffer buffer= new StringBuffer(); - Iterator iter= fStructureViewerAliases.keySet().iterator(); - while (iter.hasNext()) { - String key= (String) iter.next(); - String alias= (String) fStructureViewerAliases.get(key); - buffer.append(key); - buffer.append('.'); - buffer.append(alias); - buffer.append(' '); - } - ps.setValue(STRUCTUREVIEWER_ALIASES_PREFERENCE_NAME, buffer.toString()); - } - - //---- filters - - public boolean filter(String name, boolean isFolder, boolean isArchive) { - if (fFilter == null) { - fFilter= new CompareFilter(); - final IPreferenceStore ps= getPreferenceStore(); - fFilter.setFilters(ps.getString(ComparePreferencePage.PATH_FILTER)); - fPropertyChangeListener= new IPropertyChangeListener() { - public void propertyChange(PropertyChangeEvent event) { - if (ComparePreferencePage.PATH_FILTER.equals(event.getProperty())) - fFilter.setFilters(ps.getString(ComparePreferencePage.PATH_FILTER)); - } - }; - ps.addPropertyChangeListener(fPropertyChangeListener); - } - return fFilter.filter(name, isFolder, isArchive); - } - - //---- more utilities - - /** - * Returns an array of all editors that have an unsaved content. If the identical content is - * presented in more than one editor, only one of those editor parts is part of the result. - * - * @return an array of all dirty editor parts. - */ - public static IEditorPart[] getDirtyEditors() { - Set inputs= new HashSet(); - List result= new ArrayList(0); - IWorkbench workbench= getDefault().getWorkbench(); - IWorkbenchWindow[] windows= workbench.getWorkbenchWindows(); - for (int i= 0; i < windows.length; i++) { - IWorkbenchPage[] pages= windows[i].getPages(); - for (int x= 0; x < pages.length; x++) { - IEditorPart[] editors= pages[x].getDirtyEditors(); - for (int z= 0; z < editors.length; z++) { - IEditorPart ep= editors[z]; - IEditorInput input= ep.getEditorInput(); - if (!inputs.contains(input)) { - inputs.add(input); - result.add(ep); - } - } - } - } - return (IEditorPart[])result.toArray(new IEditorPart[result.size()]); - } - - public static void logErrorMessage(String message) { - if (message == null) - message= ""; //$NON-NLS-1$ - log(new Status(IStatus.ERROR, getPluginId(), INTERNAL_ERROR, message, null)); - } - - public static void log(Throwable e) { - log(new Status(IStatus.ERROR, getPluginId(), INTERNAL_ERROR, CompareMessages.getString("ComparePlugin.internal_error"), e)); //$NON-NLS-1$ - } - - public static void log(IStatus status) { - getDefault().getLog().log(status); - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithEditionAction.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithEditionAction.java deleted file mode 100644 index f8cef54d1..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithEditionAction.java +++ /dev/null @@ -1,20 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -public class CompareWithEditionAction extends EditionAction { - - public CompareWithEditionAction() { - super(false, "org.eclipse.compare.internal.CompareWithEditionAction"); //$NON-NLS-1$ - this.fHelpContextId= ICompareContextIds.COMPARE_WITH_EDITION_DIALOG; - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithEditionAction.properties b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithEditionAction.properties deleted file mode 100644 index 154531afa..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareWithEditionAction.properties +++ /dev/null @@ -1,38 +0,0 @@ -############################################################################### -# Copyright (c) 2000, 2003 IBM Corporation and others. -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Common Public License v1.0 -# which accompanies this distribution, and is available at -# http://www.eclipse.org/legal/cpl-v10.html -# -# Contributors: -# IBM Corporation - initial API and implementation -############################################################################### - -# @(#)CompareWithEditionAction.properties -# -# Resources for CompareWithEditionAction.java - -title= Compare with Local History - -treeTitleFormat= Local History of ''{0}'' -dateIcon= obj16/day_obj.gif -timeIcon= obj16/resource_obj.gif - -treeFormat= {0} -workspaceTreeFormat= {0} (Workspace File) -parseErrorFormat= {0} (Parse Error) - -editionLabel= Local History ({0}) -workspaceEditionLabel= Workspace File - -targetLabel= Editor Buffer -workspaceTargetLabel= Workspace File - -todayFormat= Today ({0}) -yesterdayFormat= Yesterday ({0}) -dayFormat= {0} - -closeButton.label=Close - -noLocalHistoryError= No local history available for selected resource. diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/DiffImage.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/DiffImage.java deleted file mode 100644 index 1c17ded85..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/DiffImage.java +++ /dev/null @@ -1,78 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.swt.graphics.*; - -import org.eclipse.jface.resource.CompositeImageDescriptor; -import org.eclipse.jface.resource.ImageDescriptor; - -/** - * Combines an image with an overlay. - */ -public class DiffImage extends CompositeImageDescriptor { - - static final int HEIGHT= 16; - - private Image fBaseImage; - private ImageDescriptor fOverlayImage; - private int fWidth; - private boolean fLeft= true; - - public DiffImage(Image base, ImageDescriptor overlay, int w) { - fBaseImage= base; - fOverlayImage= overlay; - fWidth= w; - } - - public DiffImage(Image base, ImageDescriptor overlay, int w, boolean onLeft) { - fBaseImage= base; - fOverlayImage= overlay; - fWidth= w; - fLeft= onLeft; - } - - protected Point getSize() { - return new Point(fWidth, HEIGHT); - } - - protected void drawCompositeImage(int width, int height) { - if (fLeft) { - if (fBaseImage != null) { - ImageData base= fBaseImage.getImageData(); - if (base == null) - base= DEFAULT_IMAGE_DATA; - drawImage(base, fWidth - base.width, 0); - } - - if (fOverlayImage != null) { - ImageData overlay= fOverlayImage.getImageData(); - if (overlay == null) - overlay= DEFAULT_IMAGE_DATA; - drawImage(overlay, 0, (HEIGHT - overlay.height) / 2); - } - } else { - if (fBaseImage != null) { - ImageData base= fBaseImage.getImageData(); - if (base == null) - base= DEFAULT_IMAGE_DATA; - drawImage(base, 0, 0); - } - - if (fOverlayImage != null) { - ImageData overlay= fOverlayImage.getImageData(); - if (overlay == null) - overlay= DEFAULT_IMAGE_DATA; - drawImage(overlay, fWidth - overlay.width, (HEIGHT - overlay.height) / 2); - } - } - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/DocLineComparator.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/DocLineComparator.java deleted file mode 100644 index d1671df31..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/DocLineComparator.java +++ /dev/null @@ -1,202 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.jface.text.*; -import org.eclipse.compare.contentmergeviewer.ITokenComparator; -import org.eclipse.compare.rangedifferencer.IRangeComparator; - -/** - * Implements the IRangeComparator interface for lines in a document. - * A DocLineComparator is used as the input for the RangeDifferencer - * engine to perform a line oriented compare on documents. - *

- * A DocLineComparator doesn't know anything about line separators because - * its notion of lines is solely defined in the underlying IDocument. - */ -public class DocLineComparator implements ITokenComparator { - - private IDocument fDocument; - private int fLineOffset; - private int fLineCount; - private int fLength; - private boolean fIgnoreWhiteSpace; - - /** - * Creates a DocLineComparator for the given document range. - * ignoreWhiteSpace controls whether comparing lines (in method - * rangesEqual) should ignore whitespace. - * - * @param document the document from which the lines are taken - * @param region if non-null only lines within this range are taken - * @param ignoreWhiteSpace if true white space is ignored when comparing lines - */ - public DocLineComparator(IDocument document, IRegion region, boolean ignoreWhiteSpace) { - - fDocument= document; - fIgnoreWhiteSpace= ignoreWhiteSpace; - - fLineOffset= 0; - if (region != null) { - fLength= region.getLength(); - int start= region.getOffset(); - try { - fLineOffset= fDocument.getLineOfOffset(start); - } catch (BadLocationException ex) { - // silently ignored - } - - if (fLength == 0) - fLineCount= 0; - else { - int endLine= fDocument.getNumberOfLines(); - try { - endLine= fDocument.getLineOfOffset(start + fLength); - } catch (BadLocationException ex) { - // silently ignored - } - fLineCount= endLine - fLineOffset + 1; - } - - } else { - fLength= document.getLength(); - fLineCount= fDocument.getNumberOfLines(); - } - } - - /** - * Returns the number of lines in the document. - * - * @return number of lines - */ - public int getRangeCount() { - return fLineCount; - } - - /* (non Javadoc) - * see ITokenComparator.getTokenStart - */ - public int getTokenStart(int line) { - try { - IRegion r= fDocument.getLineInformation(fLineOffset + line); - return r.getOffset(); - } catch (BadLocationException ex) { - return fDocument.getLength(); - } - } - - /* (non Javadoc) - * Returns the length of the given line. - * see ITokenComparator.getTokenLength - */ - public int getTokenLength(int line) { - return getTokenStart(line+1) - getTokenStart(line); - } - - /** - * Returns true if a line given by the first index - * matches a line specified by the other IRangeComparator and index. - * - * @param thisIndex the number of the line within this range comparator - * @param otherComparator the range comparator to compare this with - * @param otherIndex the number of the line within the other comparator - * @return true if the lines are equal - */ - public boolean rangesEqual(int thisIndex, IRangeComparator otherComparator, int otherIndex) { - - if (otherComparator != null && otherComparator.getClass() == getClass()) { - DocLineComparator other= (DocLineComparator) otherComparator; - - if (fIgnoreWhiteSpace) { - String s1= extract(thisIndex); - String s2= other.extract(otherIndex); - //return s1.trim().equals(s2.trim()); - return compare(s1, s2); - } - - int tlen= getTokenLength(thisIndex); - int olen= other.getTokenLength(otherIndex); - if (tlen == olen) { - String s1= extract(thisIndex); - String s2= other.extract(otherIndex); - return s1.equals(s2); - } - } - return false; - } - - /** - * Aborts the comparison if the number of tokens is too large. - * - * @param length a number on which to base the decision whether to return - * true or false - * @param maxLength another number on which to base the decision whether to return - * true or false - * @param other the other IRangeComparator to compare with - * @return true to avoid a too lengthy range comparison - */ - public boolean skipRangeComparison(int length, int maxLength, IRangeComparator other) { - return false; - } - - //---- private methods - - /** - * Extract a single line from the underlying document without the line separator. - * - * @param line the number of the line to extract - * @return the contents of the line as a String - */ - private String extract(int line) { - if (line < fLineCount) { - try { - IRegion r= fDocument.getLineInformation(fLineOffset + line); - return fDocument.get(r.getOffset(), r.getLength()); - } catch(BadLocationException e) { - // silently ignored - } - } - return ""; //$NON-NLS-1$ - } - - private boolean compare(String s1, String s2) { - int l1= s1.length(); - int l2= s2.length(); - int c1= 0, c2= 0; - int i1= 0, i2= 0; - - while (c1 != -1) { - - c1= -1; - while (i1 < l1) { - char c= s1.charAt(i1++); - if (! Character.isWhitespace(c)) { - c1= c; - break; - } - } - - c2= -1; - while (i2 < l2) { - char c= s2.charAt(i2++); - if (! Character.isWhitespace(c)) { - c2= c; - break; - } - } - - if (c1 != c2) - return false; - } - return true; - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/DocumentManager.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/DocumentManager.java deleted file mode 100644 index b2db19190..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/DocumentManager.java +++ /dev/null @@ -1,65 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.util.*; - -import org.eclipse.jface.text.IDocument; - -/** - * No API yet. - */ -public class DocumentManager { - - private static final boolean DEBUG= false; - - private static ArrayList fgKeys= new ArrayList(); - private static ArrayList fgValues= new ArrayList(); - - public static IDocument get(Object o) { - - for (int i= 0; i < fgKeys.size(); i++) { - if (fgKeys.get(i) == o) - return (IDocument) fgValues.get(i); - } - return null; - } - - public static void put(Object o, IDocument document) { - if (DEBUG) System.out.println("DocumentManager.put: " + document); //$NON-NLS-1$ - for (int i= 0; i < fgKeys.size(); i++) { - if (fgKeys.get(i) == o) { - fgValues.set(i, document); - return; - } - } - fgKeys.add(o); - fgValues.add(document); - } - - public static void remove(IDocument document) { - if (document != null) { - if (DEBUG) System.out.println("DocumentManager.remove: " + document); //$NON-NLS-1$ - for (int i= 0; i < fgValues.size(); i++) { - if (fgValues.get(i) == document) { - fgKeys.remove(i); - fgValues.remove(i); - return; - } - } - if (DEBUG) System.out.println("DocumentManager.remove: not found"); //$NON-NLS-1$ - } - } - - public static void dump() { - if (DEBUG) System.out.println("DocumentManager: managed docs:" + fgValues.size()); //$NON-NLS-1$ - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/EditionAction.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/EditionAction.java deleted file mode 100644 index 43c09b13d..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/EditionAction.java +++ /dev/null @@ -1,237 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.util.ResourceBundle; -import java.lang.reflect.InvocationTargetException; - -import org.eclipse.core.resources.*; -import org.eclipse.core.runtime.*; - -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.graphics.Image; - -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.dialogs.ProgressMonitorDialog; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.BadLocationException; - -import org.eclipse.ui.*; -import org.eclipse.ui.part.FileEditorInput; -import org.eclipse.ui.texteditor.ITextEditor; -import org.eclipse.ui.texteditor.IDocumentProvider; -import org.eclipse.ui.actions.WorkspaceModifyOperation; - -import org.eclipse.compare.*; -import org.eclipse.compare.ITypedElement; -import org.eclipse.compare.IStreamContentAccessor; - - -public class EditionAction extends BaseCompareAction { - - /** - * Implements the IStreamContentAccessor and ITypedElement protocols - * for a Document. - */ - class DocumentBufferNode implements ITypedElement, IEncodedStreamContentAccessor { - private static final String UTF_16= "UTF-16"; //$NON-NLS-1$ - private IDocument fDocument; - private IFile fFile; - - DocumentBufferNode(IDocument document, IFile file) { - fDocument= document; - fFile= file; - } - - public String getName() { - return fFile.getName(); - } - - public String getType() { - return fFile.getFileExtension(); - } - - public Image getImage() { - return null; - } - - public InputStream getContents() { - return new ByteArrayInputStream(Utilities.getBytes(fDocument.get(), UTF_16)); - } - - public String getCharset() { - return UTF_16; - } - } - - private String fBundleName; - private boolean fReplaceMode; - protected boolean fPrevious= false; - protected String fHelpContextId; - - EditionAction(boolean replaceMode, String bundleName) { - fReplaceMode= replaceMode; - fBundleName= bundleName; - } - - protected boolean isEnabled(ISelection selection) { - return Utilities.getFiles(selection).length == 1; // we don't support multiple selection for now - } - - protected void run(ISelection selection) { - IFile[] files= Utilities.getFiles(selection); - for (int i= 0; i < files.length; i++) - doFromHistory(files[i]); - } - - private void doFromHistory(final IFile file) { - - ResourceBundle bundle= ResourceBundle.getBundle(fBundleName); - String title= Utilities.getString(bundle, "title"); //$NON-NLS-1$ - - Shell parentShell= CompareUIPlugin.getShell(); - - IFileState states[]= null; - try { - states= file.getHistory(null); - } catch (CoreException ex) { - MessageDialog.openError(parentShell, title, ex.getMessage()); - return; - } - - if (states == null || states.length <= 0) { - String msg= Utilities.getString(bundle, "noLocalHistoryError"); //$NON-NLS-1$ - MessageDialog.openInformation(parentShell, title, msg); - return; - } - - ITypedElement base= new ResourceNode(file); - - IDocument document= getDocument(file); - ITypedElement target= base; - if (document != null) - target= new DocumentBufferNode(document, file); - - ITypedElement[] editions= new ITypedElement[states.length+1]; - editions[0]= base; - for (int i= 0; i < states.length; i++) - editions[i+1]= new HistoryItem(base, states[i]); - - EditionSelectionDialog d= new EditionSelectionDialog(parentShell, bundle); - d.setEditionTitleArgument(file.getName()); - d.setEditionTitleImage(CompareUIPlugin.getImage(file)); - //d.setHideIdenticalEntries(false); - if (fHelpContextId != null) - d.setHelpContextId(fHelpContextId); - - if (fReplaceMode) { - - ITypedElement ti= null; - if (fPrevious) - ti= d.selectPreviousEdition(target, editions, null); - else - ti= d.selectEdition(target, editions, null); - - if (ti instanceof IStreamContentAccessor) { - IStreamContentAccessor sa= (IStreamContentAccessor)ti; - - if (Utilities.validateResource(file, parentShell, title)) { - try { - - if (document != null) - updateDocument(document, sa); - else - updateWorkspace(bundle, parentShell, sa, file); - - } catch (InterruptedException x) { - // Do nothing. Operation has been canceled by user. - - } catch (InvocationTargetException x) { - String reason= x.getTargetException().getMessage(); - MessageDialog.openError(parentShell, title, Utilities.getFormattedString(bundle, "replaceError", reason)); //$NON-NLS-1$ - } - } - } - } else { - d.setCompareMode(true); - - d.selectEdition(target, editions, null); - } - } - - private void updateWorkspace(final ResourceBundle bundle, Shell shell, - final IStreamContentAccessor sa, final IFile file) - throws InvocationTargetException, InterruptedException { - WorkspaceModifyOperation operation= new WorkspaceModifyOperation() { - public void execute(IProgressMonitor pm) throws InvocationTargetException { - try { - String taskName= Utilities.getString(bundle, "taskName"); //$NON-NLS-1$ - pm.beginTask(taskName, IProgressMonitor.UNKNOWN); - file.setContents(sa.getContents(), false, true, pm); - } catch (CoreException e) { - throw new InvocationTargetException(e); - } finally { - pm.done(); - } - } - }; - - ProgressMonitorDialog pmdialog= new ProgressMonitorDialog(shell); - pmdialog.run(false, true, operation); - } - - private void updateDocument(IDocument document, IStreamContentAccessor sa) throws InvocationTargetException { - try { - String text= Utilities.readString(sa); - document.replace(0, document.getLength(), text); - } catch (CoreException e) { - throw new InvocationTargetException(e); - } catch (BadLocationException e) { - throw new InvocationTargetException(e); - } - } - - private IDocument getDocument(IFile file) { - IWorkbench wb= PlatformUI.getWorkbench(); - if (wb == null) - return null; - IWorkbenchWindow[] ws= wb.getWorkbenchWindows(); - if (ws == null) - return null; - - FileEditorInput test= new FileEditorInput(file); - - for (int i= 0; i < ws.length; i++) { - IWorkbenchWindow w= ws[i]; - IWorkbenchPage[] wps= w.getPages(); - if (wps != null) { - for (int j= 0; j < wps.length; j++) { - IWorkbenchPage wp= wps[j]; - IEditorPart ep= wp.findEditor(test); - if (ep instanceof ITextEditor) { - ITextEditor te= (ITextEditor) ep; - IDocumentProvider dp= te.getDocumentProvider(); - if (dp != null) { - IDocument doc= dp.getDocument(ep); - if (doc != null) - return doc; - } - } - } - } - } - return null; - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ExceptionHandler.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ExceptionHandler.java deleted file mode 100644 index 58d12b4fb..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ExceptionHandler.java +++ /dev/null @@ -1,133 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.io.StringWriter; -import java.lang.reflect.InvocationTargetException; - -import org.eclipse.swt.widgets.Shell; - -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; - -import org.eclipse.jface.dialogs.ErrorDialog; -import org.eclipse.jface.dialogs.MessageDialog; - -/** - * The default exception handler shows an error dialog when one of its handle methods - * is called. If the passed exception is a CoreException an error dialog - * pops up showing the exception's status information. For a InvocationTargetException - * a normal message dialog pops up showing the exception's message. Additionally the exception - * is written to the platform log. - */ -public class ExceptionHandler { - - private static ExceptionHandler fgInstance= new ExceptionHandler(); - - /* - * Logs the given exception using the platform's logging mechanism. The exception is - * logged as an error with the error code JavaStatusConstants.INTERNAL_ERROR. - */ - public static void log(Throwable t, String message) { - CompareUIPlugin.log(new Status(IStatus.ERROR, CompareUIPlugin.getPluginId(), - CompareUIPlugin.INTERNAL_ERROR, message, t)); - } - - /** - * Handles the given CoreException. The workbench shell is used as a parent - * for the dialog window. - * - * @param e the CoreException to be handled - * @param title the dialog window's window title - * @param message message to be displayed by the dialog window - */ - public static void handle(CoreException e, String title, String message) { - handle(e, CompareUIPlugin.getShell(), title, message); - } - - /** - * Handles the given CoreException. - * - * @param e the CoreException to be handled - * @param parent the dialog window's parent shell - * @param title the dialog window's window title - * @param message message to be displayed by the dialog window - */ - public static void handle(CoreException e, Shell parent, String title, String message) { - fgInstance.perform(e, parent, title, message); - } - - /** - * Handles the given InvocationTargetException. The workbench shell is used - * as a parent for the dialog window. - * - * @param e the InvocationTargetException to be handled - * @param title the dialog window's window title - * @param message message to be displayed by the dialog window - */ - public static void handle(InvocationTargetException e, String title, String message) { - handle(e, CompareUIPlugin.getShell(), title, message); - } - - /** - * Handles the given InvocationTargetException. - * - * @param e the InvocationTargetException to be handled - * @param parent the dialog window's parent shell - * @param title the dialog window's window title - * @param message message to be displayed by the dialog window - */ - public static void handle(InvocationTargetException e, Shell parent, String title, String message) { - fgInstance.perform(e, parent, title, message); - } - - //---- Hooks for subclasses to control exception handling ------------------------------------ - - protected void perform(CoreException e, Shell shell, String title, String message) { - CompareUIPlugin.log(e); - IStatus status= e.getStatus(); - if (status != null) { - ErrorDialog.openError(shell, title, message, status); - } else { - displayMessageDialog(e, e.getMessage(), shell, title, message); - } - } - - protected void perform(InvocationTargetException e, Shell shell, String title, String message) { - Throwable target= e.getTargetException(); - if (target instanceof CoreException) { - perform((CoreException)target, shell, title, message); - } else { - CompareUIPlugin.log(e); - if (e.getMessage() != null && e.getMessage().length() > 0) { - displayMessageDialog(e, e.getMessage(), shell, title, message); - } else { - displayMessageDialog(e, target.getMessage(), shell, title, message); - } - } - } - - //---- Helper methods ----------------------------------------------------------------------- - - private void displayMessageDialog(Throwable t, String exceptionMessage, Shell shell, String title, String message) { - StringWriter msg= new StringWriter(); - if (message != null) { - msg.write(message); - msg.write("\n\n"); //$NON-NLS-1$ - } - if (exceptionMessage == null || exceptionMessage.length() == 0) - msg.write(CompareMessages.getString("ExceptionDialog.seeErrorLogMessage")); //$NON-NLS-1$ - else - msg.write(exceptionMessage); - MessageDialog.openError(shell, title, msg.toString()); - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ICompareContextIds.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ICompareContextIds.java deleted file mode 100644 index a6df241e4..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ICompareContextIds.java +++ /dev/null @@ -1,53 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.compare.CompareUI; - -/** - * Help context ids for the Compare UI. - *

- * This interface contains constants only; it is not intended to be implemented - * or extended. - *

- * - */ -public interface ICompareContextIds { - - public static final String PREFIX= CompareUI.PLUGIN_ID + '.'; - - // Dialogs - public static final String EDITION_DIALOG= PREFIX + "edition_dialog_context"; //$NON-NLS-1$ - - public static final String COMPARE_EDITOR= PREFIX + "compare_editor_context"; //$NON-NLS-1$ - public static final String PATCH_INPUT_WIZARD_PAGE= PREFIX + "patch_input_wizard_page_context"; //$NON-NLS-1$ - public static final String PATCH_PREVIEW_WIZARD_PAGE= PREFIX + "patch_preview_wizard_page_context"; //$NON-NLS-1$ - public static final String ADD_FROM_HISTORY_DIALOG= PREFIX + "add_from_history_dialog_context"; //$NON-NLS-1$ - public static final String COMPARE_DIALOG= PREFIX + "compare_dialog_context"; //$NON-NLS-1$ - public static final String COMPARE_WITH_EDITION_DIALOG= PREFIX + "compare_with_edition_dialog_context"; //$NON-NLS-1$ - public static final String REPLACE_WITH_EDITION_DIALOG= PREFIX + "replace_with_edition_dialog_context"; //$NON-NLS-1$ - - // Viewer - public static final String TEXT_MERGE_VIEW= PREFIX + "text_merge_view_context"; //$NON-NLS-1$ - public static final String IMAGE_COMPARE_VIEW= PREFIX + "image_compare_view_context"; //$NON-NLS-1$ - public static final String BINARY_COMPARE_VIEW= PREFIX + "binary_compare_view_context"; //$NON-NLS-1$ - public static final String DIFF_VIEW= PREFIX + "diff_view_context"; //$NON-NLS-1$ - - // Actions - public static final String GLOBAL_NEXT_DIFF_ACTION= PREFIX + "global_next_diff_action_context"; //$NON-NLS-1$ - public static final String GLOBAL_PREVIOUS_DIFF_ACTION= PREFIX + "global_previous_diff_action_context"; //$NON-NLS-1$ - public static final String NEXT_DIFF_ACTION= PREFIX + "next_diff_action_context"; //$NON-NLS-1$ - public static final String PREVIOUS_DIFF_ACTION= PREFIX + "previous_diff_action_context"; //$NON-NLS-1$ - public static final String IGNORE_WHITESPACE_ACTION= PREFIX + "ignore_whitespace_action_context"; //$NON-NLS-1$ - - // Preference page - public static final String COMPARE_PREFERENCE_PAGE= PREFIX + "compare_preference_page_context"; //$NON-NLS-1$ -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/INavigatable.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/INavigatable.java deleted file mode 100644 index eab7f523d..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/INavigatable.java +++ /dev/null @@ -1,21 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -public interface INavigatable { - - static final String NAVIGATOR_PROPERTY= "org.eclipse.compare.internal.Navigator"; //$NON-NLS-1$ - - /* - * Returns true if at end or beginning. - */ - boolean gotoDifference(boolean next); -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/IOpenable.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/IOpenable.java deleted file mode 100644 index 013885909..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/IOpenable.java +++ /dev/null @@ -1,24 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -/* - * Fix for http://dev.eclipse.org/bugs/show_bug.cgi?id=20106 - */ -public interface IOpenable { - - static final String OPENABLE_PROPERTY= "org.eclipse.compare.internal.Openable"; //$NON-NLS-1$ - - /** - * Opens the selected element - */ - void openSelected(); -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/IResourceProvider.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/IResourceProvider.java deleted file mode 100644 index 359d6a293..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/IResourceProvider.java +++ /dev/null @@ -1,23 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.core.resources.IResource; - -public interface IResourceProvider { - - /** - * Returns the corresponding resource for this object or null. - * - * @return the corresponding resource or null - */ - IResource getResource(); -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ISavable.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ISavable.java deleted file mode 100644 index a15db7c68..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ISavable.java +++ /dev/null @@ -1,19 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.CoreException; - -public interface ISavable { - - void save(IProgressMonitor pm) throws CoreException; -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/IViewerDescriptor.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/IViewerDescriptor.java deleted file mode 100644 index 2dda66e0d..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/IViewerDescriptor.java +++ /dev/null @@ -1,41 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.swt.widgets.Composite; - -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.compare.CompareConfiguration; - -/** - * A factory object for creating a Viewers from a descriptor. - *

- * It is used when registering a viewer for a specific type - * in CompareUIPlugin.registerContentViewerDescriptor and - * in CompareUIPlugin.registerStructureViewerDescriptor. - * - * @see org.eclipse.compare.structuremergeviewer.IStructureCreator - * @see CompareUIPlugin - */ -public interface IViewerDescriptor { - - /** - * Creates a new viewer from this descriptor under the given STW parent control. - * If the current viewer has the same type as a new viewer - * the implementation of this method is free to return the current viewer instead. - * - * @param currentViewer the current viewer which is going to be replaced with a new viewer. - * @param parent the SWT parent control under which the new viewer has to be created. - * @param config a compare configuration the new viewer might be interested in. - * @return a new viewer or the current viewer. - */ - Viewer createViewer(Viewer currentViewer, Composite parent, CompareConfiguration config); -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/IgnoreWhiteSpaceAction.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/IgnoreWhiteSpaceAction.java deleted file mode 100644 index b6b0fa14d..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/IgnoreWhiteSpaceAction.java +++ /dev/null @@ -1,26 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.util.ResourceBundle; - -import org.eclipse.compare.*; - -/** - * Toggles the ICompareConfiguration.IGNORE_WS property of an - * ICompareConfiguration. - */ -public class IgnoreWhiteSpaceAction extends ChangePropertyAction { - - public IgnoreWhiteSpaceAction(ResourceBundle bundle, CompareConfiguration cc) { - super(bundle, cc, "action.IgnoreWhiteSpace.", CompareConfiguration.IGNORE_WHITESPACE); //$NON-NLS-1$ - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageCanvas.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageCanvas.java deleted file mode 100644 index 7a9266b49..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageCanvas.java +++ /dev/null @@ -1,139 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.swt.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.*; - -/** - * A Canvas showing a single centered SWT Image. - * If the Image is larger than the Canvas, - * Scrollbars will appear. - */ -class ImageCanvas extends Canvas { - - private Image fImage; - - /* - * Create a new ImageCanvas with the given SWT stylebits. - * (SWT.H_SCROLL and SWT.V_SCROLL are automtically added). - */ - public ImageCanvas(Composite parent, int style) { - super(parent, style | SWT.H_SCROLL | SWT.V_SCROLL); - - ScrollBar sb= getHorizontalBar(); - sb.setIncrement(20); - sb.addListener(SWT.Selection, new Listener() { - public void handleEvent(Event e) { - repaint(); - } - }); - - sb= getVerticalBar(); - sb.setIncrement(20); - sb.addListener(SWT.Selection, new Listener() { - public void handleEvent(Event e) { - repaint(); - } - }); - - addListener(SWT.Resize, new Listener() { - public void handleEvent(Event e) { - updateScrollbars(); - } - }); - - addListener(SWT.Paint, new Listener() { - public void handleEvent(Event event) { - paint(event.gc); - } - }); - } - - /* - * Set the SWT Image to use as the ImageCanvas contents. - */ - public void setImage(Image img) { - fImage= img; - - if (!isDisposed()) { - getHorizontalBar().setSelection(0); - getVerticalBar().setSelection(0); - updateScrollbars(); - getParent().layout(); - redraw(); - } - } - - public void repaint() { - if (!isDisposed()) { - GC gc= new GC(this); - paint(gc); - gc.dispose(); - } - } - - void paint(GC gc) { - if (fImage != null) { - Rectangle bounds= fImage.getBounds(); - Rectangle clientArea= getClientArea(); - - int x; - if (bounds.width < clientArea.width) - x= (clientArea.width - bounds.width) / 2; - else - x= -getHorizontalBar().getSelection(); - - int y; - if (bounds.height < clientArea.height) - y= (clientArea.height - bounds.height) / 2; - else - y= -getVerticalBar().getSelection(); - - gc.drawImage(fImage, x, y); - } - } - - /** - * @private - */ - void updateScrollbars() { - Rectangle bounds= fImage != null ? fImage.getBounds() : new Rectangle(0, 0, 0, 0); - Point size= getSize(); - Rectangle clientArea= getClientArea(); - - ScrollBar horizontal= getHorizontalBar(); - if (bounds.width <= clientArea.width) { - horizontal.setVisible(false); - horizontal.setSelection(0); - } else { - horizontal.setPageIncrement(clientArea.width - horizontal.getIncrement()); - int max= bounds.width + (size.x - clientArea.width); - horizontal.setMaximum(max); - horizontal.setThumb(size.x > max ? max : size.x); - horizontal.setVisible(true); - } - - ScrollBar vertical= getVerticalBar(); - if (bounds.height <= clientArea.height) { - vertical.setVisible(false); - vertical.setSelection(0); - } else { - vertical.setPageIncrement(clientArea.height - vertical.getIncrement()); - int max= bounds.height + (size.y - clientArea.height); - vertical.setMaximum(max); - vertical.setThumb(size.y > max ? max : size.y); - vertical.setVisible(true); - } - } - -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewer.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewer.java deleted file mode 100644 index fd733547a..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewer.java +++ /dev/null @@ -1,145 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.io.InputStream; -import java.io.IOException; -import java.util.ResourceBundle; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.SWTException; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.ui.help.WorkbenchHelp; - -import org.eclipse.core.runtime.CoreException; - -import org.eclipse.compare.*; -import org.eclipse.compare.contentmergeviewer.ContentMergeViewer; - -/** - */ -public class ImageMergeViewer extends ContentMergeViewer { - - private static final String BUNDLE_NAME= "org.eclipse.compare.internal.ImageMergeViewerResources"; //$NON-NLS-1$ - - private Object fLeftImage; - private Object fRightImage; - - private ImageCanvas fAncestor; - private ImageCanvas fLeft; - private ImageCanvas fRight; - - - public ImageMergeViewer(Composite parent, int styles, CompareConfiguration mp) { - super(styles, ResourceBundle.getBundle(BUNDLE_NAME), mp); - - WorkbenchHelp.setHelp(parent, ICompareContextIds.IMAGE_COMPARE_VIEW); - - buildControl(parent); - String title= Utilities.getString(getResourceBundle(), "title"); //$NON-NLS-1$ - getControl().setData(CompareUI.COMPARE_VIEWER_TITLE, title); - } - - protected void updateContent(Object ancestor, Object left, Object right) { - - setInput(fAncestor, ancestor); - - fLeftImage= left; - setInput(fLeft, left); - - fRightImage= right; - setInput(fRight, right); - } - - /* - * We can't modify the contents of either side we just return null. - */ - protected byte[] getContents(boolean left) { - return null; - } - - public void createControls(Composite composite) { - fAncestor= new ImageCanvas(composite, SWT.NO_FOCUS); - fLeft= new ImageCanvas(composite, SWT.NO_FOCUS); - fRight= new ImageCanvas(composite, SWT.NO_FOCUS); - } - - private static void setInput(ImageCanvas canvas, Object input) { - if (canvas != null) { - - InputStream stream= null; - if (input instanceof IStreamContentAccessor) { - IStreamContentAccessor sca= (IStreamContentAccessor) input; - if (sca != null) { - try { - stream= sca.getContents(); - } catch (CoreException ex) { - // NeedWork - } - } - } - - Image image= null; - Display display= canvas.getDisplay(); - if (stream != null) { - try { - image= new Image(display, stream); - } catch (SWTException ex) { - // silently ignored - } - } - - canvas.setImage(image); - if (image != null) { - canvas.setBackground(display.getSystemColor(SWT.COLOR_LIST_BACKGROUND)); - } else { - canvas.setBackground(null); - } - - if (stream != null) { - try { - stream.close(); - } catch (IOException ex) { - // silently ignored - } - } - } - } - - protected void handleResizeAncestor(int x, int y, int width, int height) { - if (width > 0) { - fAncestor.setVisible(true); - fAncestor.setBounds(x, y, width, height); - } else { - fAncestor.setVisible(false); - } - } - - protected void handleResizeLeftRight(int x, int y, int width1, int centerWidth, int width2, int height) { - fLeft.setBounds(x, y, width1, height); - fRight.setBounds(x+width1+centerWidth, y, width2, height); - } - - protected void copy(boolean leftToRight) { - if (leftToRight) { - fRightImage= fLeftImage; - setInput(fRight, fRightImage); - setRightDirty(true); - } else { - fLeftImage= fRightImage; - setInput(fLeft, fLeftImage); - setLeftDirty(true); - } - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewerCreator.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewerCreator.java deleted file mode 100644 index ae0ab7813..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewerCreator.java +++ /dev/null @@ -1,30 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Composite; - -import org.eclipse.compare.*; -import org.eclipse.jface.viewers.Viewer; - -/** - * A factory object for the ImageMergeViewer. - * This indirection is necessary because only objects with a default - * constructor can be created via an extension point - * (this precludes Viewers). - */ -public class ImageMergeViewerCreator implements IViewerCreator { - - public Viewer createViewer(Composite parent, CompareConfiguration mp) { - return new ImageMergeViewer(parent, SWT.NULL, mp); - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewerResources.properties b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewerResources.properties deleted file mode 100644 index cb23466b0..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ImageMergeViewerResources.properties +++ /dev/null @@ -1,32 +0,0 @@ -############################################################################### -# Copyright (c) 2000, 2003 IBM Corporation and others. -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Common Public License v1.0 -# which accompanies this distribution, and is available at -# http://www.eclipse.org/legal/cpl-v10.html -# -# Contributors: -# IBM Corporation - initial API and implementation -############################################################################### - -# @(#)ImageMergeViewerResources.properties -# -# Resource strings for ImageMergeViewer.java - -title= Image Compare - -##################################################### -# Actions -##################################################### - -action.CopyLeftToRight.label= Copy Left to Right -action.CopyLeftToRight.tooltip= Copy Image from Left to Right -action.CopyLeftToRight.image= elcl16/copy_r_co.gif - -action.CopyRightToLeft.label= Copy Right to Left -action.CopyRightToLeft.tooltip= Copy Image from Right to Left -action.CopyRightToLeft.image= elcl16/copy_l_co.gif - -action.EnableAncestor.label= Enable Ancestor Pane -action.EnableAncestor.tooltip= Control Visibility of Ancestor Pane -action.EnableAncestor.image= elcl16/ancestorpane_co.gif diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ListContentProvider.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ListContentProvider.java deleted file mode 100644 index 8de56aa1d..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ListContentProvider.java +++ /dev/null @@ -1,49 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.util.List; - -import org.eclipse.jface.viewers.IStructuredContentProvider; -import org.eclipse.jface.viewers.Viewer; - -/** - * A specialized content provider to show a list of editor parts. - */ -public class ListContentProvider implements IStructuredContentProvider { - List fContents; - - public ListContentProvider() { - // nothing to do - } - - public Object[] getElements(Object input) { - if (fContents != null && fContents == input) - return fContents.toArray(); - return new Object[0]; - } - - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - if (newInput instanceof List) - fContents= (List)newInput; - else - fContents= null; - // we use a fixed set. - } - - public void dispose() { - // empty default implementation - } - - public boolean isDeleted(Object o) { - return fContents != null && !fContents.contains(o); - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ListDialog.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ListDialog.java deleted file mode 100644 index 5df991bc3..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ListDialog.java +++ /dev/null @@ -1,90 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.widgets.*; - -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.viewers.*; - -import org.eclipse.ui.dialogs.SelectionDialog; - -public class ListDialog extends SelectionDialog { - - private IStructuredContentProvider fContentProvider; - private ILabelProvider fLabelProvider; - private Object fInput; - private TableViewer fTableViewer; - private boolean fAddCancelButton; - - public ListDialog(Shell parent) { - super(parent); - fAddCancelButton= false; - } - - public void setInput(Object input) { - fInput= input; - } - - public void setContentProvider(IStructuredContentProvider sp){ - fContentProvider= sp; - } - - public void setLabelProvider(ILabelProvider lp){ - fLabelProvider= lp; - } - - public void setAddCancelButton(boolean addCancelButton) { - fAddCancelButton= addCancelButton; - } - - public TableViewer getTableViewer(){ - return fTableViewer; - } - - public boolean hasFilters(){ - return fTableViewer.getFilters() != null && fTableViewer.getFilters().length != 0; - } - - public void create() { - setShellStyle(SWT.DIALOG_TRIM | SWT.RESIZE); - super.create(); - } - - protected void createButtonsForButtonBar(Composite parent) { - if (! fAddCancelButton) - createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); - else - super.createButtonsForButtonBar(parent); - } - - protected Control createDialogArea(Composite container) { - Composite parent= (Composite) super.createDialogArea(container); - createMessageArea(parent); - fTableViewer= new TableViewer(parent, getTableStyle()); - fTableViewer.setContentProvider(fContentProvider); - Table table= fTableViewer.getTable(); - fTableViewer.setLabelProvider(fLabelProvider); - fTableViewer.setInput(fInput); - GridData gd= new GridData(GridData.FILL_BOTH); - gd.heightHint= convertHeightInCharsToPixels(15); - gd.widthHint= convertWidthInCharsToPixels(55); - table.setLayoutData(gd); - applyDialogFont(parent); - return parent; - } - - protected int getTableStyle() { - return SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER; - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeSourceViewer.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeSourceViewer.java deleted file mode 100644 index d162414d7..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeSourceViewer.java +++ /dev/null @@ -1,410 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.util.*; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.StyledText; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.graphics.Font; - -import org.eclipse.jface.action.*; -import org.eclipse.jface.viewers.*; -import org.eclipse.jface.text.*; -import org.eclipse.jface.text.source.*; - -import org.eclipse.jface.viewers.SelectionChangedEvent; -/** - * Extends the JFace SourceViewer with some convenience methods. - */ -public class MergeSourceViewer extends SourceViewer - implements ISelectionChangedListener, ITextListener, IMenuListener { - - public static final String UNDO_ID= "undo"; //$NON-NLS-1$ - public static final String REDO_ID= "redo"; //$NON-NLS-1$ - public static final String CUT_ID= "cut"; //$NON-NLS-1$ - public static final String COPY_ID= "copy"; //$NON-NLS-1$ - public static final String PASTE_ID= "paste"; //$NON-NLS-1$ - public static final String DELETE_ID= "delete"; //$NON-NLS-1$ - public static final String SELECT_ALL_ID= "selectAll"; //$NON-NLS-1$ - public static final String SAVE_ID= "save"; //$NON-NLS-1$ - - class TextOperationAction extends MergeViewerAction { - - private int fOperationCode; - - TextOperationAction(int operationCode, boolean mutable, boolean selection, boolean content) { - super(mutable, selection, content); - fOperationCode= operationCode; - update(); - } - - public void run() { - if (isEnabled()) - doOperation(fOperationCode); - } - - public boolean isEnabled() { - return fOperationCode != -1 && canDoOperation(fOperationCode); - } - - public void update() { - this.setEnabled(isEnabled()); - } - } - - private ResourceBundle fResourceBundle; - private Position fRegion; - private boolean fEnabled= true; - private HashMap fActions= new HashMap(); - private IDocument fRememberedDocument; - - private boolean fAddSaveAction= true; - - - public MergeSourceViewer(Composite parent, ResourceBundle bundle) { - super(parent, null, SWT.H_SCROLL + SWT.V_SCROLL); - - fResourceBundle= bundle; - - MenuManager menu= new MenuManager(); - menu.setRemoveAllWhenShown(true); - menu.addMenuListener(this); - StyledText te= getTextWidget(); - te.setMenu(menu.createContextMenu(te)); - } - - public void rememberDocument(IDocument doc) { -// if (doc != null && fRememberedDocument != null) { -// System.err.println("MergeSourceViewer.rememberDocument: fRememberedDocument != null: shouldn't happen"); //$NON-NLS-1$ -// } - fRememberedDocument= doc; - } - - public IDocument getRememberedDocument() { - return fRememberedDocument; - } - - public void hideSaveAction() { - fAddSaveAction= false; - } - - public void setFont(Font font) { - StyledText te= getTextWidget(); - if (te != null) - te.setFont(font); - } - - public void setBackgroundColor(Color color) { - StyledText te= getTextWidget(); - if (te != null) - te.setBackground(color); - } - - public void setEnabled(boolean enabled) { - if (enabled != fEnabled) { - fEnabled= enabled; - StyledText c= getTextWidget(); - if (c != null) { - c.setEnabled(enabled); - Display d= c.getDisplay(); - c.setBackground(enabled ? d.getSystemColor(SWT.COLOR_LIST_BACKGROUND) : null); - } - } - } - - public boolean getEnabled() { - return fEnabled; - } - - public void setRegion(Position region) { - fRegion= region; - } - - public Position getRegion() { - return fRegion; - } - - public boolean isControlOkToUse() { - StyledText t= getTextWidget(); - return t != null && !t.isDisposed(); - } - - public void setSelection(Position position) { - if (position != null) - setSelectedRange(position.getOffset(), position.getLength()); - } - - public void setLineBackground(Position position, Color c) { - StyledText t= getTextWidget(); - if (t != null && !t.isDisposed()) { - Point region= new Point(0, 0); - getLineRange(position, region); - - region.x-= getDocumentRegionOffset(); - - try { - t.setLineBackground(region.x, region.y, c); - } catch (IllegalArgumentException ex) { - // silently ignored - } - } - } - - public void resetLineBackground() { - StyledText t= getTextWidget(); - if (t != null && !t.isDisposed()) { - int lines= getLineCount(); - t.setLineBackground(0, lines, null); - } - } - - /* - * Returns number of lines in document region. - */ - public int getLineCount() { - IRegion region= getVisibleRegion(); - - int length= region.getLength(); - if (length == 0) - return 0; - - IDocument doc= getDocument(); - int startLine= 0; - int endLine= 0; - - int start= region.getOffset(); - try { - startLine= doc.getLineOfOffset(start); - } catch(BadLocationException ex) { - // silently ignored - } - try { - endLine= doc.getLineOfOffset(start+length); - } catch(BadLocationException ex) { - // silently ignored - } - - return endLine-startLine+1; - } - - public int getViewportLines() { - StyledText te= getTextWidget(); - Rectangle clArea= te.getClientArea(); - if (!clArea.isEmpty()) - return clArea.height / te.getLineHeight(); - return 0; - } - - public int getViewportHeight() { - StyledText te= getTextWidget(); - Rectangle clArea= te.getClientArea(); - if (!clArea.isEmpty()) - return clArea.height; - return 0; - } - - /* - * Returns lines - */ - public int getDocumentRegionOffset() { - int start= getVisibleRegion().getOffset(); - IDocument doc= getDocument(); - if (doc != null) { - try { - return doc.getLineOfOffset(start); - } catch(BadLocationException ex) { - // silently ignored - } - } - return 0; - } - - public int getVerticalScrollOffset() { - StyledText st= getTextWidget(); - int lineHeight= st.getLineHeight(); - return getTopInset() - ((getDocumentRegionOffset()*lineHeight) + st.getTopPixel()); - } - - /* - * Returns the start line and the number of lines which correspond to the given position. - * Starting line number is 0 based. - */ - public Point getLineRange(Position p, Point region) { - - IDocument doc= getDocument(); - - if (p == null || doc == null) { - region.x= 0; - region.y= 0; - return region; - } - - int start= p.getOffset(); - int length= p.getLength(); - - int startLine= 0; - try { - startLine= doc.getLineOfOffset(start); - } catch (BadLocationException e) { - // silently ignored - } - - int lineCount= 0; - - if (length == 0) { -// // if range length is 0 and if range starts a new line -// try { -// if (start == doc.getLineStartOffset(startLine)) { -// lines--; -// } -// } catch (BadLocationException e) { -// lines--; -// } - - } else { - int endLine= 0; - try { - endLine= doc.getLineOfOffset(start + length - 1); // why -1? - } catch (BadLocationException e) { - // silently ignored - } - lineCount= endLine-startLine+1; - } - - region.x= startLine; - region.y= lineCount; - return region; - } - - /* - * Scroll TextPart to the given line. - */ - public void vscroll(int line) { - - int srcViewSize= getLineCount(); - int srcExtentSize= getViewportLines(); - - if (srcViewSize > srcExtentSize) { - - if (line < 0) - line= 0; - - int cp= getTopIndex(); - if (cp != line) - setTopIndex(line + getDocumentRegionOffset()); - } - } - - public void addAction(String actionId, MergeViewerAction action) { - fActions.put(actionId, action); - } - - public MergeViewerAction getAction(String actionId) { - MergeViewerAction action= (MergeViewerAction) fActions.get(actionId); - if (action == null) { - action= createAction(actionId); - if (action == null) - return null; - - if (action.isContentDependent()) - addTextListener(this); - if (action.isSelectionDependent()) - addSelectionChangedListener(this); - - Utilities.initAction(action, fResourceBundle, "action." + actionId + "."); //$NON-NLS-1$ //$NON-NLS-2$ - fActions.put(actionId, action); - } - if (action.isEditableDependent() && !isEditable()) - return null; - return action; - } - - protected MergeViewerAction createAction(String actionId) { - if (UNDO_ID.equals(actionId)) - return new TextOperationAction(UNDO, true, false, true); - if (REDO_ID.equals(actionId)) - return new TextOperationAction(REDO, true, false, true); - if (CUT_ID.equals(actionId)) - return new TextOperationAction(CUT, true, true, false); - if (COPY_ID.equals(actionId)) - return new TextOperationAction(COPY, false, true, false); - if (PASTE_ID.equals(actionId)) - return new TextOperationAction(PASTE, true, false, false); - if (DELETE_ID.equals(actionId)) - return new TextOperationAction(DELETE, true, false, false); - if (SELECT_ALL_ID.equals(actionId)) - return new TextOperationAction(SELECT_ALL, false, false, false); - return null; - } - - public void selectionChanged(SelectionChangedEvent event) { - Iterator e= fActions.values().iterator(); - while (e.hasNext()) { - MergeViewerAction action= (MergeViewerAction) e.next(); - if (action.isSelectionDependent()) - action.update(); - } - } - - public void textChanged(TextEvent event) { - Iterator e= fActions.values().iterator(); - while (e.hasNext()) { - MergeViewerAction action= (MergeViewerAction) e.next(); - if (action.isContentDependent()) - action.update(); - } - } - - /* - * Allows the viewer to add menus and/or tools to the context menu. - */ - public void menuAboutToShow(IMenuManager menu) { - - menu.add(new Separator("undo")); //$NON-NLS-1$ - addMenu(menu, UNDO_ID); - addMenu(menu, REDO_ID); - - menu.add(new Separator("ccp")); //$NON-NLS-1$ - addMenu(menu, CUT_ID); - addMenu(menu, COPY_ID); - addMenu(menu, PASTE_ID); - addMenu(menu, DELETE_ID); - addMenu(menu, SELECT_ALL_ID); - - menu.add(new Separator("edit")); //$NON-NLS-1$ - menu.add(new Separator("find")); //$NON-NLS-1$ - //addMenu(menu, FIND_ID); - - menu.add(new Separator("save")); //$NON-NLS-1$ - if (fAddSaveAction) - addMenu(menu, SAVE_ID); - - menu.add(new Separator("rest")); //$NON-NLS-1$ - } - - private void addMenu(IMenuManager menu, String actionId) { - IAction action= getAction(actionId); - if (action != null) - menu.add(action); - } - - protected void handleDispose() { - - removeTextListener(this); - removeSelectionChangedListener(this); - - super.handleDispose(); - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeViewerAction.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeViewerAction.java deleted file mode 100644 index d0e53995e..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeViewerAction.java +++ /dev/null @@ -1,44 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.ui.texteditor.IUpdate; -import org.eclipse.jface.action.Action; - - -public abstract class MergeViewerAction extends Action implements IUpdate { - - private boolean fMutable; - private boolean fSelection; - private boolean fContent; - - public MergeViewerAction(boolean mutable, boolean selection, boolean content) { - fMutable= mutable; - fSelection= selection; - fContent= content; - } - - public boolean isSelectionDependent() { - return fSelection; - } - - public boolean isContentDependent() { - return fContent; - } - - public boolean isEditableDependent() { - return fMutable; - } - - public void update() { - // empty default implementation - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeViewerContentProvider.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeViewerContentProvider.java deleted file mode 100644 index d36ec19d5..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/MergeViewerContentProvider.java +++ /dev/null @@ -1,199 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.swt.graphics.Image; - -import org.eclipse.jface.viewers.Viewer; - -import org.eclipse.compare.*; -import org.eclipse.compare.structuremergeviewer.*; -import org.eclipse.compare.contentmergeviewer.IMergeViewerContentProvider; - -/** - * Adapts any ContentMergeViewer to work on an ICompareInput - * e.g. a DiffNode. - */ -public class MergeViewerContentProvider implements IMergeViewerContentProvider { - - private CompareConfiguration fCompareConfiguration; - private String fAncestorError; - private String fLeftError; - private String fRightError; - - public MergeViewerContentProvider(CompareConfiguration cc) { - fCompareConfiguration= cc; - } - - private boolean hasError() { - return fAncestorError != null || fLeftError != null || fRightError != null; - } - - public void dispose() { - // empty default implementation - } - - public void inputChanged(Viewer v, Object o1, Object o2) { - // we are not interested since we have no state - } - - //---- ancestor - - public void setAncestorError(String errorMessage) { - fAncestorError= errorMessage; - } - - public String getAncestorLabel(Object element) { - if (fAncestorError != null) - return fAncestorError; - return fCompareConfiguration.getAncestorLabel(element); - } - - public Image getAncestorImage(Object element) { - if (fAncestorError != null) - return null; - return fCompareConfiguration.getAncestorImage(element); - } - - public Object getAncestorContent(Object element) { - if (element instanceof ICompareInput) - return ((ICompareInput) element).getAncestor(); - return null; - } - - public boolean showAncestor(Object element) { - if (element instanceof ICompareInput) - return true; // fix for #45239: Show ancestor for incoming and outgoing changes - //return (((ICompareInput)element).getKind() & Differencer.DIRECTION_MASK) == Differencer.CONFLICTING; - return false; - } - - //---- left - - public void setLeftError(String errorMessage) { - fLeftError= errorMessage; - } - - public String getLeftLabel(Object element) { - if (fLeftError != null) - return fLeftError; - return fCompareConfiguration.getLeftLabel(element); - } - - public Image getLeftImage(Object element) { - if (fLeftError != null) - return null; - return fCompareConfiguration.getLeftImage(element); - } - - public Object getLeftContent(Object element) { - if (element instanceof ICompareInput) - return ((ICompareInput) element).getLeft(); - return null; - } - - public boolean isLeftEditable(Object element) { - if (hasError()) - return false; - if (element instanceof ICompareInput) { - Object left= ((ICompareInput) element).getLeft(); - if (left == null) { - IDiffElement parent= ((IDiffElement)element).getParent(); - if (parent instanceof ICompareInput) - left= ((ICompareInput) parent).getLeft(); - } - if (left instanceof IEditableContent) - return ((IEditableContent)left).isEditable(); - } - return false; - } - - public void saveLeftContent(Object element, byte[] bytes) { - if (element instanceof ICompareInput) { - ICompareInput node= (ICompareInput) element; - if (bytes != null) { - ITypedElement left= node.getLeft(); - // #9869: problem if left is null (because no resource exists yet) nothing is done! - if (left == null) { - node.copy(false); - left= node.getLeft(); - } - if (left instanceof IEditableContent) - ((IEditableContent)left).setContent(bytes); - if (node instanceof ResourceCompareInput.MyDiffNode) - ((ResourceCompareInput.MyDiffNode)node).fireChange(); - } else { - node.copy(false); - } - } - } - - //---- right - - public void setRightError(String errorMessage) { - fRightError= errorMessage; - } - - public String getRightLabel(Object element) { - if (fRightError != null) - return fRightError; - return fCompareConfiguration.getRightLabel(element); - } - - public Image getRightImage(Object element) { - if (fRightError != null) - return null; - return fCompareConfiguration.getRightImage(element); - } - - public Object getRightContent(Object element) { - if (element instanceof ICompareInput) - return ((ICompareInput) element).getRight(); - return null; - } - - public boolean isRightEditable(Object element) { - if (hasError()) - return false; - if (element instanceof ICompareInput) { - Object right= ((ICompareInput) element).getRight(); - if (right == null) { - IDiffContainer parent= ((IDiffElement)element).getParent(); - if (parent instanceof ICompareInput) - right= ((ICompareInput) parent).getRight(); - } - if (right instanceof IEditableContent) - return ((IEditableContent)right).isEditable(); - } - return false; - } - - public void saveRightContent(Object element, byte[] bytes) { - if (element instanceof ICompareInput) { - ICompareInput node= (ICompareInput) element; - if (bytes != null) { - ITypedElement right= node.getRight(); - // #9869: problem if right is null (because no resource exists yet) nothing is done! - if (right == null) { - node.copy(true); - right= node.getRight(); - } - if (right instanceof IEditableContent) - ((IEditableContent)right).setContent(bytes); - if (node instanceof ResourceCompareInput.MyDiffNode) - ((ResourceCompareInput.MyDiffNode)node).fireChange(); - } else { - node.copy(true); - } - } - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/NullViewer.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/NullViewer.java deleted file mode 100644 index 495a8cf28..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/NullViewer.java +++ /dev/null @@ -1,35 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.*; - -import org.eclipse.compare.CompareViewerPane; - -/** - * Used whenever the input is null or no viewer can be found. - */ -public class NullViewer extends AbstractViewer { - - private Control fDummy; - - public NullViewer(Composite parent) { - - fDummy= new Tree(parent, SWT.NULL); - - CompareViewerPane.clearToolBar(parent); - } - - public Control getControl() { - return fDummy; - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/OverlayPreferenceStore.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/OverlayPreferenceStore.java deleted file mode 100644 index 9cc039d26..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/OverlayPreferenceStore.java +++ /dev/null @@ -1,452 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.preference.PreferenceStore; -import org.eclipse.jface.util.IPropertyChangeListener; -import org.eclipse.jface.util.PropertyChangeEvent; - -/** - * An overlaying preference store. - */ -public class OverlayPreferenceStore implements IPreferenceStore { - - - public static final class TypeDescriptor { - private TypeDescriptor() { - // nothing to do - } - } - - public static final TypeDescriptor BOOLEAN= new TypeDescriptor(); - public static final TypeDescriptor DOUBLE= new TypeDescriptor(); - public static final TypeDescriptor FLOAT= new TypeDescriptor(); - public static final TypeDescriptor INT= new TypeDescriptor(); - public static final TypeDescriptor LONG= new TypeDescriptor(); - public static final TypeDescriptor STRING= new TypeDescriptor(); - - public static class OverlayKey { - - TypeDescriptor fDescriptor; - String fKey; - - public OverlayKey(TypeDescriptor descriptor, String key) { - fDescriptor= descriptor; - fKey= key; - } - } - - private class PropertyListener implements IPropertyChangeListener { - - /* - * @see IPropertyChangeListener#propertyChange(PropertyChangeEvent) - */ - public void propertyChange(PropertyChangeEvent event) { - OverlayKey key= findOverlayKey(event.getProperty()); - if (key != null) - propagateProperty(fParent, key, fStore); - } - } - - - private IPreferenceStore fParent; - private IPreferenceStore fStore; - private OverlayKey[] fOverlayKeys; - - private PropertyListener fPropertyListener; - - - public OverlayPreferenceStore(IPreferenceStore parent, OverlayKey[] overlayKeys) { - fParent= parent; - fOverlayKeys= overlayKeys; - fStore= new PreferenceStore(); - } - - private OverlayKey findOverlayKey(String key) { - for (int i= 0; i < fOverlayKeys.length; i++) { - if (fOverlayKeys[i].fKey.equals(key)) - return fOverlayKeys[i]; - } - return null; - } - - private boolean covers(String key) { - return (findOverlayKey(key) != null); - } - - private void propagateProperty(IPreferenceStore orgin, OverlayKey key, IPreferenceStore target) { - - if (orgin.isDefault(key.fKey)) { - if (!target.isDefault(key.fKey)) - target.setToDefault(key.fKey); - return; - } - - TypeDescriptor d= key.fDescriptor; - if (BOOLEAN == d) { - - boolean originValue= orgin.getBoolean(key.fKey); - boolean targetValue= target.getBoolean(key.fKey); - if (targetValue != originValue) - target.setValue(key.fKey, originValue); - - } else if (DOUBLE == d) { - - double originValue= orgin.getDouble(key.fKey); - double targetValue= target.getDouble(key.fKey); - if (targetValue != originValue) - target.setValue(key.fKey, originValue); - - } else if (FLOAT == d) { - - float originValue= orgin.getFloat(key.fKey); - float targetValue= target.getFloat(key.fKey); - if (targetValue != originValue) - target.setValue(key.fKey, originValue); - - } else if (INT == d) { - - int originValue= orgin.getInt(key.fKey); - int targetValue= target.getInt(key.fKey); - if (targetValue != originValue) - target.setValue(key.fKey, originValue); - - } else if (LONG == d) { - - long originValue= orgin.getLong(key.fKey); - long targetValue= target.getLong(key.fKey); - if (targetValue != originValue) - target.setValue(key.fKey, originValue); - - } else if (STRING == d) { - - String originValue= orgin.getString(key.fKey); - String targetValue= target.getString(key.fKey); - if (targetValue != null && originValue != null && !targetValue.equals(originValue)) - target.setValue(key.fKey, originValue); - - } - } - - public void propagate() { - for (int i= 0; i < fOverlayKeys.length; i++) - propagateProperty(fStore, fOverlayKeys[i], fParent); - } - - private void loadProperty(IPreferenceStore orgin, OverlayKey key, IPreferenceStore target, boolean forceInitialization) { - TypeDescriptor d= key.fDescriptor; - if (BOOLEAN == d) { - - if (forceInitialization) - target.setValue(key.fKey, true); - target.setValue(key.fKey, orgin.getBoolean(key.fKey)); - target.setDefault(key.fKey, orgin.getDefaultBoolean(key.fKey)); - - } else if (DOUBLE == d) { - - if (forceInitialization) - target.setValue(key.fKey, 1.0D); - target.setValue(key.fKey, orgin.getDouble(key.fKey)); - target.setDefault(key.fKey, orgin.getDefaultDouble(key.fKey)); - - } else if (FLOAT == d) { - - if (forceInitialization) - target.setValue(key.fKey, 1.0F); - target.setValue(key.fKey, orgin.getFloat(key.fKey)); - target.setDefault(key.fKey, orgin.getDefaultFloat(key.fKey)); - - } else if (INT == d) { - - if (forceInitialization) - target.setValue(key.fKey, 1); - target.setValue(key.fKey, orgin.getInt(key.fKey)); - target.setDefault(key.fKey, orgin.getDefaultInt(key.fKey)); - - } else if (LONG == d) { - - if (forceInitialization) - target.setValue(key.fKey, 1L); - target.setValue(key.fKey, orgin.getLong(key.fKey)); - target.setDefault(key.fKey, orgin.getDefaultLong(key.fKey)); - - } else if (STRING == d) { - - if (forceInitialization) - target.setValue(key.fKey, "1"); //$NON-NLS-1$ - target.setValue(key.fKey, orgin.getString(key.fKey)); - target.setDefault(key.fKey, orgin.getDefaultString(key.fKey)); - - } - } - - public void load() { - for (int i= 0; i < fOverlayKeys.length; i++) - loadProperty(fParent, fOverlayKeys[i], fStore, true); - } - - public void loadDefaults() { - for (int i= 0; i < fOverlayKeys.length; i++) - setToDefault(fOverlayKeys[i].fKey); - } - - public void start() { - if (fPropertyListener == null) { - fPropertyListener= new PropertyListener(); - fParent.addPropertyChangeListener(fPropertyListener); - } - } - - public void stop() { - if (fPropertyListener != null) { - fParent.removePropertyChangeListener(fPropertyListener); - fPropertyListener= null; - } - } - - /* - * @see IPreferenceStore#addPropertyChangeListener(IPropertyChangeListener) - */ - public void addPropertyChangeListener(IPropertyChangeListener listener) { - fStore.addPropertyChangeListener(listener); - } - - /* - * @see IPreferenceStore#removePropertyChangeListener(IPropertyChangeListener) - */ - public void removePropertyChangeListener(IPropertyChangeListener listener) { - fStore.removePropertyChangeListener(listener); - } - - /* - * @see IPreferenceStore#firePropertyChangeEvent(String, Object, Object) - */ - public void firePropertyChangeEvent(String name, Object oldValue, Object newValue) { - fStore.firePropertyChangeEvent(name, oldValue, newValue); - } - - /* - * @see IPreferenceStore#contains(String) - */ - public boolean contains(String name) { - return fStore.contains(name); - } - - /* - * @see IPreferenceStore#getBoolean(String) - */ - public boolean getBoolean(String name) { - return fStore.getBoolean(name); - } - - /* - * @see IPreferenceStore#getDefaultBoolean(String) - */ - public boolean getDefaultBoolean(String name) { - return fStore.getDefaultBoolean(name); - } - - /* - * @see IPreferenceStore#getDefaultDouble(String) - */ - public double getDefaultDouble(String name) { - return fStore.getDefaultDouble(name); - } - - /* - * @see IPreferenceStore#getDefaultFloat(String) - */ - public float getDefaultFloat(String name) { - return fStore.getDefaultFloat(name); - } - - /* - * @see IPreferenceStore#getDefaultInt(String) - */ - public int getDefaultInt(String name) { - return fStore.getDefaultInt(name); - } - - /* - * @see IPreferenceStore#getDefaultLong(String) - */ - public long getDefaultLong(String name) { - return fStore.getDefaultLong(name); - } - - /* - * @see IPreferenceStore#getDefaultString(String) - */ - public String getDefaultString(String name) { - return fStore.getDefaultString(name); - } - - /* - * @see IPreferenceStore#getDouble(String) - */ - public double getDouble(String name) { - return fStore.getDouble(name); - } - - /* - * @see IPreferenceStore#getFloat(String) - */ - public float getFloat(String name) { - return fStore.getFloat(name); - } - - /* - * @see IPreferenceStore#getInt(String) - */ - public int getInt(String name) { - return fStore.getInt(name); - } - - /* - * @see IPreferenceStore#getLong(String) - */ - public long getLong(String name) { - return fStore.getLong(name); - } - - /* - * @see IPreferenceStore#getString(String) - */ - public String getString(String name) { - return fStore.getString(name); - } - - /* - * @see IPreferenceStore#isDefault(String) - */ - public boolean isDefault(String name) { - return fStore.isDefault(name); - } - - /* - * @see IPreferenceStore#needsSaving() - */ - public boolean needsSaving() { - return fStore.needsSaving(); - } - - /* - * @see IPreferenceStore#putValue(String, String) - */ - public void putValue(String name, String value) { - if (covers(name)) - fStore.putValue(name, value); - } - - /* - * @see IPreferenceStore#setDefault(String, double) - */ - public void setDefault(String name, double value) { - if (covers(name)) - fStore.setDefault(name, value); - } - - /* - * @see IPreferenceStore#setDefault(String, float) - */ - public void setDefault(String name, float value) { - if (covers(name)) - fStore.setDefault(name, value); - } - - /* - * @see IPreferenceStore#setDefault(String, int) - */ - public void setDefault(String name, int value) { - if (covers(name)) - fStore.setDefault(name, value); - } - - /* - * @see IPreferenceStore#setDefault(String, long) - */ - public void setDefault(String name, long value) { - if (covers(name)) - fStore.setDefault(name, value); - } - - /* - * @see IPreferenceStore#setDefault(String, String) - */ - public void setDefault(String name, String value) { - if (covers(name)) - fStore.setDefault(name, value); - } - - /* - * @see IPreferenceStore#setDefault(String, boolean) - */ - public void setDefault(String name, boolean value) { - if (covers(name)) - fStore.setDefault(name, value); - } - - /* - * @see IPreferenceStore#setToDefault(String) - */ - public void setToDefault(String name) { - fStore.setToDefault(name); - } - - /* - * @see IPreferenceStore#setValue(String, double) - */ - public void setValue(String name, double value) { - if (covers(name)) - fStore.setValue(name, value); - } - - /* - * @see IPreferenceStore#setValue(String, float) - */ - public void setValue(String name, float value) { - if (covers(name)) - fStore.setValue(name, value); - } - - /* - * @see IPreferenceStore#setValue(String, int) - */ - public void setValue(String name, int value) { - if (covers(name)) - fStore.setValue(name, value); - } - - /* - * @see IPreferenceStore#setValue(String, long) - */ - public void setValue(String name, long value) { - if (covers(name)) - fStore.setValue(name, value); - } - - /* - * @see IPreferenceStore#setValue(String, String) - */ - public void setValue(String name, String value) { - if (covers(name)) - fStore.setValue(name, value); - } - - /* - * @see IPreferenceStore#setValue(String, boolean) - */ - public void setValue(String name, boolean value) { - if (covers(name)) - fStore.setValue(name, value); - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithEditionAction.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithEditionAction.java deleted file mode 100644 index fdcc7bf68..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithEditionAction.java +++ /dev/null @@ -1,20 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - - -public class ReplaceWithEditionAction extends EditionAction { - - public ReplaceWithEditionAction() { - super(true, "org.eclipse.compare.internal.ReplaceWithEditionAction"); //$NON-NLS-1$ - fHelpContextId= ICompareContextIds.REPLACE_WITH_EDITION_DIALOG; - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithEditionAction.properties b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithEditionAction.properties deleted file mode 100644 index 76e8d323b..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithEditionAction.properties +++ /dev/null @@ -1,40 +0,0 @@ -############################################################################### -# Copyright (c) 2000, 2004 IBM Corporation and others. -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Common Public License v1.0 -# which accompanies this distribution, and is available at -# http://www.eclipse.org/legal/cpl-v10.html -# -# Contributors: -# IBM Corporation - initial API and implementation -############################################################################### - -# @(#)ReplaceWithEditionAction.properties -# -# Resources for ReplaceWithEditionAction.java - -title= Replace from Local History - -treeTitleFormat= Local History of ''{0}'' -dateIcon= obj16/day_obj.gif -timeIcon= obj16/resource_obj.gif - -treeFormat= {0} -workspaceTreeFormat= {0} (Workspace File) -parseErrorFormat= {0} (Parse Error) - -editionLabel= Local History ({0}) -workspaceEditionLabel= Workspace File - -targetLabel= {0} - -todayFormat= Today ({0}) -yesterdayFormat= Yesterday ({0}) -dayFormat= {0} - -buttonLabel= Replace - -noLocalHistoryError= No local history available for selected resource. -replaceError=Cannot replace resource (reason: {0}). - -taskName=Replacing diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithPreviousEditionAction.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithPreviousEditionAction.java deleted file mode 100644 index 3fa6b07aa..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ReplaceWithPreviousEditionAction.java +++ /dev/null @@ -1,21 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - - -public class ReplaceWithPreviousEditionAction extends EditionAction { - - public ReplaceWithPreviousEditionAction() { - super(true, - "org.eclipse.compare.internal.ReplaceWithEditionAction"); //$NON-NLS-1$ - fPrevious= true; - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ResizableDialog.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ResizableDialog.java deleted file mode 100644 index 669aec61d..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ResizableDialog.java +++ /dev/null @@ -1,163 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.util.ResourceBundle; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.*; -import org.eclipse.swt.graphics.*; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.help.WorkbenchHelp; - -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.IDialogSettings; -import org.eclipse.jface.dialogs.DialogSettings; - - -/** - * Base class for resizable Dialogs with persistent window bounds. - */ -public abstract class ResizableDialog extends Dialog { - - // dialog store id constants - private final static String DIALOG_BOUNDS_KEY= "ResizableDialogBounds"; //$NON-NLS-1$ - private static final String X= "x"; //$NON-NLS-1$ - private static final String Y= "y"; //$NON-NLS-1$ - private static final String WIDTH= "width"; //$NON-NLS-1$ - private static final String HEIGHT= "height"; //$NON-NLS-1$ - - protected ResourceBundle fBundle; - private Rectangle fNewBounds; - private IDialogSettings fSettings; - private String fContextId; - - - public ResizableDialog(Shell parent, ResourceBundle bundle) { - super(parent); - setShellStyle(getShellStyle() | SWT.RESIZE | SWT.MAX); - - fBundle= bundle; - - fSettings= CompareUIPlugin.getDefault().getDialogSettings(); - } - - public void setHelpContextId(String contextId) { - fContextId= contextId; - } - - /* - * @see org.eclipse.jface.window.Window#configureShell(Shell) - */ - protected void configureShell(Shell newShell) { - super.configureShell(newShell); - if (fContextId != null) - WorkbenchHelp.setHelp(newShell, fContextId); - } - - protected Point getInitialSize() { - - int width= 0; - int height= 0; - - final Shell s= getShell(); - if (s != null) { - s.addControlListener( - new ControlListener() { - public void controlMoved(ControlEvent arg0) { - fNewBounds= s.getBounds(); - } - public void controlResized(ControlEvent arg0) { - fNewBounds= s.getBounds(); - } - } - ); - } - - IDialogSettings bounds= fSettings.getSection(DIALOG_BOUNDS_KEY); //$NON-NLS-1$ - if (bounds == null) { - if (fBundle != null) { - width= Utilities.getInteger(fBundle, WIDTH, 0); - height= Utilities.getInteger(fBundle, HEIGHT, 0); - Shell shell= getParentShell(); - if (shell != null) { - Point parentSize= shell.getSize(); - if (width <= 0) - width= parentSize.x-300; - if (height <= 0) - height= parentSize.y-200; - } - } else { - Shell shell= getParentShell(); - if (shell != null) { - Point parentSize= shell.getSize(); - width= parentSize.x-100; - height= parentSize.y-100; - } - } - if (width < 700) - width= 700; - if (height < 500) - height= 500; - } else { - try { - width= bounds.getInt(WIDTH); - } catch (NumberFormatException e) { - width= 700; - } - try { - height= bounds.getInt(HEIGHT); - } catch (NumberFormatException e) { - height= 500; - } - } - - return new Point(width, height); - } - - protected Point getInitialLocation(Point initialSize) { - Point loc= super.getInitialLocation(initialSize); - - IDialogSettings bounds= fSettings.getSection(DIALOG_BOUNDS_KEY); - if (bounds != null) { - try { - loc.x= bounds.getInt(X); - } catch (NumberFormatException e) { - // silently ignored - } - try { - loc.y= bounds.getInt(Y); - } catch (NumberFormatException e) { - // silently ignored - } - } - return loc; - } - - public boolean close() { - boolean closed= super.close(); - if (closed && fNewBounds != null) - saveBounds(fNewBounds); - return closed; - } - - private void saveBounds(Rectangle bounds) { - IDialogSettings dialogBounds= fSettings.getSection(DIALOG_BOUNDS_KEY); - if (dialogBounds == null) { - dialogBounds= new DialogSettings(DIALOG_BOUNDS_KEY); - fSettings.addSection(dialogBounds); - } - dialogBounds.put(X, bounds.x); - dialogBounds.put(Y, bounds.y); - dialogBounds.put(WIDTH, bounds.width); - dialogBounds.put(HEIGHT, bounds.height); - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ResourceCompareInput.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ResourceCompareInput.java deleted file mode 100644 index d2de626b2..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ResourceCompareInput.java +++ /dev/null @@ -1,423 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.lang.reflect.InvocationTargetException; -import java.text.MessageFormat; -import java.util.HashSet; -import java.util.Set; - -import org.eclipse.core.resources.*; -import org.eclipse.core.runtime.*; - -import org.eclipse.swt.widgets.Composite; - -import org.eclipse.jface.action.*; -import org.eclipse.jface.viewers.*; - -import org.eclipse.compare.*; -import org.eclipse.compare.structuremergeviewer.*; - - -/** - * A two-way or three-way compare for arbitrary IResources. - */ -class ResourceCompareInput extends CompareEditorInput { - - private static final boolean NORMALIZE_CASE= true; - - private boolean fThreeWay= false; - private Object fRoot; - private IStructureComparator fAncestor; - private IStructureComparator fLeft; - private IStructureComparator fRight; - private IResource fAncestorResource; - private IResource fLeftResource; - private IResource fRightResource; - private DiffTreeViewer fDiffViewer; - private IAction fOpenAction; - - class MyDiffNode extends DiffNode { - - private boolean fDirty= false; - private ITypedElement fLastId; - private String fLastName; - - - public MyDiffNode(IDiffContainer parent, int description, ITypedElement ancestor, ITypedElement left, ITypedElement right) { - super(parent, description, ancestor, left, right); - } - public void fireChange() { - super.fireChange(); - setDirty(true); - fDirty= true; - if (fDiffViewer != null) - fDiffViewer.refresh(this); - } - void clearDirty() { - fDirty= false; - } - public String getName() { - if (fLastName == null) - fLastName= super.getName(); - if (fDirty) - return '<' + fLastName + '>'; - return fLastName; - } - - public ITypedElement getId() { - ITypedElement id= super.getId(); - if (id == null) - return fLastId; - fLastId= id; - return id; - } - } - - static class FilteredBufferedResourceNode extends BufferedResourceNode { - FilteredBufferedResourceNode(IResource resource) { - super(resource); - } - protected IStructureComparator createChild(IResource child) { - String name= child.getName(); - if (CompareUIPlugin.getDefault().filter(name, child instanceof IContainer, false)) - return null; - return new FilteredBufferedResourceNode(child); - } - } - - /* - * Creates an compare editor input for the given selection. - */ - ResourceCompareInput(CompareConfiguration config) { - super(config); - } - - public Viewer createDiffViewer(Composite parent) { - fDiffViewer= new DiffTreeViewer(parent, getCompareConfiguration()) { - protected void fillContextMenu(IMenuManager manager) { - - if (fOpenAction == null) { - fOpenAction= new Action() { - public void run() { - handleOpen(null); - } - }; - Utilities.initAction(fOpenAction, getBundle(), "action.CompareContents."); //$NON-NLS-1$ - } - - boolean enable= false; - ISelection selection= getSelection(); - if (selection instanceof IStructuredSelection) { - IStructuredSelection ss= (IStructuredSelection)selection; - if (ss.size() == 1) { - Object element= ss.getFirstElement(); - if (element instanceof MyDiffNode) { - ITypedElement te= ((MyDiffNode) element).getId(); - if (te != null) - enable= !ITypedElement.FOLDER_TYPE.equals(te.getType()); - } else - enable= true; - } - } - fOpenAction.setEnabled(enable); - - manager.add(fOpenAction); - - super.fillContextMenu(manager); - } - }; - return fDiffViewer; - } - - void setSelection(ISelection s) { - - IResource[] selection= Utilities.getResources(s); - - fThreeWay= selection.length == 3; - - fAncestorResource= null; - fLeftResource= selection[0]; - fRightResource= selection[1]; - if (fThreeWay) { - fLeftResource= selection[1]; - fRightResource= selection[2]; - } - - fAncestor= null; - fLeft= getStructure(fLeftResource); - fRight= getStructure(fRightResource); - - if (fThreeWay) { - fAncestorResource= selection[0]; - fAncestor= getStructure(fAncestorResource); - } - } - - /* - * Returns true if compare can be executed for the given selection. - */ - public boolean isEnabled(ISelection s) { - - IResource[] selection= Utilities.getResources(s); - if (selection.length < 2 || selection.length > 3) - return false; - - fThreeWay= selection.length == 3; - - fLeftResource= selection[0]; - fRightResource= selection[1]; - if (fThreeWay) { - fLeftResource= selection[1]; - fRightResource= selection[2]; - } - - if (!comparable(fLeftResource, fRightResource)) - return false; - - if (fThreeWay) { - fAncestorResource= selection[0]; - - if (!comparable(fLeftResource, fRightResource)) - return false; - } - - return true; - } - - /** - * Initializes the images in the compare configuration. - */ - void initializeCompareConfiguration() { - CompareConfiguration cc= getCompareConfiguration(); - if (fLeftResource != null) { - cc.setLeftLabel(buildLabel(fLeftResource)); - cc.setLeftImage(CompareUIPlugin.getImage(fLeftResource)); - } - if (fRightResource != null) { - cc.setRightLabel(buildLabel(fRightResource)); - cc.setRightImage(CompareUIPlugin.getImage(fRightResource)); - } - if (fThreeWay && fAncestorResource != null) { - cc.setAncestorLabel(buildLabel(fAncestorResource)); - cc.setAncestorImage(CompareUIPlugin.getImage(fAncestorResource)); - } - } - - /* - * Returns true if both resources are either structured or unstructured. - */ - private boolean comparable(IResource c1, IResource c2) { - return hasStructure(c1) == hasStructure(c2); - } - - /* - * Returns true if the given argument has a structure. - */ - private boolean hasStructure(IResource input) { - - if (input instanceof IContainer) - return true; - - if (input instanceof IFile) { - IFile file= (IFile) input; - String type= file.getFileExtension(); - if (type != null) { - type= normalizeCase(type); - return "JAR".equals(type) || "ZIP".equals(type); //$NON-NLS-2$ //$NON-NLS-1$ - } - } - - return false; - } - - /* - * Creates a IStructureComparator for the given input. - * Returns null if no IStructureComparator - * can be found for the IResource. - */ - private IStructureComparator getStructure(IResource input) { - - if (input instanceof IContainer) - return new FilteredBufferedResourceNode(input); - - if (input instanceof IFile) { - IStructureComparator rn= new FilteredBufferedResourceNode(input); - IFile file= (IFile) input; - String type= normalizeCase(file.getFileExtension()); - if ("JAR".equals(type) || "ZIP".equals(type)) //$NON-NLS-2$ //$NON-NLS-1$ - return new ZipFileStructureCreator().getStructure(rn); - return rn; - } - return null; - } - - /* - * Performs a two-way or three-way diff on the current selection. - */ - public Object prepareInput(IProgressMonitor pm) throws InvocationTargetException { - - try { - // fix for PR 1GFMLFB: ITPUI:WIN2000 - files that are out of sync with the file system appear as empty - fLeftResource.refreshLocal(IResource.DEPTH_INFINITE, pm); - fRightResource.refreshLocal(IResource.DEPTH_INFINITE, pm); - if (fThreeWay && fAncestorResource != null) - fAncestorResource.refreshLocal(IResource.DEPTH_INFINITE, pm); - // end fix - - pm.beginTask(Utilities.getString("ResourceCompare.taskName"), IProgressMonitor.UNKNOWN); //$NON-NLS-1$ - - String leftLabel= fLeftResource.getName(); - String rightLabel= fRightResource.getName(); - - String title; - if (fThreeWay) { - String format= Utilities.getString("ResourceCompare.threeWay.title"); //$NON-NLS-1$ - String ancestorLabel= fAncestorResource.getName(); - title= MessageFormat.format(format, new String[] {ancestorLabel, leftLabel, rightLabel}); - } else { - String format= Utilities.getString("ResourceCompare.twoWay.title"); //$NON-NLS-1$ - title= MessageFormat.format(format, new String[] {leftLabel, rightLabel}); - } - setTitle(title); - - Differencer d= new Differencer() { - protected Object visit(Object parent, int description, Object ancestor, Object left, Object right) { - return new MyDiffNode((IDiffContainer) parent, description, (ITypedElement)ancestor, (ITypedElement)left, (ITypedElement)right); - } - }; - - fRoot= d.findDifferences(fThreeWay, pm, null, fAncestor, fLeft, fRight); - return fRoot; - - } catch (CoreException ex) { - throw new InvocationTargetException(ex); - } finally { - pm.done(); - } - } - - public String getToolTipText() { - if (fLeftResource != null && fRightResource != null) { - String leftLabel= fLeftResource.getFullPath().makeRelative().toString(); - String rightLabel= fRightResource.getFullPath().makeRelative().toString(); - if (fThreeWay) { - String format= Utilities.getString("ResourceCompare.threeWay.tooltip"); //$NON-NLS-1$ - String ancestorLabel= fAncestorResource.getFullPath().makeRelative().toString(); - return MessageFormat.format(format, new String[] {ancestorLabel, leftLabel, rightLabel}); - } - String format= Utilities.getString("ResourceCompare.twoWay.tooltip"); //$NON-NLS-1$ - return MessageFormat.format(format, new String[] {leftLabel, rightLabel}); - } - // fall back - return super.getToolTipText(); - } - - private String buildLabel(IResource r) { - String n= r.getFullPath().toString(); - if (n.charAt(0) == IPath.SEPARATOR) - return n.substring(1); - return n; - } - - public void saveChanges(IProgressMonitor pm) throws CoreException { - super.saveChanges(pm); - if (fRoot instanceof DiffNode) { - try { - commit(pm, (DiffNode) fRoot); - } finally { - if (fDiffViewer != null) - fDiffViewer.refresh(); - setDirty(false); - } - } - } - - /* - * Recursively walks the diff tree and commits all changes. - */ - private static void commit(IProgressMonitor pm, DiffNode node) throws CoreException { - - if (node instanceof MyDiffNode) - ((MyDiffNode)node).clearDirty(); - - ITypedElement left= node.getLeft(); - if (left instanceof BufferedResourceNode) - ((BufferedResourceNode) left).commit(pm); - - ITypedElement right= node.getRight(); - if (right instanceof BufferedResourceNode) - ((BufferedResourceNode) right).commit(pm); - - IDiffElement[] children= node.getChildren(); - if (children != null) { - for (int i= 0; i < children.length; i++) { - IDiffElement element= children[i]; - if (element instanceof DiffNode) - commit(pm, (DiffNode) element); - } - } - } - - /* (non Javadoc) - * see IAdaptable.getAdapter - */ - public Object getAdapter(Class adapter) { - if (IFile[].class.equals(adapter)) { - HashSet collector= new HashSet(); - collectDirtyResources(fRoot, collector); - return (IFile[]) collector.toArray(new IFile[collector.size()]); - } - return super.getAdapter(adapter); - } - - private void collectDirtyResources(Object o, Set collector) { - if (o instanceof DiffNode) { - DiffNode node= (DiffNode) o; - - ITypedElement left= node.getLeft(); - if (left instanceof BufferedResourceNode) { - BufferedResourceNode bn= (BufferedResourceNode) left; - if (bn.isDirty()) { - IResource resource= bn.getResource(); - if (resource instanceof IFile) - collector.add(resource); - } - } - - ITypedElement right= node.getRight(); - if (right instanceof BufferedResourceNode) { - BufferedResourceNode bn= (BufferedResourceNode) right; - if (bn.isDirty()) { - IResource resource= bn.getResource(); - if (resource instanceof IFile) - collector.add(resource); - } - } - - IDiffElement[] children= node.getChildren(); - if (children != null) { - for (int i= 0; i < children.length; i++) { - IDiffElement element= children[i]; - if (element instanceof DiffNode) - collectDirtyResources(element, collector); - } - } - } - } - - private static String normalizeCase(String s) { - if (NORMALIZE_CASE && s != null) - return s.toUpperCase(); - return s; - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ShowPseudoConflicts.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ShowPseudoConflicts.java deleted file mode 100644 index 581527039..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ShowPseudoConflicts.java +++ /dev/null @@ -1,26 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.util.ResourceBundle; - -import org.eclipse.compare.*; - -/** - * Toggles the ICompareConfiguration.SHOW_PSEUDO_CONFLICTS property of an - * ICompareConfiguration. - */ -public class ShowPseudoConflicts extends ChangePropertyAction { - - public ShowPseudoConflicts(ResourceBundle bundle, CompareConfiguration cc) { - super(bundle, cc, "action.ShowPseudoConflicts.", CompareConfiguration.SHOW_PSEUDO_CONFLICTS); //$NON-NLS-1$ - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/SimpleTextViewer.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/SimpleTextViewer.java deleted file mode 100644 index a28339bfb..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/SimpleTextViewer.java +++ /dev/null @@ -1,65 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; - -import org.eclipse.jface.text.source.SourceViewer; -import org.eclipse.jface.text.Document; - -import org.eclipse.core.runtime.CoreException; -import org.eclipse.compare.*; -import org.eclipse.compare.structuremergeviewer.ICompareInput; - - -public class SimpleTextViewer extends AbstractViewer { - - private SourceViewer fSourceViewer; - private ICompareInput fInput; - - - SimpleTextViewer(Composite parent) { - fSourceViewer= new SourceViewer(parent, null, SWT.H_SCROLL + SWT.V_SCROLL); - fSourceViewer.setEditable(false); - } - - public Control getControl() { - return fSourceViewer.getTextWidget(); - } - - public void setInput(Object input) { - if (input instanceof IStreamContentAccessor) { - fSourceViewer.setDocument(new Document(getString(input))); - } else if (input instanceof ICompareInput) { - fInput= (ICompareInput) input; - ITypedElement left= fInput.getLeft(); - fSourceViewer.setDocument(new Document(getString(left))); - } - } - - public Object getInput() { - return fInput; - } - - private String getString(Object input) { - - if (input instanceof IStreamContentAccessor) { - try { - return Utilities.readString((IStreamContentAccessor) input); - } catch (CoreException ex) { - // NeedWork - } - } - return ""; //$NON-NLS-1$ - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/StreamMergerDescriptor.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/StreamMergerDescriptor.java deleted file mode 100644 index 16225ecb4..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/StreamMergerDescriptor.java +++ /dev/null @@ -1,47 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.compare.IStreamMerger; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IConfigurationElement; - -/** - * A factory proxy for creating a StructureCreator. - */ -class StreamMergerDescriptor { - - private final static String CLASS_ATTRIBUTE= "class"; //$NON-NLS-1$ - - private IConfigurationElement fElement; - - /* - * Creates a new sorter node with the given configuration element. - */ - public StreamMergerDescriptor(IConfigurationElement element) { - fElement= element; - } - - /* - * Creates a new stream merger from this node. - */ - public IStreamMerger createStreamMerger() { - try { - return (IStreamMerger)fElement.createExecutableExtension(CLASS_ATTRIBUTE); - } catch (CoreException ex) { - //ExceptionHandler.handle(ex, SearchMessages.getString("Search.Error.createSorter.title"), SearchMessages.getString("Search.Error.createSorter.message")); //$NON-NLS-2$ //$NON-NLS-1$ - return null; - } catch (ClassCastException ex) { - //ExceptionHandler.displayMessageDialog(ex, SearchMessages.getString("Search.Error.createSorter.title"), SearchMessages.getString("Search.Error.createSorter.message")); //$NON-NLS-2$ //$NON-NLS-1$ - return null; - } - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/StructureCreatorDescriptor.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/StructureCreatorDescriptor.java deleted file mode 100644 index be8a4d6b9..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/StructureCreatorDescriptor.java +++ /dev/null @@ -1,57 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IConfigurationElement; - -import org.eclipse.compare.structuremergeviewer.IStructureCreator; - -/** - * A factory proxy for creating a StructureCreator. - */ -public class StructureCreatorDescriptor { - - private final static String CLASS_ATTRIBUTE= "class"; //$NON-NLS-1$ - private final static String EXTENSIONS_ATTRIBUTE= "extensions"; //$NON-NLS-1$ - - private IConfigurationElement fElement; - - /* - * Creates a new sorter node with the given configuration element. - */ - public StructureCreatorDescriptor(IConfigurationElement element) { - fElement= element; - } - - /* - * Creates a new sorter from this node. - */ - public IStructureCreator createStructureCreator() { - try { - return (IStructureCreator)fElement.createExecutableExtension(CLASS_ATTRIBUTE); - } catch (CoreException ex) { - CompareUIPlugin.log(ex.getStatus()); - //ExceptionHandler.handle(ex, SearchMessages.getString("Search.Error.createSorter.title"), SearchMessages.getString("Search.Error.createSorter.message")); //$NON-NLS-2$ //$NON-NLS-1$ - return null; - } catch (ClassCastException ex) { - //ExceptionHandler.displayMessageDialog(ex, SearchMessages.getString("Search.Error.createSorter.title"), SearchMessages.getString("Search.Error.createSorter.message")); //$NON-NLS-2$ //$NON-NLS-1$ - return null; - } - } - - /* - * Returns the structure creator's extensions. - */ - public String getExtension() { - return fElement.getAttribute(EXTENSIONS_ATTRIBUTE); - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/TabFolderLayout.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/TabFolderLayout.java deleted file mode 100644 index 739b82f0e..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/TabFolderLayout.java +++ /dev/null @@ -1,53 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Layout; - -public class TabFolderLayout extends Layout { - - protected Point computeSize (Composite composite, int wHint, int hHint, boolean flushCache) { - if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT) - return new Point(wHint, hHint); - - Control [] children = composite.getChildren (); - int count = children.length; - int maxWidth = 0, maxHeight = 0; - for (int i=0; iTextMergeViewer. - * This indirection is necessary because only objects with a default - * constructor can be created via an extension point - * (this precludes Viewers). - */ -public class TextMergeViewerCreator implements IViewerCreator { - - public Viewer createViewer(Composite parent, CompareConfiguration mp) { - return new TextMergeViewer(parent, mp); - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/TextViewerCreator.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/TextViewerCreator.java deleted file mode 100644 index 66eaba9f8..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/TextViewerCreator.java +++ /dev/null @@ -1,32 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.swt.widgets.Composite; - -import org.eclipse.jface.viewers.Viewer; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.IViewerCreator; - - -/** - * A factory object for the TextMergeViewer. - * This indirection is necessary because only objects with a default - * constructor can be created via an extension point - * (this precludes Viewers). - */ -public class TextViewerCreator implements IViewerCreator { - - public Viewer createViewer(Composite parent, CompareConfiguration mp) { - return new SimpleTextViewer(parent); - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/TokenComparator.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/TokenComparator.java deleted file mode 100644 index e2ecaf7eb..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/TokenComparator.java +++ /dev/null @@ -1,175 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.jface.util.Assert; - -import org.eclipse.compare.rangedifferencer.IRangeComparator; -import org.eclipse.compare.contentmergeviewer.ITokenComparator; - -/** - * Implements the ITokenComparator interface for words (or tokens) - * in a string. - * A TokenComparator is used as the input for the RangeDifferencer - * engine to perform a token oriented compare on strings. - */ -public class TokenComparator implements ITokenComparator { - - private boolean fShouldEscape= true; - private String fText; - private int fCount; - private int[] fStarts; - private int[] fLengths; - - /** - * Creates a TokenComparator for the given string. - * - * @param text the string that is split into token - */ - public TokenComparator(String text) { - - Assert.isNotNull(text); - - fText= text; - - int length= fText.length(); - fStarts= new int[length]; // pessimistic assumption! - fLengths= new int[length]; - fCount= 0; - - char lastCategory= 0; // 0: no category - for (int i= 0; i < length; i++) { - char c= fText.charAt(i); - - char category= '?'; // unspecified category - if (Character.isWhitespace(c)) - category= ' '; // white space category - else if (Character.isDigit(c)) - category= '0'; // digits - else if (Character.isLetter(c)) - category= 'a'; // letters - - if (category != lastCategory) { - // start a new token - fStarts[fCount++]= i; - lastCategory= category; - } - fLengths[fCount-1]++; - } - } - - /** - * Creates a TokenComparator for the given string. - * - * @param text the string that is split into token - * @param shouldEscape - */ - public TokenComparator(String text, boolean shouldEscape) { - this(text); - fShouldEscape= shouldEscape; - } - - /** - * Returns the number of token in the string. - * - * @return number of token in the string - */ - public int getRangeCount() { - return fCount; - } - - /* (non Javadoc) - * see ITokenComparator.getTokenStart - */ - public int getTokenStart(int index) { - if (index < fCount) - return fStarts[index]; - return fText.length(); - } - - /* (non Javadoc) - * see ITokenComparator.getTokenLength - */ - public int getTokenLength(int index) { - if (index < fCount) - return fLengths[index]; - return 0; - } - - /** - * Returns true if a token given by the first index - * matches a token specified by the other IRangeComparator and index. - * - * @param thisIndex the number of the token within this range comparator - * @param other the range comparator to compare this with - * @param otherIndex the number of the token within the other comparator - * @return true if the token are equal - */ - public boolean rangesEqual(int thisIndex, IRangeComparator other, int otherIndex) { - if (other != null && getClass() == other.getClass()) { - TokenComparator tc= (TokenComparator) other; - int thisLen= getTokenLength(thisIndex); - int otherLen= tc.getTokenLength(otherIndex); - if (thisLen == otherLen) - return fText.regionMatches(false, getTokenStart(thisIndex), tc.fText, tc.getTokenStart(otherIndex), thisLen); - } - return false; - } - - /* - * Aborts the comparison if the number of tokens is too large. - * @return true to abort a token comparison - */ - public boolean skipRangeComparison(int length, int max, IRangeComparator other) { - - if (!fShouldEscape) - return false; - - if (getRangeCount() < 50 || other.getRangeCount() < 50) - return false; - - if (max < 100) - return false; - - if (length < 100) - return false; - - if (max > 800) - return true; - - if (length < max / 4) - return false; - - return true; - } - -// public static void main(String args[]) { -// //String in= "private static boolean isWhitespace(char c) {"; -// //String in= "for (int j= 0; j < l-1; j++) {"; -// String in= "for do i= 123; i++"; -// TokenComparator tc= new TokenComparator(in, false); -// -// System.out.println("n: " + tc.getRangeCount()); -// System.out.println(in); -// -// int p= 0; -// for (int i= 0; i < tc.getRangeCount(); i++) { -// int l= tc.getTokenLength(i); -// System.out.print("<"); -// -// for (int j= 0; j < l-1; j++) -// System.out.print(" "); -// } -// System.out.println(); -// -// //System.out.println("extract: <" + tc.extract(16, 1) + ">"); -// } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/Utilities.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/Utilities.java deleted file mode 100644 index ef697931f..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/Utilities.java +++ /dev/null @@ -1,592 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import java.io.*; -import java.text.MessageFormat; -import java.util.*; -import java.util.List; - -import org.eclipse.swt.widgets.*; - -import org.eclipse.core.resources.IEncodedStorage; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.ResourceAttributes; -import org.eclipse.core.resources.ResourcesPlugin; - -import org.eclipse.jface.action.IAction; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.util.*; -import org.eclipse.jface.viewers.*; -import org.eclipse.jface.dialogs.ErrorDialog; - -import org.eclipse.core.resources.IResource; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.MultiStatus; -import org.eclipse.core.runtime.Status; - -import org.eclipse.ui.*; - -import org.eclipse.compare.CompareConfiguration; -import org.eclipse.compare.CompareUI; -import org.eclipse.compare.IEncodedStreamContentAccessor; -import org.eclipse.compare.IStreamContentAccessor; - -/** - * Convenience and utility methods. - */ -public class Utilities { - - public static void registerAction(IKeyBindingService kbs, IAction a, String id) { - if (kbs != null) { - a.setActionDefinitionId(id); - kbs.registerAction(a); - } - } - - public static IWorkbenchPartSite findSite(Control c) { - while (c != null && !c.isDisposed()) { - Object data= c.getData(); - if (data instanceof IWorkbenchPart) - return ((IWorkbenchPart)data).getSite(); - c= c.getParent(); - } - return null; - } - - public static IActionBars findActionBars(Control c) { - while (c != null && !c.isDisposed()) { - Object data= c.getData(); - if (data instanceof CompareEditor) - return ((CompareEditor)data).getActionBars(); - - // PR 1GDVZV7: ITPVCM:WIN98 - CTRL + C does not work in Java source compare - if (data instanceof IViewPart) - return ((IViewPart)data).getViewSite().getActionBars(); - // end PR 1GDVZV7 - - c= c.getParent(); - } - return null; - } - - public static void setEnableComposite(Composite composite, boolean enable) { - Control[] children= composite.getChildren(); - for (int i= 0; i < children.length; i++) - children[i].setEnabled(enable); - } - - public static boolean getBoolean(CompareConfiguration cc, String key, boolean dflt) { - if (cc != null) { - Object value= cc.getProperty(key); - if (value instanceof Boolean) - return ((Boolean) value).booleanValue(); - } - return dflt; - } - - public static void firePropertyChange(ListenerList ll, Object source, String property, Object old, Object newValue) { - if (ll != null) { - PropertyChangeEvent event= null; - Object[] listeners= ll.getListeners(); - for (int i= 0; i < listeners.length; i++) { - IPropertyChangeListener l= (IPropertyChangeListener) listeners[i]; - if (event == null) - event= new PropertyChangeEvent(source, property, old, newValue); - l.propertyChange(event); - } - } - } - - public static boolean okToUse(Widget widget) { - return widget != null && !widget.isDisposed(); - } - - private static ArrayList internalGetResources(ISelection selection, Class type) { - - ArrayList tmp= new ArrayList(); - - if (selection instanceof IStructuredSelection) { - - Object[] s= ((IStructuredSelection)selection).toArray(); - - for (int i= 0; i < s.length; i++) { - - IResource resource= null; - - Object o= s[i]; - if (type.isInstance(o)) { - resource= (IResource) o; - - } else if (o instanceof IAdaptable) { - IAdaptable a= (IAdaptable) o; - Object adapter= a.getAdapter(IResource.class); - if (type.isInstance(adapter)) - resource= (IResource) adapter; - } - - if (resource != null && resource.isAccessible()) - tmp.add(resource); - } - } - - return tmp; - } - - /* - * Convenience method: extract all accessible IResources from given selection. - * Never returns null. - */ - public static IResource[] getResources(ISelection selection) { - ArrayList tmp= internalGetResources(selection, IResource.class); - return (IResource[]) tmp.toArray(new IResource[tmp.size()]); - } - - /* - * Convenience method: extract all accessible IFiles from given selection. - * Never returns null. - */ - public static IFile[] getFiles(ISelection selection) { - ArrayList tmp= internalGetResources(selection, IFile.class); - return (IFile[]) tmp.toArray(new IFile[tmp.size()]); - } - - public static byte[] readBytes(InputStream in) { - ByteArrayOutputStream bos= new ByteArrayOutputStream(); - try { - while (true) { - int c= in.read(); - if (c == -1) - break; - bos.write(c); - } - - } catch (IOException ex) { - return null; - - } finally { - Utilities.close(in); - try { - bos.close(); - } catch (IOException x) { - // silently ignored - } - } - - return bos.toByteArray(); - } - - public static String getIconPath(Display display) { - return "icons/full/"; //$NON-NLS-1$ - } - - /* - * Initialize the given Action from a ResourceBundle. - */ - public static void initAction(IAction a, ResourceBundle bundle, String prefix) { - - String labelKey= "label"; //$NON-NLS-1$ - String tooltipKey= "tooltip"; //$NON-NLS-1$ - String imageKey= "image"; //$NON-NLS-1$ - String descriptionKey= "description"; //$NON-NLS-1$ - - if (prefix != null && prefix.length() > 0) { - labelKey= prefix + labelKey; - tooltipKey= prefix + tooltipKey; - imageKey= prefix + imageKey; - descriptionKey= prefix + descriptionKey; - } - - a.setText(getString(bundle, labelKey, labelKey)); - a.setToolTipText(getString(bundle, tooltipKey, null)); - a.setDescription(getString(bundle, descriptionKey, null)); - - String relPath= getString(bundle, imageKey, null); - if (relPath != null && relPath.trim().length() > 0) { - - String dPath; - String ePath; - - if (relPath.indexOf("/") >= 0) { //$NON-NLS-1$ - String path= relPath.substring(1); - dPath= 'd' + path; - ePath= 'e' + path; - } else { - dPath= "dlcl16/" + relPath; //$NON-NLS-1$ - ePath= "elcl16/" + relPath; //$NON-NLS-1$ - } - - ImageDescriptor id= CompareUIPlugin.getImageDescriptor(dPath); // we set the disabled image first (see PR 1GDDE87) - if (id != null) - a.setDisabledImageDescriptor(id); - id= CompareUIPlugin.getImageDescriptor(ePath); - if (id != null) { - a.setImageDescriptor(id); - a.setHoverImageDescriptor(id); - } - } - } - - public static void initToggleAction(IAction a, ResourceBundle bundle, String prefix, boolean checked) { - - String tooltip= null; - if (checked) - tooltip= getString(bundle, prefix + "tooltip.checked", null); //$NON-NLS-1$ - else - tooltip= getString(bundle, prefix + "tooltip.unchecked", null); //$NON-NLS-1$ - if (tooltip == null) - tooltip= getString(bundle, prefix + "tooltip", null); //$NON-NLS-1$ - - if (tooltip != null) - a.setToolTipText(tooltip); - - String description= null; - if (checked) - description= getString(bundle, prefix + "description.checked", null); //$NON-NLS-1$ - else - description= getString(bundle, prefix + "description.unchecked", null); //$NON-NLS-1$ - if (description == null) - description= getString(bundle, prefix + "description", null); //$NON-NLS-1$ - - if (description != null) - a.setDescription(description); - - } - - public static String getString(ResourceBundle bundle, String key, String dfltValue) { - - if (bundle != null) { - try { - return bundle.getString(key); - } catch (MissingResourceException x) { - // NeedWork - } - } - return dfltValue; - } - - public static String getFormattedString(ResourceBundle bundle, String key, String arg) { - - if (bundle != null) { - try { - return MessageFormat.format(bundle.getString(key), new String[] { arg }); - } catch (MissingResourceException x) { - // NeedWork - } - } - return "!" + key + "!";//$NON-NLS-2$ //$NON-NLS-1$ - } - - public static String getString(String key) { - try { - return CompareUI.getResourceBundle().getString(key); - } catch (MissingResourceException e) { - return "!" + key + "!";//$NON-NLS-2$ //$NON-NLS-1$ - } - } - - public static String getFormattedString(String key, String arg) { - try { - return MessageFormat.format(CompareUI.getResourceBundle().getString(key), new String[] { arg }); - } catch (MissingResourceException e) { - return "!" + key + "!";//$NON-NLS-2$ //$NON-NLS-1$ - } - } - - public static String getFormattedString(String key, String arg0, String arg1) { - try { - return MessageFormat.format(CompareUI.getResourceBundle().getString(key), new String[] { arg0, arg1 }); - } catch (MissingResourceException e) { - return "!" + key + "!";//$NON-NLS-2$ //$NON-NLS-1$ - } - } - - public static String getString(ResourceBundle bundle, String key) { - return getString(bundle, key, key); - } - - public static int getInteger(ResourceBundle bundle, String key, int dfltValue) { - - if (bundle != null) { - try { - String s= bundle.getString(key); - if (s != null) - return Integer.parseInt(s); - } catch (NumberFormatException x) { - // NeedWork - } catch (MissingResourceException x) { - // NeedWork - } - } - return dfltValue; - } - - /** - * Answers true if the given selection contains resources that don't - * have overlapping paths and false otherwise. - */ - /* - public static boolean isSelectionNonOverlapping() throws TeamException { - IResource[] resources = getSelectedResources(); - // allow operation for non-overlapping resource selections - if(resources.length>0) { - List validPaths = new ArrayList(2); - for (int i = 0; i < resources.length; i++) { - IResource resource = resources[i]; - - // only allow cvs resources to be selected - if(RepositoryProvider.getProvider(resource.getProject(), CVSProviderPlugin.getTypeId()) == null) { - return false; - } - - // check if this resource overlaps other selections - IPath resourceFullPath = resource.getFullPath(); - if(!validPaths.isEmpty()) { - for (Iterator it = validPaths.iterator(); it.hasNext();) { - IPath path = (IPath) it.next(); - if(path.isPrefixOf(resourceFullPath) || - resourceFullPath.isPrefixOf(path)) { - return false; - } - } - } - validPaths.add(resourceFullPath); - - // ensure that resources are managed - ICVSResource cvsResource = CVSWorkspaceRoot.getCVSResourceFor(resource); - if(cvsResource.isFolder()) { - if( ! ((ICVSFolder)cvsResource).isCVSFolder()) return false; - } else { - if( ! cvsResource.isManaged()) return false; - } - } - return true; - } - return false; - } - */ - - /* validate edit utilities */ - - /** - * Status constant indicating that an validateEdit call has changed the - * content of a file on disk. - */ - private static final int VALIDATE_EDIT_PROBLEM= 10004; - - /* - * Makes the given resources committable. Committable means that all - * resources are writeable and that the content of the resources hasn't - * changed by calling validateEdit for a given file on - * IWorkspace. - * - * @param resources the resources to be checked - * @param shell the Shell passed to validateEdit as a context - * @return returns true if all resources are committable, false otherwise - * - * @see org.eclipse.core.resources.IWorkspace#validateEdit(org.eclipse.core.resources.IFile[], java.lang.Object) - */ - public static boolean validateResource(IResource resource, Shell shell, String title) { - return validateResources(new IResource[] { resource }, shell, title); - } - - /* - * Makes the given resources committable. Committable means that all - * resources are writeable and that the content of the resources hasn't - * changed by calling validateEdit for a given file on - * IWorkspace. - * - * @param resources the resources to be checked - * @param shell the Shell passed to validateEdit as a context - * @return returns true if all resources are committable, false otherwise - * - * @see org.eclipse.core.resources.IWorkspace#validateEdit(org.eclipse.core.resources.IFile[], java.lang.Object) - */ - public static boolean validateResources(List resources, Shell shell, String title) { - IResource r[]= (IResource[]) resources.toArray(new IResource[resources.size()]); - return validateResources(r, shell, title); - } - - /* - * Makes the given resources committable. Committable means that all - * resources are writeable and that the content of the resources hasn't - * changed by calling validateEdit for a given file on - * IWorkspace. - * - * @param resources the resources to be checked - * @param shell the Shell passed to validateEdit as a context - * @return returns true if all resources are committable, false otherwise - * - * @see org.eclipse.core.resources.IWorkspace#validateEdit(org.eclipse.core.resources.IFile[], java.lang.Object) - */ - public static boolean validateResources(IResource[] resources, Shell shell, String title) { - - // get all readonly files - List readOnlyFiles= getReadonlyFiles(resources); - if (readOnlyFiles.size() == 0) - return true; - - // get timestamps of readonly files before validateEdit - Map oldTimeStamps= createModificationStampMap(readOnlyFiles); - - IFile[] files= (IFile[]) readOnlyFiles.toArray(new IFile[readOnlyFiles.size()]); - IStatus status= ResourcesPlugin.getWorkspace().validateEdit(files, shell); - if (! status.isOK()) { - String message= getString("ValidateEdit.error.unable_to_perform"); //$NON-NLS-1$ - ErrorDialog.openError(shell, title, message, status); //$NON-NLS-1$ - return false; - } - - IStatus modified= null; - Map newTimeStamps= createModificationStampMap(readOnlyFiles); - for (Iterator iter= oldTimeStamps.keySet().iterator(); iter.hasNext();) { - IFile file= (IFile) iter.next(); - if (file.isReadOnly()) { - IStatus entry= new Status(IStatus.ERROR, - CompareUIPlugin.getPluginId(), - VALIDATE_EDIT_PROBLEM, - getFormattedString("ValidateEdit.error.stillReadonly", file.getFullPath().toString()), //$NON-NLS-1$ - null); - modified= addStatus(modified, entry); - } else if (! oldTimeStamps.get(file).equals(newTimeStamps.get(file))) { - IStatus entry= new Status(IStatus.ERROR, - CompareUIPlugin.getPluginId(), - VALIDATE_EDIT_PROBLEM, - getFormattedString("ValidateEdit.error.fileModified", file.getFullPath().toString()), //$NON-NLS-1$ - null); - modified= addStatus(modified, entry); - } - } - if (modified != null) { - String message= getString("ValidateEdit.error.unable_to_perform"); //$NON-NLS-1$ - ErrorDialog.openError(shell, title, message, modified); - return false; - } - return true; - } - - private static List getReadonlyFiles(IResource[] resources) { - List readOnlyFiles= new ArrayList(); - for (int i= 0; i < resources.length; i++) { - IResource resource= resources[i]; - ResourceAttributes resourceAttributes= resource.getResourceAttributes(); - if (resource.getType() == IResource.FILE && resourceAttributes != null && resourceAttributes.isReadOnly()) - readOnlyFiles.add(resource); - } - return readOnlyFiles; - } - - private static Map createModificationStampMap(List files) { - Map map= new HashMap(); - for (Iterator iter= files.iterator(); iter.hasNext(); ) { - IFile file= (IFile)iter.next(); - map.put(file, new Long(file.getModificationStamp())); - } - return map; - } - - private static IStatus addStatus(IStatus status, IStatus entry) { - - if (status == null) - return entry; - - if (status.isMultiStatus()) { - ((MultiStatus)status).add(entry); - return status; - } - - MultiStatus result= new MultiStatus(CompareUIPlugin.getPluginId(), - VALIDATE_EDIT_PROBLEM, - getString("ValidateEdit.error.unable_to_perform"), null); //$NON-NLS-1$ - result.add(status); - result.add(entry); - return result; - } - - // encoding - - /* - * Returns null if an error occurred. - */ - public static String readString(InputStream is, String encoding) { - if (is == null) - return null; - BufferedReader reader= null; - try { - StringBuffer buffer= new StringBuffer(); - char[] part= new char[2048]; - int read= 0; - reader= new BufferedReader(new InputStreamReader(is, encoding)); - - while ((read= reader.read(part)) != -1) - buffer.append(part, 0, read); - - return buffer.toString(); - - } catch (IOException ex) { - // NeedWork - } finally { - if (reader != null) { - try { - reader.close(); - } catch (IOException ex) { - // silently ignored - } - } - } - return null; - } - - public static String getCharset(IResource resource) { - if (resource instanceof IEncodedStorage) { - try { - return ((IEncodedStorage)resource).getCharset(); - } catch (CoreException ex) { - // fall through - } - } - return ResourcesPlugin.getEncoding(); - } - - public static byte[] getBytes(String s, String encoding) { - byte[] bytes= null; - if (s != null) { - try { - bytes= s.getBytes(encoding); //$NON-NLS-1$ - } catch (UnsupportedEncodingException e) { - bytes= s.getBytes(); - } - } - return bytes; - } - - public static String readString(IStreamContentAccessor sa) throws CoreException { - InputStream is= sa.getContents(); - String encoding= null; - if (sa instanceof IEncodedStreamContentAccessor) - encoding= ((IEncodedStreamContentAccessor)sa).getCharset(); - if (encoding == null) - encoding= ResourcesPlugin.getEncoding(); - return Utilities.readString(is, encoding); - } - - public static void close(InputStream is) { - if (is != null) { - try { - is.close(); - } catch (IOException ex) { - // silently ignored - } - } - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ViewerDescriptor.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ViewerDescriptor.java deleted file mode 100644 index 3d5dbcc6f..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ViewerDescriptor.java +++ /dev/null @@ -1,65 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - -import org.eclipse.swt.widgets.Composite; - -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IConfigurationElement; -import org.eclipse.compare.*; - -import org.eclipse.jface.viewers.Viewer; - -/** - * Creates Viewers from an IConfigurationElement. - */ -public class ViewerDescriptor implements IViewerDescriptor { - - private final static String CLASS_ATTRIBUTE= "class"; //$NON-NLS-1$ - private final static String EXTENSIONS_ATTRIBUTE= "extensions"; //$NON-NLS-1$ - - private IConfigurationElement fConfiguration; - private IViewerCreator fViewerCreator; - private Class fViewerClass; - - public ViewerDescriptor(IConfigurationElement config) { - fConfiguration= config; - } - - public Viewer createViewer(Viewer currentViewer, Composite parent, CompareConfiguration mp) { - - if (currentViewer != null && currentViewer.getClass() == fViewerClass) { - //System.out.println("reused viewer: " + currentViewer.getClass().getName()); - return currentViewer; - } - - if (fViewerCreator == null) { - try { - fViewerCreator= (IViewerCreator) fConfiguration.createExecutableExtension(CLASS_ATTRIBUTE); - } catch (CoreException e) { - // NeedWork - } - } - - if (fViewerCreator != null) { - Viewer viewer= fViewerCreator.createViewer(parent, mp); - if (viewer != null) - fViewerClass= viewer.getClass(); - return viewer; - } - - return null; - } - - public String getExtension() { - return fConfiguration.getAttribute(EXTENSIONS_ATTRIBUTE); - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ViewerSwitchingCancelled.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ViewerSwitchingCancelled.java deleted file mode 100644 index 0be0b1396..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/ViewerSwitchingCancelled.java +++ /dev/null @@ -1,19 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal; - - -public class ViewerSwitchingCancelled extends RuntimeException { - - private static final long serialVersionUID = 1L; - -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/LineComparator.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/LineComparator.java deleted file mode 100644 index ce923314a..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/LineComparator.java +++ /dev/null @@ -1,69 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal.merge; - -import java.io.*; -import java.util.ArrayList; -import org.eclipse.compare.rangedifferencer.IRangeComparator; - -/** - * This implementation of IRangeComparator breaks an input stream into lines. - */ -class LineComparator implements IRangeComparator { - - private String[] fLines; - - public LineComparator(InputStream is, String encoding) throws UnsupportedEncodingException { - - BufferedReader br = new BufferedReader(new InputStreamReader(is, encoding)); - String line; - ArrayList ar = new ArrayList(); - try { - while ((line = br.readLine()) != null) - ar.add(line); - } catch (IOException e) { - // silently ignored - } -// try { -// is.close(); -// } catch (IOException e1) { -// } - fLines = (String[]) ar.toArray(new String[ar.size()]); - } - - String getLine(int ix) { - return fLines[ix]; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.rangedifferencer.IRangeComparator#getRangeCount() - */ - public int getRangeCount() { - return fLines.length; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.rangedifferencer.IRangeComparator#rangesEqual(int, org.eclipse.compare.rangedifferencer.IRangeComparator, int) - */ - public boolean rangesEqual(int thisIndex, IRangeComparator other, - int otherIndex) { - String s1 = fLines[thisIndex]; - String s2 = ((LineComparator) other).fLines[otherIndex]; - return s1.equals(s2); - } - - /* (non-Javadoc) - * @see org.eclipse.compare.rangedifferencer.IRangeComparator#skipRangeComparison(int, int, org.eclipse.compare.rangedifferencer.IRangeComparator) - */ - public boolean skipRangeComparison(int length, int maxLength, IRangeComparator other) { - return false; - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/MergeMessages.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/MergeMessages.java deleted file mode 100644 index 21c7939cf..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/MergeMessages.java +++ /dev/null @@ -1,33 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal.merge; - -import java.util.MissingResourceException; -import java.util.ResourceBundle; - -class MergeMessages { - - private static final String RESOURCE_BUNDLE= "org.eclipse.compare.internal.merge.MergeMessages";//$NON-NLS-1$ - - private static ResourceBundle fgResourceBundle= ResourceBundle.getBundle(RESOURCE_BUNDLE); - - private MergeMessages() { - // nothing to do - } - - public static String getString(String key) { - try { - return fgResourceBundle.getString(key); - } catch (MissingResourceException e) { - return "!" + key + "!";//$NON-NLS-2$ //$NON-NLS-1$ - } - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/MergeMessages.properties b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/MergeMessages.properties deleted file mode 100644 index 8b55acb6c..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/MergeMessages.properties +++ /dev/null @@ -1,15 +0,0 @@ -############################################################################### -# Copyright (c) 2004 IBM Corporation and others. -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Common Public License v1.0 -# which accompanies this distribution, and is available at -# http://www.eclipse.org/legal/cpl-v10.html -# -# Contributors: -# IBM Corporation - initial API and implementation -############################################################################### - -TextAutoMerge.inputEncodingError= Unsupported encoding for input streams -TextAutoMerge.outputEncodingError= Unsupported encoding for output streams -TextAutoMerge.outputIOError= IO error on writing -TextAutoMerge.conflict= Conflict: cannot auto merge \ No newline at end of file diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/TextStreamMerger.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/TextStreamMerger.java deleted file mode 100644 index c7bc3fe30..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/merge/TextStreamMerger.java +++ /dev/null @@ -1,97 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2003, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal.merge; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; - -import org.eclipse.compare.*; -import org.eclipse.compare.rangedifferencer.RangeDifference; -import org.eclipse.compare.rangedifferencer.RangeDifferencer; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; - -/** - * A simple merger for streams containing text lines. - */ -public class TextStreamMerger implements IStreamMerger { - - /* - * (non-Javadoc) - * - * @see org.eclipse.compare.internal.merge.IAutoMerger#automerge(java.io.OutputStream, - * org.eclipse.core.resources.IEncodedStorage, - * org.eclipse.core.resources.IEncodedStorage, - * org.eclipse.core.resources.IEncodedStorage, - * org.eclipse.core.runtime.IProgressMonitor) - */ - public IStatus merge(OutputStream output, String outputEncoding, - InputStream ancestor, String ancestorEncoding, - InputStream target, String targetEncoding, - InputStream other, String otherEncoding, - IProgressMonitor monitor) { - - LineComparator a, t, o; - - try { - a= new LineComparator(ancestor, ancestorEncoding); - t= new LineComparator(target, targetEncoding); - o= new LineComparator(other, otherEncoding); - } catch (UnsupportedEncodingException e) { - return new Status(IStatus.ERROR, CompareUI.PLUGIN_ID, 1, MergeMessages.getString("TextAutoMerge.inputEncodingError"), e); //$NON-NLS-1$ - } - - try { - char lineSeparator= '\n'; - - RangeDifference[] diffs = RangeDifferencer.findRanges(monitor, a, t, o); - - for (int i = 0; i < diffs.length; i++) { - RangeDifference rd = diffs[i]; - switch (rd.kind()) { - case RangeDifference.ANCESTOR: // pseudo conflict - case RangeDifference.NOCHANGE: - case RangeDifference.RIGHT: - for (int j = rd.rightStart(); j < rd.rightEnd(); j++) { - String s= o.getLine(j); - output.write(s.getBytes(outputEncoding)); - output.write(lineSeparator); - } - break; - - case RangeDifference.LEFT: - for (int j = rd.leftStart(); j < rd.leftEnd(); j++) { - String s= t.getLine(j); - output.write(s.getBytes(outputEncoding)); - output.write(lineSeparator); - } - break; - - case RangeDifference.CONFLICT: - return new Status(IStatus.ERROR, CompareUI.PLUGIN_ID, CONFLICT, MergeMessages.getString("TextAutoMerge.conflict"), null); //$NON-NLS-1$ - - default: - break; - } - } - - } catch (UnsupportedEncodingException e) { - return new Status(IStatus.ERROR, CompareUI.PLUGIN_ID, 1, MergeMessages.getString("TextAutoMerge.outputEncodingError"), e); //$NON-NLS-1$ - } catch (IOException e) { - return new Status(IStatus.ERROR, CompareUI.PLUGIN_ID, 1, MergeMessages.getString("TextAutoMerge.outputIOError"), e); //$NON-NLS-1$ - } - - return Status.OK_STATUS; - } -} \ No newline at end of file diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/CompareWithPatchAction.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/CompareWithPatchAction.java deleted file mode 100644 index 08b7b9556..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/CompareWithPatchAction.java +++ /dev/null @@ -1,154 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal.patch; - -import java.lang.reflect.InvocationTargetException; -import java.util.Arrays; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Shell; - -import org.eclipse.jface.dialogs.ProgressMonitorDialog; -import org.eclipse.jface.operation.IRunnableWithProgress; -import org.eclipse.jface.util.Assert; -import org.eclipse.jface.viewers.*; -import org.eclipse.jface.window.Window; -import org.eclipse.jface.wizard.IWizard; -import org.eclipse.jface.wizard.WizardDialog; - -import org.eclipse.core.resources.*; -import org.eclipse.core.runtime.*; - -import org.eclipse.ui.IEditorPart; - -import org.eclipse.compare.internal.*; - - -public class CompareWithPatchAction extends BaseCompareAction { - - static class PatchWizardDialog extends WizardDialog { - - PatchWizardDialog(Shell parent, IWizard wizard) { - super(parent, wizard); - - setShellStyle(getShellStyle() | SWT.RESIZE); - setMinimumPageSize(700, 500); - } - } - - protected boolean isEnabled(ISelection selection) { - return Utilities.getResources(selection).length == 1; - } - - /* (non-Javadoc) - * @see org.eclipse.compare.internal.BaseCompareAction#run(org.eclipse.jface.viewers.ISelection) - */ - protected void run(ISelection selection) { - PatchWizard wizard= new PatchWizard(selection); - - if (areAllEditorsSaved()) { - PatchWizardDialog dialog= new PatchWizardDialog(CompareUIPlugin.getShell(), wizard); - dialog.open(); - } - } - - private boolean areAllEditorsSaved(){ - if (CompareUIPlugin.getDirtyEditors().length == 0) - return true; - if (! saveAllDirtyEditors()) - return false; - Shell shell= CompareUIPlugin.getShell(); - try { - // Save isn't cancelable. - IWorkspace workspace= ResourcesPlugin.getWorkspace(); - IWorkspaceDescription description= workspace.getDescription(); - boolean autoBuild= description.isAutoBuilding(); - description.setAutoBuilding(false); - workspace.setDescription(description); - try { - new ProgressMonitorDialog(shell).run(false, false, createRunnable()); - } finally { - description.setAutoBuilding(autoBuild); - workspace.setDescription(description); - } - return true; - } catch (InvocationTargetException e) { - ExceptionHandler.handle(e, shell, PatchMessages.getString("PatchAction.ExceptionTitle"), PatchMessages.getString("Exception")); //$NON-NLS-1$ //$NON-NLS-2$ - return false; - } catch (CoreException e) { - ExceptionHandler.handle(e, shell, PatchMessages.getString("PatchAction.ExceptionTitle"), PatchMessages.getString("Exception")); //$NON-NLS-1$ //$NON-NLS-2$ - return false; - } catch (InterruptedException e) { - Assert.isTrue(false); // Can't happen. Operation isn't cancelable. - return false; - } - } - - private IRunnableWithProgress createRunnable() { - return new IRunnableWithProgress() { - public void run(IProgressMonitor pm) { - IEditorPart[] editorsToSave= CompareUIPlugin.getDirtyEditors(); - pm.beginTask(PatchMessages.getString("PatchAction.SavingDirtyEditorsTask"), editorsToSave.length); //$NON-NLS-1$ - for (int i= 0; i < editorsToSave.length; i++) { - editorsToSave[i].doSave(new SubProgressMonitor(pm, 1)); - pm.worked(1); - } - pm.done(); - } - }; - } - - private boolean saveAllDirtyEditors() { - if (ComparePreferencePage.getSaveAllEditors()) //must save everything - return true; - ListDialog dialog= new ListDialog(CompareUIPlugin.getShell()) { - protected Control createDialogArea(Composite parent) { - Composite result= (Composite) super.createDialogArea(parent); - final Button check= new Button(result, SWT.CHECK); - check.setText(PatchMessages.getString("PatchAction.AlwaysSaveQuestion")); //$NON-NLS-1$ - check.setSelection(ComparePreferencePage.getSaveAllEditors()); - check.addSelectionListener( - new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - ComparePreferencePage.setSaveAllEditors(check.getSelection()); - } - } - ); - applyDialogFont(result); - return result; - } - }; - dialog.setTitle(PatchMessages.getString("PatchAction.SaveAllQuestion")); //$NON-NLS-1$ - dialog.setAddCancelButton(true); - dialog.setLabelProvider(createDialogLabelProvider()); - dialog.setMessage(PatchMessages.getString("PatchAction.SaveAllDescription")); //$NON-NLS-1$ - dialog.setContentProvider(new ListContentProvider()); - dialog.setInput(Arrays.asList(CompareUIPlugin.getDirtyEditors())); - return dialog.open() == Window.OK; - } - - private ILabelProvider createDialogLabelProvider() { - return new LabelProvider() { - public Image getImage(Object element) { - return ((IEditorPart) element).getTitleImage(); - } - public String getText(Object element) { - return ((IEditorPart) element).getTitle(); - } - }; - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/Diff.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/Diff.java deleted file mode 100644 index ad5899bbe..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/Diff.java +++ /dev/null @@ -1,102 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal.patch; - -import java.util.*; - -import org.eclipse.core.runtime.IPath; - -import org.eclipse.compare.structuremergeviewer.Differencer; - - -/* package */ class Diff { - - IPath fOldPath, fNewPath; - long fOldDate, fNewDate; // if 0: no file - List fHunks= new ArrayList(); - boolean fMatches= false; - private boolean fIsEnabled2= true; - String fRejected; - - - /* package */ Diff(IPath oldPath, long oldDate, IPath newPath, long newDate) { - fOldPath= oldPath; - fOldDate= oldPath == null ? 0 : oldDate; - fNewPath= newPath; - fNewDate= newPath == null ? 0 : newDate; - } - - boolean isEnabled() { - return fIsEnabled2; - } - - void setEnabled(boolean b) { - fIsEnabled2= b; - } - - void reverse() { - IPath tp= fOldPath; - fOldPath= fNewPath; - fNewPath= tp; - - long t= fOldDate; - fOldDate= fNewDate; - fNewDate= t; - - Iterator iter= fHunks.iterator(); - while (iter.hasNext()) { - Hunk hunk= (Hunk) iter.next(); - hunk.reverse(); - } - } - - Hunk[] getHunks() { - return (Hunk[]) fHunks.toArray(new Hunk[fHunks.size()]); - } - - IPath getPath() { - if (fOldPath != null) - return fOldPath; - return fNewPath; - } - - void finish() { - if (fHunks.size() == 1) { - Hunk h= (Hunk) fHunks.get(0); - if (h.fNewLength == 0) { - fNewDate= 0; - fNewPath= fOldPath; - } - } - } - - /* package */ void add(Hunk hunk) { - fHunks.add(hunk); - } - - /* package */ int getType() { - if (fOldDate == 0) - return Differencer.ADDITION; - if (fNewDate == 0) - return Differencer.DELETION; - return Differencer.CHANGE; - } - - /* package */ String getDescription(int strip) { - IPath path= fOldPath; - if (fOldDate == 0) - path= fNewPath; - if (strip > 0 && strip < path.segmentCount()) - path= path.removeFirstSegments(strip); - return path.toOSString(); - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/Hunk.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/Hunk.java deleted file mode 100644 index 24a336532..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/Hunk.java +++ /dev/null @@ -1,132 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal.patch; - -import java.util.List; - -/** - * A Hunk describes a range of changed lines and some context lines. - */ -/* package */ class Hunk { - - Diff fParent; - int fOldStart, fOldLength; - int fNewStart, fNewLength; - String[] fLines; - boolean fMatches= false; - private boolean fIsEnabled= true; - - - /* package */ Hunk(Diff parent, int[] oldRange, int[] newRange, List lines) { - - fParent= parent; - if (fParent != null) - fParent.add(this); - - if (oldRange[0] > 0) - fOldStart= oldRange[0]-1; // line number start at 0! - else - fOldStart= 0; - fOldLength= oldRange[1]; - if (newRange[0] > 0) - fNewStart= newRange[0]-1; // line number start at 0! - else - fNewStart= 0; - fNewLength= newRange[1]; - - fLines= (String[]) lines.toArray(new String[lines.size()]); - } - - boolean isEnabled() { - return fIsEnabled; - } - - void setEnabled(boolean enable) { - fIsEnabled= enable; - } - - void reverse() { - int t= fOldStart; - fOldStart= fNewStart; - fNewStart= t; - - t= fOldLength; - fOldLength= fNewLength; - fNewLength= t; - - for (int i= 0; i < fLines.length; i++) { - String line= fLines[i]; - char c= line.charAt(0); - switch (c) { - case '+': - fLines[i]= '-' + line.substring(1); - break; - case '-': - fLines[i]= '+' + line.substring(1); - break; - default: - break; - } - } - } - - /* - * Returns the contents of this hunk. - * Each line starts with a control character. Their meaning is as follows: - *

    - *
  • - * '+': add the line - *
  • - * '-': delete the line - *
  • - * ' ': no change, context line - *
- */ - String getContent() { - StringBuffer sb= new StringBuffer(); - for (int i= 0; i < fLines.length; i++) { - String line= fLines[i]; - sb.append(line.substring(0, Patcher.length(line))); - sb.append('\n'); - } - return sb.toString(); - } - - /* - * Returns a descriptive String for this hunk. - * It is in the form old_start,old_length -> new_start,new_length. - */ - String getDescription() { - StringBuffer sb= new StringBuffer(); - sb.append(Integer.toString(fOldStart)); - sb.append(','); - sb.append(Integer.toString(fOldLength)); - sb.append(" -> "); //$NON-NLS-1$ - sb.append(Integer.toString(fNewStart)); - sb.append(','); - sb.append(Integer.toString(fNewLength)); - return sb.toString(); - } - - String getRejectedDescription() { - StringBuffer sb= new StringBuffer(); - sb.append("@@ -"); //$NON-NLS-1$ - sb.append(Integer.toString(fOldStart)); - sb.append(','); - sb.append(Integer.toString(fOldLength)); - sb.append(" +"); //$NON-NLS-1$ - sb.append(Integer.toString(fNewStart)); - sb.append(','); - sb.append(Integer.toString(fNewLength)); - sb.append(" @@"); //$NON-NLS-1$ - return sb.toString(); - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/InputPatchPage.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/InputPatchPage.java deleted file mode 100644 index 6ec5fd293..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/InputPatchPage.java +++ /dev/null @@ -1,532 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal.patch; - -import java.io.*; -import java.text.MessageFormat; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.dnd.*; -import org.eclipse.swt.events.*; -import org.eclipse.swt.layout.*; -import org.eclipse.swt.widgets.*; - -import org.eclipse.jface.dialogs.*; -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.viewers.*; -import org.eclipse.jface.wizard.*; - -import org.eclipse.ui.help.*; -import org.eclipse.ui.model.*; - -import org.eclipse.compare.internal.ICompareContextIds; -import org.eclipse.compare.internal.Utilities; -import org.eclipse.core.resources.*; -import org.eclipse.core.runtime.*; - - -/* package */ class InputPatchPage extends WizardPage { - - // constants - protected static final int SIZING_TEXT_FIELD_WIDTH= 250; - protected static final int COMBO_HISTORY_LENGTH= 5; - - // dialog store id constants - private final static String PAGE_NAME= "PatchWizardPage1"; //$NON-NLS-1$ - private final static String STORE_PATCH_FILES_ID= PAGE_NAME + ".PATCH_FILES"; //$NON-NLS-1$ - private final static String STORE_USE_CLIPBOARD_ID= PAGE_NAME + ".USE_CLIPBOARD"; //$NON-NLS-1$ - - static final char SEPARATOR = System.getProperty ("file.separator").charAt (0); //$NON-NLS-1$ - - private boolean fShowError= false; - - // SWT widgets - private Button fUseClipboardButton; - private Combo fPatchFileNameField; - private Button fPatchFileBrowseButton; - private Button fUsePatchFileButton; - private Group fPatchFileGroup; - private CheckboxTreeViewer fPatchTargets; - private PatchWizard fPatchWizard; - - - InputPatchPage(PatchWizard pw) { - super("InputPatchPage", PatchMessages.getString("InputPatchPage.title"), null); //$NON-NLS-1$ //$NON-NLS-2$ - fPatchWizard= pw; - setMessage(PatchMessages.getString("InputPatchPage.message")); //$NON-NLS-1$ - } - - /* - * Get a path from the supplied text widget. - * @return org.eclipse.core.runtime.IPath - */ - protected IPath getPathFromText(Text textField) { - return (new Path(textField.getText())).makeAbsolute(); - } - - /* package */ String getPatchName() { - if (getUseClipboard()) - return PatchMessages.getString("InputPatchPage.Clipboard"); //$NON-NLS-1$ - return getPatchFilePath(); - } - - public void createControl(Composite parent) { - - Composite composite= new Composite(parent, SWT.NULL); - composite.setLayout(new GridLayout()); - composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL)); - setControl(composite); - - Label l= new Label(composite, SWT.NONE); - l.setText(PatchMessages.getString("InputPatchPage.SelectInput")); //$NON-NLS-1$ - buildInputGroup(composite); - - new Label(composite, SWT.NONE); // a spacer - - buildPatchFileGroup(composite); - - restoreWidgetValues(); - - updateWidgetEnablements(); - - Dialog.applyDialogFont(composite); - WorkbenchHelp.setHelp(composite, ICompareContextIds.PATCH_INPUT_WIZARD_PAGE); - } - - /* (non-JavaDoc) - * Method declared in IWizardPage. - */ - public IWizardPage getNextPage() { - - Patcher patcher= ((PatchWizard) getWizard()).getPatcher(); - - String source; - // Create a reader for the input - Reader reader= null; - if (getUseClipboard()) { - Control c= getControl(); - if (c != null) { - Clipboard clipboard= new Clipboard(c.getDisplay()); - Object o= clipboard.getContents(TextTransfer.getInstance()); - clipboard.dispose(); - if (o instanceof String) - reader= new StringReader((String)o); - } - source= PatchMessages.getString("InputPatchPage.Clipboard.title"); //$NON-NLS-1$ - } else { - String patchFilePath= getPatchFilePath(); - if (patchFilePath != null) { - try { - reader= new FileReader(patchFilePath); - } catch (FileNotFoundException ex) { - MessageDialog.openError(null, - PatchMessages.getString("InputPatchPage.PatchErrorDialog.title"), //$NON-NLS-1$ - PatchMessages.getString("InputPatchPage.PatchFileNotFound.message")); //$NON-NLS-1$ - } - } - source= PatchMessages.getString("InputPatchPage.PatchFile.title"); //$NON-NLS-1$ - } - - // parse the input - if (reader != null) { - try { - patcher.parse(new BufferedReader(reader)); - } catch (IOException ex) { - MessageDialog.openError(null, - PatchMessages.getString("InputPatchPage.PatchErrorDialog.title"), //$NON-NLS-1$ - PatchMessages.getString("InputPatchPage.ParseError.message")); //$NON-NLS-1$ - } - - try { - reader.close(); - } catch (IOException x) { - // silently ignored - } - } - - Diff[] diffs= patcher.getDiffs(); - if (diffs == null || diffs.length == 0) { - String format= PatchMessages.getString("InputPatchPage.NoDiffsFound.format"); //$NON-NLS-1$ - String message= MessageFormat.format(format, new String[] { source }); - MessageDialog.openInformation(null, - PatchMessages.getString("InputPatchPage.PatchErrorDialog.title"), message); //$NON-NLS-1$ - return this; - } - - // if selected target is file ensure that patch file - // contains only a patch for a single file - IResource target= fPatchWizard.getTarget(); - if (target instanceof IFile && diffs.length > 1) { - String format= PatchMessages.getString("InputPatchPage.SingleFileError.format"); //$NON-NLS-1$ - String message= MessageFormat.format(format, new String[] { source }); - MessageDialog.openInformation(null, - PatchMessages.getString("InputPatchPage.PatchErrorDialog.title"), message); //$NON-NLS-1$ - return this; - } - - // guess prefix count - int guess= 0; // guessPrefix(diffs); - patcher.setStripPrefixSegments(guess); - - return super.getNextPage(); - } - - /* (non-JavaDoc) - * Method declared in IWizardPage. - */ - public boolean canFlipToNextPage() { - // we can't call getNextPage to determine if flipping is allowed since computing - // the next page is quite expensive. So we say yes if the page is complete. - return isPageComplete(); - } - - private void setEnablePatchFile(boolean enable) { - fPatchFileNameField.setEnabled(enable); - fPatchFileBrowseButton.setEnabled(enable); - } - - /* - * Create the group for selecting the patch file - */ - private void buildPatchFileGroup(Composite parent) { - - fPatchFileGroup= new Group(parent, SWT.NONE); - fPatchFileGroup.setText(PatchMessages.getString("InputPatchPage.SelectPatch.title")); //$NON-NLS-1$ - GridLayout layout= new GridLayout(); - layout.numColumns= 3; - fPatchFileGroup.setLayout(layout); - fPatchFileGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - - // 1st row - fUsePatchFileButton= new Button(fPatchFileGroup, SWT.RADIO); - fUsePatchFileButton.setText(PatchMessages.getString("InputPatchPage.FileButton.text")); //$NON-NLS-1$ - - fPatchFileNameField= new Combo(fPatchFileGroup, SWT.BORDER); - GridData gd= new GridData(GridData.FILL_HORIZONTAL); - //gd.horizontalIndent= 8; - gd.widthHint= SIZING_TEXT_FIELD_WIDTH; - fPatchFileNameField.setLayoutData(gd); - - fPatchFileBrowseButton= new Button(fPatchFileGroup, SWT.PUSH); - fPatchFileBrowseButton.setText(PatchMessages.getString("InputPatchPage.ChooseFileButton.text")); //$NON-NLS-1$ - fPatchFileBrowseButton.setLayoutData(new GridData()); - - // 2nd row - fUseClipboardButton= new Button(fPatchFileGroup, SWT.RADIO); - fUseClipboardButton.setText(PatchMessages.getString("InputPatchPage.UseClipboardButton.text")); //$NON-NLS-1$ - gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); - gd.horizontalSpan= 2; - fUseClipboardButton.setLayoutData(gd); - - - // Add listeners - fUsePatchFileButton.addSelectionListener( - new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - fShowError= true; - setEnablePatchFile(!getUseClipboard()); - updateWidgetEnablements(); - } - } - ); - fPatchFileNameField.addSelectionListener( - new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - setSourceName(fPatchFileNameField.getText()); - updateWidgetEnablements(); - } - } - ); - fPatchFileNameField.addModifyListener( - new ModifyListener() { - public void modifyText(ModifyEvent e) { - fShowError= true; - updateWidgetEnablements(); - } - } - ); - fPatchFileBrowseButton.addSelectionListener( - new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - handlePatchFileBrowseButtonPressed(); - updateWidgetEnablements(); - } - } - ); - - //fPatchFileNameField.setFocus(); - } - - private void buildInputGroup(Composite parent) { - - PatchWizard pw= (PatchWizard) getWizard(); - IResource target= pw.getTarget(); - IWorkspace workspace= target.getWorkspace(); - IWorkspaceRoot root= workspace.getRoot(); - - Tree tree= new Tree(parent, SWT.BORDER); - GridData gd= new GridData(GridData.FILL_BOTH); - gd.heightHint= 200; - tree.setLayoutData(gd); - - fPatchTargets= new CheckboxTreeViewer(tree); - fPatchTargets.setLabelProvider(new WorkbenchLabelProvider()); - fPatchTargets.setContentProvider(new WorkbenchContentProvider()); - fPatchTargets.setSorter(new WorkbenchViewerSorter()); - fPatchTargets.setInput(root); - if (target != null) { - fPatchTargets.expandToLevel(target, 0); - fPatchTargets.setSelection(new StructuredSelection(target)); - } - - // register listeners - fPatchTargets.addSelectionChangedListener( - new ISelectionChangedListener() { - public void selectionChanged(SelectionChangedEvent event) { - fPatchWizard.setTargets(Utilities.getResources(event.getSelection())); - updateWidgetEnablements(); - } - } - ); - } - - /** - * Updates the enable state of this page's controls. - */ - private void updateWidgetEnablements() { - - String error= null; - - ISelection selection= fPatchTargets.getSelection(); - boolean anySelected= selection != null && !selection.isEmpty(); - if (!anySelected) - error= PatchMessages.getString("InputPatchPage.NothingSelected.message"); //$NON-NLS-1$ - - boolean gotPatch= false; - if (getUseClipboard()) { - Control c= getControl(); - if (c != null) { - Clipboard clipboard= new Clipboard(c.getDisplay()); - Object o= clipboard.getContents(TextTransfer.getInstance()); - clipboard.dispose(); - if (o instanceof String) { - String s= ((String) o).trim(); - if (s.length() > 0) - gotPatch= true; - else - error= PatchMessages.getString("InputPatchPage.ClipboardIsEmpty.message"); //$NON-NLS-1$ - } else - error= PatchMessages.getString("InputPatchPage.NoTextInClipboard.message"); //$NON-NLS-1$ - } else - error= PatchMessages.getString("InputPatchPage.CouldNotReadClipboard.message"); //$NON-NLS-1$ - } else { - String path= fPatchFileNameField.getText(); - if (path != null && path.length() > 0) { - File file= new File(path); - gotPatch= file.exists() && file.isFile() && file.length() > 0; - if (!gotPatch) - error= PatchMessages.getString("InputPatchPage.CannotLocatePatch.message") + path; //$NON-NLS-1$ - } else { - error= PatchMessages.getString("InputPatchPage.NoFileName.message"); //$NON-NLS-1$ - } - } - - setPageComplete(anySelected && gotPatch); - if (fShowError) - setErrorMessage(error); - } - - protected void handlePatchFileBrowseButtonPressed() { - FileDialog dialog= new FileDialog(getShell(), SWT.NONE); - dialog.setText(PatchMessages.getString("InputPatchPage.SelectPatchFileDialog.title")); //$NON-NLS-1$ - String patchFilePath= getPatchFilePath(); - if (patchFilePath != null) { - int lastSegment= patchFilePath.lastIndexOf(SEPARATOR); - if (lastSegment > 0) { - patchFilePath= patchFilePath.substring(0, lastSegment); - } - } - dialog.setFilterPath(patchFilePath); - String res= dialog.open(); - if (res == null) - return; - - patchFilePath= dialog.getFileName(); - IPath filterPath= new Path(dialog.getFilterPath()); - IPath path= filterPath.append(patchFilePath).makeAbsolute(); - patchFilePath= path.toOSString(); - //fDialogSettings.put(IUIConstants.DIALOGSTORE_LASTEXTJAR, filterPath.toOSString()); - - fPatchFileNameField.setText(patchFilePath); - //setSourceName(patchFilePath); - } - - /** - * Sets the source name of the import to be the supplied path. - * Adds the name of the path to the list of items in the - * source combo and selects it. - * - * @param path the path to be added - */ - protected void setSourceName(String path) { - - if (path.length() > 0) { - - String[] currentItems= fPatchFileNameField.getItems(); - int selectionIndex= -1; - for (int i= 0; i < currentItems.length; i++) - if (currentItems[i].equals(path)) - selectionIndex= i; - - if (selectionIndex < 0) { // not found in history - int oldLength= currentItems.length; - String[] newItems= new String[oldLength + 1]; - System.arraycopy(currentItems, 0, newItems, 0, oldLength); - newItems[oldLength]= path; - fPatchFileNameField.setItems(newItems); - selectionIndex= oldLength; - } - fPatchFileNameField.select(selectionIndex); - - //resetSelection(); - } - } - - /** - * The Finish button was pressed. Try to do the required work now and answer - * a boolean indicating success. If false is returned then the wizard will - * not close. - * - * @return boolean - */ - public boolean finish() { -// if (!ensureSourceIsValid()) -// return false; - - saveWidgetValues(); - -// Iterator resourcesEnum = getSelectedResources().iterator(); -// List fileSystemObjects = new ArrayList(); -// while (resourcesEnum.hasNext()) { -// fileSystemObjects.add( -// ((FileSystemElement) resourcesEnum.next()).getFileSystemObject()); -// } -// -// if (fileSystemObjects.size() > 0) -// return importResources(fileSystemObjects); -// -// MessageDialog -// .openInformation( -// getContainer().getShell(), -// DataTransferMessages.getString("DataTransfer.information"), //$NON-NLS-1$ -// DataTransferMessages.getString("FileImport.noneSelected")); //$NON-NLS-1$ -// -// return false; - - return true; - } - - /** - * Use the dialog store to restore widget values to the values that they held - * last time this wizard was used to completion - */ - private void restoreWidgetValues() { - - boolean useClipboard= false; - - IDialogSettings settings= getDialogSettings(); - if (settings != null) { - - useClipboard= settings.getBoolean(STORE_USE_CLIPBOARD_ID); - - // set filenames history - String[] sourceNames= settings.getArray(STORE_PATCH_FILES_ID); - if (sourceNames != null) - for (int i= 0; i < sourceNames.length; i++) - if (sourceNames[i] != null && sourceNames[i].length() > 0) - fPatchFileNameField.add(sourceNames[i]); - - // set patch file path - String patchFilePath= settings.get(STORE_PATCH_FILES_ID); - if (patchFilePath != null) - setSourceName(patchFilePath); - } - - // set 'Use Clipboard' radio buttons - setUseClipboard(useClipboard); - } - - /** - * Since Finish was pressed, write widget values to the dialog store so that they - * will persist into the next invocation of this wizard page - */ - void saveWidgetValues() { - IDialogSettings settings= getDialogSettings(); - if (settings != null) { - - settings.put(STORE_USE_CLIPBOARD_ID, getUseClipboard()); - settings.put(STORE_PATCH_FILES_ID, getPatchFilePath()); - - // update source names history - String[] sourceNames= settings.getArray(STORE_PATCH_FILES_ID); - if (sourceNames == null) - sourceNames= new String[0]; - - sourceNames= addToHistory(sourceNames, getPatchFilePath()); - settings.put(STORE_PATCH_FILES_ID, sourceNames); - } - } - - // static helpers - - private void setUseClipboard(boolean useClipboard) { - if (useClipboard) - fUseClipboardButton.setSelection(true); - else - fUsePatchFileButton.setSelection(true); - setEnablePatchFile(!useClipboard); - } - - private boolean getUseClipboard() { - if (fUseClipboardButton != null) - return fUseClipboardButton.getSelection(); - return false; - } - - private String getPatchFilePath() { - if (fPatchFileNameField != null) - return fPatchFileNameField.getText(); - return ""; //$NON-NLS-1$ - } - - /* - * Adds an entry to a history, while taking care of duplicate history items - * and excessively long histories. The assumption is made that all histories - * should be of length COMBO_HISTORY_LENGTH. - * - * @param history the current history - * @param newEntry the entry to add to the history - */ - protected static String[] addToHistory(String[] history, String newEntry) { - java.util.ArrayList l= new java.util.ArrayList(java.util.Arrays.asList(history)); - - l.remove(newEntry); - l.add(0,newEntry); - - // since only one new item was added, we can be over the limit - // by at most one item - if (l.size() > COMBO_HISTORY_LENGTH) - l.remove(COMBO_HISTORY_LENGTH); - - return (String[]) l.toArray(new String[l.size()]); - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/LineReader.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/LineReader.java deleted file mode 100644 index f4ceeeb01..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/LineReader.java +++ /dev/null @@ -1,134 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal.patch; - -import java.io.*; -import java.util.*; - -import org.eclipse.jface.util.Assert; - -/* package */ class LineReader { - - private boolean fHaveChar= false; - private int fLastChar; - private boolean fSawEOF= false; - private BufferedReader fReader; - private boolean fIgnoreSingleCR= false; - - - /* package */ LineReader(BufferedReader reader) { - fReader= reader; - Assert.isNotNull(reader); - } - - void ignoreSingleCR() { - fIgnoreSingleCR= true; - } - - /** - * Reads a line of text. A line is considered to be terminated by any one - * of a line feed ('\n'), a carriage return ('\r'), or a carriage return - * followed immediately by a linefeed. - * @return A string containing the contents of the line including - * the line-termination characters, or null if the end of the - * stream has been reached - * @exception IOException If an I/O error occurs - */ - /* package */ String readLine() throws IOException { - StringBuffer sb= null; - - while (!fSawEOF) { - int c= readChar(); - if (c == -1) { - fSawEOF= true; - break; - } - if (sb == null) - sb= new StringBuffer(); - sb.append((char)c); - if (c == '\n') - break; - if (c == '\r') { - c= readChar(); - if (c == -1) { - fSawEOF= true; - break; // EOF - } - if (c != '\n') { - if (fIgnoreSingleCR) { - sb.append((char)c); - continue; - } - fHaveChar= true; - fLastChar= c; - } else - sb.append((char)c); - break; - } - } - - if (sb != null) - return sb.toString(); - return null; - } - - /* package */ void close() { - try { - fReader.close(); - } catch (IOException ex) { - // silently ignored - } - } - - /* package */ List readLines() { - try { - List lines= new ArrayList(); - String line; - while ((line= readLine()) != null) - lines.add(line); - return lines; - } catch (IOException ex) { - // NeedWork - //System.out.println("error while reading file: " + fileName + "(" + ex + ")"); - } finally { - close(); - } - return null; - } - - /* - * Returns the number of characters in the given string without - * counting a trailing line separator. - */ - /* package */ int lineContentLength(String line) { - if (line == null) - return 0; - int length= line.length(); - for (int i= length-1; i >= 0; i--) { - char c= line.charAt(i); - if (c =='\n' || c == '\r') - length--; - else - break; - } - return length; - } - - //---- private - - private int readChar() throws IOException { - if (fHaveChar) { - fHaveChar= false; - return fLastChar; - } - return fReader.read(); - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchErrorDialog.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchErrorDialog.java deleted file mode 100644 index 7b1b0a702..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchErrorDialog.java +++ /dev/null @@ -1,19 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal.patch; - -public class PatchErrorDialog { - - private PatchErrorDialog() { - // no instance. - } - -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.java deleted file mode 100644 index eac554ccf..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.java +++ /dev/null @@ -1,33 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal.patch; - -import java.util.MissingResourceException; -import java.util.ResourceBundle; - -public class PatchMessages { - - private static final String RESOURCE_BUNDLE= "org.eclipse.compare.internal.patch.PatchMessages";//$NON-NLS-1$ - - private static ResourceBundle fgResourceBundle= ResourceBundle.getBundle(RESOURCE_BUNDLE); - - private PatchMessages() { - // nothing to do - } - - public static String getString(String key) { - try { - return fgResourceBundle.getString(key); - } catch (MissingResourceException e) { - return "!" + key + "!";//$NON-NLS-2$ //$NON-NLS-1$ - } - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.properties b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.properties deleted file mode 100644 index e0e37821e..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchMessages.properties +++ /dev/null @@ -1,91 +0,0 @@ -############################################################################### -# Copyright (c) 2000, 2004 IBM Corporation and others. -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Common Public License v1.0 -# which accompanies this distribution, and is available at -# http://www.eclipse.org/legal/cpl-v10.html -# -# Contributors: -# IBM Corporation - initial API and implementation -############################################################################### - -# -# 'Compare with Patch' Action -# -PatchAction.ExceptionTitle=Saving Resources -PatchAction.Exception=Unexpected exception. See log for details -PatchAction.SavingDirtyEditorsTask=Saving dirty editors -PatchAction.AlwaysSaveQuestion=&Always save all modified resources automatically prior to patching -PatchAction.SaveAllQuestion=Save all modified resources -PatchAction.SaveAllDescription=All modified resources have to be saved before this operation.\nClick 'OK' to confirm or click 'Cancel'. - -# -# PatchWizard -# -PatchWizard.title=Apply Patch -PatchWizard.unexpectedException.message= Unexpected exception while applying the patch. See log for a detailed error description. - -# -# InputPatchPage -# -InputPatchPage.title= Patch Input Specification -InputPatchPage.message= Define the resource to patch and the patch to apply -InputPatchPage.Clipboard=Clipboard -InputPatchPage.SelectInput=Select a single file or folder to patch: -InputPatchPage.PatchErrorDialog.title=Patch Error -InputPatchPage.PatchErrorDialog=Patch Error -InputPatchPage.SelectPatch.title=Select Patch -InputPatchPage.FileButton.text=Fil&e -InputPatchPage.ChooseFileButton.text=&Browse... -InputPatchPage.UseClipboardButton.text=&Clipboard -InputPatchPage.NothingSelected.message=Select a file or folder to be patched -InputPatchPage.ClipboardIsEmpty.message=Clipboard is empty -InputPatchPage.NoTextInClipboard.message=Clipboard does not contain text -InputPatchPage.CouldNotReadClipboard.message=Cannot retrieve clipboard contents -InputPatchPage.CannotLocatePatch.message=Cannot locate patch file: -InputPatchPage.NoFileName.message=No file name -#SI - Select file name ? -InputPatchPage.SelectPatchFileDialog.title=Select Patch File -InputPatchPage.PatchFileNotFound.message=Patch file not found. -InputPatchPage.ParseError.message=Error while parsing patch -InputPatchPage.Clipboard.title=Clipboard -InputPatchPage.PatchFile.title=Patch file -InputPatchPage.NoDiffsFound.format={0} does not contain valid patch. -InputPatchPage.SingleFileError.format={0} contains multiple patches. You cannot apply them to a single file. - -# -# PreviewPatchPage -# -PreviewPatchPage.title= Verify Patch -PreviewPatchPage.message= The tree shows the contents of the patch.\nA checked item indicates that a patch can be applied successfully. To remove an item, clear its checkbox. -PreviewPatchPage.Left.title= Original -PreviewPatchPage.Right.title= Result -PreviewPatchPage.PatchOptions.title=Patch Options -PreviewPatchPage.IgnoreSegments.text=&Ignore leading path name segments: -PreviewPatchPage.ReversePatch.text=&Reverse patch -PreviewPatchPage.FuzzFactor.text=&Maximum fuzz factor: -PreviewPatchPage.FuzzFactor.tooltip=Allow Context to Shift This Number of Lines from the Original Location -PreviewPatchPage.IgnoreWhitespace.text=Ignore &white space -PreviewPatchPage.NoName.text=no name -PreviewPatchPage.FileExists.error=(file already exists) -PreviewPatchPage.FileDoesNotExist.error=(file does not exist) -PreviewPatchPage.NoMatch.error=(no match) -PreviewPatchPage.FileIsReadOnly.error=(file is read-only) -PreviewPatchPage.GuessFuzz.text= &Guess -PreviewPatchPage.GuessFuzzProgress.text= Guessing Fuzz Factor... -PreviewPatchPage.GuessFuzzProgress.format= {0} (hunk #{1}) - -# -# Patcher -# -Patcher.ErrorDialog.title=title -Patcher.DeleteError.message=Error while deleting resource -Patcher.UpdateError.message=Error while updating resource -Patcher.RefreshError.message=Error while refreshing from local -Patcher.Marker.message=Rejected patch -Patcher.Task.message=Patching - -# -# PatchCompareInput -# -PatchCompareInput.RightTitle.format= Patch: {0} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchWizard.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchWizard.java deleted file mode 100644 index 6f7b1f5e5..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchWizard.java +++ /dev/null @@ -1,135 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal.patch; - -import java.lang.reflect.InvocationTargetException; - -import org.eclipse.jface.dialogs.IDialogSettings; -import org.eclipse.jface.viewers.*; -import org.eclipse.jface.wizard.Wizard; - -import org.eclipse.core.resources.IResource; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.CoreException; - -import org.eclipse.ui.actions.WorkspaceModifyOperation; - -import org.eclipse.compare.internal.*; - - -/* package */ class PatchWizard extends Wizard { - - // dialog store id constants - private final static String DIALOG_SETTINGS_KEY= "PatchWizard"; //$NON-NLS-1$ - - private boolean fHasNewDialogSettings; - - private InputPatchPage fPatchWizardPage; - - private Patcher fPatcher; - private IResource fTarget; - - - /* - * Creates a wizard for applying a patch file to the workspace. - */ - /* package */ PatchWizard(ISelection selection) { - - setDefaultPageImageDescriptor(CompareUIPlugin.getImageDescriptor("wizban/applypatch_wizban.gif")); //$NON-NLS-1$ - setWindowTitle(PatchMessages.getString("PatchWizard.title")); //$NON-NLS-1$ - - setTargets(Utilities.getResources(selection)); - - fPatcher= new Patcher(); - - IDialogSettings workbenchSettings= CompareUIPlugin.getDefault().getDialogSettings(); - IDialogSettings section= workbenchSettings.getSection(DIALOG_SETTINGS_KEY); //$NON-NLS-1$ - if (section == null) - fHasNewDialogSettings= true; - else { - fHasNewDialogSettings= false; - setDialogSettings(section); - } - } - - Patcher getPatcher() { - return fPatcher; - } - - IResource getTarget() { - return fTarget; - } - - void setTargets(IResource[] targets) { - if (targets != null && targets.length > 0) - fTarget= targets[0]; // right now we can only deal with a single selection - } - - /* (non-Javadoc) - * Method declared on IWizard. - */ - public void addPages() { - super.addPages(); - - addPage(fPatchWizardPage= new InputPatchPage(this)); - addPage(new PreviewPatchPage(this)); - } - - /* (non-Javadoc) - * Method declared on IWizard. - */ - public boolean needsProgressMonitor() { - return true; - } - - /* (non-Javadoc) - * Method declared on IWizard. - */ - public boolean performFinish() { - - fPatcher.setName(fPatchWizardPage.getPatchName()); - - try { - WorkspaceModifyOperation op= new WorkspaceModifyOperation(fTarget.getProject()) { - protected void execute(IProgressMonitor monitor) throws InvocationTargetException { - try { - fPatcher.applyAll(getTarget(), monitor, getShell(), PatchMessages.getString("PatchWizard.title")); //$NON-NLS-1$ - } catch (CoreException e) { - throw new InvocationTargetException(e); - } - } - }; - getContainer().run(true, false, op); - - } catch (InvocationTargetException e) { - ExceptionHandler.handle(e, - PatchMessages.getString("PatchWizard.title"), //$NON-NLS-1$ - PatchMessages.getString("PatchWizard.unexpectedException.message")); //$NON-NLS-1$ - } catch (InterruptedException e) { - // cannot happen - // NeedWork: use assert! - } - - // Save the dialog settings - if (fHasNewDialogSettings) { - IDialogSettings workbenchSettings= CompareUIPlugin.getDefault().getDialogSettings(); - IDialogSettings section= workbenchSettings.getSection(DIALOG_SETTINGS_KEY); - section= workbenchSettings.addNewSection(DIALOG_SETTINGS_KEY); - setDialogSettings(section); - } - - fPatchWizardPage.saveWidgetValues(); - //fPreviewPatchPage.saveWidgetValues(); - - return true; - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/Patcher.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/Patcher.java deleted file mode 100644 index 29e3827d1..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/Patcher.java +++ /dev/null @@ -1,1081 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal.patch; - -import java.io.*; -import java.text.*; -import java.util.*; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Shell; - -import org.eclipse.jface.util.Assert; - -import org.eclipse.core.runtime.*; -import org.eclipse.core.resources.*; - -import org.eclipse.compare.internal.Utilities; -import org.eclipse.compare.structuremergeviewer.Differencer; - -/** - * A Patcher - * - knows how to parse various patch file formats into some in-memory structure, - * - holds onto the parsed data and the options to use when applying the patches, - * - knows how to apply the patches to files and folders. - */ -public class Patcher { - - private static final boolean DEBUG= false; - - private static final String DEV_NULL= "/dev/null"; //$NON-NLS-1$ - - private static final String REJECT_FILE_EXTENSION= ".rej"; //$NON-NLS-1$ - - private static final String MARKER_TYPE= "org.eclipse.compare.rejectedPatchMarker"; //$NON-NLS-1$ - - // diff formats -// private static final int CONTEXT= 0; -// private static final int ED= 1; -// private static final int NORMAL= 2; -// private static final int UNIFIED= 3; - - // we recognize the following date/time formats - private static DateFormat[] DATE_FORMATS= new DateFormat[] { - new SimpleDateFormat("EEE MMM dd kk:mm:ss yyyy"), //$NON-NLS-1$ - new SimpleDateFormat("yyyy/MM/dd kk:mm:ss"), //$NON-NLS-1$ - new SimpleDateFormat("EEE MMM dd kk:mm:ss yyyy", Locale.US) //$NON-NLS-1$ - }; - - private String fName; - private Diff[] fDiffs; - // patch options - private int fStripPrefixSegments; - private int fFuzz; - private boolean fIgnoreWhitespace= false; - private boolean fIgnoreLineDelimiter= true; - private boolean fPreserveLineDelimiters= false; - private boolean fReverse= false; - private boolean fAdjustShift= true; - - - Patcher() { - // nothing to do - } - - //---- options - - void setName(String name) { - fName= name; - } - - String getName() { - return fName; - } - - /* - * Returns an array of Diffs after a sucessfull call to parse. - * If parse hasn't been called returns null. - */ - Diff[] getDiffs() { - return fDiffs; - } - - IPath getPath(Diff diff) { - IPath path= diff.getPath(); - if (fStripPrefixSegments > 0 && fStripPrefixSegments < path.segmentCount()) - path= path.removeFirstSegments(fStripPrefixSegments); - return path; - } - - /* - * Returns true if new value differs from old. - */ - boolean setStripPrefixSegments(int strip) { - if (strip != fStripPrefixSegments) { - fStripPrefixSegments= strip; - return true; - } - return false; - } - - int getStripPrefixSegments() { - return fStripPrefixSegments; - } - - /* - * Returns true if new value differs from old. - */ - boolean setFuzz(int fuzz) { - if (fuzz != fFuzz) { - fFuzz= fuzz; - return true; - } - return false; - } - - /* - * Returns true if new value differs from old. - */ - boolean setReversed(boolean reverse) { - if (fReverse != reverse) { - fReverse= reverse; - - for (int i= 0; i < fDiffs.length; i++) - fDiffs[i].reverse(); - - return true; - } - return false; - } - - /* - * Returns true if new value differs from old. - */ - boolean setIgnoreWhitespace(boolean ignoreWhitespace) { - if (ignoreWhitespace != fIgnoreWhitespace) { - fIgnoreWhitespace= ignoreWhitespace; - return true; - } - return false; - } - - //---- parsing patch files - - /* package */ void parse(BufferedReader reader) throws IOException { - List diffs= new ArrayList(); - String line= null; - boolean reread= false; - String diffArgs= null; - String fileName= null; - - LineReader lr= new LineReader(reader); - if (!"carbon".equals(SWT.getPlatform())) //$NON-NLS-1$ - lr.ignoreSingleCR(); - - // read leading garbage - while (true) { - if (!reread) - line= lr.readLine(); - reread= false; - if (line == null) - break; - if (line.length() < 4) - continue; // too short - - // remember some infos - if (line.startsWith("Index: ")) { //$NON-NLS-1$ - fileName= line.substring(7).trim(); - continue; - } - if (line.startsWith("diff")) { //$NON-NLS-1$ - diffArgs= line.substring(4).trim(); - continue; - } - - if (line.startsWith("--- ")) { //$NON-NLS-1$ - line= readUnifiedDiff(diffs, lr, line, diffArgs, fileName); - diffArgs= fileName= null; - reread= true; - } else if (line.startsWith("*** ")) { //$NON-NLS-1$ - line= readContextDiff(diffs, lr, line, diffArgs, fileName); - diffArgs= fileName= null; - reread= true; - } - } - - lr.close(); - - fDiffs= (Diff[]) diffs.toArray(new Diff[diffs.size()]); - } - - /* - * Returns the next line that does not belong to this diff - */ - private String readUnifiedDiff(List diffs, LineReader reader, String line, String args, String fileName) throws IOException { - - String[] oldArgs= split(line.substring(4)); - - // read info about new file - line= reader.readLine(); - if (line == null || !line.startsWith("+++ ")) //$NON-NLS-1$ - return line; - - String[] newArgs= split(line.substring(4)); - - Diff diff= new Diff(extractPath(oldArgs, 0, fileName), extractDate(oldArgs, 1), - extractPath(newArgs, 0, fileName), extractDate(newArgs, 1)); - diffs.add(diff); - - int[] oldRange= new int[2]; - int[] newRange= new int[2]; - List lines= new ArrayList(); - - try { - // read lines of hunk - while (true) { - - line= reader.readLine(); - if (line == null) - return null; - - if (reader.lineContentLength(line) == 0) { - //System.out.println("Warning: found empty line in hunk; ignored"); - //lines.add(' ' + line); - continue; - } - - char c= line.charAt(0); - switch (c) { - case '@': - if (line.startsWith("@@ ")) { //$NON-NLS-1$ - // flush old hunk - if (lines.size() > 0) { - new Hunk(diff, oldRange, newRange, lines); - lines.clear(); - } - - // format: @@ -oldStart,oldLength +newStart,newLength @@ - extractPair(line, '-', oldRange); - extractPair(line, '+', newRange); - continue; - } - break; - case ' ': - case '+': - case '-': - lines.add(line); - continue; - case '\\': - if (line.startsWith("No newline at end of file", 2)) { //$NON-NLS-1$ - int lastIndex= lines.size(); - if (lastIndex > 0) { - line= (String) lines.get(lastIndex-1); - int end= line.length()-1; - char lc= line.charAt(end); - if (lc == '\n') { - end--; - if (end > 0 && line.charAt(end-1) == '\r') - end--; - } else if (lc == '\r') { - end--; - } - line= line.substring(0, end); - lines.set(lastIndex-1, line); - } - continue; - } - break; - default: - if (DEBUG) { - int a1= c, a2= 0; - if (line.length() > 1) - a2= line.charAt(1); - System.out.println("char: " + a1 + " " + a2); //$NON-NLS-1$ //$NON-NLS-2$ - } - break; - } - return line; - } - } finally { - if (lines.size() > 0) - new Hunk(diff, oldRange, newRange, lines); - diff.finish(); - } - } - - /* - * Returns the next line that does not belong to this diff - */ - private String readContextDiff(List diffs, LineReader reader, String line, String args, String fileName) throws IOException { - - String[] oldArgs= split(line.substring(4)); - - // read info about new file - line= reader.readLine(); - if (line == null || !line.startsWith("--- ")) //$NON-NLS-1$ - return line; - - String[] newArgs= split(line.substring(4)); - - Diff diff= new Diff(extractPath(oldArgs, 0, fileName), extractDate(oldArgs, 1), - extractPath(newArgs, 0, fileName), extractDate(newArgs, 1)); - diffs.add(diff); - - int[] oldRange= new int[2]; - int[] newRange= new int[2]; - List oldLines= new ArrayList(); - List newLines= new ArrayList(); - List lines= oldLines; - - try { - // read lines of hunk - while (true) { - - line= reader.readLine(); - if (line == null) - return line; - - int l= line.length(); - if (l == 0) - continue; - if (l > 1) { - switch (line.charAt(0)) { - case '*': - if (line.startsWith("***************")) { // new hunk //$NON-NLS-1$ - // flush old hunk - if (oldLines.size() > 0 || newLines.size() > 0) { - new Hunk(diff, oldRange, newRange, unifyLines(oldLines, newLines)); - oldLines.clear(); - newLines.clear(); - } - continue; - } - if (line.startsWith("*** ")) { // old range //$NON-NLS-1$ - // format: *** oldStart,oldEnd *** - extractPair(line, ' ', oldRange); - oldRange[1]= oldRange[1]-oldRange[0]+1; - lines= oldLines; - continue; - } - break; - case ' ': // context line - case '+': // addition - case '!': // change - if (line.charAt(1) == ' ') { - lines.add(line); - continue; - } - break; - case '-': - if (line.charAt(1) == ' ') { // deletion - lines.add(line); - continue; - } - if (line.startsWith("--- ")) { // new range //$NON-NLS-1$ - // format: *** newStart,newEnd *** - extractPair(line, ' ', newRange); - newRange[1]= newRange[1]-newRange[0]+1; - lines= newLines; - continue; - } - break; - default: - break; - } - } - return line; - } - } finally { - // flush last hunk - if (oldLines.size() > 0 || newLines.size() > 0) - new Hunk(diff, oldRange, newRange, unifyLines(oldLines, newLines)); - diff.finish(); - } - } - - /* - * Creates a List of lines in the unified format from - * two Lists of lines in the 'classic' format. - */ - private List unifyLines(List oldLines, List newLines) { - List result= new ArrayList(); - - String[] ol= (String[]) oldLines.toArray(new String[oldLines.size()]); - String[] nl= (String[]) newLines.toArray(new String[newLines.size()]); - - int oi= 0, ni= 0; - - while (true) { - - char oc= 0; - String o= null; - if (oi < ol.length) { - o= ol[oi]; - oc= o.charAt(0); - } - - char nc= 0; - String n= null; - if (ni < nl.length) { - n= nl[ni]; - nc= n.charAt(0); - } - - // EOF - if (oc == 0 && nc == 0) - break; - - // deletion in old - if (oc == '-') { - do { - result.add('-' + o.substring(2)); - oi++; - if (oi >= ol.length) - break; - o= ol[oi]; - } while (o.charAt(0) == '-'); - continue; - } - - // addition in new - if (nc == '+') { - do { - result.add('+' + n.substring(2)); - ni++; - if (ni >= nl.length) - break; - n= nl[ni]; - } while (n.charAt(0) == '+'); - continue; - } - - // differing lines on both sides - if (oc == '!' && nc == '!') { - // remove old - do { - result.add('-' + o.substring(2)); - oi++; - if (oi >= ol.length) - break; - o= ol[oi]; - } while (o.charAt(0) == '!'); - - // add new - do { - result.add('+' + n.substring(2)); - ni++; - if (ni >= nl.length) - break; - n= nl[ni]; - } while (n.charAt(0) == '!'); - - continue; - } - - // context lines - if (oc == ' ' && nc == ' ') { - do { - Assert.isTrue(o.equals(n), "non matching context lines"); //$NON-NLS-1$ - result.add(' ' + o.substring(2)); - oi++; - ni++; - if (oi >= ol.length || ni >= nl.length) - break; - o= ol[oi]; - n= nl[ni]; - } while (o.charAt(0) == ' ' && n.charAt(0) == ' '); - continue; - } - - if (oc == ' ') { - do { - result.add(' ' + o.substring(2)); - oi++; - if (oi >= ol.length) - break; - o= ol[oi]; - } while (o.charAt(0) == ' '); - continue; - } - - if (nc == ' ') { - do { - result.add(' ' + n.substring(2)); - ni++; - if (ni >= nl.length) - break; - n= nl[ni]; - } while (n.charAt(0) == ' '); - continue; - } - - Assert.isTrue(false, "unexpected char <" + oc + "> <" + nc + ">"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - - return result; - } - - /* - * Breaks the given string into tab separated substrings. - * Leading and trailing whitespace is removed from each token. - */ - private String[] split(String line) { - List l= new ArrayList(); - StringTokenizer st= new StringTokenizer(line, "\t"); //$NON-NLS-1$ - while (st.hasMoreElements()) { - String token= st.nextToken().trim(); - if (token.length() > 0) - l.add(token); - } - return (String[]) l.toArray(new String[l.size()]); - } - - /* - * @return the parsed time/date in milliseconds or -1 on error - */ - private long extractDate(String[] args, int n) { - if (n < args.length) { - String line= args[n]; - for (int i= 0; i < DATE_FORMATS.length; i++) { - DATE_FORMATS[i].setLenient(true); - try { - Date date= DATE_FORMATS[i].parse(line); - return date.getTime(); - } catch (ParseException ex) { - // silently ignored - } - } - // System.err.println("can't parse date: <" + line + ">"); - } - return -1; - } - - /* - * Returns null if file name is "/dev/null". - */ - private IPath extractPath(String[] args, int n, String path2) { - if (n < args.length) { - String path= args[n]; - if (DEV_NULL.equals(path)) - return null; - int pos= path.lastIndexOf(':'); - if (pos >= 0) - path= path.substring(0, pos); - if (path2 != null && !path2.equals(path)) { - if (DEBUG) System.out.println("path mismatch: " + path2); //$NON-NLS-1$ - path= path2; - } - return new Path(path); - } - return null; - } - - /* - * Tries to extract two integers separated by a comma. - * The parsing of the line starts at the position after - * the first occurrence of the given character start an ends - * at the first blank (or the end of the line). - * If only a single number is found this is assumed to be the length of the range. - * In this case the start of the range is set to 1. - * If an error occurs the range -1,-1 is returned. - */ - private void extractPair(String line, char start, int[] pair) { - pair[0]= pair[1]= -1; - int startPos= line.indexOf(start); - if (startPos < 0) { - if (DEBUG) System.out.println("parsing error in extractPair: couldn't find \'" + start + "\'"); //$NON-NLS-1$ //$NON-NLS-2$ - return; - } - line= line.substring(startPos+1); - int endPos= line.indexOf(' '); - if (endPos < 0) { - if (DEBUG) System.out.println("parsing error in extractPair: couldn't find end blank"); //$NON-NLS-1$ - return; - } - line= line.substring(0, endPos); - int comma= line.indexOf(','); - if (comma >= 0) { - pair[0]= Integer.parseInt(line.substring(0, comma)); - pair[1]= Integer.parseInt(line.substring(comma+1)); - } else { - pair[0]= 1; - pair[1]= Integer.parseInt(line.substring(comma+1)); - } - } - - //---- applying a patch file - - /* - * Tries to patch the given lines with the specified Diff. - * Any hunk that couldn't be applied is returned in the list failedHunks. - */ - /* package */ void patch(Diff diff, List lines, List failedHunks) { - - int shift= 0; - Iterator iter= diff.fHunks.iterator(); - while (iter.hasNext()) { - Hunk hunk= (Hunk) iter.next(); - hunk.fMatches= false; - shift= patch(hunk, lines, shift, failedHunks); - } - } - - /* - * Tries to apply the specified hunk to the given lines. - * If the hunk cannot be applied at the original position - * the methods tries Fuzz lines before and after. - * If this fails the Hunk is added to the given list of failed hunks. - */ - private int patch(Hunk hunk, List lines, int shift, List failedHunks) { - if (tryPatch(hunk, lines, shift)) { - if (hunk.isEnabled()) - shift+= doPatch(hunk, lines, shift); - } else { - boolean found= false; - int oldShift= shift; - - for (int i= 1; i <= fFuzz; i++) { - if (tryPatch(hunk, lines, shift-i)) { - if (fAdjustShift) - shift-= i; - found= true; - break; - } - } - - if (! found) { - for (int i= 1; i <= fFuzz; i++) { - if (tryPatch(hunk, lines, shift+i)) { - if (fAdjustShift) - shift+= i; - found= true; - break; - } - } - } - - if (found) { - if (DEBUG) System.out.println("patched hunk at offset: " + (shift-oldShift)); //$NON-NLS-1$ - shift+= doPatch(hunk, lines, shift); - } else { - if (failedHunks != null) { - if (DEBUG) System.out.println("failed hunk"); //$NON-NLS-1$ - failedHunks.add(hunk); - } - } - } - return shift; - } - - /* - * Tries to apply the given hunk on the specified lines. - * The parameter shift is added to the line numbers given - * in the hunk. - */ - private boolean tryPatch(Hunk hunk, List lines, int shift) { - int pos= hunk.fOldStart + shift; - int deleteMatches= 0; - for (int i= 0; i < hunk.fLines.length; i++) { - String s= hunk.fLines[i]; - Assert.isTrue(s.length() > 0); - String line= s.substring(1); - char controlChar= s.charAt(0); - if (controlChar == ' ') { // context lines - while (true) { - if (pos < 0 || pos >= lines.size()) - return false; - if (linesMatch(line, (String) lines.get(pos))) { - pos++; - break; - } - return false; - } - } else if (controlChar == '-') { - // deleted lines - while (true) { - if (pos < 0 || pos >= lines.size()) - return false; - if (linesMatch(line, (String) lines.get(pos))) { - deleteMatches++; - pos++; - break; - } - if (deleteMatches <= 0) - return false; - pos++; - } - } else if (controlChar == '+') { - // added lines - // we don't have to do anything for a 'try' - } else - Assert.isTrue(false, "tryPatch: unknown control character: " + controlChar); //$NON-NLS-1$ - } - return true; - } - - private int doPatch(Hunk hunk, List lines, int shift) { - int pos= hunk.fOldStart + shift; - for (int i= 0; i < hunk.fLines.length; i++) { - String s= hunk.fLines[i]; - Assert.isTrue(s.length() > 0); - String line= s.substring(1); - char controlChar= s.charAt(0); - if (controlChar == ' ') { // context lines - while (true) { - Assert.isTrue(pos < lines.size(), "doPatch: inconsistency in context"); //$NON-NLS-1$ - if (linesMatch(line, (String) lines.get(pos))) { - pos++; - break; - } - pos++; - } - } else if (controlChar == '-') { - // deleted lines - while (true) { - Assert.isTrue(pos < lines.size(), "doPatch: inconsistency in deleted lines"); //$NON-NLS-1$ - if (linesMatch(line, (String) lines.get(pos))) { - break; - } - pos++; - } - lines.remove(pos); - } else if (controlChar == '+') { - // added lines - lines.add(pos, line); - pos++; - } else - Assert.isTrue(false, "doPatch: unknown control character: " + controlChar); //$NON-NLS-1$ - } - hunk.fMatches= true; - return hunk.fNewLength - hunk.fOldLength; - } - - public void applyAll(IResource target, IProgressMonitor pm, Shell shell, String title) throws CoreException { - - final int WORK_UNIT= 10; - - int i; - - IFile singleFile= null; // file to be patched - IContainer container= null; - if (target instanceof IContainer) - container= (IContainer) target; - else if (target instanceof IFile) { - singleFile= (IFile) target; - container= singleFile.getParent(); - } else { - Assert.isTrue(false); - } - - // get all files to be modified in order to call validateEdit - List list= new ArrayList(); - if (singleFile != null) - list.add(singleFile); - else { - for (i= 0; i < fDiffs.length; i++) { - Diff diff= fDiffs[i]; - if (diff.isEnabled()) { - switch (diff.getType()) { - case Differencer.CHANGE: - list.add(createPath(container, getPath(diff))); - break; - } - } - } - } - if (! Utilities.validateResources(list, shell, title)) - return; - - if (pm != null) { - String message= PatchMessages.getString("Patcher.Task.message"); //$NON-NLS-1$ - pm.beginTask(message, fDiffs.length*WORK_UNIT); - } - - for (i= 0; i < fDiffs.length; i++) { - - int workTicks= WORK_UNIT; - - Diff diff= fDiffs[i]; - if (diff.isEnabled()) { - - IPath path= getPath(diff); - if (pm != null) - pm.subTask(path.toString()); - - IFile file= singleFile != null - ? singleFile - : createPath(container, path); - - List failed= new ArrayList(); - List result= null; - - int type= diff.getType(); - switch (type) { - case Differencer.ADDITION: - // patch it and collect rejected hunks - result= apply(diff, file, true, failed); - store(createString(result), file, new SubProgressMonitor(pm, workTicks)); - workTicks-= WORK_UNIT; - break; - case Differencer.DELETION: - file.delete(true, true, new SubProgressMonitor(pm, workTicks)); - workTicks-= WORK_UNIT; - break; - case Differencer.CHANGE: - // patch it and collect rejected hunks - result= apply(diff, file, false, failed); - store(createString(result), file, new SubProgressMonitor(pm, workTicks)); - workTicks-= WORK_UNIT; - break; - } - - if (failed.size() > 0) { - IPath pp= null; - if (path.segmentCount() > 1) { - pp= path.removeLastSegments(1); - pp= pp.append(path.lastSegment() + REJECT_FILE_EXTENSION); - } else - pp= new Path(path.lastSegment() + REJECT_FILE_EXTENSION); - file= createPath(container, pp); - if (file != null) { - store(getRejected(failed), file, pm); - try { - IMarker marker= file.createMarker(MARKER_TYPE); - marker.setAttribute(IMarker.MESSAGE, PatchMessages.getString("Patcher.Marker.message")); //$NON-NLS-1$ - marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_HIGH); - } catch (CoreException ex) { - // NeedWork - } - } - } - } - - if (pm != null) { - if (pm.isCanceled()) - break; - if (workTicks > 0) - pm.worked(workTicks); - } - } - } - - /* - * Reads the contents from the given file and returns them as - * a List of lines. - */ - List load(IFile file, boolean create) { - List lines= null; - if (!create && file != null) { - // read current contents - InputStream is= null; - try { - is= file.getContents(); - - Reader streamReader= null; - try { - streamReader= new InputStreamReader(is, Utilities.getCharset(file)); - } catch (UnsupportedEncodingException x) { - // use default encoding - streamReader= new InputStreamReader(is); - } - - BufferedReader reader= new BufferedReader(streamReader); - LineReader lr= new LineReader(reader); - if (!"carbon".equals(SWT.getPlatform())) //$NON-NLS-1$ - lr.ignoreSingleCR(); - lines= lr.readLines(); - } catch(CoreException ex) { - // NeedWork - } finally { - if (is != null) - try { - is.close(); - } catch(IOException ex) { - // silently ignored - } - } - } - - if (lines == null) - lines= new ArrayList(); - return lines; - } - - List apply(Diff diff, IFile file, boolean create, List failedHunks) { - List lines= load(file, create); - patch(diff, lines, failedHunks); - return lines; - } - - /* - * Converts the string into bytes and stores them in the given file. - */ - private void store(String contents, IFile file, IProgressMonitor pm) throws CoreException { - - byte[] bytes; - try { - bytes= contents.getBytes(Utilities.getCharset(file)); - } catch (UnsupportedEncodingException x) { - // uses default encoding - bytes= contents.getBytes(); - } - - InputStream is= new ByteArrayInputStream(bytes); - try { - if (file.exists()) { - file.setContents(is, false, true, pm); - } else { - file.create(is, false, pm); - } - } finally { - if (is != null) - try { - is.close(); - } catch(IOException ex) { - // silently ignored - } - } - } - - /* - * Concatenates all strings found in the given List. - */ - private String createString(List lines) { - StringBuffer sb= new StringBuffer(); - Iterator iter= lines.iterator(); - if (fPreserveLineDelimiters) { - while (iter.hasNext()) - sb.append((String)iter.next()); - } else { - String lineSeparator= System.getProperty("line.separator"); //$NON-NLS-1$ - while (iter.hasNext()) { - String line= (String)iter.next(); - int l= length(line); - if (l < line.length()) { // line has delimiter - sb.append(line.substring(0, l)); - sb.append(lineSeparator); - } else { - sb.append(line); - } - } - } - return sb.toString(); - } - - String getRejected(List failedHunks) { - if (failedHunks.size() <= 0) - return null; - - String lineSeparator= System.getProperty("line.separator"); //$NON-NLS-1$ - StringBuffer sb= new StringBuffer(); - Iterator iter= failedHunks.iterator(); - while (iter.hasNext()) { - Hunk hunk= (Hunk) iter.next(); - sb.append(hunk.getRejectedDescription()); - sb.append(lineSeparator); - sb.append(hunk.getContent()); - } - return sb.toString(); - } - - /* - * Ensures that a file with the given path exists in - * the given container. Folder are created as necessary. - */ - private IFile createPath(IContainer container, IPath path) throws CoreException { - if (path.segmentCount() > 1) { - IFolder f= container.getFolder(path.uptoSegment(1)); - if (!f.exists()) - f.create(false, true, null); - return createPath(f, path.removeFirstSegments(1)); - } - // a leaf - return container.getFile(path); - } - - /* - * Returns the given string with all whitespace characters removed. - * Whitespace is defined by Character.isWhitespace(...). - */ - private static String stripWhiteSpace(String s) { - StringBuffer sb= new StringBuffer(); - int l= s.length(); - for (int i= 0; i < l; i++) { - char c= s.charAt(i); - if (!Character.isWhitespace(c)) - sb.append(c); - } - return sb.toString(); - } - - /* - * Compares two strings. - * If fIgnoreWhitespace is true whitespace is ignored. - */ - private boolean linesMatch(String line1, String line2) { - if (fIgnoreWhitespace) - return stripWhiteSpace(line1).equals(stripWhiteSpace(line2)); - if (fIgnoreLineDelimiter) { - int l1= length(line1); - int l2= length(line2); - if (l1 != l2) - return false; - return line1.regionMatches(0, line2, 0, l1); - } - return line1.equals(line2); - } - - /* - * Returns the length (exluding a line delimiter CR, LF, CR/LF) - * of the given string. - */ - /* package */ static int length(String s) { - int l= s.length(); - if (l > 0) { - char c= s.charAt(l-1); - if (c == '\r') - return l-1; - if (c == '\n') { - if (l > 1 && s.charAt(l-2) == '\r') - return l-2; - return l-1; - } - } - return l; - } - - int calculateFuzz(Hunk hunk, List lines, int shift, IProgressMonitor pm, int[] fuzz) { - - hunk.fMatches= false; - if (tryPatch(hunk, lines, shift)) { - shift+= doPatch(hunk, lines, shift); - fuzz[0]= 0; - } else { - boolean found= false; - int hugeFuzz= lines.size(); // the maximum we need for this file - fuzz[0]= -2; // not found - - for (int i= 1; i <= hugeFuzz; i++) { - if (pm.isCanceled()) { - fuzz[0]= -1; - return 0; - } - if (tryPatch(hunk, lines, shift-i)) { - fuzz[0]= i; - if (fAdjustShift) - shift-= i; - found= true; - break; - } - } - - if (! found) { - for (int i= 1; i <= hugeFuzz; i++) { - if (pm.isCanceled()) { - fuzz[0]= -1; - return 0; - } - if (tryPatch(hunk, lines, shift+i)) { - fuzz[0]= i; - if (fAdjustShift) - shift+= i; - found= true; - break; - } - } - } - - if (found) - shift+= doPatch(hunk, lines, shift); - } - return shift; - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PreviewPatchPage.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PreviewPatchPage.java deleted file mode 100644 index b4046f039..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PreviewPatchPage.java +++ /dev/null @@ -1,740 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.internal.patch; - -import java.io.*; -import java.lang.reflect.InvocationTargetException; -import java.text.MessageFormat; -import java.util.Iterator; -import java.util.List; -import java.util.ArrayList; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.*; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.layout.*; -import org.eclipse.swt.widgets.*; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.help.WorkbenchHelp; - -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.jface.wizard.WizardPage; -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.operation.IRunnableWithProgress; -import org.eclipse.jface.resource.ImageDescriptor; - -import org.eclipse.core.resources.*; -import org.eclipse.core.runtime.*; - -import org.eclipse.compare.*; -import org.eclipse.compare.internal.CompareUIPlugin; -import org.eclipse.compare.internal.DiffImage; -import org.eclipse.compare.internal.ICompareContextIds; -import org.eclipse.compare.internal.Utilities; -import org.eclipse.compare.structuremergeviewer.*; - - -/** - * Shows the parsed patch file and any mismatches - * between files, hunks and the currently selected - * resources. - */ -/* package */ class PreviewPatchPage extends WizardPage { - - /** - * Used with CompareInput - */ - static class HunkInput implements ITypedElement, IEncodedStreamContentAccessor { - static final String UTF_16= "UTF-16"; //$NON-NLS-1$ - String fContent; - String fType; - - HunkInput(String type, String s) { - fType= type; - fContent= s; - } - public Image getImage() { - return null; - } - public String getName() { - return PatchMessages.getString("PreviewPatchPage.NoName.text"); //$NON-NLS-1$ - } - public String getType() { - return fType; - } - public InputStream getContents() { - return new ByteArrayInputStream(Utilities.getBytes(fContent, UTF_16)); - } - public String getCharset() { - return UTF_16; - } - } - - private PatchWizard fPatchWizard; - - private Tree fTree; - private Combo fStripPrefixSegments; - private CompareViewerSwitchingPane fHunkViewer; - private Button fIgnoreWhitespaceButton; - private Button fReversePatchButton; - private Text fFuzzField; - - private Image[] fImages= new Image[6]; - private CompareConfiguration fCompareConfiguration; - - - /* package */ PreviewPatchPage(PatchWizard pw) { - super("PreviewPatchPage", //$NON-NLS-1$ - PatchMessages.getString("PreviewPatchPage.title"), null); //$NON-NLS-1$ - - setMessage(PatchMessages.getString("PreviewPatchPage.message")); //$NON-NLS-1$ - - fPatchWizard= pw; - //setPageComplete(false); - - int w= 16; - - ImageDescriptor addId= CompareUIPlugin.getImageDescriptor("ovr16/add_ov.gif"); //$NON-NLS-1$ - ImageDescriptor delId= CompareUIPlugin.getImageDescriptor("ovr16/del_ov.gif"); //$NON-NLS-1$ - - ImageDescriptor errId= CompareUIPlugin.getImageDescriptor("ovr16/error_ov.gif"); //$NON-NLS-1$ - Image errIm= errId.createImage(); - - fImages[0]= new DiffImage(null, null, w).createImage(); - fImages[1]= new DiffImage(null, addId, w).createImage(); - fImages[2]= new DiffImage(null, delId, w).createImage(); - - fImages[3]= new DiffImage(errIm, null, w).createImage(); - fImages[4]= new DiffImage(errIm, addId, w).createImage(); - fImages[5]= new DiffImage(errIm, delId, w).createImage(); - - fCompareConfiguration= new CompareConfiguration(); - - fCompareConfiguration.setLeftEditable(false); - fCompareConfiguration.setLeftLabel(PatchMessages.getString("PreviewPatchPage.Left.title")); //$NON-NLS-1$ - - fCompareConfiguration.setRightEditable(false); - fCompareConfiguration.setRightLabel(PatchMessages.getString("PreviewPatchPage.Right.title")); //$NON-NLS-1$ - } - - /* (non-Javadoc) - * Method declared in WizardPage - */ - public void setVisible(boolean visible) { - if (visible) - buildTree(); - super.setVisible(visible); - } - - Image getImage(Diff diff) { - if (diff.fMatches) { - switch (diff.getType()) { - case Differencer.ADDITION: - return fImages[1]; - case Differencer.DELETION: - return fImages[2]; - } - return fImages[0]; - } - switch (diff.getType()) { - case Differencer.ADDITION: - return fImages[4]; - case Differencer.DELETION: - return fImages[5]; - } - return fImages[3]; - } - - Image getImage(Hunk hunk) { - if (hunk.fMatches) - return fImages[0]; - return fImages[3]; - } - - public void createControl(Composite parent) { - - Composite composite= new Composite(parent, SWT.NULL); - composite.setLayout(new GridLayout()); - composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL)); - - WorkbenchHelp.setHelp(composite, ICompareContextIds.PATCH_PREVIEW_WIZARD_PAGE); - - setControl(composite); - - buildPatchOptionsGroup(composite); - - Splitter splitter= new Splitter(composite, SWT.VERTICAL); - splitter.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL - | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_VERTICAL)); - - - // top pane showing diffs and hunks in a check box tree - fTree= new Tree(splitter, SWT.CHECK | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); - GridData gd= new GridData(); - gd.verticalAlignment= GridData.FILL; - gd.horizontalAlignment= GridData.FILL; - gd.grabExcessHorizontalSpace= true; - gd.grabExcessVerticalSpace= true; - fTree.setLayoutData(gd); - - // bottom pane showing hunks in compare viewer - fHunkViewer= new CompareViewerSwitchingPane(splitter, SWT.BORDER | SWT.FLAT) { - protected Viewer getViewer(Viewer oldViewer, Object input) { - return CompareUI.findContentViewer(oldViewer, (ICompareInput)input, this, fCompareConfiguration); - } - }; - gd= new GridData(); - gd.verticalAlignment= GridData.FILL; - gd.horizontalAlignment= GridData.FILL; - gd.grabExcessHorizontalSpace= true; - gd.grabExcessVerticalSpace= true; - fHunkViewer.setLayoutData(gd); - - // register listeners - - fTree.addSelectionListener( - new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - TreeItem ti= (TreeItem) e.item; - Object data= e.item.getData(); - if (e.detail == SWT.CHECK) { - boolean checked= ti.getChecked(); - if (data instanceof Hunk) { - Hunk hunk= (Hunk) data; - checked= checked && hunk.fMatches; - //hunk.setEnabled(checked); - ti.setChecked(checked); - updateGrayedState(ti); - } else if (data instanceof Diff) { - updateCheckedState(ti); - } - } else { - if (data instanceof Hunk) - PreviewPatchPage.this.fHunkViewer.setInput(createInput((Hunk)data)); - else - PreviewPatchPage.this.fHunkViewer.setInput(null); - } - } - } - ); - fTree.addDisposeListener(new DisposeListener() { - public void widgetDisposed(DisposeEvent e) { - if (fImages != null) { - for (int i= 0; i < fImages.length; i++) { - if (fImages[i] == null) - fImages[i].dispose(); - } - fImages= null; - } - } - }); - // creating tree's content - buildTree(); - Dialog.applyDialogFont(composite); - } - - /* - * Create the group for setting various patch options - */ - private void buildPatchOptionsGroup(Composite parent) { - - GridLayout gl; - GridData gd; - Label l; - - final Patcher patcher= fPatchWizard.getPatcher(); - - Group group= new Group(parent, SWT.NONE); - group.setText(PatchMessages.getString("PreviewPatchPage.PatchOptions.title")); //$NON-NLS-1$ - gl= new GridLayout(); gl.numColumns= 4; gl.marginHeight= 0; - group.setLayout(gl); - group.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL)); - - // 1st row - - Composite pair= new Composite(group, SWT.NONE); - gl= new GridLayout(); gl.numColumns= 2; gl.marginHeight= gl.marginWidth= 0; - pair.setLayout(gl); - gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL); - pair.setLayoutData(gd); - - l= new Label(pair, SWT.NONE); - l.setText(PatchMessages.getString("PreviewPatchPage.IgnoreSegments.text")); //$NON-NLS-1$ - gd= new GridData(GridData.VERTICAL_ALIGN_CENTER | GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.GRAB_HORIZONTAL); - l.setLayoutData(gd); - - fStripPrefixSegments= new Combo(pair, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.SIMPLE); - int prefixCnt= patcher.getStripPrefixSegments(); - String prefix= Integer.toString(prefixCnt); - fStripPrefixSegments.add(prefix); - fStripPrefixSegments.setText(prefix); - gd= new GridData(GridData.VERTICAL_ALIGN_CENTER | GridData.HORIZONTAL_ALIGN_END); - fStripPrefixSegments.setLayoutData(gd); - - addSpacer(group); - - fReversePatchButton= new Button(group, SWT.CHECK); - fReversePatchButton.setText(PatchMessages.getString("PreviewPatchPage.ReversePatch.text")); //$NON-NLS-1$ - - addSpacer(group); - - // 2nd row - pair= new Composite(group, SWT.NONE); - gl= new GridLayout(); gl.numColumns= 3; gl.marginHeight= gl.marginWidth= 0; - pair.setLayout(gl); - gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL); - pair.setLayoutData(gd); - - l= new Label(pair, SWT.NONE); - l.setText(PatchMessages.getString("PreviewPatchPage.FuzzFactor.text")); //$NON-NLS-1$ - l.setToolTipText(PatchMessages.getString("PreviewPatchPage.FuzzFactor.tooltip")); //$NON-NLS-1$ - gd= new GridData(GridData.VERTICAL_ALIGN_CENTER | GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.GRAB_HORIZONTAL); - l.setLayoutData(gd); - - fFuzzField= new Text(pair, SWT.BORDER); - fFuzzField.setText("2"); //$NON-NLS-1$ - gd= new GridData(GridData.VERTICAL_ALIGN_CENTER | GridData.HORIZONTAL_ALIGN_END); gd.widthHint= 30; - fFuzzField.setLayoutData(gd); - - Button b= new Button(pair, SWT.PUSH); - b.setText(PatchMessages.getString("PreviewPatchPage.GuessFuzz.text")); //$NON-NLS-1$ - b.addSelectionListener( - new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - int fuzz= guessFuzzFactor(patcher); - if (fuzz >= 0) - fFuzzField.setText(Integer.toString(fuzz)); - } - } - ); - gd= new GridData(GridData.VERTICAL_ALIGN_CENTER); - b.setLayoutData(gd); - - addSpacer(group); - - fIgnoreWhitespaceButton= new Button(group, SWT.CHECK); - fIgnoreWhitespaceButton.setText(PatchMessages.getString("PreviewPatchPage.IgnoreWhitespace.text")); //$NON-NLS-1$ - - addSpacer(group); - - // register listeners - - if (fStripPrefixSegments != null) - fStripPrefixSegments.addSelectionListener( - new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - if (patcher.setStripPrefixSegments(getStripPrefixSegments())) - updateTree(); - } - } - ); - fReversePatchButton.addSelectionListener( - new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - if (patcher.setReversed(fReversePatchButton.getSelection())) - updateTree(); - } - } - ); - fIgnoreWhitespaceButton.addSelectionListener( - new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - if (patcher.setIgnoreWhitespace(fIgnoreWhitespaceButton.getSelection())) - updateTree(); - } - } - ); - - fFuzzField.addModifyListener( - new ModifyListener() { - public void modifyText(ModifyEvent e) { - if (patcher.setFuzz(getFuzzFactor())) - updateTree(); - } - } - ); - } - - private int guessFuzzFactor(final Patcher patcher) { - final int strip= getStripPrefixSegments(); - final int[] result= new int[1]; - try { - PlatformUI.getWorkbench().getProgressService().run(true, true, - //TimeoutContext.run(true, GUESS_TIMEOUT, getControl().getShell(), - new IRunnableWithProgress() { - public void run(IProgressMonitor monitor) { - result[0]= guess(patcher, monitor, strip); - } - } - ); - return result[0]; - } catch (InvocationTargetException ex) { - // NeedWork - } catch (InterruptedException ex) { - // NeedWork - } - return -1; - } - - private int guess(Patcher patcher, IProgressMonitor pm, int strip) { - - Diff[] diffs= patcher.getDiffs(); - if (diffs == null || diffs.length <= 0) - return -1; - - // now collect files and determine "work" - IFile[] files= new IFile[diffs.length]; - int work= 0; - for (int i= 0; i < diffs.length; i++) { - Diff diff= diffs[i]; - if (diff == null) - continue; - if (diff.getType() != Differencer.ADDITION) { - IPath p= diff.fOldPath; - if (strip > 0 && strip < p.segmentCount()) - p= p.removeFirstSegments(strip); - IFile file= existsInSelection(p); - if (file != null) { - files[i]= file; - work+= diff.fHunks.size(); - } - } - } - - // do the "work" - int[] fuzzRef= new int[1]; - String format= PatchMessages.getString("PreviewPatchPage.GuessFuzzProgress.format"); //$NON-NLS-1$ - pm.beginTask(PatchMessages.getString("PreviewPatchPage.GuessFuzzProgress.text"), work); //$NON-NLS-1$ - try { - int fuzz= 0; - for (int i= 0; i < diffs.length; i++) { - Diff d= diffs[i]; - IFile file= files[i]; - if (d != null && file != null) { - List lines= patcher.load(file, false); - String name= d.getPath().lastSegment(); - Iterator iter= d.fHunks.iterator(); - int shift= 0; - for (int hcnt= 1; iter.hasNext(); hcnt++) { - pm.subTask(MessageFormat.format(format, new String[] { name, Integer.toString(hcnt) } )); - Hunk h= (Hunk) iter.next(); - shift= patcher.calculateFuzz(h, lines, shift, pm, fuzzRef); - int f= fuzzRef[0]; - if (f == -1) // cancel - return -1; - if (f > fuzz) - fuzz= f; - pm.worked(1); - } - } - } - return fuzz; - } finally { - pm.done(); - } - } - - ICompareInput createInput(Hunk hunk) { - - String[] lines= hunk.fLines; - StringBuffer left= new StringBuffer(); - StringBuffer right= new StringBuffer(); - - for (int i= 0; i < lines.length; i++) { - String line= lines[i]; - String rest= line.substring(1); - switch (line.charAt(0)) { - case ' ': - left.append(rest); - right.append(rest); - break; - case '-': - left.append(rest); - break; - case '+': - right.append(rest); - break; - } - } - - Diff diff= hunk.fParent; - IPath path= diff.getPath(); - String type= path.getFileExtension(); - - return new DiffNode(new HunkInput(type, left.toString()), new HunkInput(type, right.toString())); - } - - /** - * Builds a tree from list of Diffs. - * As a side effect it calculates the maximum number of segments - * in all paths. - */ - private void buildTree() { - setPageComplete(true); - if (fTree != null && !fTree.isDisposed()) { - fTree.removeAll(); - fHunkViewer.setInput(null); - - int length= 99; - - Diff[] diffs= fPatchWizard.getPatcher().getDiffs(); - if (diffs != null) { - for (int i= 0; i < diffs.length; i++) { - Diff diff= diffs[i]; - TreeItem d= new TreeItem(fTree, SWT.NULL); - d.setData(diff); - d.setImage(getImage(diff)); - - if (diff.fOldPath != null) - length= Math.min(length, diff.fOldPath.segmentCount()); - if (diff.fNewPath != null) - length= Math.min(length, diff.fNewPath.segmentCount()); - - java.util.List hunks= diff.fHunks; - java.util.Iterator iter= hunks.iterator(); - while (iter.hasNext()) { - Hunk hunk= (Hunk) iter.next(); - TreeItem h= new TreeItem(d, SWT.NULL); - h.setData(hunk); - h.setText(hunk.getDescription()); - } - } - } - if (fStripPrefixSegments != null && length != 99) - for (int i= 1; i < length; i++) - fStripPrefixSegments.add(Integer.toString(i)); - } - - updateTree(); - } - - private IFile existsInSelection(IPath path) { - IResource target= fPatchWizard.getTarget(); - if (target instanceof IFile) { // special case - IFile file= (IFile) target; - if (matches(file.getFullPath(), path)) - return file; - } else if (target instanceof IContainer) { - IContainer c= (IContainer) target; - if (c.exists(path)) - return c.getFile(path); - } - return null; - } - - /* - * Returns true if path completely matches the end of fullpath - */ - private boolean matches(IPath fullpath, IPath path) { - - for (IPath p= fullpath; path.segmentCount() <= p.segmentCount(); p= p.removeFirstSegments(1)) { - if (p.equals(path)) - return true; - } - return false; - } - - /** - * Updates label and checked state of tree items. - */ - private void updateTree() { - if (fTree == null || fTree.isDisposed()) - return; - int strip= getStripPrefixSegments(); - TreeItem[] children= fTree.getItems(); - for (int i= 0; i < children.length; i++) { - TreeItem item= children[i]; - Diff diff= (Diff) item.getData(); - diff.fMatches= false; - String error= null; - - boolean create= false; - IFile file= null; - if (diff.getType() == Differencer.ADDITION) { - IPath p= diff.fNewPath; - if (strip > 0 && strip < p.segmentCount()) - p= p.removeFirstSegments(strip); - file= existsInSelection(p); - if (file == null) { - diff.fMatches= true; - } else { - // file already exists - error= PatchMessages.getString("PreviewPatchPage.FileExists.error"); //$NON-NLS-1$ - } - create= true; - } else { - IPath p= diff.fOldPath; - if (strip > 0 && strip < p.segmentCount()) - p= p.removeFirstSegments(strip); - file= existsInSelection(p); - diff.fMatches= false; - if (file != null) { - if (file.isReadOnly()) { - // file is readonly - error= PatchMessages.getString("PreviewPatchPage.FileIsReadOnly.error"); //$NON-NLS-1$ - file= null; - } else { - diff.fMatches= true; - } - } else { - // file doesn't exist - error= PatchMessages.getString("PreviewPatchPage.FileDoesNotExist.error"); //$NON-NLS-1$ - } - } - - ArrayList failedHunks= new ArrayList(); - Patcher patcher= fPatchWizard.getPatcher(); - patcher.setFuzz(getFuzzFactor()); - patcher.apply(diff, file, create, failedHunks); - - if (failedHunks.size() > 0) - diff.fRejected= fPatchWizard.getPatcher().getRejected(failedHunks); - - int checkedSubs= 0; // counts checked hunk items - TreeItem[] hunkItems= item.getItems(); - for (int h= 0; h < hunkItems.length; h++) { - Hunk hunk= (Hunk) hunkItems[h].getData(); - boolean failed= failedHunks.contains(hunk); - String hunkError= null; - if (failed) - hunkError= PatchMessages.getString("PreviewPatchPage.NoMatch.error"); //$NON-NLS-1$ - - boolean check= !failed; - hunkItems[h].setChecked(check); - if (check) - checkedSubs++; - - String hunkLabel= hunk.getDescription(); - if (hunkError != null) - hunkLabel+= " " + hunkError; //$NON-NLS-1$ - hunkItems[h].setText(hunkLabel); - hunkItems[h].setImage(getImage(hunk)); - } - - String label= diff.getDescription(strip); - if (error != null) - label+= " " + error; //$NON-NLS-1$ - item.setText(label); - item.setImage(getImage(diff)); - item.setChecked(checkedSubs > 0); - boolean gray= (checkedSubs > 0 && checkedSubs < hunkItems.length); - item.setGrayed(gray); - item.setExpanded(gray); - } - setPageComplete(updateModel()); - } - - /* - * Updates the gray state of the given diff and the checked state of its children. - */ - private void updateCheckedState(TreeItem diffItem) { - boolean checked= diffItem.getChecked(); - // check whether we can enable all hunks - TreeItem[] hunks= diffItem.getItems(); - int checkedCount= 0; - for (int i= 0; i < hunks.length; i++) { - Hunk hunk= (Hunk) hunks[i].getData(); - if (checked) { - if (hunk.fMatches) { - hunks[i].setChecked(true); - checkedCount++; - } - } else { - hunks[i].setChecked(false); - } - } - diffItem.setGrayed(checkedCount > 0 && checkedCount < hunks.length); - diffItem.setChecked(checkedCount > 0); - - setPageComplete(updateModel()); - } - - /* - * Updates the gray state of the given items parent. - */ - private void updateGrayedState(TreeItem hunk) { - TreeItem diff= hunk.getParentItem(); - TreeItem[] hunks= diff.getItems(); - int checked= 0; - for (int i= 0; i < hunks.length; i++) - if (hunks[i].getChecked()) - checked++; - diff.setChecked(checked > 0); - diff.setGrayed(checked > 0 && checked < hunks.length); - - setPageComplete(updateModel()); - } - - private void addSpacer(Composite parent) { - Label label= new Label(parent, SWT.NONE); - GridData gd= new GridData(GridData.FILL_HORIZONTAL); - gd.widthHint= 20; - label.setLayoutData(gd); - } - - private int getStripPrefixSegments() { - int stripPrefixSegments= 0; - if (fStripPrefixSegments != null) { - String s= fStripPrefixSegments.getText(); - try { - stripPrefixSegments= Integer.parseInt(s); - } catch(NumberFormatException ex) { - // silently ignored - } - } - return stripPrefixSegments; - } - - private int getFuzzFactor() { - int fuzzFactor= 0; - if (fFuzzField != null) { - String s= fFuzzField.getText(); - try { - fuzzFactor= Integer.parseInt(s); - } catch(NumberFormatException ex) { - // silently ignored - } - } - return fuzzFactor; - } - - public boolean updateModel() { - boolean atLeastOneIsEnabled= false; - if (fTree != null && !fTree.isDisposed()) { - TreeItem [] diffItems= fTree.getItems(); - for (int i= 0; i < diffItems.length; i++) { - TreeItem diffItem= diffItems[i]; - Object data= diffItem.getData(); - if (data instanceof Diff) { - Diff diff= (Diff) data; - boolean b= diffItem.getChecked(); - diff.setEnabled(b); - if (b) { - TreeItem [] hunkItems= diffItem.getItems(); - for (int j= 0; j < hunkItems.length; j++) { - TreeItem hunkItem= hunkItems[j]; - data= hunkItem.getData(); - if (data instanceof Hunk) { - Hunk hunk= (Hunk) data; - b= hunkItem.getChecked(); - hunk.setEnabled(b); - if (b) { - atLeastOneIsEnabled= true; - } - } - } - } - } - } - } - return atLeastOneIsEnabled; - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/package.html b/bundles/org.eclipse.compare/compare/org/eclipse/compare/package.html deleted file mode 100644 index 96ffb6342..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/package.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - Package-level Javadoc - - -Provides support for performing structural and textual -compare operations on arbitrary data and displaying the results. -

-Package Specification

- -The class CompareUI defines the entry point to initiate a configurable -compare operation on arbitrary resources. The result of the compare is -opened into a compare editor where the details can be browsed and edited -in dynamically selected structure and content viewers. -

- -A compare operation must be implemented as a subclass of CompareEditorInput. -A CompareEditorInput runs a (potentially lengthy) compare operation -under progress monitor control, creates a UI for drilling-down into the -compare results, tracks the dirty state of the result in case of merge, -and saves any changes that occured during a merge. -

- -The NavigationAction is used to navigate (step) through the individual -differences of a CompareEditorInput. -

- -An instance of CompareConfiguration configures various UI aspects -of compare/merge viewers like title labels and images, or whether a side -of a merge viewer is editable. It is passed to the CompareEditorInput -on creation. -

- -When implementing a hierarchical compare operation as a subclass of -CompareEditorInput clients have to provide a tree of objects where each -node implements the interface -org.eclipse.compare.structuremergeviewer.IStructureComparator. -This interface is used by the hierarchical differencing engine -(org.eclipse.compare.structuremergeviewer.Differencer) to walk the tree. -
-In addition every leaf of the tree must implement the IStreamContentAccessor -or IEncodedStreamContentAccessor -interfaces in order to give the differencing engine access to its stream content -and to its encoding (with IEncodedStreamContentAccessor). -

- -The abstract class BufferedContent provides a default implementation -for the IStreamContentAccessor and IContentChangeNotifier interfaces. -Its subclass ResourceNode adds an implementation for the -IStructureComparator and ITypedElement interfaces -based on Eclipse workbench resources (org.eclipse.core.resources.IResource). -It can be used without modification as the input to the differencing engine. -

- -The ZipFileStructureCreator is an implementation of the -org.eclipse.compare.structuremergeviewer.IStructureCreator interface -and makes the contents of a zip archive available as a -hierarchical structure of IStructureComparators which can be easily compared -by the differencing engine (org.eclipse.compare.structuremergeviewer.Differencer). -It is a good example for how to make structured files available to the hierarchical -compare functionality of the Compare plugin. -

- -The EditionSelectionDialog is a simple selection dialog where -one input element can be compared against a list of historic variants (editions) -of the same input element. The dialog can be used to implement functions -like "Replace with Version" or "Replace with Edition" on workbench resources. -

- -In addition it is possible to specify a subsection of the input element -(e.g. a method in a Java source file) by means of a path. In this -case the dialog compares only the subsection (as specified by the path) -with the corresponding subsection in the list of editions. This functionality -can be used to implement "Replace with Method Edition" for the Java -language. -

- -The EditionSelectionDialog requires that the editions implement -the IStreamContentAccessor and IModificationDate interfaces. -The HistoryItem is a convenience class that implements these interfaces -for IFileState objects. -

- - -The CompareViewerPane is a convenience class which provides -a label and local toolbar for a compare viewer (or any other subclass of a -JFace Viewer). -
-Its abstract subclass CompareViewerSwitchingPane supports dynamic -viewer switching, that is the viewer installed in the pane is dynamically -determined by the pane's input object. -Both classes are useful if you want to use compare viewers outside the context of -a compare editor, for example in a dialog or wizard. -

- -A Splitter is an extension of a SashForm that supports nesting, maximizing of panes, -and propagating the visibility state of panes. -

- -The interface IStreamMerger defines a single operation for performing a three-way merge on three -input streams. The merged result is written to an output stream. -
-Clients must implement this interface when contributing new mergers to the -org.eclipse.compare.streamMergers extension point. -New IStreamMergers can be created for registered types with the createStreamMerger methods of CompareUI. - - - - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/DifferencesIterator.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/DifferencesIterator.java deleted file mode 100644 index 0ad70b4f4..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/DifferencesIterator.java +++ /dev/null @@ -1,77 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.rangedifferencer; - -import java.util.ArrayList; -import java.util.List; - -/** - * A custom iterator to iterate over a List of RangeDifferences. - * It is used internally by the RangeDifferencer. - */ -/* package */ class DifferencesIterator { - - List fRange; - int fIndex; - RangeDifference[] fArray; - RangeDifference fDifference; - - /* - * Creates a differences iterator on an array of RangeDifferences. - */ - DifferencesIterator(RangeDifference[] differenceRanges) { - - fArray= differenceRanges; - fIndex= 0; - fRange= new ArrayList(); - if (fIndex < fArray.length) - fDifference= fArray[fIndex++]; - else - fDifference= null; - } - - /* - * Returns the number of RangeDifferences - */ - int getCount() { - return fRange.size(); - } - - /* - * Appends the edit to its list and moves to the next RangeDifference. - */ - void next() { - fRange.add(fDifference); - if (fDifference != null) { - if (fIndex < fArray.length) - fDifference= fArray[fIndex++]; - else - fDifference= null; - } - } - - /* - * Difference iterators are used in pairs. - * This method returns the other iterator. - */ - DifferencesIterator other(DifferencesIterator right, DifferencesIterator left) { - if (this == right) - return left; - return right; - } - - /* - * Removes all RangeDifferences - */ - void removeAll() { - fRange.clear(); - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/IRangeComparator.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/IRangeComparator.java deleted file mode 100644 index 70bd1d5e0..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/IRangeComparator.java +++ /dev/null @@ -1,60 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.rangedifferencer; - -/** - * For breaking an object to compare into a sequence of comparable entities. - *

- * It is used by RangeDifferencer to find longest sequences of - * matching and non-matching ranges. - *

- * For example, to compare two text documents and find longest common sequences - * of matching and non-matching lines, the implementation must break the document - * into lines. getRangeCount would return the number of lines in the - * document, and rangesEqual would compare a specified line given - * with one in another IRangeComparator. - *

- *

- * Clients should implement this interface; there is no standard implementation. - *

- */ -public interface IRangeComparator { - - /** - * Returns the number of comparable entities. - * - * @return the number of comparable entities - */ - int getRangeCount(); - - /** - * Returns whether the comparable entity given by the first index - * matches an entity specified by the other IRangeComparator and index. - * - * @param thisIndex the index of the comparable entity within this IRangeComparator - * @param other the IRangeComparator to compare this with - * @param otherIndex the index of the comparable entity within the other IRangeComparator - * @return true if the comparable entities are equal - */ - boolean rangesEqual(int thisIndex, IRangeComparator other, int otherIndex); - - /** - * Returns whether a comparison should be skipped because it would be too costly (or lengthy). - * - * @param length a number on which to base the decision whether to return - * true or false - * @param maxLength another number on which to base the decision whether to return - * true or false - * @param other the other IRangeComparator to compare with - * @return true to avoid a too lengthy range comparison - */ - boolean skipRangeComparison(int length, int maxLength, IRangeComparator other); -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/LinkedRangeDifference.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/LinkedRangeDifference.java deleted file mode 100644 index 0d06930bf..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/LinkedRangeDifference.java +++ /dev/null @@ -1,57 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.rangedifferencer; - -/* package */ class LinkedRangeDifference extends RangeDifference { - - static final int INSERT= 0; - static final int DELETE= 1; - - LinkedRangeDifference fNext; - - /* - * Creates a LinkedRangeDifference an initializes it to the error state - */ - LinkedRangeDifference() { - super(ERROR); - fNext= null; - } - - /* - * Constructs and links a LinkeRangeDifference to another LinkedRangeDifference - */ - LinkedRangeDifference(LinkedRangeDifference next, int operation) { - super(operation); - fNext= next; - } - - /* - * Follows the next link - */ - LinkedRangeDifference getNext() { - return fNext; - } - - boolean isDelete() { - return kind() == DELETE; - } - - boolean isInsert() { - return kind() == INSERT; - } - - /* - * Sets the next link of this LinkedRangeDifference - */ - void setNext(LinkedRangeDifference next) { - fNext= next; - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/RangeDifference.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/RangeDifference.java deleted file mode 100644 index 8d75eae7e..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/RangeDifference.java +++ /dev/null @@ -1,208 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.rangedifferencer; - -/** - * Description of a change between two or three ranges of comparable entities. - *

- * RangeDifference objects are the elements of a compare result returned from - * the RangeDifferencer find* methods. - * Clients use these objects as they are returned from the differencer. - * This class is not intended to be instantiated or subclassed. - *

- * Note: A range in the RangeDifference object is given as a start index - * and length in terms of comparable entities. However, these entity indices and counts - * are not necessarily character positions. For example, if an entity represents a line - * in a document, the start index would be a line number and the count would be in lines. - *

- * - * @see RangeDifferencer - */ -public class RangeDifference { - - /** Two-way change constant indicating no change. */ - public final static int NOCHANGE= 0; - /** Two-way change constant indicating two-way change (same as RIGHT) */ - public final static int CHANGE= 2; - - /** Three-way change constant indicating a change in both right and left. */ - public final static int CONFLICT= 1; - /** Three-way change constant indicating a change in right. */ - public final static int RIGHT= 2; - /** Three-way change constant indicating a change in left. */ - public final static int LEFT= 3; - /** - * Three-way change constant indicating the same change in both right and left, - * that is only the ancestor is different. - */ - public final static int ANCESTOR= 4; - - /** Constant indicating an unknown change kind. */ - public final static int ERROR= 5; - - /** the kind of change: NOCHANGE, CHANGE, LEFT, RIGHT, ANCESTOR, CONFLICT, ERROR */ - int fKind; - - int fLeftStart; - int fLeftLength; - int fRightStart; - int fRightLength; - int lAncestorStart; - int lAncestorLength; - - /** - * Creates a new range difference with the given change kind. - * - * @param changeKind the kind of change - */ - /* package */ RangeDifference(int changeKind) { - fKind= changeKind; - } - - /** - * Creates a new RangeDifference with the given change kind - * and left and right ranges. - * - * @param kind the kind of change - * @param rightStart start index of entity on right side - * @param rightLength number of entities on right side - * @param leftStart start index of entity on left side - * @param leftLength number of entities on left side - */ - /* package */ RangeDifference(int kind, int rightStart, int rightLength, int leftStart, int leftLength) { - fKind= kind; - fRightStart= rightStart; - fRightLength= rightLength; - fLeftStart= leftStart; - fLeftLength= leftLength; - } - - /** - * Creates a new RangeDifference with the given change kind - * and left, right, and ancestor ranges. - * - * @param kind the kind of change - * @param rightStart start index of entity on right side - * @param rightLength number of entities on right side - * @param leftStart start index of entity on left side - * @param leftLength number of entities on left side - * @param ancestorStart start index of entity on ancestor side - * @param ancestorLength number of entities on ancestor side - */ - /* package */ RangeDifference(int kind, int rightStart, int rightLength, int leftStart, int leftLength, - int ancestorStart, int ancestorLength) { - this(kind, rightStart, rightLength, leftStart, leftLength); - lAncestorStart= ancestorStart; - lAncestorLength= ancestorLength; - } - - /** - * Returns the kind of difference. - * - * @return the kind of difference, one of - * NOCHANGE, CHANGE, LEFT, RIGHT, - * ANCESTOR, CONFLICT, ERROR - */ - public int kind() { - return fKind; - } - - /** - * Returns the start index of the entity range on the ancestor side. - * - * @return the start index of the entity range on the ancestor side - */ - public int ancestorStart() { - return lAncestorStart; - } - - /** - * Returns the number of entities on the ancestor side. - * - * @return the number of entities on the ancestor side - */ - public int ancestorLength() { - return lAncestorLength; - } - - /** - * Returns the end index of the entity range on the ancestor side. - * - * @return the end index of the entity range on the ancestor side - */ - public int ancestorEnd() { - return lAncestorStart + lAncestorLength; - } - - /** - * Returns the start index of the entity range on the right side. - * - * @return the start index of the entity range on the right side - */ - public int rightStart() { - return fRightStart; - } - - /** - * Returns the number of entities on the right side. - * - * @return the number of entities on the right side - */ - public int rightLength() { - return fRightLength; - } - - /** - * Returns the end index of the entity range on the right side. - * - * @return the end index of the entity range on the right side - */ - public int rightEnd() { - return fRightStart + fRightLength; - } - - /** - * Returns the start index of the entity range on the left side. - * - * @return the start index of the entity range on the left side - */ - public int leftStart() { - return fLeftStart; - } - - /** - * Returns the number of entities on the left side. - * - * @return the number of entities on the left side - */ - public int leftLength() { - return fLeftLength; - } - - /** - * Returns the end index of the entity range on the left side. - * - * @return the end index of the entity range on the left side - */ - public int leftEnd() { - return fLeftStart + fLeftLength; - } - - /** - * Returns the maximum number of entities in the left, right, and ancestor sides of this range. - * - * @return the maximum number of entities in the left, right, and ancestor sides of this range - */ - public int maxLength() { - return Math.max(fRightLength, Math.max(fLeftLength, lAncestorLength)); - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/RangeDifferencer.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/RangeDifferencer.java deleted file mode 100644 index 31cbc8214..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/RangeDifferencer.java +++ /dev/null @@ -1,536 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.rangedifferencer; - -import java.util.*; - -import org.eclipse.jface.util.Assert; - -import org.eclipse.core.runtime.IProgressMonitor; - -/** - * A RangeDifferencer finds the differences between two or three IRangeComparators. - *

- * To use the differencer, clients provide an IRangeComparator - * that breaks their input data into a sequence of comparable entities. The differencer - * returns the differences among these sequences as an array of RangeDifference objects - * (findDifferences methods). - * Every RangeDifference represents a single kind of difference - * and the corresponding ranges of the underlying comparable entities in the - * left, right, and optionally ancestor sides. - *

- * Alternatively, the findRanges methods not only return objects for - * the differing ranges but for non-differing ranges too. - *

- * The algorithm used is an objectified version of one described in: - * A File Comparison Program, by Webb Miller and Eugene W. Myers, - * Software Practice and Experience, Vol. 15, Nov. 1985. - * - * @see IRangeComparator - * @see RangeDifference - */ -public final class RangeDifferencer { - - private static final RangeDifference[] EMPTY_RESULT= new RangeDifference[0]; - - /* (non Javadoc) - * Non instantiatiable! - */ - private RangeDifferencer() { - // nothing to do - } - - /** - * Finds the differences between two IRangeComparators. - * The differences are returned as an array of RangeDifferences. - * If no differences are detected an empty array is returned. - * - * @param left the left range comparator - * @param right the right range comparator - * @return an array of range differences, or an empty array if no differences were found - */ - public static RangeDifference[] findDifferences(IRangeComparator left, IRangeComparator right) { - return findDifferences((IProgressMonitor)null, left, right); - } - - /** - * Finds the differences between two IRangeComparators. - * The differences are returned as an array of RangeDifferences. - * If no differences are detected an empty array is returned. - * - * @param pm if not null used to report progress - * @param left the left range comparator - * @param right the right range comparator - * @return an array of range differences, or an empty array if no differences were found - * @since 2.0 - */ - public static RangeDifference[] findDifferences(IProgressMonitor pm, IRangeComparator left, IRangeComparator right) { - - // assert that both IRangeComparators are of the same class - Assert.isTrue(right.getClass().equals(left.getClass())); - - int rightSize= right.getRangeCount(); - int leftSize= left.getRangeCount(); - // - // Differences matrix: - // only the last d of each diagonal is stored, i.e., lastDiagonal[k] = row of d - // - int diagLen= 2 * Math.max(rightSize, leftSize); // bound on the size of edit script - int maxDiagonal= diagLen; - int lastDiagonal[]= new int[diagLen + 1]; // the row containing the last d - // on diagonal k (lastDiagonal[k] = row) - int origin= diagLen / 2; // origin of diagonal 0 - - // script corresponding to d[k] - LinkedRangeDifference script[]= new LinkedRangeDifference[diagLen + 1]; - int row, col; - - // find common prefix - for (row= 0; row < rightSize && row < leftSize && rangesEqual(right, row, left, row) == true;) - row++; - - lastDiagonal[origin]= row; - script[origin]= null; - int lower= (row == rightSize) ? origin + 1 : origin - 1; - int upper= (row == leftSize) ? origin - 1 : origin + 1; - - if (lower > upper) - return EMPTY_RESULT; - - //System.out.println("findDifferences: " + maxDiagonal + " " + lower + " " + upper); - - // for each value of the edit distance - for (int d= 1; d <= maxDiagonal; ++d) { // d is the current edit distance - - if (pm != null) - pm.worked(1); - - if (right.skipRangeComparison(d, maxDiagonal, left)) - return EMPTY_RESULT; // should be something we already found - - // for each relevant diagonal (-d, -d+2 ..., d-2, d) - for (int k= lower; k <= upper; k += 2) { // k is the current diagonal - LinkedRangeDifference edit; - - if (pm != null && pm.isCanceled()) - return EMPTY_RESULT; - - if (k == origin - d || k != origin + d && lastDiagonal[k + 1] >= lastDiagonal[k - 1]) { - // - // move down - // - row= lastDiagonal[k + 1] + 1; - edit= new LinkedRangeDifference(script[k + 1], LinkedRangeDifference.DELETE); - } else { - // - // move right - // - row= lastDiagonal[k - 1]; - edit= new LinkedRangeDifference(script[k - 1], LinkedRangeDifference.INSERT); - } - col= row + k - origin; - edit.fRightStart= row; - edit.fLeftStart= col; - Assert.isTrue(k >= 0 && k <= maxDiagonal); - script[k]= edit; - - // slide down the diagonal as far as possible - while (row < rightSize && col < leftSize && rangesEqual(right, row, left, col) == true) { - ++row; - ++col; - } - - Assert.isTrue(k >= 0 && k <= maxDiagonal); // Unreasonable value for diagonal index - lastDiagonal[k]= row; - - if (row == rightSize && col == leftSize) { - //showScript(script[k], right, left); - return createDifferencesRanges(script[k]); - } - if (row == rightSize) - lower= k + 2; - if (col == leftSize) - upper= k - 2; - } - --lower; - ++upper; - } - // too many differences - Assert.isTrue(false); - return null; - } - - /** - * Finds the differences among three IRangeComparators. - * The differences are returned as a list of RangeDifferences. - * If no differences are detected an empty list is returned. - * If the ancestor range comparator is null, a two-way - * comparison is performed. - * - * @param ancestor the ancestor range comparator or null - * @param left the left range comparator - * @param right the right range comparator - * @return an array of range differences, or an empty array if no differences were found - */ - public static RangeDifference[] findDifferences(IRangeComparator ancestor, IRangeComparator left, IRangeComparator right) { - return findDifferences(null, ancestor, left, right); - } - - /** - * Finds the differences among three IRangeComparators. - * The differences are returned as a list of RangeDifferences. - * If no differences are detected an empty list is returned. - * If the ancestor range comparator is null, a two-way - * comparison is performed. - * - * @param pm if not null used to report progress - * @param ancestor the ancestor range comparator or null - * @param left the left range comparator - * @param right the right range comparator - * @return an array of range differences, or an empty array if no differences were found - * @since 2.0 - */ - public static RangeDifference[] findDifferences(IProgressMonitor pm, IRangeComparator ancestor, IRangeComparator left, IRangeComparator right) { - - if (ancestor == null) - return findDifferences(pm, left, right); - - RangeDifference[] leftAncestorScript= null; - RangeDifference[] rightAncestorScript= findDifferences(pm, ancestor, right); - if (rightAncestorScript != null) - leftAncestorScript= findDifferences(pm, ancestor, left); - if (rightAncestorScript == null || leftAncestorScript == null) - return null; - - DifferencesIterator myIter= new DifferencesIterator(rightAncestorScript); - DifferencesIterator yourIter= new DifferencesIterator(leftAncestorScript); - - List diff3= new ArrayList(); - diff3.add(new RangeDifference(RangeDifference.ERROR)); // add a sentinel - - int changeRangeStart= 0; - int changeRangeEnd= 0; - // - // Combine the two two-way edit scripts into one - // - while (myIter.fDifference != null || yourIter.fDifference != null) { - - DifferencesIterator startThread; - myIter.removeAll(); - yourIter.removeAll(); - // - // take the next diff that is closer to the start - // - if (myIter.fDifference == null) - startThread= yourIter; - else if (yourIter.fDifference == null) - startThread= myIter; - else { // not at end of both scripts take the lowest range - if (myIter.fDifference.fLeftStart <= yourIter.fDifference.fLeftStart) // 2 -> common (Ancestor) change range - startThread= myIter; - else - startThread= yourIter; - } - changeRangeStart= startThread.fDifference.fLeftStart; - changeRangeEnd= startThread.fDifference.leftEnd(); - - startThread.next(); - // - // check for overlapping changes with other thread - // merge overlapping changes with this range - // - DifferencesIterator other= startThread.other(myIter, yourIter); - while (other.fDifference != null && other.fDifference.fLeftStart <= changeRangeEnd) { - int newMax= other.fDifference.leftEnd(); - other.next(); - if (newMax >= changeRangeEnd) { - changeRangeEnd= newMax; - other= other.other(myIter, yourIter); - } - } - diff3.add(createRangeDifference3(myIter, yourIter, diff3, right, left, changeRangeStart, changeRangeEnd)); - } - - // remove sentinel - diff3.remove(0); - return (RangeDifference[]) diff3.toArray(EMPTY_RESULT); - } - - /** - * Finds the differences among two IRangeComparators. - * In contrast to findDifferences, the result - * contains RangeDifference elements for non-differing ranges too. - * - * @param left the left range comparator - * @param right the right range comparator - * @return an array of range differences - */ - public static RangeDifference[] findRanges(IRangeComparator left, IRangeComparator right) { - return findRanges((IProgressMonitor)null, left, right); - } - - /** - * Finds the differences among two IRangeComparators. - * In contrast to findDifferences, the result - * contains RangeDifference elements for non-differing ranges too. - * - * @param pm if not null used to report progress - * @param left the left range comparator - * @param right the right range comparator - * @return an array of range differences - * @since 2.0 - */ - public static RangeDifference[] findRanges(IProgressMonitor pm, IRangeComparator left, IRangeComparator right) { - RangeDifference[] in= findDifferences(pm, left, right); - List out= new ArrayList(); - - RangeDifference rd; - - int mstart= 0; - int ystart= 0; - - for (int i= 0; i < in.length; i++) { - RangeDifference es= in[i]; - - rd= new RangeDifference(RangeDifference.NOCHANGE, mstart, es.rightStart() - mstart, ystart, es.leftStart() - ystart); - if (rd.maxLength() != 0) - out.add(rd); - - out.add(es); - - mstart= es.rightEnd(); - ystart= es.leftEnd(); - } - rd= new RangeDifference(RangeDifference.NOCHANGE, mstart, right.getRangeCount() - mstart, ystart, left.getRangeCount() - ystart); - if (rd.maxLength() > 0) - out.add(rd); - - return (RangeDifference[]) out.toArray(EMPTY_RESULT); - } - - /** - * Finds the differences among three IRangeComparators. - * In contrast to findDifferences, the result - * contains RangeDifference elements for non-differing ranges too. - * If the ancestor range comparator is null, a two-way - * comparison is performed. - * - * @param ancestor the ancestor range comparator or null - * @param left the left range comparator - * @param right the right range comparator - * @return an array of range differences - */ - public static RangeDifference[] findRanges(IRangeComparator ancestor, IRangeComparator left, IRangeComparator right) { - return findRanges(null, ancestor, left, right); - } - - /** - * Finds the differences among three IRangeComparators. - * In contrast to findDifferences, the result - * contains RangeDifference elements for non-differing ranges too. - * If the ancestor range comparator is null, a two-way - * comparison is performed. - * - * @param pm if not null used to report progress - * @param ancestor the ancestor range comparator or null - * @param left the left range comparator - * @param right the right range comparator - * @return an array of range differences - * @since 2.0 - */ - public static RangeDifference[] findRanges(IProgressMonitor pm, IRangeComparator ancestor, IRangeComparator left, IRangeComparator right) { - - if (ancestor == null) - return findRanges(pm, left, right); - - RangeDifference[] in= findDifferences(pm, ancestor, left, right); - List out= new ArrayList(); - - RangeDifference rd; - - int mstart= 0; - int ystart= 0; - int astart= 0; - - for (int i= 0; i < in.length; i++) { - RangeDifference es= in[i]; - - rd= new RangeDifference(RangeDifference.NOCHANGE, mstart, es.rightStart() - mstart, ystart, es.leftStart() - ystart, astart, es.ancestorStart() - astart); - if (rd.maxLength() > 0) - out.add(rd); - - out.add(es); - - mstart= es.rightEnd(); - ystart= es.leftEnd(); - astart= es.ancestorEnd(); - } - rd= new RangeDifference(RangeDifference.NOCHANGE, mstart, right.getRangeCount() - mstart, ystart, left.getRangeCount() - ystart, astart, ancestor.getRangeCount() - astart); - if (rd.maxLength() > 0) - out.add(rd); - - return (RangeDifference[]) out.toArray(EMPTY_RESULT); - } - - //---- private methods - - /* - * Creates a Vector of DifferencesRanges out of the LinkedRangeDifference. - * It coalesces adjacent changes. - * In addition, indices are changed such that the ranges are 1) open, i.e, - * the end of the range is not included, and 2) are zero based. - */ - private static RangeDifference[] createDifferencesRanges(LinkedRangeDifference start) { - - LinkedRangeDifference ep= reverseDifferences(start); - ArrayList result= new ArrayList(); - RangeDifference es= null; - - while (ep != null) { - es= new RangeDifference(RangeDifference.CHANGE); - - if (ep.isInsert()) { - es.fRightStart= ep.fRightStart + 1; - es.fLeftStart= ep.fLeftStart; - RangeDifference b= ep; - do { - ep= ep.getNext(); - es.fLeftLength++; - } while (ep != null && ep.isInsert() && ep.fRightStart == b.fRightStart); - } else { - es.fRightStart= ep.fRightStart; - es.fLeftStart= ep.fLeftStart; - - RangeDifference a= ep; - // - // deleted lines - // - do { - a= ep; - ep= ep.getNext(); - es.fRightLength++; - } while (ep != null && ep.isDelete() && ep.fRightStart == a.fRightStart + 1); - - boolean change= (ep != null && ep.isInsert() && ep.fRightStart == a.fRightStart); - - if (change) { - RangeDifference b= ep; - // - // replacement lines - // - do { - ep= ep.getNext(); - es.fLeftLength++; - } while (ep != null && ep.isInsert() && ep.fRightStart == b.fRightStart); - } else { - es.fLeftLength= 0; - } - es.fLeftStart++; // meaning of range changes from "insert after", to "replace with" - - } - // - // the script commands are 1 based, subtract one to make them zero based - // - es.fRightStart--; - es.fLeftStart--; - result.add(es); - } - return (RangeDifference[]) result.toArray(EMPTY_RESULT); - } - - /* - * Creates a RangeDifference3 given the - * state of two DifferenceIterators. - */ - private static RangeDifference createRangeDifference3(DifferencesIterator myIter, DifferencesIterator yourIter, List diff3, - IRangeComparator right, IRangeComparator left, int changeRangeStart, int changeRangeEnd) { - - int rightStart, rightEnd; - int leftStart, leftEnd; - int kind= RangeDifference.ERROR; - RangeDifference last= (RangeDifference) diff3.get(diff3.size() - 1); - - Assert.isTrue((myIter.getCount() != 0 || yourIter.getCount() != 0)); // At least one range array must be non-empty - // - // find corresponding lines to fChangeRangeStart/End in right and left - // - if (myIter.getCount() == 0) { // only left changed - rightStart= changeRangeStart - last.ancestorEnd() + last.rightEnd(); - rightEnd= changeRangeEnd - last.ancestorEnd() + last.rightEnd(); - kind= RangeDifference.LEFT; - } else { - RangeDifference f= (RangeDifference) myIter.fRange.get(0); - RangeDifference l= (RangeDifference) myIter.fRange.get(myIter.fRange.size() - 1); - rightStart= changeRangeStart - f.fLeftStart + f.fRightStart; - rightEnd= changeRangeEnd - l.leftEnd() + l.rightEnd(); - } - - if (yourIter.getCount() == 0) { // only right changed - leftStart= changeRangeStart - last.ancestorEnd() + last.leftEnd(); - leftEnd= changeRangeEnd - last.ancestorEnd() + last.leftEnd(); - kind= RangeDifference.RIGHT; - } else { - RangeDifference f= (RangeDifference) yourIter.fRange.get(0); - RangeDifference l= (RangeDifference) yourIter.fRange.get(yourIter.fRange.size() - 1); - leftStart= changeRangeStart - f.fLeftStart + f.fRightStart; - leftEnd= changeRangeEnd - l.leftEnd() + l.rightEnd(); - } - - if (kind == RangeDifference.ERROR) { // overlapping change (conflict) -> compare the changed ranges - if (rangeSpansEqual(right, rightStart, rightEnd - rightStart, left, leftStart, leftEnd - leftStart)) - kind= RangeDifference.ANCESTOR; - else - kind= RangeDifference.CONFLICT; - } - return new RangeDifference(kind, rightStart, rightEnd - rightStart, leftStart, leftEnd - leftStart, changeRangeStart, changeRangeEnd - changeRangeStart); - } - - /* - * Tests if two ranges are equal - */ - private static boolean rangesEqual(IRangeComparator a, int ai, IRangeComparator b, int bi) { - return a.rangesEqual(ai, b, bi); - } - - /* - * Tests whether right and left changed in the same way - */ - private static boolean rangeSpansEqual(IRangeComparator right, int rightStart, int rightLen, IRangeComparator left, int leftStart, int leftLen) { - if (rightLen == leftLen) { - int i= 0; - for (i= 0; i < rightLen; i++) { - if (!rangesEqual(right, rightStart + i, left, leftStart + i)) - break; - } - if (i == rightLen) - return true; - } - return false; - } - - /* - * Reverses the range differences - */ - private static LinkedRangeDifference reverseDifferences(LinkedRangeDifference start) { - LinkedRangeDifference ep, behind, ahead; - - ahead= start; - ep= null; - while (ahead != null) { - behind= ep; - ep= ahead; - ahead= ahead.getNext(); - ep.setNext(behind); - } - return ep; - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/package.html b/bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/package.html deleted file mode 100644 index 368068b3b..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/rangedifferencer/package.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - Package-level Javadoc - - -Provides support for finding the differences between -two or three sequences of comparable entities. -

-Package Specification

- -The class RangeDifferencer finds longest sequences of matching and -non-matching comparable entities. Its implementation is based on -an objectified version of the algorithm described in: -A File Comparison Program, by Webb Miller and Eugene W. Myers, -Software Practice and Experience, Vol. 15, Nov. 1985. -

- -Clients must supply the input to the differencer as an implementation -of the IRangeComparator interface. -An IRangeComparator breaks the input data into a sequence -of entities and provides a method for comparing -one entity with the entity in another IRangeComparator. -

- -For example, to compare two text documents and find longest common -sequences of matching and non-matching lines, -the implementation of IRangeComparator -must break the document into lines and provide a method for testing -whether two lines are considered equal. -See org.eclipse.compare.internal.DocLineComparator for how this can be done. -

- -The differencer returns the differences among these sequences as an -array of RangeDifference objects. -Every single RangeDifference describes the kind of difference -(no change, change, addition, deletion) and the corresponding ranges -of the underlying comparable entities in the two or three inputs. - - - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffContainer.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffContainer.java deleted file mode 100644 index b74d36e1b..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffContainer.java +++ /dev/null @@ -1,107 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.structuremergeviewer; - -import java.util.ArrayList; - -/** - * The standard implementation of a diff container element. - *

- * This class may be instantiated, or further subclassed. - *

- */ -public abstract class DiffContainer extends DiffElement implements IDiffContainer { - - private static IDiffElement[] fgEmptyArray= new IDiffElement[0]; - private ArrayList fChildren; - - /** - * Creates a new container with the specified kind under the given parent. - * - * @param parent under which the new container is added as a child or null. - * @param kind of difference (defined in Differencer). - */ - public DiffContainer(IDiffContainer parent, int kind) { - super(parent, kind); - } - - /** - * Tries to find the child with the given name. - * Returns null if no such child exists. - * - * @param name of the child to find - * @return the first element with a matching name - */ - public IDiffElement findChild(String name) { - Object[] children= getChildren(); - for (int i= 0; i < children.length; i++) { - IDiffElement child= (IDiffElement) children[i]; - if (name.equals(child.getName())) - return child; - } - return null; - } - - /* (non Javadoc) - * see IDiffContainer.add - */ - public void add(IDiffElement diff) { - if (fChildren == null) - fChildren= new ArrayList(); - fChildren.add(diff); - diff.setParent(this); - } - - /* - * Removes the given child from this container. - * If the container becomes empty it is removed from its container. - */ - public void removeToRoot(IDiffElement child) { - if (fChildren != null) { - fChildren.remove(child); - child.setParent(null); - if (fChildren.size() == 0) { - IDiffContainer p= getParent(); - if (p != null) - p.removeToRoot(this); - } - } - } - - /** - * Removes the given child (non-recursively) from this container. - * - * @param child to remove - */ - public void remove(IDiffElement child) { - if (fChildren != null) { - fChildren.remove(child); - child.setParent(null); - } - } - - /* (non Javadoc) - * see IDiffContainer.hasChildren - */ - public boolean hasChildren() { - return fChildren != null && fChildren.size() > 0; - } - - /* (non Javadoc) - * see IDiffContainer.getChildren - */ - public IDiffElement[] getChildren() { - if (fChildren != null) - return (IDiffElement[]) fChildren.toArray(fgEmptyArray); - return fgEmptyArray; - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffElement.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffElement.java deleted file mode 100644 index ef1cf5f59..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffElement.java +++ /dev/null @@ -1,93 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.structuremergeviewer; - -import org.eclipse.swt.graphics.Image; -import org.eclipse.compare.ITypedElement; - -/** - * An abstract base implementation of the IDiffElement interface. - *

- * Subclasses may add behavior and state, and may override getImage - * and getType to suit. - *

- */ -public abstract class DiffElement implements IDiffElement { - - private int fKind; - private IDiffContainer fParent; - - /** - * Creates a new DiffElement as a child of the given parent. - * If parent is not null the new element is added to the parent. - * - * @param parent the parent of this child; if not null this element is automatically added as a child - * @param kind the kind of change - */ - public DiffElement(IDiffContainer parent, int kind) { - fParent= parent; - fKind= kind; - if (parent != null) - parent.add(this); - } - - /** - * The DiffElement implementation of this ITypedInput - * method returns null. Subclasses may re-implement to provide - * an image for this element. - * @return null. - */ - public Image getImage() { - return null; - } - - /** - * The DiffElement implementation of this ITypedElement - * method returns ITypedElement.UNKNOWN_TYPE. Subclasses may - * re-implement to provide a type for this element. - * @return ITypedElement.UNKNOWN_TYPE. - */ - public String getType() { - return ITypedElement.UNKNOWN_TYPE; - } - - /** - * Sets the kind of difference for this element. - * - * @param kind set the kind of difference this element represents - * @see Differencer - */ - public void setKind(int kind) { - fKind= kind; - } - - /* (non Javadoc) - * see IDiffElement.getKind - */ - public int getKind() { - return fKind; - } - - /* (non Javadoc) - * see IDiffElement.getParent - */ - public IDiffContainer getParent() { - return fParent; - } - - /* (non Javadoc) - * see IDiffElement.setParent - */ - public void setParent(IDiffContainer parent) { - fParent= parent; - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffNode.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffNode.java deleted file mode 100644 index 8e062d273..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffNode.java +++ /dev/null @@ -1,365 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.structuremergeviewer; - -import java.text.MessageFormat; - -import org.eclipse.swt.graphics.Image; - -import org.eclipse.jface.util.ListenerList; - -import org.eclipse.compare.*; -import org.eclipse.compare.internal.Utilities; - -/** - * Diff node are used as the compare result of the differencing engine. - * Since it implements the ITypedElement and ICompareInput - * interfaces it can be used directly to display the - * compare result in a DiffTreeViewer and as the input to any other - * compare/merge viewer. - *

- * DiffNodes are typically created as the result of performing - * a compare with the Differencer. - *

- * Clients typically use this class as is, but may subclass if required. - * - * @see DiffTreeViewer - * @see Differencer - */ -public class DiffNode extends DiffContainer implements ITypedElement, ICompareInput { - - private ITypedElement fAncestor; - private ITypedElement fLeft; - private ITypedElement fRight; - private boolean fDontExpand; - private ListenerList fListener; - private boolean fSwapSides; - - - /** - * Creates a new DiffNode and initializes with the given values. - * - * @param parent under which the new container is added as a child or null - * @param kind of difference (defined in Differencer) - * @param ancestor the common ancestor input to a compare - * @param left the left input to a compare - * @param right the right input to a compare - */ - public DiffNode(IDiffContainer parent, int kind, ITypedElement ancestor, ITypedElement left, ITypedElement right) { - this(parent, kind); - fAncestor= ancestor; - fLeft= left; - fRight= right; - } - - /** - * Creates a new DiffNode with diff kind Differencer.CHANGE - * and initializes with the given values. - * - * @param left the left input to a compare - * @param right the right input to a compare - */ - public DiffNode(ITypedElement left, ITypedElement right) { - this(null, Differencer.CHANGE, null, left, right); - } - - /** - * Creates a new DiffNode and initializes with the given values. - * - * @param kind of difference (defined in Differencer) - * @param ancestor the common ancestor input to a compare - * @param left the left input to a compare - * @param right the right input to a compare - */ - public DiffNode(int kind, ITypedElement ancestor, ITypedElement left, ITypedElement right) { - this(null, kind, ancestor, left, right); - } - - /** - * Creates a new DiffNode with the given diff kind. - * - * @param kind of difference (defined in Differencer) - */ - public DiffNode(int kind) { - super(null, kind); - } - - /** - * Creates a new DiffNode and initializes with the given values. - * - * @param parent under which the new container is added as a child or null - * @param kind of difference (defined in Differencer) - */ - public DiffNode(IDiffContainer parent, int kind) { - super(parent, kind); - } - - /** - * Registers a listener for changes of this ICompareInput. - * Has no effect if an identical listener is already registered. - * - * @param listener the listener to add - */ - public void addCompareInputChangeListener(ICompareInputChangeListener listener) { - if (fListener == null) - fListener= new ListenerList(); - fListener.add(listener); - } - - /** - * Unregisters a ICompareInput listener. - * Has no effect if listener is not registered. - * - * @param listener the listener to remove - */ - public void removeCompareInputChangeListener(ICompareInputChangeListener listener) { - if (fListener != null) { - fListener.remove(listener); - if (fListener.isEmpty()) - fListener= null; - } - } - - /** - * Sends out notification that a change has occured on the ICompareInput. - */ - protected void fireChange() { - if (fListener != null) { - Object[] listeners= fListener.getListeners(); - for (int i= 0; i < listeners.length; i++) - ((ICompareInputChangeListener) listeners[i]).compareInputChanged(this); - } - } - - //---- getters & setters - - /** - * Returns true if this node shouldn't automatically be expanded in - * a DiffTreeViewer. - * - * @return true if node shouldn't automatically be expanded - */ - public boolean dontExpand() { - return fDontExpand; - } - - /** - * Controls whether this node is not automatically expanded when displayed in - * a DiffTreeViewer. - * - * @param dontExpand if true this node is not automatically expanded in DiffTreeViewer - */ - public void setDontExpand(boolean dontExpand) { - fDontExpand= dontExpand; - } - - /** - * Returns the first not-null input of this node. - * Method checks the three inputs in the order: ancestor, right, left. - * - * @return the first not-null input of this node - */ - public ITypedElement getId() { - if (fAncestor != null) - return fAncestor; - if (fRight != null) - return fRight; - return fLeft; - } - - /** - * Returns the (non-null) name of the left or right side if they are identical. - * Otherwise both names are concatenated (separated with a slash ('/')). - *

- * Subclasses may re-implement to provide a different name for this node. - * @return the name of this node. - */ - public String getName() { - String right= null; - if (fRight != null) - right= fRight.getName(); - - String left= null; - if (fLeft != null) - left= fLeft.getName(); - - if (right == null && left == null) { - if (fAncestor != null) - return fAncestor.getName(); - return Utilities.getString("DiffNode.noName"); //$NON-NLS-1$ - } - - if (right == null) - return left; - if (left == null) - return right; - - if (right.equals(left)) - return right; - - String s1; - String s2; - - if (fSwapSides) { - s1= left; - s2= right; - } else { - s1= right; - s2= left; - } - - String fmt= Utilities.getString("DiffNode.nameFormat"); //$NON-NLS-1$ - return MessageFormat.format(fmt, new String[] { s1, s2 }); - } - - void swapSides(boolean swap) { - fSwapSides= swap; - } - - /* (non Javadoc) - * see ITypedElement.getImage - */ - public Image getImage() { - ITypedElement id= getId(); - if (id != null) - return id.getImage(); - return null; - } - - /* (non Javadoc) - * see ITypedElement.getType - */ - public String getType() { - ITypedElement id= getId(); - if (id != null) - return id.getType(); - return ITypedElement.UNKNOWN_TYPE; - } - - /** - * Sets the ancestor input to the given value. - * - * @param ancestor the new value for the ancestor input - * @since 3.0 - */ - public void setAncestor(ITypedElement ancestor) { - fAncestor= ancestor; - } - - /* (non Javadoc) - * see ICompareInput.getAncestor - */ - public ITypedElement getAncestor() { - return fAncestor; - } - - /** - * Sets the left input to the given value. - * - * @param left the new value for the left input - */ - public void setLeft(ITypedElement left) { - fLeft= left; - } - - /* (non Javadoc) - * see ICompareInput.getLeft - */ - public ITypedElement getLeft() { - return fLeft; - } - - /** - * Sets the right input to the given value. - * - * @param right the new value for the right input - */ - public void setRight(ITypedElement right) { - fRight= right; - } - - /* (non Javadoc) - * see ICompareInput.getRight - */ - public ITypedElement getRight() { - return fRight; - } - - /* (non Javadoc) - * see ICompareInput.copy - */ - public void copy(boolean leftToRight) { - //System.out.println("DiffNode.copy: " + leftToRight); - - IDiffContainer pa= getParent(); - if (pa instanceof ICompareInput) { - ICompareInput parent= (ICompareInput) pa; - Object dstParent= leftToRight ? parent.getRight() : parent.getLeft(); - - if (dstParent instanceof IEditableContent) { - ITypedElement dst= leftToRight ? getRight() : getLeft(); - ITypedElement src= leftToRight ? getLeft() : getRight(); - dst= ((IEditableContent)dstParent).replace(dst, src); - if (leftToRight) - setRight(dst); - else - setLeft(dst); - - //setKind(Differencer.NO_CHANGE); - - fireChange(); - } - } - } - - /* (non Javadoc) - * see Object.hashCode - */ - public int hashCode() { - String[] path= getPath(this, 0); - int hashCode= 1; - for (int i= 0; i < path.length; i++) { - String s= path[i]; - hashCode= (31*hashCode) + (s != null ? s.hashCode() : 0); - } - return hashCode; - } - - /* (non Javadoc) - * see Object.equals - */ - public boolean equals(Object other) { - if (other != null && getClass() == other.getClass()) { - String[] path1= getPath(this, 0); - String[] path2= getPath((DiffNode) other, 0); - if (path1.length != path2.length) - return false; - for (int i= 0; i < path1.length; i++) - if (! path1[i].equals(path2[i])) - return false; - return true; - } - return super.equals(other); - } - - private static String[] getPath(ITypedElement el, int level) { - String[] path= null; - if (el instanceof IDiffContainer) { - IDiffContainer parent= ((IDiffContainer)el).getParent(); - if (parent != null) - path= getPath(parent, level+1); - } - if (path == null) - path= new String[level+1]; - path[(path.length-1)-level]= el.getName(); - return path; - } -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffTreeViewer.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffTreeViewer.java deleted file mode 100644 index 5b6b849f3..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffTreeViewer.java +++ /dev/null @@ -1,727 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.structuremergeviewer; - -import java.util.Iterator; -import java.util.ResourceBundle; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.*; - -import org.eclipse.jface.util.*; -import org.eclipse.jface.action.*; -import org.eclipse.jface.viewers.*; - -import org.eclipse.compare.internal.*; -import org.eclipse.compare.*; - -/** - * A tree viewer that works on objects implementing - * the IDiffContainer and IDiffElement interfaces. - *

- * This class may be instantiated; it is not intended to be subclassed outside - * this package. - *

- * - * @see IDiffContainer - * @see IDiffElement - */ -public class DiffTreeViewer extends TreeViewer { - - static class DiffViewerSorter extends ViewerSorter { - - public boolean isSorterProperty(Object element, Object property) { - return false; - } - - public int category(Object node) { - if (node instanceof DiffNode) { - Object o= ((DiffNode) node).getId(); - if (o instanceof DocumentRangeNode) - return ((DocumentRangeNode) o).getTypeCode(); - } - return 0; - } - } - - class DiffViewerContentProvider implements ITreeContentProvider { - - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - // empty implementation - } - - public boolean isDeleted(Object element) { - return false; - } - - public void dispose() { - inputChanged(DiffTreeViewer.this, getInput(), null); - } - - public Object getParent(Object element) { - if (element instanceof IDiffElement) - return ((IDiffElement)element).getParent(); - return null; - } - - public final boolean hasChildren(Object element) { - if (element instanceof IDiffContainer) - return ((IDiffContainer)element).hasChildren(); - return false; - } - - public final Object[] getChildren(Object element) { - if (element instanceof IDiffContainer) - return ((IDiffContainer)element).getChildren(); - return new Object[0]; - } - - public Object[] getElements(Object element) { - return getChildren(element); - } - } - - /* - * Takes care of swapping left and right if fLeftIsLocal - * is true. - */ - class DiffViewerLabelProvider extends LabelProvider { - - public String getText(Object element) { - - if (element instanceof IDiffElement) - return ((IDiffElement)element).getName(); - - return Utilities.getString(fBundle, "defaultLabel"); //$NON-NLS-1$ - } - - public Image getImage(Object element) { - if (element instanceof IDiffElement) { - IDiffElement input= (IDiffElement) element; - - int kind= input.getKind(); - if (fLeftIsLocal) { - switch (kind & Differencer.DIRECTION_MASK) { - case Differencer.LEFT: - kind= (kind &~ Differencer.LEFT) | Differencer.RIGHT; - break; - case Differencer.RIGHT: - kind= (kind &~ Differencer.RIGHT) | Differencer.LEFT; - break; - } - } - - return fCompareConfiguration.getImage(input.getImage(), kind); - } - return null; - } - } - - static class FilterSame extends ViewerFilter { - public boolean select(Viewer viewer, Object parentElement, Object element) { - if (element instanceof IDiffElement) - return (((IDiffElement)element).getKind() & Differencer.PSEUDO_CONFLICT) == 0; - return true; - } - public boolean isFilterProperty(Object element, Object property) { - return false; - } - } - - private ResourceBundle fBundle; - private CompareConfiguration fCompareConfiguration; - /* package */ boolean fLeftIsLocal; - private IPropertyChangeListener fPropertyChangeListener; - - private Action fCopyLeftToRightAction; - private Action fCopyRightToLeftAction; - private Action fEmptyMenuAction; - private Action fExpandAllAction; - - /** - * Creates a new viewer for the given SWT tree control with the specified configuration. - * - * @param tree the tree control - * @param configuration the configuration for this viewer - */ - public DiffTreeViewer(Tree tree, CompareConfiguration configuration) { - super(tree); - initialize(configuration); - } - - /** - * Creates a new viewer under the given SWT parent and with the specified configuration. - * - * @param parent the SWT control under which to create the viewer - * @param configuration the configuration for this viewer - */ - public DiffTreeViewer(Composite parent, CompareConfiguration configuration) { - super(new Tree(parent, SWT.MULTI)); - initialize(configuration); - } - - private void initialize(CompareConfiguration configuration) { - - Control tree= getControl(); - - INavigatable nav= new INavigatable() { - public boolean gotoDifference(boolean next) { - // Fix for http://dev.eclipse.org/bugs/show_bug.cgi?id=20106 - return internalNavigate(next, true); - } - }; - tree.setData(INavigatable.NAVIGATOR_PROPERTY, nav); - - // Fix for http://dev.eclipse.org/bugs/show_bug.cgi?id=20106 - IOpenable openable= new IOpenable() { - public void openSelected() { - internalOpen(); - } - }; - tree.setData(IOpenable.OPENABLE_PROPERTY, openable); - - fLeftIsLocal= Utilities.getBoolean(configuration, "LEFT_IS_LOCAL", false); //$NON-NLS-1$ - - tree.setData(CompareUI.COMPARE_VIEWER_TITLE, getTitle()); - - Composite parent= tree.getParent(); - - fBundle= ResourceBundle.getBundle("org.eclipse.compare.structuremergeviewer.DiffTreeViewerResources"); //$NON-NLS-1$ - - // register for notification with the CompareConfiguration - fCompareConfiguration= configuration; - if (fCompareConfiguration != null) { - fPropertyChangeListener= new IPropertyChangeListener() { - public void propertyChange(PropertyChangeEvent event) { - DiffTreeViewer.this.propertyChange(event); - } - }; - fCompareConfiguration.addPropertyChangeListener(fPropertyChangeListener); - } - - setContentProvider(new DiffViewerContentProvider()); - setLabelProvider(new DiffViewerLabelProvider()); - - addSelectionChangedListener( - new ISelectionChangedListener() { - public void selectionChanged(SelectionChangedEvent se) { - updateActions(); - } - } - ); - - setSorter(new DiffViewerSorter()); - - ToolBarManager tbm= CompareViewerPane.getToolBarManager(parent); - if (tbm != null) { - tbm.removeAll(); - - tbm.add(new Separator("merge")); //$NON-NLS-1$ - tbm.add(new Separator("modes")); //$NON-NLS-1$ - tbm.add(new Separator("navigation")); //$NON-NLS-1$ - - createToolItems(tbm); - updateActions(); - - tbm.update(true); - } - - MenuManager mm= new MenuManager(); - mm.setRemoveAllWhenShown(true); - mm.addMenuListener( - new IMenuListener() { - public void menuAboutToShow(IMenuManager mm2) { - fillContextMenu(mm2); - if (mm2.isEmpty()) { - if (fEmptyMenuAction == null) { - fEmptyMenuAction= new Action(Utilities.getString(fBundle, "emptyMenuItem")) { //$NON-NLS-1$ - // left empty - }; - fEmptyMenuAction.setEnabled(false); - } - mm2.add(fEmptyMenuAction); - } - } - } - ); - tree.setMenu(mm.createContextMenu(tree)); - } - - /** - * Returns the viewer's name. - * - * @return the viewer's name - */ - public String getTitle() { - String title= Utilities.getString(fBundle, "title", null); //$NON-NLS-1$ - if (title == null) - title= Utilities.getString("DiffTreeViewer.title"); //$NON-NLS-1$ - return title; - } - - /** - * Returns the resource bundle. - * - * @return the viewer's resource bundle - */ - protected ResourceBundle getBundle() { - return fBundle; - } - - /** - * Returns the compare configuration of this viewer. - * - * @return the compare configuration of this viewer - */ - public CompareConfiguration getCompareConfiguration() { - return fCompareConfiguration; - } - - /** - * Called on the viewer disposal. - * Unregisters from the compare configuration. - * Clients may extend if they have to do additional cleanup. - * @param event dispose event that triggered call to this method - */ - protected void handleDispose(DisposeEvent event) { - - if (fCompareConfiguration != null) { - if (fPropertyChangeListener != null) - fCompareConfiguration.removePropertyChangeListener(fPropertyChangeListener); - fCompareConfiguration= null; - } - fPropertyChangeListener= null; - - super.handleDispose(event); - } - - /** - * Tracks property changes of the configuration object. - * Clients may extend to track their own property changes. - * @param event property change event that triggered call to this method - */ - protected void propertyChange(PropertyChangeEvent event) { - // empty default implementation - } - - protected void inputChanged(Object in, Object oldInput) { - super.inputChanged(in, oldInput); - - if (in != oldInput) { - initialSelection(); - updateActions(); - } - } - - /** - * This hook method is called from within inputChanged - * after a new input has been set but before any controls are updated. - * This default implementation calls navigate(true) - * to select and expand the first leaf node. - * Clients can override this method and are free to decide whether - * they want to call the inherited method. - * - * @since 2.0 - */ - protected void initialSelection() { - navigate(true); - } - - /** - * Overridden to avoid expanding DiffNodes that shouldn't expand. - * @param node the node to expand - * @param level non-negative level, or ALL_LEVELS to collapse all levels of the tree - */ - protected void internalExpandToLevel(Widget node, int level) { - - Object data= node.getData(); - - if (dontExpand(data)) - return; - - super.internalExpandToLevel(node, level); - } - - /** - * This hook method is called from within internalExpandToLevel - * to control whether a given model node should be expanded or not. - * This default implementation checks whether the object is a DiffNode and - * calls dontExpand() on it. - * Clients can override this method and are free to decide whether - * they want to call the inherited method. - * - * @param o the model object to be expanded - * @return false if a node should be expanded, true to prevent expanding - * @since 2.0 - */ - protected boolean dontExpand(Object o) { - return o instanceof DiffNode && ((DiffNode)o).dontExpand(); - } - - //---- merge action support - - /** - * This factory method is called after the viewer's controls have been created. - * It installs four actions in the given ToolBarManager. Two actions - * allow for copying one side of a DiffNode to the other side. - * Two other actions are for navigating from one node to the next (previous). - *

- * Clients can override this method and are free to decide whether they want to call - * the inherited method. - * - * @param toolbarManager the toolbar manager for which to add the actions - */ - protected void createToolItems(ToolBarManager toolbarManager) { - -// fCopyLeftToRightAction= new Action() { -// public void run() { -// copySelected(true); -// } -// }; -// Utilities.initAction(fCopyLeftToRightAction, fBundle, "action.TakeLeft."); -// toolbarManager.appendToGroup("merge", fCopyLeftToRightAction); - -// fCopyRightToLeftAction= new Action() { -// public void run() { -// copySelected(false); -// } -// }; -// Utilities.initAction(fCopyRightToLeftAction, fBundle, "action.TakeRight."); -// toolbarManager.appendToGroup("merge", fCopyRightToLeftAction); - -// fNextAction= new Action() { -// public void run() { -// navigate(true); -// } -// }; -// Utilities.initAction(fNextAction, fBundle, "action.NextDiff."); //$NON-NLS-1$ -// toolbarManager.appendToGroup("navigation", fNextAction); //$NON-NLS-1$ - -// fPreviousAction= new Action() { -// public void run() { -// navigate(false); -// } -// }; -// Utilities.initAction(fPreviousAction, fBundle, "action.PrevDiff."); //$NON-NLS-1$ -// toolbarManager.appendToGroup("navigation", fPreviousAction); //$NON-NLS-1$ - } - - /** - * This method is called to add actions to the viewer's context menu. - * It installs actions for expanding tree nodes, copying one side of a DiffNode to the other side. - * Clients can override this method and are free to decide whether they want to call - * the inherited method. - * - * @param manager the menu manager for which to add the actions - */ - protected void fillContextMenu(IMenuManager manager) { - if (fExpandAllAction == null) { - fExpandAllAction= new Action() { - public void run() { - expandSelection(); - } - }; - Utilities.initAction(fExpandAllAction, fBundle, "action.ExpandAll."); //$NON-NLS-1$ - } - - boolean enable= false; - ISelection selection= getSelection(); - if (selection instanceof IStructuredSelection) { - Iterator elements= ((IStructuredSelection)selection).iterator(); - while (elements.hasNext()) { - Object element= elements.next(); - if (element instanceof IDiffContainer) { - if (((IDiffContainer)element).hasChildren()) { - enable= true; - break; - } - } - } - } - fExpandAllAction.setEnabled(enable); - - manager.add(fExpandAllAction); - - if (fCopyLeftToRightAction != null) - manager.add(fCopyLeftToRightAction); - if (fCopyRightToLeftAction != null) - manager.add(fCopyRightToLeftAction); - } - - /** - * Expands to infinity all items in the selection. - * - * @since 2.0 - */ - protected void expandSelection() { - ISelection selection= getSelection(); - if (selection instanceof IStructuredSelection) { - Iterator elements= ((IStructuredSelection)selection).iterator(); - while (elements.hasNext()) { - Object next= elements.next(); - expandToLevel(next, ALL_LEVELS); - } - } - } - - /** - * Copies one side of all DiffNodes in the current selection to the other side. - * Called from the (internal) actions for copying the sides of a DiffNode. - * Clients may override. - * - * @param leftToRight if true the left side is copied to the right side. - * If false the right side is copied to the left side - */ - protected void copySelected(boolean leftToRight) { - ISelection selection= getSelection(); - if (selection instanceof IStructuredSelection) { - Iterator e= ((IStructuredSelection) selection).iterator(); - while (e.hasNext()) { - Object element= e.next(); - if (element instanceof ICompareInput) - copyOne((ICompareInput) element, leftToRight); - } - } - } - - /** - * Called to copy one side of the given node to the other. - * This default implementation delegates the call to ICompareInput.copy(...). - * Clients may override. - * @param node the node to copy - * @param leftToRight if true the left side is copied to the right side. - * If false the right side is copied to the left side - */ - protected void copyOne(ICompareInput node, boolean leftToRight) { - - node.copy(leftToRight); - - // update node's image - update(new Object[] { node }, null); - } - - /** - * Selects the next (or previous) node of the current selection. - * If there is no current selection the first (last) node in the tree is selected. - * Wraps around at end or beginning. - * Clients may override. - * - * @param next if true the next node is selected, otherwise the previous node - */ - protected void navigate(boolean next) { - // Fix for http://dev.eclipse.org/bugs/show_bug.cgi?id=20106 - internalNavigate(next, false); - } - - //---- private - - /** - * Selects the next (or previous) node of the current selection. - * If there is no current selection the first (last) node in the tree is selected. - * Wraps around at end or beginning. - * Clients may override. - * - * @param next if true the next node is selected, otherwise the previous node - * @param fireOpen if true an open event is fired. - * @return true if at end (or beginning) - */ - private boolean internalNavigate(boolean next, boolean fireOpen) { - - Control c= getControl(); - if (!(c instanceof Tree)) - return false; - - Tree tree= (Tree) c; - TreeItem item= null; - TreeItem children[]= tree.getSelection(); - if (children != null && children.length > 0) - item= children[0]; - if (item == null) { - children= tree.getItems(); - if (children != null && children.length > 0) { - item= children[0]; - if (item != null && item.getItemCount() <= 0) { - internalSetSelection(item, fireOpen); // Fix for http://dev.eclipse.org/bugs/show_bug.cgi?id=20106 - return false; - } - } - } - - while (true) { - item= findNextPrev(item, next); - if (item == null) - break; - if (item.getItemCount() <= 0) - break; - } - - if (item != null) { - internalSetSelection(item, fireOpen); // Fix for http://dev.eclipse.org/bugs/show_bug.cgi?id=20106 - return false; - } - return true; - } - - private TreeItem findNextPrev(TreeItem item, boolean next) { - - if (item == null) - return null; - - TreeItem children[]= null; - - if (!next) { - - TreeItem parent= item.getParentItem(); - if (parent != null) - children= parent.getItems(); - else - children= item.getParent().getItems(); - - if (children != null && children.length > 0) { - // goto previous child - int index= 0; - for (; index < children.length; index++) - if (children[index] == item) - break; - - if (index > 0) { - - item= children[index-1]; - - while (true) { - createChildren(item); - int n= item.getItemCount(); - if (n <= 0) - break; - - item.setExpanded(true); - item= item.getItems()[n-1]; - } - - // previous - return item; - } - } - - // go up - item= parent; - - } else { - item.setExpanded(true); - createChildren(item); - - if (item.getItemCount() > 0) { - // has children: go down - children= item.getItems(); - return children[0]; - } - - while (item != null) { - children= null; - TreeItem parent= item.getParentItem(); - if (parent != null) - children= parent.getItems(); - else - children= item.getParent().getItems(); - - if (children != null && children.length > 0) { - // goto next child - int index= 0; - for (; index < children.length; index++) - if (children[index] == item) - break; - - if (index < children.length-1) { - // next - return children[index+1]; - } - } - - // go up - item= parent; - } - } - - return item; - } - - private void internalSetSelection(TreeItem ti, boolean fireOpen) { - if (ti != null) { - Object data= ti.getData(); - if (data != null) { - // Fix for http://dev.eclipse.org/bugs/show_bug.cgi?id=20106 - ISelection selection= new StructuredSelection(data); - setSelection(selection, true); - ISelection currentSelection= getSelection(); - if (fireOpen && currentSelection != null && selection.equals(currentSelection)) { - fireOpen(new OpenEvent(this, selection)); - } - } - } - } - - private final boolean isEditable(Object element, boolean left) { - if (element instanceof ICompareInput) { - ICompareInput diff= (ICompareInput) element; - Object side= left ? diff.getLeft() : diff.getRight(); - if (side == null && diff instanceof IDiffElement) { - IDiffContainer container= ((IDiffElement)diff).getParent(); - if (container instanceof ICompareInput) { - ICompareInput parent= (ICompareInput) container; - side= left ? parent.getLeft() : parent.getRight(); - } - } - if (side instanceof IEditableContent) - return ((IEditableContent) side).isEditable(); - } - return false; - } - - private void updateActions() { - int leftToRight= 0; - int rightToLeft= 0; - ISelection selection= getSelection(); - if (selection instanceof IStructuredSelection) { - IStructuredSelection ss= (IStructuredSelection) selection; - Iterator e= ss.iterator(); - while (e.hasNext()) { - Object element= e.next(); - if (element instanceof ICompareInput) { - if (isEditable(element, false)) - leftToRight++; - if (isEditable(element, true)) - rightToLeft++; - if (leftToRight > 0 && rightToLeft > 0) - break; - } - } - if (fExpandAllAction != null) - fExpandAllAction.setEnabled(selection.isEmpty()); - } - if (fCopyLeftToRightAction != null) - fCopyLeftToRightAction.setEnabled(leftToRight > 0); - if (fCopyRightToLeftAction != null) - fCopyRightToLeftAction.setEnabled(rightToLeft > 0); - } - - /* - * Fix for http://dev.eclipse.org/bugs/show_bug.cgi?id=20106 - */ - private void internalOpen() { - ISelection selection= getSelection(); - if (selection != null && !selection.isEmpty()) { - fireOpen(new OpenEvent(this, selection)); - } - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffTreeViewerResources.properties b/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffTreeViewerResources.properties deleted file mode 100644 index f737039be..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DiffTreeViewerResources.properties +++ /dev/null @@ -1,53 +0,0 @@ -############################################################################### -# Copyright (c) 2000, 2004 IBM Corporation and others. -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Common Public License v1.0 -# which accompanies this distribution, and is available at -# http://www.eclipse.org/legal/cpl-v10.html -# -# Contributors: -# IBM Corporation - initial API and implementation -############################################################################### - -# @(#)DiffTreeViewerResources.properties -# -# Resource strings for DiffTreeViewer.java - -title= Structure Compare -defaultLabel= - -##################################################### -# Dummy menu item for empty context menu -##################################################### - -emptyMenuItem= - -##################################################### -# Actions -##################################################### - -action.Smart.label=Smart -action.Smart.tooltip=Guess Similar Elements -action.Smart.image=smartmode_co.gif - -action.ExpandAll.label=Expand All -action.ExpandAll.tooltip=Expand All Nodes - -action.CompareContents.label= Show Content Comparison -action.CompareContents.tooltip= Show Content Comparison - -action.NextDiff.label=Next -action.NextDiff.tooltip=Select Next Change -action.NextDiff.image=next_nav.gif - -action.PrevDiff.label=Previous -action.PrevDiff.tooltip=Select Previous Change -action.PrevDiff.image=prev_nav.gif - -action.TakeLeft.label=Copy Left to Right -action.TakeLeft.tooltip=Copy Selected Nodes from Left to Right -action.TakeLeft.image=copycont_r_co.gif - -action.TakeRight.label=Copy Right to Left -action.TakeRight.tooltip=Copy Selected Nodes from Right to Left -action.TakeRight.image=copycont_l_co.gif diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/Differencer.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/Differencer.java deleted file mode 100644 index b90c3c0ef..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/Differencer.java +++ /dev/null @@ -1,529 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.structuremergeviewer; - -import java.io.*; -import java.util.*; -import java.text.MessageFormat; - -import org.eclipse.jface.util.Assert; - -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.OperationCanceledException; - -import org.eclipse.compare.*; -import org.eclipse.compare.internal.Utilities; - - -/** - * A generic two-way or three-way differencing engine. - *

- * The engine is used by calling one of the findDifferences methods and passing - * in the objects to compare. - * The engine calls the following methods on the input objects to perform the compare: - *

    - *
  • getChildren: for enumerating the children of an object (if any), - *
  • contentsEqual: for comparing the content of leaf objects, that is, objects without children, - *
  • visit: for every pair of compared object the compare result is passed in. - *
- * Clients may use as is, or subclass to provide a custom implementation for the three hooks. - * However the default implementation already deals with the typical case: - *
    - *
  • getChildren: tries to apply the IStructureComparator - * interface to enumerate the children, - *
  • contentsEqual: tries to apply the IStreamContentAccessor interface - * to perform a byte-wise content comparison, - *
  • visit: creates a DiffNode for any detected difference between the compared objects and - * links it under a parent node effectively creating a tree of differences. - *
- * The different kind of changes detected by the engine are decoded as follows: - * In the two-way case only NO_CHANGE, ADDITION, DELETION, and CHANGE are used. - * In the three-way case these constants are bitwise ORed with one of directional constants - * LEFT, RIGHT, and CONFLICTING. - */ -public class Differencer { - - // The kind of differences. - /** - * Difference constant (value 0) indicating no difference. - */ - public static final int NO_CHANGE= 0; - /** - * Difference constant (value 1) indicating one side was added. - */ - public static final int ADDITION= 1; - /** - * Difference constant (value 2) indicating one side was removed. - */ - public static final int DELETION= 2; - /** - * Difference constant (value 3) indicating side changed. - */ - public static final int CHANGE= 3; - - /** - * Bit mask (value 3) for extracting the kind of difference. - */ - public static final int CHANGE_TYPE_MASK= 3; - - // The direction of a three-way change. - /** - * Three-way change constant (value 4) indicating a change on left side. - */ - public static final int LEFT= 4; - - /** - * Three-way change constant (value 8) indicating a change on right side. - */ - public static final int RIGHT= 8; - - /** - * Three-way change constant (value 12) indicating a change on left and - * right sides. - */ - public static final int CONFLICTING= 12; - - /** - * Bit mask (value 12) for extracting the direction of a three-way change. - */ - public static final int DIRECTION_MASK= 12; - - /** - * Constant (value 16) indicating a change on left and - * right side (with respect to ancestor) but left and right are identical. - */ - public static final int PSEUDO_CONFLICT= 16; - - - static class Node { - List fChildren; - int fCode; - Object fAncestor; - Object fLeft; - Object fRight; - - Node() { - // nothing to do - } - Node(Node parent, Object ancestor, Object left, Object right) { - parent.add(this); - fAncestor= ancestor; - fLeft= left; - fRight= right; - } - void add(Node child) { - if (fChildren == null) - fChildren= new ArrayList(); - fChildren.add(child); - } - Object visit(Differencer d, Object parent, int level) { - if (fCode == NO_CHANGE) - return null; - //dump(level); - Object data= d.visit(parent, fCode, fAncestor, fLeft, fRight); - if (fChildren != null) { - Iterator i= fChildren.iterator(); - while (i.hasNext()) { - Node n= (Node) i.next(); - n.visit(d, data, level+1); - } - } - return data; - } -// private void dump(int level) { -// String name= null; -// if (fAncestor instanceof ITypedElement) -// name= ((ITypedElement)fAncestor).getName(); -// if (name == null && fLeft instanceof ITypedElement) -// name= ((ITypedElement)fLeft).getName(); -// if (name == null && fRight instanceof ITypedElement) -// name= ((ITypedElement)fRight).getName(); -// if (name == null) -// name= "???"; //$NON-NLS-1$ -// -// for (int i= 0; i < level; i++) -// System.out.print(" "); //$NON-NLS-1$ -// -// System.out.println(getDiffType(fCode) + name); -// } - -// private String getDiffType(int code) { -// String dir= " "; //$NON-NLS-1$ -// switch (code & DIRECTION_MASK) { -// case LEFT: -// dir= ">"; //$NON-NLS-1$ -// break; -// case RIGHT: -// dir= "<"; //$NON-NLS-1$ -// break; -// case CONFLICTING: -// dir= "!"; //$NON-NLS-1$ -// break; -// } -// String change= "="; //$NON-NLS-1$ -// switch (code & CHANGE_TYPE_MASK) { -// case ADDITION: -// change= "+"; //$NON-NLS-1$ -// break; -// case DELETION: -// change= "-"; //$NON-NLS-1$ -// break; -// case CHANGE: -// change= "#"; //$NON-NLS-1$ -// break; -// } -// return dir + change + " "; //$NON-NLS-1$ -// } - } - - /** - * Creates a new differencing engine. - */ - public Differencer() { - // nothing to do - } - - /** - * Starts the differencing engine on the three input objects. If threeWay is true a - * three-way comparison is performed, otherwise a two-way compare (in the latter case the ancestor argument is ignored). - * The progress monitor is passed to the method updateProgress which is called for every node or - * leaf compare. The method returns the object that was returned from the top-most call to method visit. - * At most two of the ancestor, left, and right parameters are allowed to be null. - * - * @param threeWay if true a three-way comparison is performed, otherwise a two-way compare - * @param pm a progress monitor which is passed to method updateProgress - * @param data a client data that is passed to the top-level call to visit - * @param ancestor the ancestor object of the compare (may be null) - * @param left the left object of the compare - * @param right the right object of the compare - * @return the object returned from the top most call to method visit, - * possibly null - */ - public Object findDifferences(boolean threeWay, IProgressMonitor pm, Object data, Object ancestor, Object left, Object right) { - - Node root= new Node(); - - int code= traverse(threeWay, root, pm, threeWay ? ancestor : null, left, right); - - if (code != NO_CHANGE) { - List l= root.fChildren; - if (l.size() > 0) { - Node first= (Node)l.get(0); - return first.visit(this, data, 0); - } - } - return null; - } - - /* - * Traverse tree in postorder. - */ - private int traverse(boolean threeWay, Node parent, IProgressMonitor pm, Object ancestor, Object left, Object right) { - - Object[] ancestorChildren= getChildren(ancestor); - Object[] rightChildren= getChildren(right); - Object[] leftChildren= getChildren(left); - - int code= NO_CHANGE; - - Node node= new Node(parent, ancestor, left, right); - - boolean content= true; // we reset this if we have at least one child - - if (((threeWay && ancestorChildren != null) || !threeWay) - && rightChildren != null && leftChildren != null) { - // we only recurse down if no leg is null - // a node - - Set allSet= new HashSet(20); - Map ancestorSet= null; - Map rightSet= null; - Map leftSet= null; - - if (ancestorChildren != null) { - ancestorSet= new HashMap(10); - for (int i= 0; i < ancestorChildren.length; i++) { - Object ancestorChild= ancestorChildren[i]; - ancestorSet.put(ancestorChild, ancestorChild); - allSet.add(ancestorChild); - } - } - - if (rightChildren != null) { - rightSet= new HashMap(10); - for (int i= 0; i < rightChildren.length; i++) { - Object rightChild= rightChildren[i]; - rightSet.put(rightChild, rightChild); - allSet.add(rightChild); - } - } - - if (leftChildren != null) { - leftSet= new HashMap(10); - for (int i= 0; i < leftChildren.length; i++) { - Object leftChild= leftChildren[i]; - leftSet.put(leftChild, leftChild); - allSet.add(leftChild); - } - } - - Iterator e= allSet.iterator(); - while (e.hasNext()) { - Object keyChild= e.next(); - - content= false; - - if (pm != null) { - - if (pm.isCanceled()) - throw new OperationCanceledException(); - - updateProgress(pm, keyChild); - } - - Object ancestorChild= ancestorSet != null ? ancestorSet.get(keyChild) : null; - Object leftChild= leftSet != null ? leftSet.get(keyChild) : null; - Object rightChild= rightSet != null ? rightSet.get(keyChild) : null; - - int c= traverse(threeWay, node, pm, ancestorChild, leftChild, rightChild); - - if ((c & CHANGE_TYPE_MASK) != NO_CHANGE) { - code|= CHANGE; // deletions and additions of child result in a change of the container - code|= (c & DIRECTION_MASK); // incoming & outgoing are just ored - } - } - } - - if (content) // a leaf - code= compare(threeWay, ancestor, left, right); - - node.fCode= code; - - return code; - } - - /** - * Called for every node or leaf comparison. - * The differencing engine passes in the input objects of the compare and the result of the compare. - * The data object is the value returned from a call to the visit method on the parent input. - * It can be considered the "parent" reference and is useful when building a tree. - *

- * The Differencer implementation returns a new - * DiffNode which is initialized with the corresponding values. - * Subclasses may override. - * - * @param data object returned from parent call to visit, - * possibly null - * @param result the result of the compare operation performed on the three inputs - * @param ancestor the compare ancestor of the left and right inputs - * @param left the left input to the compare - * @param right the right input to the compare - * @return the result, possibly null - */ - protected Object visit(Object data, int result, Object ancestor, Object left, Object right) { - return new DiffNode((IDiffContainer) data, result, (ITypedElement)ancestor, (ITypedElement)left, (ITypedElement)right); - } - - /* - * Performs a 2-way or 3-way compare of the given leaf elements and returns an integer - * describing the kind of difference. - */ - private int compare(boolean threeway, Object ancestor, Object left, Object right) { - - int description= NO_CHANGE; - - if (threeway) { - if (ancestor == null) { - if (left == null) { - if (right == null) { - Assert.isTrue(false); - // shouldn't happen - } else { - description= RIGHT | ADDITION; - } - } else { - if (right == null) { - description= LEFT | ADDITION; - } else { - description= CONFLICTING | ADDITION; - if (contentsEqual(left, right)) - description|= PSEUDO_CONFLICT; - } - } - } else { - if (left == null) { - if (right == null) { - description= CONFLICTING | DELETION | PSEUDO_CONFLICT; - } else { - if (contentsEqual(ancestor, right)) - description= LEFT | DELETION; - else - description= CONFLICTING | CHANGE; - } - } else { - if (right == null) { - if (contentsEqual(ancestor, left)) - description= RIGHT | DELETION; - else - description= CONFLICTING | CHANGE; - } else { - boolean ay= contentsEqual(ancestor, left); - boolean am= contentsEqual(ancestor, right); - - if (ay && am) { - // empty - } else if (ay && !am) { - description= RIGHT | CHANGE; - } else if (!ay && am) { - description= LEFT | CHANGE; - } else { - description= CONFLICTING | CHANGE; - if (contentsEqual(left, right)) - description|= PSEUDO_CONFLICT; - } - } - } - } - } else { // two way compare ignores ancestor - if (left == null) { - if (right == null) { - Assert.isTrue(false); - // shouldn't happen - } else { - description= ADDITION; - } - } else { - if (right == null) { - description= DELETION; - } else { - if (! contentsEqual(left, right)) - description= CHANGE; - } - } - } - - return description; - } - - /** - * Performs a content compare on the two given inputs. - *

- * The Differencer implementation - * returns true if both inputs implement IStreamContentAccessor - * and their byte contents is identical. Subclasses may override to implement - * a different content compare on the given inputs. - *

- * - * @param input1 first input to contents compare - * @param input2 second input to contents compare - * @return true if content is equal - */ - protected boolean contentsEqual(Object input1, Object input2) { - - if (input1 == input2) - return true; - - InputStream is1= getStream(input1); - InputStream is2= getStream(input2); - - if (is1 == null && is2 == null) // no byte contents - return true; - - try { - if (is1 == null || is2 == null) // only one has contents - return false; - - while (true) { - int c1= is1.read(); - int c2= is2.read(); - if (c1 == -1 && c2 == -1) - return true; - if (c1 != c2) - break; - - } - } catch (IOException ex) { - // NeedWork - } finally { - if (is1 != null) { - try { - is1.close(); - } catch(IOException ex) { - // silently ignored - } - } - if (is2 != null) { - try { - is2.close(); - } catch(IOException ex) { - // silently ignored - } - } - } - return false; - } - - /* - * Tries to return an InputStream for the given object. - * Returns null if the object not an IStreamContentAccessor - * or an error occured. - */ - private InputStream getStream(Object o) { - if (o instanceof IStreamContentAccessor) { - try { - return ((IStreamContentAccessor)o).getContents(); - } catch(CoreException ex) { - // NeedWork - } - } - return null; - } - - /** - * Returns the children of the given input or null if there are no children. - *

- * The Differencer implementation checks whether the input - * implements the IStructureComparator interface. If yes it is used - * to return an array containing all children. Otherwise null is returned. - * Subclasses may override to implement a different strategy to enumerate children. - *

- * - * @param input the object for which to return children - * @return the children of the given input or null if there are no children. - */ - protected Object[] getChildren(Object input) { - if (input instanceof IStructureComparator) - return ((IStructureComparator)input).getChildren(); - return null; - } - - /** - * Called for every leaf or node compare to update progress information. - *

- * The Differencer implementation shows the name of the input object - * as a subtask. Subclasses may override. - *

- * - * @param progressMonitor the progress monitor for reporting progress - * @param node the currently processed non-null node - */ - protected void updateProgress(IProgressMonitor progressMonitor, Object node) { - if (node instanceof ITypedElement) { - String name= ((ITypedElement)node).getName(); - String fmt= Utilities.getString("Differencer.progressFormat"); //$NON-NLS-1$ - String msg= MessageFormat.format(fmt, new String[] { name }); - progressMonitor.subTask(msg); - //progressMonitor.worked(1); - } - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DocumentRangeNode.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DocumentRangeNode.java deleted file mode 100644 index d35bc457c..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/DocumentRangeNode.java +++ /dev/null @@ -1,358 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.structuremergeviewer; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.util.ArrayList; - -import org.eclipse.jface.text.*; - -import org.eclipse.core.runtime.CoreException; -import org.eclipse.compare.*; -import org.eclipse.compare.internal.Utilities; -import org.eclipse.compare.contentmergeviewer.IDocumentRange; - - -/** - * A document range node represents a structural element - * when performing a structure compare of documents. - * DocumentRangeNodes are created while parsing the document and represent - * a semantic entity (e.g. a Java class or method). - * As a consequence of the parsing a DocumentRangeNode maps to a range - * of characters in the document. - *

- * Since a DocumentRangeNode implements the IStructureComparator - * and IStreamContentAccessor interfaces it can be used as input to the - * differencing engine. This makes it possible to perform - * a structural diff on a document and have the nodes and leaves of the compare easily map - * to character ranges within the document. - *

- * Subclasses may add additional state collected while parsing the document. - *

- * @see Differencer - */ -public class DocumentRangeNode - implements IDocumentRange, IStructureComparator, IEditableContent, IEncodedStreamContentAccessor { - - private static final boolean POS_UPDATE= true; - private static final String UTF_16= "UTF-16"; //$NON-NLS-1$ - - private IDocument fBaseDocument; - private Position fRange; // the range in the base document - private int fTypeCode; - private String fID; - private Position fAppendPosition; // a position where to insert a child textually - private ArrayList fChildren; - - /** - * Creates a new DocumentRangeNode for the given range within the specified - * document. The typeCode is uninterpreted client data. The ID is used when comparing - * two nodes with each other: i.e. the differencing engine performs a content compare - * on two nodes if their IDs are equal. - * - * @param typeCode a type code for this node - * @param id an identifier for this node - * @param document document on which this node is based on - * @param start start position of range within document - * @param length length of range - */ - public DocumentRangeNode(int typeCode, String id, IDocument document, int start, int length) { - - fTypeCode= typeCode; - fID= id; - - fBaseDocument= document; - fBaseDocument.addPositionCategory(RANGE_CATEGORY); - fRange= new Position(start, length); - - if (POS_UPDATE) { - try { - document.addPosition(RANGE_CATEGORY, fRange); - } catch (BadPositionCategoryException ex) { - // silently ignored - } catch (BadLocationException ex) { - // silently ignored - } - } - } - - /* (non Javadoc) - * see IDocumentRange.getDocument - */ - public IDocument getDocument() { - return fBaseDocument; - } - - /* (non Javadoc) - * see IDocumentRange.getRange - */ - public Position getRange() { - return fRange; - } - - /** - * Returns the type code of this node. - * The type code is uninterpreted client data which can be set in the constructor. - * - * @return the type code of this node - */ - public int getTypeCode() { - return fTypeCode; - } - - /** - * Returns this node's id. - * It is used in equals and hashcode. - * - * @return the node's id - */ - public String getId() { - return fID; - } - - /** - * Sets this node's id. - * It is used in equals and hashcode. - * - * @param id the new id for this node - */ - public void setId(String id) { - fID= id; - } - - /** - * Adds the given node as a child. - * - * @param node the node to add as a child - */ - public void addChild(DocumentRangeNode node) { - if (fChildren == null) - fChildren= new ArrayList(); - fChildren.add(node); - } - - /* (non Javadoc) - * see IStructureComparator.getChildren - */ - public Object[] getChildren() { - if (fChildren != null) - return fChildren.toArray(); - return new Object[0]; - } - - /** - * Sets the length of the range of this node. - * - * @param length the length of the range - */ - public void setLength(int length) { - getRange().setLength(length); - } - - /** - * Sets a position within the document range that can be used to (legally) insert - * text without breaking the syntax of the document. - *

- * E.g. when parsing a Java document the "append position" of a DocumentRangeNode - * representating a Java class could be the character position just before the closing bracket. - * Inserting the text of a new method there would not disturb the syntax of the class. - * - * @param pos the character position within the underlying document where text can be legally inserted - */ - public void setAppendPosition(int pos) { - if (POS_UPDATE) { - fBaseDocument.removePosition(fAppendPosition); - try { - Position p= new Position(pos); - fBaseDocument.addPosition(RANGE_CATEGORY, p); - fAppendPosition= p; - } catch (BadPositionCategoryException ex) { - // silently ignored - } catch (BadLocationException ex) { - // silently ignored - } - } else { - fAppendPosition= new Position(pos); - } - } - - /** - * Returns the position that has been set with setAppendPosition. - * If setAppendPosition hasn't been called, the position after the last character - * of this range is returned. - * - * @return a position where text can be legally inserted - */ - public Position getAppendPosition() { - if (fAppendPosition == null) { - if (POS_UPDATE) { - try { - Position p= new Position(fBaseDocument.getLength()); - fBaseDocument.addPosition(RANGE_CATEGORY, p); - fAppendPosition= p; - } catch (BadPositionCategoryException ex) { - // silently ignored - } catch (BadLocationException ex) { - // silently ignored - } - } else { - fAppendPosition= new Position(fBaseDocument.getLength()); - } - } - return fAppendPosition; - } - - /** - * Implementation based on getID. - * @param other the object to compare this DocumentRangeNode against. - * @return true if the DocumentRangeNodesare equal; false otherwise. - */ - public boolean equals(Object other) { - if (other != null && other.getClass() == getClass()) { - DocumentRangeNode tn= (DocumentRangeNode) other; - return fTypeCode == tn.fTypeCode && fID.equals(tn.fID); - } - return super.equals(other); - } - - /** - * Implementation based on getID. - * @return a hashcode for this object. - */ - public int hashCode() { - return fID.hashCode(); - } - - /* - * Find corresponding position - */ - private Position findCorrespondingPosition(DocumentRangeNode otherParent, DocumentRangeNode child) { - - // we try to find a predecessor of left Node which exists on the right side - - if (child != null && fChildren != null) { - int ix= otherParent.fChildren.indexOf(child); - if (ix >= 0) { - - for (int i= ix - 1; i >= 0; i--) { - DocumentRangeNode c1= (DocumentRangeNode) otherParent.fChildren.get(i); - int i2= fChildren.indexOf(c1); - if (i2 >= 0) { - DocumentRangeNode c= (DocumentRangeNode) fChildren.get(i2); - //System.out.println(" found corresponding: " + i2 + " " + c); - Position p= c.fRange; - - //try { - Position po= new Position(p.getOffset() + p.getLength() + 1, 0); - //c.fBaseDocument.addPosition(RANGE_CATEGORY, po); - return po; - //} catch (BadLocationException ex) { - //} - //break; - } - } - - for (int i= ix; i < otherParent.fChildren.size(); i++) { - DocumentRangeNode c1= (DocumentRangeNode) otherParent.fChildren.get(i); - int i2= fChildren.indexOf(c1); - if (i2 >= 0) { - DocumentRangeNode c= (DocumentRangeNode) fChildren.get(i2); - //System.out.println(" found corresponding: " + i2 + " " + c); - Position p= c.fRange; - //try { - Position po= new Position(p.getOffset(), 0); - //c.fBaseDocument.addPosition(RANGE_CATEGORY, po); - return po; - //} catch (BadLocationException ex) { - //} - //break; - } - } - - } - } - return getAppendPosition(); - } - - private void add(String s, DocumentRangeNode parent, DocumentRangeNode child) { - - Position p= findCorrespondingPosition(parent, child); - if (p != null) { - try { - fBaseDocument.replace(p.getOffset(), p.getLength(), s); - } catch (BadLocationException ex) { - // silently ignored - } - } - } - - /* (non Javadoc) - * see IStreamContentAccessor.getContents - */ - public InputStream getContents() { - String s; - try { - s= fBaseDocument.get(fRange.getOffset(), fRange.getLength()); - } catch (BadLocationException ex) { - s= ""; //$NON-NLS-1$ - } - return new ByteArrayInputStream(Utilities.getBytes(s, UTF_16)); - } - - /* (non Javadoc) - * see IEditableContent.isEditable - */ - public boolean isEditable() { - return true; - } - - /* (non Javadoc) - * see IEditableContent.replace - */ - public ITypedElement replace(ITypedElement child, ITypedElement other) { - - DocumentRangeNode src= null; - String srcContents= ""; //$NON-NLS-1$ - - if (other != null) { - src= (DocumentRangeNode) child; - - if (other instanceof IStreamContentAccessor) { - try { - srcContents= Utilities.readString((IStreamContentAccessor)other); - } catch(CoreException ex) { - // NeedWork - } - } - } - - if (child == null) // no destination: we have to add the contents into the parent - add(srcContents, null, src); - - return child; - } - - /* (non Javadoc) - * see IEditableContent.setContent - */ - public void setContent(byte[] content) { - // empty default implementation - } - - /* (non-Javadoc) - * @see org.eclipse.compare.IStreamContentAccessor#getEncoding() - */ - public String getCharset() { - return UTF_16; - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/ICompareInput.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/ICompareInput.java deleted file mode 100644 index 4d937937f..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/ICompareInput.java +++ /dev/null @@ -1,142 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.structuremergeviewer; - -import org.eclipse.compare.ITypedElement; -import org.eclipse.swt.graphics.Image; - -/** - * Interface for objects used as input to a two-way or three-way compare viewer. - * It defines API for accessing the three sides for the compare, - * and a name and image which is used when displaying the three way input - * in the UI, for example, in a title bar. - *

- * Note: at most two sides of an ICompareInput can be null, - * (as it is normal for additions or deletions) but not all three. - *

- * ICompareInput provides methods for registering - * ICompareInputChangeListeners - * that get informed if one (or more) - * of the three sides of an ICompareInput object changes its value. - *

- * For example when accepting an incoming addition - * the (non-null) left side of an ICompareInput - * is copied to the right side by means of method copy. - * This should trigger a call to compareInputChanged of registered - * ICompareInputChangeListeners. - *

- * Clients can implement this interface, or use the convenience implementation - * DiffNode. - *

- * - * @see StructureDiffViewer - * @see org.eclipse.compare.contentmergeviewer.ContentMergeViewer - * @see DiffNode - */ -public interface ICompareInput { - - /** - * Returns name of input. - * This name is displayed when this input is shown in a viewer. - * In many cases this name is the name of one of the non-null sides or a combination - * thereof. - * - * @return name of input - */ - String getName(); - - /** - * Returns an image representing this input. - * This image is typically displayed when this input is shown in a viewer. - * In many cases this image is the image of one of the non-null sides. - * - * @return image representing this input, or null if no icon should be shown - */ - Image getImage(); - - /** - * Returns the kind of difference between the - * three sides ancestor, left and right. - * This field is only meaningful if the ICompareInput - * is the result of another compare. In this case it is used - * together with getImage to compose a icon - * which reflects the kind of difference between the two or three elements. - * - * @return kind of difference (see Differencer) - */ - int getKind(); - - /** - * Returns the ancestor side of this input. - * Returns null if this input has no ancestor - * or in the two-way compare case. - * - * @return the ancestor of this input, or null - */ - ITypedElement getAncestor(); - - /** - * Returns the left side of this input. - * Returns null if there is no left side (deletion or addition). - * - * @return the left side of this input, or null - */ - ITypedElement getLeft(); - - /** - * Returns the right side of this input. - * Returns null if there is no right side (deletion or addition). - * - * @return the right side of this input, or null - */ - ITypedElement getRight(); - - /** - * Registers the given listener for notification. - * If the identical listener is already registered the method has no effect. - * - * @param listener the listener to register for changes of this input - */ - void addCompareInputChangeListener(ICompareInputChangeListener listener); - - /** - * Unregisters the given listener. - * If the identical listener is not registered the method has no effect. - * - * @param listener the listener to unregister - */ - void removeCompareInputChangeListener(ICompareInputChangeListener listener); - - /** - * Copy one side (source) to the other side (destination) depending on the - * value of leftToRight. This method is called from - * a merge viewer if a corresponding action ("take left" or "take right") - * has been pressed. - *

- * The implementation should handle the following cases: - *

    - *
  • - * if the source side is null the destination must be deleted, - *
  • - * if the destination is null the destination must be created - * and filled with the contents from the source, - *
  • - * if both sides are non-null the contents of source must be copied to destination. - *
- * In addition the implementation should send out notification to the registered - * ICompareInputChangeListener. - * - * @param leftToRight if true the left side is copied to the right side. - * If false the right side is copied to the left side - */ - void copy(boolean leftToRight); -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/ICompareInputChangeListener.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/ICompareInputChangeListener.java deleted file mode 100644 index 461a94ab4..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/ICompareInputChangeListener.java +++ /dev/null @@ -1,38 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.structuremergeviewer; - -/** - * Listener that gets informed if one (or more) - * of the three sides of an ICompareInput object changes its value. - *

- * For example when accepting an incoming addition - * the (non-null) left side of an ICompareInput - * is copied to the right side (which was null). - * This triggers a call to compareInputChanged of registered - * ICompareInputChangeListener. - *

- * Note however, that listener are not informed if the content of one of the sides changes. - *

- * Clients may implement this interface. It is also implemented by viewers that take - * an ICompareInput as input. - *

- */ -public interface ICompareInputChangeListener { - - /** - * Called whenever the value (not the content) of one or more of the three sides - * of a ICompareInput has changed. - * - * @param source the ICompareInput that has changed - */ - void compareInputChanged(ICompareInput source); -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IDiffContainer.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IDiffContainer.java deleted file mode 100644 index 598996bef..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IDiffContainer.java +++ /dev/null @@ -1,62 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.structuremergeviewer; - -/** - * IDiffContainer is a IDiffElement with children. - *

- * IDiffContainer are the inner nodes displayed - * by the DiffTreeViewer. - * IDiffContainer are typically created as the result of performing - * a compare with the Differencer. - *

- * Clients may implement this interface, or use one of the standard implementations, - * DiffContainer or DiffNode. - * - * @see Differencer - * @see DiffTreeViewer - */ -public interface IDiffContainer extends IDiffElement { - - /** - * Returns whether this container has at least one child. - * In some cases this methods avoids having to call the - * potential more costly getChildren method. - * - * @return true if this container has at least one child - */ - boolean hasChildren(); - - /** - * Returns the children of this container. - * If this container has no children an empty array is returned (not null). - * - * @return the children of this container as an array - */ - IDiffElement[] getChildren(); - - /** - * Adds the given child to this container. - * If the child is already contained in this container, this method has no effect. - * - * @param child the child to be added to this container - */ - void add(IDiffElement child); - - /** - * Removes the given child from this container. - * If the container becomes empty it is removed from its container. - * If the child is not contained in this container, this method has no effect. - * - * @param child the child to be removed from this container - */ - void removeToRoot(IDiffElement child); -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IDiffElement.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IDiffElement.java deleted file mode 100644 index f09742a1d..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IDiffElement.java +++ /dev/null @@ -1,61 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.structuremergeviewer; - -import org.eclipse.compare.ITypedElement; - -/** - * An IDiffElement is used in the DiffTreeViewer - * to display the kind of change detected as the result of a two-way or three-way compare. - *

- * The base interface ITypedElement provides a name, a type, and an image. - * IDiffElement adds API for maintaining a parent relationship. - *

- * DiffTreeViewer works on a tree of IDiffElements. - * Leaf elements must implement the - * IDiffElement interface, inner nodes the IDiffContainer interface. - *

- * IDiffElements are typically created as the result of performing - * a compare with the Differencer. - *

- * Clients may implement this interface, or use one of the standard implementations, - * DiffElement, DiffContainer, or DiffNode. - * - * @see DiffTreeViewer - * @see DiffElement - * @see DiffContainer - * @see DiffNode - */ -public interface IDiffElement extends ITypedElement { - - /** - * Returns the kind of difference as defined in Differencer. - * - * @return the kind of difference as defined in Differencer - */ - int getKind(); - - /** - * Returns the parent of this element. - * If the object is the root of a hierarchy null is returned. - * - * @return the parent of this element, or null if the element has no parent - */ - IDiffContainer getParent(); - - /** - * Sets the parent of this element. - * - * @param parent the new parent of this element, or null if this - * element is to have no parent - */ - void setParent(IDiffContainer parent); -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IStructureComparator.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IStructureComparator.java deleted file mode 100644 index b4bb8e0d0..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IStructureComparator.java +++ /dev/null @@ -1,45 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.structuremergeviewer; - -/** - * Interface used to compare hierarchical structures. - * It is used by the differencing engine. - *

- * Clients typically implement this interface in an adaptor class which - * wrappers the objects to be compared. - * - * @see org.eclipse.compare.ResourceNode - * @see Differencer - */ -public interface IStructureComparator { - - /** - * Returns an iterator for all children of this object or null - * if there are no children. - * - * @return an array with all children of this object, or an empty array if there are no children - */ - Object[] getChildren(); - - /** - * Returns whether some other object is "equal to" this one - * with respect to a structural comparison. For example, when comparing - * Java class methods, equals would return true - * if two methods have the same signature (the argument names and the - * method body might differ). - * - * @param other the reference object with which to compare - * @return true if this object is the same as the other argument; false otherwise - * @see java.lang.Object#equals - */ - boolean equals(Object other); -} diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IStructureCreator.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IStructureCreator.java deleted file mode 100644 index 2f2c3916a..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/IStructureCreator.java +++ /dev/null @@ -1,110 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.structuremergeviewer; - -/** - * Interface used to create a hierarchical structure of - * IStructureComparators for a given input object. - * In addition, it provides methods for locating a path in the hierarchical structure - * and to map a node of this structure back to the corresponding input object. - *

- * Structure creators are used in the following contexts: - *

    - *
  • - * the StructureDiffViewer uses an IStructureCreator to - * build two (or three) tree structures of its input elements (method getStructure). - * These trees are then compared with each other by means of the differencing engine and displayed - * with the DiffTreeViewer, - *
  • - *
  • - * the ReplaceWithEditionDialog uses an IStructureCreator - * to map a path back to a range of characters in the textual representation. - *
  • - *
- * A IStructureCreator provides methods for rewriting the tree produced by the differencing - * engine to support "smart" structural differencing. E.g. certain patterns of pairs of "addition" - * and "deletion" nodes can be detected as renames and merged into a single node. - *

- *

- * Clients may implement this interface; there is no standard implementation. - *

- * - * @see StructureDiffViewer - * @see org.eclipse.compare.EditionSelectionDialog - * @see Differencer - */ -public interface IStructureCreator { - - /** - * Returns a descriptive name which can be used in the UI of the StructureDiffViewer. - * - * @return a descriptive name for this IStructureCreator - */ - String getName(); - - /** - * Creates a tree structure consisting of IStructureComparators - * from the given object and returns its root object. - * Implementing this method typically involves parsing the input object. - * In case of an error (e.g. a parsing error) the value null is returned. - * - * @param input the object from which to create the tree of IStructureComparator - * @return the root node of the structure or null in case of error - */ - IStructureComparator getStructure(Object input); - - /** - * Creates the single node specified by path from the given input object. - * In case of an error (e.g. a parsing error) the value null is returned. - * This method is similar to getStructure but in - * contrast to getStructure only a single node without any children must be returned. - * This method is used in the ReplaceWithEditionDialog to locate a sub element - * (e.g. a method) within an input object (e.g. a file containing source code). - *

- * One (not optimized) approach to implement this method is calling getStructure(input) - * to build the full tree, and then finding that node within the tree that is specified - * by path. - *

- * The syntax of path is not specified, because it is treated by the compare subsystem - * as an opaque entity and is not further interpreted. Clients using this functionality - * will pass a value of path to the selectEdition - * method of ReplaceWithEditionDialog and will receive this value unchanged - * as an argument to locate. - * - * @param path specifies a sub object within the input object - * @param input the object from which to create the IStructureComparator - * @return the single node specified by path or null - * - * @see org.eclipse.compare.EditionSelectionDialog#selectEdition - */ - IStructureComparator locate(Object path, Object input); - - /** - * Returns the contents of the given node as a string for the purpose - * of performing a content comparison only (that is the string will not be visible in the UI). - * If ignoreWhitespace is true all character sequences considered - * whitespace should be removed from the returned string. - * - * @param node the node for which to return a string representation - * @param ignoreWhitespace if true the returned string should not contain whitespace - * @return the string contents of the given node - */ - String getContents(Object node, boolean ignoreWhitespace); - - /** - * Called whenever a copy operation has been performed on a tree node. - * - * @param node the node for which to save the new content - * @param input the object from which the structure tree was created in getStructure - */ - void save(IStructureComparator node, Object input); -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/StructureDiffViewer.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/StructureDiffViewer.java deleted file mode 100644 index 9dd4f68f8..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/StructureDiffViewer.java +++ /dev/null @@ -1,375 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.compare.structuremergeviewer; - -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.widgets.*; -import org.eclipse.jface.util.PropertyChangeEvent; - -import org.eclipse.compare.*; -import org.eclipse.compare.internal.*; - - -/** - * A diff tree viewer that can be configured with a IStructureCreator - * to retrieve a hierarchical structure from the input object (an ICompareInput) - * and perform a two-way or three-way compare on it. - *

- * This class may be instantiated; it is not intended to be subclassed outside - * this package. - *

- * - * @see IStructureCreator - * @see ICompareInput - */ -public class StructureDiffViewer extends DiffTreeViewer { - - private Differencer fDifferencer; - private boolean fThreeWay= false; - - private ITypedElement fAncestorInput; - private ITypedElement fLeftInput; - private ITypedElement fRightInput; - - private IStructureComparator fAncestorStructure; - private IStructureComparator fLeftStructure; - private IStructureComparator fRightStructure; - - private IStructureCreator fStructureCreator; - private IDiffContainer fRoot; - private IContentChangeListener fContentChangedListener; - private CompareViewerSwitchingPane fParent; - - /** - * Creates a new viewer for the given SWT tree control with the specified configuration. - * - * @param tree the tree control - * @param configuration the configuration for this viewer - */ - public StructureDiffViewer(Tree tree, CompareConfiguration configuration) { - super(tree, configuration); - Composite c= tree.getParent(); - if (c instanceof CompareViewerSwitchingPane) - fParent= (CompareViewerSwitchingPane) c; - initialize(); - } - - /** - * Creates a new viewer under the given SWT parent with the specified configuration. - * - * @param parent the SWT control under which to create the viewer - * @param configuration the configuration for this viewer - */ - public StructureDiffViewer(Composite parent, CompareConfiguration configuration) { - super(parent, configuration); - if (parent instanceof CompareViewerSwitchingPane) - fParent= (CompareViewerSwitchingPane) parent; - initialize(); - } - - private void initialize() { - - setAutoExpandLevel(3); - - fContentChangedListener= new IContentChangeListener() { - public void contentChanged(IContentChangeNotifier changed) { - StructureDiffViewer.this.contentChanged(changed); - } - }; - new ICompareInputChangeListener() { - public void compareInputChanged(ICompareInput input) { - StructureDiffViewer.this.compareInputChanged(input); - } - }; - } - - /** - * Configures the StructureDiffViewer with a structure creator. - * The structure creator is used to create a hierarchical structure - * for each side of the viewer's input element of type ICompareInput. - * - * @param structureCreator the new structure creator - */ - public void setStructureCreator(IStructureCreator structureCreator) { - if (fStructureCreator != structureCreator) { - fStructureCreator= structureCreator; - Control tree= getControl(); - if (tree != null && !tree.isDisposed()) - tree.setData(CompareUI.COMPARE_VIEWER_TITLE, getTitle()); - } - } - - /** - * Returns the structure creator or null if no - * structure creator has been set with setStructureCreator. - * - * @return the structure creator or null - */ - public IStructureCreator getStructureCreator() { - return fStructureCreator; - } - - /** - * Reimplemented to get the descriptive title for this viewer from the IStructureCreator. - * @return the viewer's name - */ - public String getTitle() { - if (fStructureCreator != null) - return fStructureCreator.getName(); - return super.getTitle(); - } - - /** - * Overridden because the input of this viewer is not identical to the root of the tree. - * The tree's root is a IDiffContainer that was returned from the method diff. - * - * @return the root of the diff tree produced by method diff - */ - protected Object getRoot() { - return fRoot; - } - - /* - * (non-Javadoc) Method declared on StructuredViewer. - * Overridden to create the comparable structures from the input object - * and to feed them through the differencing engine. Note: for this viewer - * the value from getInput is not identical to getRoot. - */ - protected void inputChanged(Object input, Object oldInput) { - if (input instanceof ICompareInput) { - compareInputChanged((ICompareInput) input); - if (input != oldInput) - initialSelection(); - } - } - - protected void initialSelection() { - expandToLevel(2); - } - - /* (non Javadoc) - * Overridden to unregister all listeners. - */ - protected void handleDispose(DisposeEvent event) { - - compareInputChanged(null); - - fContentChangedListener= null; - - super.handleDispose(event); - } - - /** - * Recreates the comparable structures for the input sides. - * @param input this viewer's new input - */ - protected void compareInputChanged(ICompareInput input) { - ITypedElement t= null; - boolean changed= false; - - if (input != null) - t= input.getAncestor(); - - fThreeWay= (t != null); - - if (t != fAncestorInput) { - if (fAncestorInput instanceof IContentChangeNotifier) - ((IContentChangeNotifier)fAncestorInput).removeContentChangeListener(fContentChangedListener); - fAncestorInput= t; - if (fAncestorInput != null) { - fAncestorStructure= fStructureCreator.getStructure(fAncestorInput); - changed= true; - } else - fAncestorStructure= null; - if (fAncestorInput instanceof IContentChangeNotifier) - ((IContentChangeNotifier)fAncestorInput).addContentChangeListener(fContentChangedListener); - } - - if (input != null) - t= input.getLeft(); - if (t != fLeftInput) { - if (fLeftInput instanceof IContentChangeNotifier) - ((IContentChangeNotifier)fLeftInput).removeContentChangeListener(fContentChangedListener); - fLeftInput= t; - if (fLeftInput != null) { - fLeftStructure= fStructureCreator.getStructure(fLeftInput); - changed= true; - } else - fLeftStructure= null; - if (fLeftInput instanceof IContentChangeNotifier) - ((IContentChangeNotifier)fLeftInput).addContentChangeListener(fContentChangedListener); - } - - if (input != null) - t= input.getRight(); - if (t != fRightInput) { - if (fRightInput instanceof IContentChangeNotifier) - ((IContentChangeNotifier)fRightInput).removeContentChangeListener(fContentChangedListener); - fRightInput= t; - if (fRightInput != null) { - fRightStructure= fStructureCreator.getStructure(fRightInput); - changed= true; - } else - fRightStructure= null; - if (fRightInput instanceof IContentChangeNotifier) - ((IContentChangeNotifier)fRightInput).addContentChangeListener(fContentChangedListener); - } - - if (changed) - diff(); - } - - /** - * Calls diff whenever the byte contents changes. - * @param changed the object that sent out the notification - */ - protected void contentChanged(IContentChangeNotifier changed) { - - if (fStructureCreator == null) - return; - - if (changed != null) { - if (changed == fAncestorInput) { - fAncestorStructure= fStructureCreator.getStructure(fAncestorInput); - } else if (changed == fLeftInput) { - fLeftStructure= fStructureCreator.getStructure(fLeftInput); - } else if (changed == fRightInput) { - fRightStructure= fStructureCreator.getStructure(fRightInput); - } else - return; - } else { - fAncestorStructure= fStructureCreator.getStructure(fAncestorInput); - fLeftStructure= fStructureCreator.getStructure(fLeftInput); - fRightStructure= fStructureCreator.getStructure(fRightInput); - } - - diff(); - } - - /** - * This method is called from within diff() before the difference - * tree is being built. - * Clients may override this method to perform their own pre-processing. - * This default implementation does nothing. - * @param ancestor the ancestor input to the differencing operation - * @param left the left input to the differencing operation - * @param right the right input to the differencing operation - * @since 2.0 - */ - protected void preDiffHook(IStructureComparator ancestor, IStructureComparator left, IStructureComparator right) { - // we do nothing here - } - - /** - * Runs the difference engine and refreshes the tree. - */ - protected void diff() { - - preDiffHook(fAncestorStructure, fLeftStructure, fRightStructure); - - String message= null; - - if ((fThreeWay && fAncestorStructure == null) || fLeftStructure == null || fRightStructure == null) { - // could not get structure of one (or more) of the legs - fRoot= null; - message= CompareMessages.getString("StructureDiffViewer.StructureError"); //$NON-NLS-1$ - - } else { // calculate difference of the two (or three) structures - - if (fDifferencer == null) - fDifferencer= new Differencer() { - protected boolean contentsEqual(Object o1, Object o2) { - return StructureDiffViewer.this.contentsEqual(o1, o2); - } - protected Object visit(Object data, int result, Object ancestor, Object left, Object right) { - Object o= super.visit(data, result, ancestor, left, right); - if (fLeftIsLocal && o instanceof DiffNode) - ((DiffNode)o).swapSides(fLeftIsLocal); - return o; - } - }; - - fRoot= (IDiffContainer) fDifferencer.findDifferences(fThreeWay, null, null, - fAncestorStructure, fLeftStructure, fRightStructure); - - if (fRoot == null || fRoot.getChildren().length == 0) { - message= CompareMessages.getString("StructureDiffViewer.NoStructuralDifferences"); //$NON-NLS-1$ - } else { - postDiffHook(fDifferencer, fRoot); - } - } - if (fParent != null) - fParent.setTitleArgument(message); - - refresh(getRoot()); - } - - /** - * This method is called from within diff() after the difference - * tree has been built. - * Clients may override this method to perform their own post-processing. - * This default implementation does nothing. - * @param differencer the differencer used to perform the differencing - * @param root the non-null root node of the difference tree - * @since 2.0 - */ - protected void postDiffHook(Differencer differencer, IDiffContainer root) { - // we do nothing here - } - - /* - * Performs a byte compare on the given objects. - * Called from the difference engine. - * Returns null if no structure creator has been set. - */ - private boolean contentsEqual(Object o1, Object o2) { - if (fStructureCreator != null) { - boolean ignoreWhiteSpace= Utilities.getBoolean(getCompareConfiguration(), CompareConfiguration.IGNORE_WHITESPACE, false); - String s1= fStructureCreator.getContents(o1, ignoreWhiteSpace); - String s2= fStructureCreator.getContents(o2, ignoreWhiteSpace); - if (s1 == null || s2 == null) - return false; - return s1.equals(s2); - } - return false; - } - - /** - * Tracks property changes of the configuration object. - * Clients may override to track their own property changes. - * In this case they must call the inherited method. - * @param event the property changed event that triggered the call to this method - */ - protected void propertyChange(PropertyChangeEvent event) { - String key= event.getProperty(); - if (key.equals(CompareConfiguration.IGNORE_WHITESPACE)) - diff(); - else - super.propertyChange(event); - } - - /** - * Overridden to call the save method on the structure creator after - * nodes have been copied from one side to the other side of an input object. - * - * @param leftToRight if true the left side is copied to the right side. - * If false the right side is copied to the left side - */ - protected void copySelected(boolean leftToRight) { - super.copySelected(leftToRight); - - if (fStructureCreator != null) - fStructureCreator.save( - leftToRight ? fRightStructure : fLeftStructure, - leftToRight ? fRightInput : fLeftInput); - } -} - diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/package.html b/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/package.html deleted file mode 100644 index 60257a4d8..000000000 --- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/structuremergeviewer/package.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - Package-level Javadoc - - -Provides support for finding and displaying the differences -between hierarchically structured data. -

-Package Specification

- -The class Differencer is a differencing engine for hierarchically -structured data. It takes two or three inputs and performs a two-way or -three-way compare on them. -

- -If the input elements to the differencing engine implement the IStructureComparator -interface the engine recursively applies itself to the children of -the input element. Leaf elements must implement the org.eclipse.compare.IStreamContentAccessor -interface so that the differencer can perform a bytewise comparison on their contents. -

- -One good example for this is org.eclipse.compare.ResourceNode which implements both interfaces -(and more) for Eclipse workspace resources (org.eclipse.core.resources.IResource). -

- -Another example is the DocumentRangeNode which can be used to compare hierarchical structures -that are superimposed on a document, that is where nodes and leafs correspond to ranges in a document -(org.eclipse.compare.contentmergeviewer.IDocumentRange). -
-Typically DocumentRangeNodes are created while parsing a document and they represent -the semantic entities of the document (e.g. a Java class, method or field). -The two subclasses JavaNode (in org.eclipse.jdt.internal.ui.compare) -and PropertyNode (in org.eclipse.jdt.internal.ui.compare) are good examples for this. -

- -By default the differencing engine returns the result of the compare operation -as a tree of DiffNode objects. However, this can be changed by overriding -a single method of the engine. -

- -Every DiffNode describes the changes among the two or three inputs. -

- -A tree of DiffNodes can be displayed in a DiffTreeViewer. -The DiffTreeViewer requires that inner nodes of the tree implement -the IDiffContainer interface and leafs the IDiffElement interface. -

- -The typical steps to compare hierarchically structured data and to display -the differences would be to: -

    -
  • -map the input data into a tree of IStructureComparator and IStreamContentAccessors,
  • - -
  • -perform the compare operation by means of the Differencer, and
  • - -
  • -feed the differencing result into the DiffTreeViewer.
  • - -
- -The StructureDiffViewer is a specialized DiffTreeViewer -that automates the three steps from above. It takes a single input object -of type ICompareInput from which it retrieves the two or three -input elements to compare. Then it uses a IStructureCreator to -extract a tree of IStructureComparator and IStreamContentAccessor -from them. These trees are then compared with the differencing engine and -the result is displayed in the tree viewer. -

- - - - - -- cgit v1.2.3