Files
Test/Library/PackageCache/com.unity.collab-proxy@4628d2ba6ea4/Editor/Diff/Text/ContentControl.cs
T
2026-11-01 23:39:55 +02:00

436 lines
14 KiB
C#

using System.Collections.Generic;
using System.Linq;
using System.Text;
using Codice.Client.Common;
using Codice.Client.Common.Threading;
using Codice.CM.Client.Differences;
using Codice.CM.Client.Differences.Graphic;
using MergetoolGui;
using PlasticGui;
using Unity.CodeEditor;
using Unity.PlasticSCM.Editor.Diff.Purged;
using Unity.PlasticSCM.Editor.UI;
using Unity.PlasticSCM.Editor.UI.UIElements;
using UnityEngine;
using UnityEngine.UIElements;
using XDiffGui;
using XDiffGui.Options;
using Language = XDiffGui.Options.Language;
namespace Unity.PlasticSCM.Editor.Diff.Text
{
internal class ContentControl :
VisualElement,
ISaveChangesListener,
ICodeEditorSettingsChangeListener,
ISyntaxHighlightListener,
IEncodingListener,
IBigFilePanelListener
{
internal ContentControl(
IAfterSaveChangesListener afterSaveChangesListener,
IBigFileDownloader bigFileDownloader,
IBigFileChecker bigFileChecker)
{
mAfterSaveChangesListener = afterSaveChangesListener;
mBigFileDownloader = bigFileDownloader;
mBigFileChecker = bigFileChecker;
CreateGUI();
LoadTextEditorOptions();
}
internal void ShowData(DiffViewerData data)
{
mTextEditorPanel.FinishPendingDraftSave();
mDiffViewerData = data;
ReplaceMainView(mNormalContentPanel);
EntryData entryData = data.Left;
mMessageView.HandleMessage(data.Message);
mFileTextView.text = PlasticLocalization.GetString(
PlasticLocalization.Name.Content, entryData.SymbolicName);
mOptionsContextMenu.SetEntryData(entryData);
mFile = entryData.File;
mPathForEdition = data.PathForEdition;
if (BigFileDiffCalculator.IsBigFileDiff(data, mBigFileDownloader, mBigFileChecker))
{
ShowBigFileMessage();
return;
}
if (data.Left?.IsPurged == true || data.Right?.IsPurged == true)
{
ShowPurgedRevision(data);
return;
}
ReplaceView(mTextEditorPanel);
if (string.IsNullOrEmpty(entryData.File))
{
ShowEntryDataContent(entryData.Content);
return;
}
ShowFileContent(entryData.File, entryData.Encoding);
}
internal void Dispose()
{
mTextEditorPanel.DirtyStateChanged -=
OnDirtyStateChanged;
mTextEditorPanel.Dispose();
mSaveChangesPanel.Dispose();
mOptionsContextMenu.Dispose();
if (mBigFileMessagePanel != null)
mBigFileMessagePanel.Dispose();
if (mPurgedRevisionControl != null)
mPurgedRevisionControl.Dispose();
}
void SaveChanges()
{
mTextEditorPanel.SaveChanges(
mAfterSaveChangesListener);
}
void ICodeEditorSettingsChangeListener.OnFontFamilyChanged(string font)
{
Unity.CodeEditor.TextEditor textEditor = mTextEditorPanel.TextEditor;
if (string.IsNullOrEmpty(font) || font == ChangeFontDialog.DEFAULT_FONT)
{
textEditor.Font = null;
return;
}
textEditor.Font = Font.CreateDynamicFontFromOSFont(
font, textEditor.FontSize);
}
void ICodeEditorSettingsChangeListener.OnTabSizeChanged(int tabSize)
{
SetTabSize(tabSize);
}
void ICodeEditorSettingsChangeListener.OnColumnGuidesChanged(IEnumerable<int> columnGuides)
{
SetColumnGuides(columnGuides);
}
void ICodeEditorSettingsChangeListener.OnConvertTabsToWhitespacesChanged(bool value)
{
SetConvertTabsToSpaces(value);
}
void ICodeEditorSettingsChangeListener.OnViewWhitespacesChanged(bool value)
{
SetViewWhitespaces(value);
}
void ICodeEditorSettingsChangeListener.OnViewEOLChanged(bool value)
{
SetViewEOL(value);
}
void ISyntaxHighlightListener.OnSyntaxHighlightChanged(string languageString)
{
Language language = LanguageString.FromString(languageString);
mTextEditorPanel.SetLanguage(language);
mOptionsContextMenu.SetLanguage(language);
}
bool IEncodingListener.OnEncodingChanged(
TextBoxContributor contributor, Encoding encoding)
{
mTextEditorPanel.DeleteDraft();
mTextEditorPanel.ShowFileContent(
mPathForEdition ?? mFile, encoding, mPathForEdition);
mOptionsContextMenu.SetLanguage(
mTextEditorPanel.CurrentLanguage);
return true;
}
void ISaveChangesListener.OnSaveChanges()
{
if (!mTextEditorPanel.IsTextDirty)
return;
SaveChanges();
}
void ISaveChangesListener.OnDiscardChanges()
{
mTextEditorPanel.DiscardChanges();
mOptionsContextMenu.SetLanguage(
mTextEditorPanel.CurrentLanguage);
}
void IBigFilePanelListener.OnCalculateDifferencesButtonClick()
{
mBigFileMessagePanel.Disable();
IThreadWaiter waiter = ThreadWaiter.GetWaiter(10);
waiter.Execute(
/*threadOperationDelegate*/ delegate
{
mBigFileDownloader.DownloadFiles(
mDiffViewerData, GetDefaultEncoding());
},
/*afterOperationDelegate*/ delegate
{
mBigFileMessagePanel.Enable();
if (waiter.Exception != null)
{
MergetoolExceptionsHandler.DisplayException(
waiter.Exception);
return;
}
if (mDiffViewerData.Left?.IsPurged == true ||
mDiffViewerData.Right?.IsPurged == true)
{
ShowPurgedRevision(mDiffViewerData);
return;
}
mFile = mDiffViewerData.Left.File;
ReplaceView(mTextEditorPanel);
if (string.IsNullOrEmpty(mFile))
{
ShowEntryDataContent(mDiffViewerData.Left.Content);
return;
}
ShowFileContent(
mFile, mDiffViewerData.Left.Encoding);
});
}
void ShowEntryDataContent(string content)
{
mTextEditorPanel.ShowContent(
content, Language.PlainText, false);
mOptionsContextMenu.SetLanguage(Language.PlainText);
}
void ShowBigFileMessage()
{
if (mBigFileMessagePanel == null)
mBigFileMessagePanel = new BigFileMessagePanel(this, false);
mBigFileMessagePanel.UpdateDisplayData(
BigFileDisplayData.Build(
mDiffViewerData, mBigFileDownloader));
mMessageView.HandleMessage(string.Empty);
ReplaceView(mBigFileMessagePanel);
}
void ShowPurgedRevision(DiffViewerData data)
{
if (mPurgedRevisionControl == null)
{
mPurgedRevisionControl = new PurgedRevisionControl(
mAfterSaveChangesListener);
}
mPurgedRevisionControl.ShowData(data);
ReplaceMainView(mPurgedRevisionControl);
}
void ReplaceMainView(VisualElement panel)
{
if (hierarchy.childCount == 1 && hierarchy[0] == panel)
return;
Clear();
Add(panel);
}
void ReplaceView(VisualElement view)
{
if (mCurrentView == view)
return;
if (mCurrentView != null)
mContainerPanel.Remove(mCurrentView);
mContainerPanel.Add(view);
mCurrentView = view;
}
Encoding GetDefaultEncoding()
{
return EncodingManager.GetEncodingFromType(
PlasticGuiConfig.Get().Configuration.Encoding);
}
void ShowFileContent(string file, Encoding encoding)
{
mTextEditorPanel.ShowFileContent(
file, encoding, mPathForEdition);
mOptionsContextMenu.SetLanguage(
mTextEditorPanel.CurrentLanguage);
}
void OnDirtyStateChanged(bool isDirty)
{
if (isDirty)
{
mFileTextView.style.color = UnityStyles.Colors.RedText;
EditedTextBlockMarker.AddMark(mFileTextView);
mSaveChangesPanel.style.display = DisplayStyle.Flex;
}
else
{
mFileTextView.style.color = StyleKeyword.Null;
EditedTextBlockMarker.RemoveMark(mFileTextView);
mSaveChangesPanel.style.display = DisplayStyle.None;
}
}
void LoadTextEditorOptions()
{
PlasticGuiConfigData config = PlasticGuiConfig.Get().Configuration;
mOptionsContextMenu.TextEditorOptionsMenu.SetOptions(
config.EditorOptionsShowWhiteSpaces,
config.EditorOptionsConvertTabsToSpaces,
config.EditorOptionsShowEOL,
config.EditorOptionsTabSize,
config.EditorOptionsColumnGuides);
SetViewWhitespaces(config.EditorOptionsShowWhiteSpaces);
SetConvertTabsToSpaces(config.EditorOptionsConvertTabsToSpaces);
SetViewEOL(config.EditorOptionsShowEOL);
SetTabSize(config.EditorOptionsTabSize);
SetColumnGuides(config.EditorOptionsColumnGuides);
((ICodeEditorSettingsChangeListener)this).OnFontFamilyChanged(
config.TextEditorFontFamily);
}
void SetViewWhitespaces(bool isEnabled)
{
mTextEditorPanel.TextEditor.Options.ShowSpaces = isEnabled;
mTextEditorPanel.TextEditor.Options.ShowTabs = isEnabled;
}
void SetViewEOL(bool isEnabled)
{
mTextEditorPanel.TextEditor.Options.ShowEndOfLine = isEnabled;
}
void SetTabSize(int tabSize)
{
if (tabSize < 1)
return;
mTextEditorPanel.TextEditor.Options.IndentationSize = tabSize;
}
void SetConvertTabsToSpaces(bool isEnabled)
{
mTextEditorPanel.TextEditor.Options.ConvertTabsToSpaces = isEnabled;
}
void SetColumnGuides(IEnumerable<int> columnGuides)
{
bool showColumnRulers = columnGuides != null && columnGuides.Count() > 0;
mTextEditorPanel.TextEditor.Options.ShowColumnRulers = showColumnRulers;
mTextEditorPanel.TextEditor.Options.ColumnRulerPositions = columnGuides != null
? new List<int>(columnGuides)
: null;
}
void CreateGUI()
{
style.flexGrow = 1;
mMessageView = new MessagePanel();
VisualElement fileNamesView = CreateFileNameView();
mTextEditorPanel = new TextEditorPanel(this);
mTextEditorPanel.DirtyStateChanged +=
OnDirtyStateChanged;
mContainerPanel = new VisualElement();
mContainerPanel.style.flexGrow = 1;
mNormalContentPanel = new VisualElement();
mNormalContentPanel.style.flexGrow = 1;
mNormalContentPanel.Add(mMessageView);
mNormalContentPanel.Add(fileNamesView);
mNormalContentPanel.Add(mContainerPanel);
Add(mNormalContentPanel);
ReplaceView(mTextEditorPanel);
}
VisualElement CreateFileNameView()
{
UnityEditor.UIElements.Toolbar toolbar = ControlBuilder.Toolbar.Create();
mFileTextView = ControlBuilder.Label.CreateSelectableLabel();
mFileTextView.style.unityTextAlign = UnityEngine.TextAnchor.MiddleLeft;
mFileTextView.style.overflow = Overflow.Hidden;
mFileTextView.style.textOverflow = TextOverflow.Ellipsis;
mFileTextView.style.flexGrow = 1;
mFileTextView.style.flexShrink = 1;
toolbar.Add(mFileTextView);
mSaveChangesPanel = new SaveChangesPanel(this);
mSaveChangesPanel.style.flexShrink = 0;
toolbar.Add(mSaveChangesPanel);
mOptionsContextMenu = new ContentControlOptionsContextMenu(
this, this, this);
VisualElement optionsButton = mOptionsContextMenu.CreateButton();
optionsButton.style.flexShrink = 0;
toolbar.Add(optionsButton);
return toolbar;
}
MessagePanel mMessageView;
Label mFileTextView;
TextEditorPanel mTextEditorPanel;
SaveChangesPanel mSaveChangesPanel;
ContentControlOptionsContextMenu mOptionsContextMenu;
VisualElement mNormalContentPanel;
VisualElement mContainerPanel;
VisualElement mCurrentView;
BigFileMessagePanel mBigFileMessagePanel;
PurgedRevisionControl mPurgedRevisionControl;
readonly IAfterSaveChangesListener mAfterSaveChangesListener;
readonly IBigFileDownloader mBigFileDownloader;
readonly IBigFileChecker mBigFileChecker;
DiffViewerData mDiffViewerData;
string mFile;
string mPathForEdition;
}
}