321 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			321 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using UnityEditor;
 | |
| using UnityEngine;
 | |
| 
 | |
| using PlasticGui;
 | |
| using PlasticGui.WorkspaceWindow.Diff;
 | |
| using Unity.PlasticSCM.Editor.UI;
 | |
| 
 | |
| namespace Unity.PlasticSCM.Editor.Views.Diff
 | |
| {
 | |
|     internal class DiffTreeViewMenu
 | |
|     {
 | |
|         internal interface IMetaMenuOperations
 | |
|         {
 | |
|             bool SelectionHasMeta();
 | |
|             void DiffMeta();
 | |
|             void HistoryMeta();
 | |
|         }
 | |
| 
 | |
|         internal DiffTreeViewMenu(
 | |
|             IDiffTreeViewMenuOperations operations,
 | |
|             IMetaMenuOperations metaMenuOperations)
 | |
|         {
 | |
|             mOperations = operations;
 | |
|             mMetaMenuOperations = metaMenuOperations;
 | |
|             BuildComponents();
 | |
|         }
 | |
| 
 | |
|         internal void Popup()
 | |
|         {
 | |
|             GenericMenu menu = new GenericMenu();
 | |
| 
 | |
|             UpdateMenuItems(menu);
 | |
| 
 | |
|             menu.ShowAsContext();
 | |
|         }
 | |
| 
 | |
|         internal bool ProcessKeyActionIfNeeded(Event e)
 | |
|         {
 | |
|             DiffTreeViewMenuOperations operationToExecute = GetMenuOperation(e);
 | |
| 
 | |
|             if (operationToExecute == DiffTreeViewMenuOperations.None)
 | |
|                 return false;
 | |
| 
 | |
|             SelectedDiffsGroupInfo info =
 | |
|                 mOperations.GetSelectedDiffsGroupInfo();
 | |
| 
 | |
|             DiffTreeViewMenuOperations operations =
 | |
|                 DiffTreeViewMenuUpdater.GetAvailableMenuOperations(info);
 | |
| 
 | |
|             if (!operations.HasFlag(operationToExecute))
 | |
|                 return false;
 | |
| 
 | |
|             ProcessMenuOperation(operationToExecute);
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
|         void SaveRevisionAsMenuItem_Click()
 | |
|         {
 | |
|             mOperations.SaveRevisionAs();
 | |
|         }
 | |
| 
 | |
|         void DiffMenuItem_Click()
 | |
|         {
 | |
|             mOperations.Diff();
 | |
|         }
 | |
| 
 | |
|         void DiffMetaMenuItem_Click()
 | |
|         {
 | |
|             mMetaMenuOperations.DiffMeta();
 | |
|         }
 | |
| 
 | |
|         void HistoryMenuItem_Click()
 | |
|         {
 | |
|              mOperations.History();
 | |
|         }
 | |
| 
 | |
|         void HistoryMetaMenuItem_Click()
 | |
|         {
 | |
|             mMetaMenuOperations.HistoryMeta();
 | |
|         }
 | |
| 
 | |
|         void RevertMenuItem_Click()
 | |
|         {
 | |
|             mOperations.RevertChanges();
 | |
|         }
 | |
| 
 | |
|         void UndeleteMenuItem_Click()
 | |
|         {
 | |
|             mOperations.Undelete();
 | |
|         }
 | |
| 
 | |
|         void UndeleteToSpecifiedPathMenuItem_Click()
 | |
|         {
 | |
|             mOperations.UndeleteToSpecifiedPaths();
 | |
|         }
 | |
| 
 | |
|         void CopyFilePathMenuItem_Click()
 | |
|         {
 | |
|             mOperations.CopyFilePath(relativePath: false);
 | |
|         }
 | |
| 
 | |
|         void CopyRelativeFilePathMenuItem_Click()
 | |
|         {
 | |
|             mOperations.CopyFilePath(relativePath: true);
 | |
|         }
 | |
| 
 | |
|         void UpdateMenuItems(GenericMenu menu)
 | |
|         {
 | |
|             SelectedDiffsGroupInfo groupInfo =
 | |
|                 mOperations.GetSelectedDiffsGroupInfo();
 | |
| 
 | |
|             DiffTreeViewMenuOperations operations =
 | |
|                 DiffTreeViewMenuUpdater.GetAvailableMenuOperations(groupInfo);
 | |
| 
 | |
|             if (operations == DiffTreeViewMenuOperations.None)
 | |
|             {
 | |
|                 menu.AddDisabledItem(GetNoActionMenuItemContent());
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             bool isMultipleSelection = groupInfo.SelectedItemsCount > 1;
 | |
|             bool selectionHasMeta = mMetaMenuOperations.SelectionHasMeta();
 | |
| 
 | |
|             if (operations.HasFlag(DiffTreeViewMenuOperations.SaveAs))
 | |
|                 menu.AddItem(mSaveRevisionAsMenuItemContent, false, SaveRevisionAsMenuItem_Click);
 | |
| 
 | |
|             if (operations.HasFlag(DiffTreeViewMenuOperations.Diff))
 | |
|                 menu.AddItem(mDiffMenuItemContent, false, DiffMenuItem_Click);
 | |
|             else
 | |
|                 menu.AddDisabledItem(mDiffMenuItemContent, false);
 | |
| 
 | |
|             if (mMetaMenuOperations.SelectionHasMeta())
 | |
|             {
 | |
|                 if (operations.HasFlag(DiffTreeViewMenuOperations.Diff))
 | |
|                     menu.AddItem(mDiffMetaMenuItemContent, false, DiffMetaMenuItem_Click);
 | |
|                 else
 | |
|                     menu.AddDisabledItem(mDiffMetaMenuItemContent);
 | |
|             }
 | |
| 
 | |
|             menu.AddSeparator(string.Empty);
 | |
| 
 | |
|             if (operations.HasFlag(DiffTreeViewMenuOperations.History))
 | |
|                 menu.AddItem(mViewHistoryMenuItemContent, false, HistoryMenuItem_Click);
 | |
|             else
 | |
|                 menu.AddDisabledItem(mViewHistoryMenuItemContent, false);
 | |
| 
 | |
|             if (mMetaMenuOperations.SelectionHasMeta())
 | |
|             {
 | |
|                 if (operations.HasFlag(DiffTreeViewMenuOperations.History))
 | |
|                     menu.AddItem(mViewHistoryMetaMenuItemContent, false, HistoryMetaMenuItem_Click);
 | |
|                 else
 | |
|                     menu.AddDisabledItem(mViewHistoryMetaMenuItemContent, false);
 | |
|             }
 | |
| 
 | |
|             if (operations.HasFlag(DiffTreeViewMenuOperations.RevertChanges))
 | |
|             {
 | |
|                 menu.AddSeparator(string.Empty);
 | |
| 
 | |
|                 mRevertMenuItemContent.text = GetRevertMenuItemText(
 | |
|                     isMultipleSelection,
 | |
|                     selectionHasMeta);
 | |
| 
 | |
|                 menu.AddItem(mRevertMenuItemContent, false, RevertMenuItem_Click);
 | |
|             }
 | |
| 
 | |
|             if (operations.HasFlag(DiffTreeViewMenuOperations.Undelete) ||
 | |
|                 operations.HasFlag(DiffTreeViewMenuOperations.UndeleteToSpecifiedPaths))
 | |
|             {
 | |
|                 menu.AddSeparator(string.Empty);
 | |
|             }
 | |
| 
 | |
|             if (operations.HasFlag(DiffTreeViewMenuOperations.Undelete))
 | |
|             {
 | |
|                 mUndeleteMenuItemContent.text = GetUndeleteMenuItemText(
 | |
|                     isMultipleSelection,
 | |
|                     selectionHasMeta);
 | |
| 
 | |
|                 menu.AddItem(mUndeleteMenuItemContent, false, UndeleteMenuItem_Click);
 | |
|             }
 | |
| 
 | |
|             if (operations.HasFlag(DiffTreeViewMenuOperations.UndeleteToSpecifiedPaths))
 | |
|             {
 | |
|                 mUndeleteToSpecifiedPathMenuItemContent.text = GetUndeleteToSpecifiedPathMenuItemText(
 | |
|                     isMultipleSelection,
 | |
|                     selectionHasMeta);
 | |
| 
 | |
|                 menu.AddItem(mUndeleteToSpecifiedPathMenuItemContent, false, UndeleteToSpecifiedPathMenuItem_Click);
 | |
|             }
 | |
| 
 | |
|             if (operations.HasFlag(DiffTreeViewMenuOperations.CopyFilePath))
 | |
|             {
 | |
|                 menu.AddSeparator(string.Empty);
 | |
| 
 | |
|                 menu.AddItem(
 | |
|                     mCopyFilePathMenuItemContent, false, CopyFilePathMenuItem_Click);
 | |
|                 menu.AddItem(
 | |
|                     mCopyRelativeFilePathMenuItemContent, false, CopyRelativeFilePathMenuItem_Click);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         GUIContent GetNoActionMenuItemContent()
 | |
|         {
 | |
|             if (mNoActionMenuItemContent == null)
 | |
|             {
 | |
|                 mNoActionMenuItemContent = new GUIContent(
 | |
|                     PlasticLocalization.GetString(PlasticLocalization.
 | |
|                         Name.NoActionMenuItem));
 | |
|             }
 | |
| 
 | |
|             return mNoActionMenuItemContent;
 | |
|         }
 | |
| 
 | |
|         static string GetRevertMenuItemText(
 | |
|             bool isMultipleSelection,
 | |
|             bool selectionHasMeta)
 | |
|         {
 | |
|             if (selectionHasMeta && !isMultipleSelection)
 | |
|                 return PlasticLocalization.GetString(PlasticLocalization.Name.RevertThisFilePlusMeta);
 | |
| 
 | |
|             return isMultipleSelection ?
 | |
|                 PlasticLocalization.GetString(PlasticLocalization.Name.RevertSelectedFiles) :
 | |
|                 PlasticLocalization.GetString(PlasticLocalization.Name.RevertThisFile);
 | |
|         }
 | |
| 
 | |
|         static string GetUndeleteMenuItemText(
 | |
|             bool isMultipleSelection,
 | |
|             bool selectionHasMeta)
 | |
|         {
 | |
|             if (selectionHasMeta && !isMultipleSelection)
 | |
|                 return PlasticLocalization.GetString(PlasticLocalization.Name.UndeleteRevisionPlusMeta);
 | |
| 
 | |
|             return isMultipleSelection ?
 | |
|                 PlasticLocalization.GetString(PlasticLocalization.Name.UndeleteSelectedRevisions) :
 | |
|                 PlasticLocalization.GetString(PlasticLocalization.Name.UndeleteRevisions);
 | |
|         }
 | |
| 
 | |
|         static string GetUndeleteToSpecifiedPathMenuItemText(
 | |
|             bool isMultipleSelection,
 | |
|             bool selectionHasMeta)
 | |
|         {
 | |
|             if (selectionHasMeta && !isMultipleSelection)
 | |
|                 return PlasticLocalization.GetString(PlasticLocalization.Name.UndeleteRevisionPlusMetaPath);
 | |
| 
 | |
|             return isMultipleSelection ?
 | |
|                 PlasticLocalization.GetString(PlasticLocalization.Name.UndeleteSelectedRevisionsPaths) :
 | |
|                 PlasticLocalization.GetString(PlasticLocalization.Name.UndeleteRevisionPath);
 | |
|         }
 | |
| 
 | |
|         void ProcessMenuOperation(DiffTreeViewMenuOperations operationToExecute)
 | |
|         {
 | |
|             if (operationToExecute == DiffTreeViewMenuOperations.SaveAs)
 | |
|             {
 | |
|                 SaveRevisionAsMenuItem_Click();
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             if (operationToExecute == DiffTreeViewMenuOperations.Diff)
 | |
|             {
 | |
|                 DiffMenuItem_Click();
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             if (operationToExecute == DiffTreeViewMenuOperations.History)
 | |
|             {
 | |
|                 HistoryMenuItem_Click();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         static DiffTreeViewMenuOperations GetMenuOperation(Event e)
 | |
|         {
 | |
|             if (Keyboard.IsControlOrCommandKeyPressed(e) && Keyboard.IsKeyPressed(e, KeyCode.D))
 | |
|                 return DiffTreeViewMenuOperations.Diff;
 | |
| 
 | |
|             if (Keyboard.IsControlOrCommandKeyPressed(e) && Keyboard.IsKeyPressed(e, KeyCode.H))
 | |
|                 return DiffTreeViewMenuOperations.History;
 | |
| 
 | |
|             return DiffTreeViewMenuOperations.None;
 | |
|         }
 | |
| 
 | |
|         void BuildComponents()
 | |
|         {
 | |
|             mSaveRevisionAsMenuItemContent = new GUIContent(
 | |
|                     PlasticLocalization.GetString(PlasticLocalization.Name.DiffMenuItemSaveRevisionAs));
 | |
|             mDiffMenuItemContent = new GUIContent(
 | |
|                 string.Format("{0} {1}",
 | |
|                     PlasticLocalization.GetString(PlasticLocalization.Name.DiffMenuItem),
 | |
|                     GetPlasticShortcut.ForDiff()));
 | |
|             mDiffMetaMenuItemContent = new GUIContent(
 | |
|                 PlasticLocalization.GetString(PlasticLocalization.Name.DiffMetaMenuItem));
 | |
|             mViewHistoryMenuItemContent = new GUIContent(
 | |
|                 string.Format("{0} {1}",
 | |
|                     PlasticLocalization.GetString(PlasticLocalization.Name.ViewHistoryMenuItem),
 | |
|                     GetPlasticShortcut.ForHistory()));
 | |
|             mViewHistoryMetaMenuItemContent = new GUIContent(
 | |
|                 PlasticLocalization.GetString(PlasticLocalization.Name.ViewHistoryMetaMenuItem));
 | |
|             mRevertMenuItemContent = new GUIContent();
 | |
|             mUndeleteMenuItemContent = new GUIContent();
 | |
|             mUndeleteToSpecifiedPathMenuItemContent = new GUIContent();
 | |
|             mCopyFilePathMenuItemContent = new GUIContent(PlasticLocalization.Name.CopyFilePathMenuItem.GetString());
 | |
|             mCopyRelativeFilePathMenuItemContent =
 | |
|                 new GUIContent(PlasticLocalization.Name.CopyRelativeFilePathMenuItem.GetString());
 | |
|         }
 | |
| 
 | |
|         GUIContent mNoActionMenuItemContent;
 | |
| 
 | |
|         GUIContent mSaveRevisionAsMenuItemContent;
 | |
|         GUIContent mDiffMenuItemContent;
 | |
|         GUIContent mDiffMetaMenuItemContent;
 | |
|         GUIContent mViewHistoryMenuItemContent;
 | |
|         GUIContent mViewHistoryMetaMenuItemContent;
 | |
|         GUIContent mRevertMenuItemContent;
 | |
|         GUIContent mUndeleteMenuItemContent;
 | |
|         GUIContent mUndeleteToSpecifiedPathMenuItemContent;
 | |
|         GUIContent mCopyFilePathMenuItemContent;
 | |
|         GUIContent mCopyRelativeFilePathMenuItemContent;
 | |
| 
 | |
|         readonly IDiffTreeViewMenuOperations mOperations;
 | |
|         readonly IMetaMenuOperations mMetaMenuOperations;
 | |
|      }
 | |
| }
 |