using UnityEditor; using UnityEngine; using Codice.Client.BaseCommands.EventTracking; using Codice.CM.Common; using PlasticGui; using PlasticGui.WorkspaceWindow.Diff; using Unity.PlasticSCM.Editor.UI; using Unity.PlasticSCM.Editor.Tool; 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 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); } } 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.UndoThisChangePlusMeta); return isMultipleSelection ? PlasticLocalization.GetString(PlasticLocalization.Name.UndoSelectedChanges) : PlasticLocalization.GetString(PlasticLocalization.Name.UndoThisChange); } 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(); } GUIContent mNoActionMenuItemContent; GUIContent mSaveRevisionAsMenuItemContent; GUIContent mDiffMenuItemContent; GUIContent mDiffMetaMenuItemContent; GUIContent mViewHistoryMenuItemContent; GUIContent mViewHistoryMetaMenuItemContent; GUIContent mRevertMenuItemContent; GUIContent mUndeleteMenuItemContent; GUIContent mUndeleteToSpecifiedPathMenuItemContent; readonly IDiffTreeViewMenuOperations mOperations; readonly IMetaMenuOperations mMetaMenuOperations; } }