using System; using Codice.Client.BaseCommands; using Codice.Client.BaseCommands.Differences; using Codice.Client.Common; using Codice.Client.Common.Threading; using Codice.CM.Client.Differences; using Codice.CM.Client.Differences.Graphic; using Codice.CM.Common; using Codice.CM.Common.Merge; using Codice.CM.Common.Mount; using PlasticGui.Diff; using Plugins.PlasticSCM.Editor.Diff.Asset; using Plugins.PlasticSCM.Editor.Diff.Purged; using Plugins.PlasticSCM.Editor.Diff.Text; using Plugins.PlasticSCM.Editor.Diff.Texture; using Unity.PlasticSCM.Editor; using UnityEngine.UIElements; using XDiffGui; using EditorWindow = UnityEditor.EditorWindow; namespace Plugins.PlasticSCM.Editor.Diff { internal class DiffWindow : EditorWindow { internal void ShowDiffFromChange(ChangeInfo changeInfo, ChangeInfo changedForMoved) { ShowDiffsFromAsyncData(() => mDiffViewerDataProvider.GetDiffViewerInfo( changeInfo, changedForMoved)); } internal void ShowDiffFromHistory( HistoryRevision leftRevision, HistoryRevision rightRevision, RepositorySpec repSpec, string cmPath, long itemId) { ShowDiffsFromAsyncData(() => mDiffViewerDataProvider.GetDiffViewerInfo( leftRevision, rightRevision, repSpec, cmPath, itemId)); } internal void ShowDiffFromDiff(MountPoint mount, Difference diff) { ShowDiffsFromAsyncData(() => mDiffViewerDataProvider.GetDiffViewerInfo( mount, diff)); } void OnDisable() { mDiffViewerDataProvider?.Clear(); mDiffViewManager?.Clear(); } void OnEnable() { UVCSPlugin uvcsPlugin = UVCSPlugin.Instance; //titleContent.image = Images.GetDiffIcon(); uvcsPlugin.Enable(); if (!uvcsPlugin.ConnectionMonitor.IsConnected) return; mWkInfo = FindWorkspace.InfoForApplicationPath( ApplicationDataPath.Get(), PlasticGui.Plastic.API); if (mWkInfo == null) return; Init(); } void Init() { mBranchResolver = new BranchResolver(); mDiffViewManager = new DiffViewManager( mWkInfo, mBranchResolver, new BigFileChecker(), null); mDiffViewerDataProvider = PlasticGui.Plastic.API.GetDiffViewerDataProvider( mWkInfo, mDiffViewManager, mBranchResolver, null); mBigFileDownloader = mDiffViewManager.BigFileDownloader; } void ShowDiffsFromAsyncData(Func getDiffViewerData) { int requestId = System.Threading.Interlocked.Increment( ref mCurrentDiffRequestId); DiffViewerData data = null; IThreadWaiter waiter = ThreadWaiter.GetWaiter(); waiter.Execute( /*threadOperationDelegate*/ delegate { if (requestId != mCurrentDiffRequestId) return; data = getDiffViewerData(); }, /*afterOperationDelegate*/ delegate { if (requestId != mCurrentDiffRequestId) return; if (waiter.Exception != null) { ExceptionsHandler.DisplayException(waiter.Exception); return; } ShowDiffs(data); }); } void ShowDiffs(DiffViewerData data) { if (data == null) return; if (data.Left?.IsPurged == true || data.Right?.IsPurged == true) { ShowPurgedDiff(data); return; } if (data.Left == null) { ShowMessage(data.Message); return; } if (data.Right == null) { ShowContent(data); return; } ShowDiff(data); } void ShowContent(DiffViewerData data) { if (data.IsImage()) { ShowImageContentControl(data); return; } if (data.IsSerializedAsset()) { ShowAssetContentControl(data); } ShowContentControl(data.Left, data.Message, data.PathForEdition); } void ShowDiff(DiffViewerData data) { if (data.IsImage()) { ShowImageDiffControl(data); return; } if (data.IsSerializedAsset()) { ShowAssetDiffControl(data); } ShowDiffControl(data); } void ShowContentControl( EntryData entryData, string message, string pathForEdition) { if (mContentControl == null) mContentControl = BuildContentControl(); mContentControl.ShowData( entryData, message, pathForEdition); ReplaceView(mContentControl); } void ShowDiffControl(DiffViewerData data) { if (mDiffControl == null) mDiffControl = BuildDiffControl(); mDiffControl.ShowData(data); ReplaceView(mDiffControl); } void ShowAssetContentControl(DiffViewerData data) { if (mAssetContentControl == null) mAssetContentControl = BuildAssetContentControl(); mAssetContentControl.ShowData(data); ReplaceView(mAssetContentControl); } void ShowAssetDiffControl(DiffViewerData data) { if (mAssetDiffControl == null) mAssetDiffControl = BuildAssetDiffControl(); mAssetDiffControl.ShowData(data); ReplaceView(mAssetDiffControl); } void ShowImageContentControl(DiffViewerData data) { if (mImageContentControl == null) mImageContentControl = BuildImageContentControl(); mImageContentControl.ShowData(data); ReplaceView(mImageContentControl); } void ShowImageDiffControl(DiffViewerData data) { if (mImageDiffControl == null) mImageDiffControl = BuildImageDiffControl(); mImageDiffControl.ShowData(data); ReplaceView(mImageDiffControl); } void ShowPurgedDiff(DiffViewerData data) { if (mPurgedRevisionControl == null) mPurgedRevisionControl = BuildPurgedRevisionControl(); mPurgedRevisionControl.ShowData(data); ReplaceView(mPurgedRevisionControl); } void ShowMessage(string message) { if (mDiffMessagePanel == null) mDiffMessagePanel = BuildDiffMessagePanel(); mDiffMessagePanel.ShowMessage(message); ReplaceView(mDiffMessagePanel); } ContentControl BuildContentControl() { return new ContentControl(); } DiffControl BuildDiffControl() { return new DiffControl(); } AssetContentControl BuildAssetContentControl() { return new AssetContentControl(); } AssetDiffControl BuildAssetDiffControl() { return new AssetDiffControl(); } ImageContentControl BuildImageContentControl() { return new ImageContentControl(); } ImageDiffControl BuildImageDiffControl() { return new ImageDiffControl(); } PurgedRevisionControl BuildPurgedRevisionControl() { return new PurgedRevisionControl(); } DiffMessagePanel BuildDiffMessagePanel() { return new DiffMessagePanel(); } void ReplaceView(VisualElement view) { if (mCurrentView != null && mCurrentView.Equals(view)) return; if (rootVisualElement.Contains(mCurrentView)) rootVisualElement.Remove(mCurrentView); rootVisualElement.Add(view); mCurrentView = view; } WorkspaceInfo mWkInfo; VisualElement mCurrentView; //NoItemsSelectedPanel mNoItemSelectedPanel; ContentControl mContentControl; DiffControl mDiffControl; ImageContentControl mImageContentControl; ImageDiffControl mImageDiffControl; AssetContentControl mAssetContentControl; AssetDiffControl mAssetDiffControl; PurgedRevisionControl mPurgedRevisionControl; DiffMessagePanel mDiffMessagePanel; BranchResolver mBranchResolver; //IRunAfterSetDifferencesInfo mRunAfterSetDifferencesInfo; DiffViewManager mDiffViewManager; //readonly IContainer mParentContainer; int mCurrentDiffRequestId; IBigFileDownloader mBigFileDownloader; IDiffViewerDataProvider mDiffViewerDataProvider; } }