369 lines
12 KiB
C#
369 lines
12 KiB
C#
|
using UnityEditor;
|
|||
|
using UnityEngine;
|
|||
|
|
|||
|
using Codice.Client.BaseCommands.EventTracking;
|
|||
|
using Codice.CM.Common;
|
|||
|
using PlasticGui.WorkspaceWindow.QueryViews.Changesets;
|
|||
|
using PlasticGui;
|
|||
|
using Unity.PlasticSCM.Editor.Tool;
|
|||
|
using Unity.PlasticSCM.Editor.UI;
|
|||
|
|
|||
|
namespace Unity.PlasticSCM.Editor.Views.Changesets
|
|||
|
{
|
|||
|
internal class ChangesetsViewMenu
|
|||
|
{
|
|||
|
internal GenericMenu Menu { get { return mMenu; } }
|
|||
|
|
|||
|
public interface IMenuOperations
|
|||
|
{
|
|||
|
void DiffBranch();
|
|||
|
ChangesetExtendedInfo GetSelectedChangeset();
|
|||
|
}
|
|||
|
|
|||
|
internal ChangesetsViewMenu(
|
|||
|
WorkspaceInfo wkInfo,
|
|||
|
IChangesetMenuOperations changesetMenuOperations,
|
|||
|
IMenuOperations menuOperations,
|
|||
|
LaunchTool.IShowDownloadPlasticExeWindow showDownloadPlasticExeWindow,
|
|||
|
bool isGluonMode)
|
|||
|
{
|
|||
|
mWkInfo = wkInfo;
|
|||
|
mChangesetMenuOperations = changesetMenuOperations;
|
|||
|
mMenuOperations = menuOperations;
|
|||
|
mShowDownloadPlasticExeWindow = showDownloadPlasticExeWindow;
|
|||
|
mIsGluonMode = isGluonMode;
|
|||
|
|
|||
|
BuildComponents();
|
|||
|
}
|
|||
|
|
|||
|
internal void Popup()
|
|||
|
{
|
|||
|
mMenu = new GenericMenu();
|
|||
|
|
|||
|
UpdateMenuItems(mMenu);
|
|||
|
|
|||
|
mMenu.ShowAsContext();
|
|||
|
}
|
|||
|
|
|||
|
internal bool ProcessKeyActionIfNeeded(Event e)
|
|||
|
{
|
|||
|
int selectedChangesetsCount = mChangesetMenuOperations.GetSelectedChangesetsCount();
|
|||
|
|
|||
|
ChangesetMenuOperations operationToExecute = GetMenuOperations(
|
|||
|
e, selectedChangesetsCount > 1);
|
|||
|
|
|||
|
if (operationToExecute == ChangesetMenuOperations.None)
|
|||
|
return false;
|
|||
|
|
|||
|
ChangesetMenuOperations operations = ChangesetMenuUpdater.GetAvailableMenuOperations(
|
|||
|
selectedChangesetsCount,
|
|||
|
mIsGluonMode,
|
|||
|
mMenuOperations.GetSelectedChangeset().BranchId,
|
|||
|
mLoadedBranchId,
|
|||
|
false);
|
|||
|
|
|||
|
if (!operations.HasFlag(operationToExecute))
|
|||
|
return false;
|
|||
|
|
|||
|
ProcessMenuOperation(operationToExecute, mChangesetMenuOperations);
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
internal void SetLoadedBranchId(long loadedBranchId)
|
|||
|
{
|
|||
|
mLoadedBranchId = loadedBranchId;
|
|||
|
}
|
|||
|
|
|||
|
void DiffChangesetMenuItem_Click()
|
|||
|
{
|
|||
|
if (mShowDownloadPlasticExeWindow.Show(
|
|||
|
mWkInfo,
|
|||
|
mIsGluonMode,
|
|||
|
TrackFeatureUseEvent.Features.InstallPlasticCloudFromDiffChangeset,
|
|||
|
TrackFeatureUseEvent.Features.InstallPlasticEnterpriseFromDiffChangeset,
|
|||
|
TrackFeatureUseEvent.Features.CancelPlasticInstallationFromDiffChangeset))
|
|||
|
return;
|
|||
|
|
|||
|
mChangesetMenuOperations.DiffChangeset();
|
|||
|
}
|
|||
|
|
|||
|
void DiffSelectedChangesetsMenuItem_Click()
|
|||
|
{
|
|||
|
if (mShowDownloadPlasticExeWindow.Show(
|
|||
|
mWkInfo,
|
|||
|
mIsGluonMode,
|
|||
|
TrackFeatureUseEvent.Features.InstallPlasticCloudFromDiffSelectedChangesets,
|
|||
|
TrackFeatureUseEvent.Features.InstallPlasticEnterpriseFromDiffSelectedChangesets,
|
|||
|
TrackFeatureUseEvent.Features.CancelPlasticInstallationFromDiffSelectedChangesets))
|
|||
|
return;
|
|||
|
|
|||
|
mChangesetMenuOperations.DiffSelectedChangesets();
|
|||
|
}
|
|||
|
|
|||
|
void RevertToChangesetMenuItem_Click()
|
|||
|
{
|
|||
|
mChangesetMenuOperations.RevertToChangeset();
|
|||
|
}
|
|||
|
|
|||
|
void DiffBranchMenuItem_Click()
|
|||
|
{
|
|||
|
mMenuOperations.DiffBranch();
|
|||
|
}
|
|||
|
|
|||
|
void SwitchToChangesetMenuItem_Click()
|
|||
|
{
|
|||
|
mChangesetMenuOperations.SwitchToChangeset();
|
|||
|
}
|
|||
|
|
|||
|
internal void UpdateMenuItems(GenericMenu menu)
|
|||
|
{
|
|||
|
ChangesetExtendedInfo singleSelectedChangeset = mMenuOperations.GetSelectedChangeset();
|
|||
|
|
|||
|
ChangesetMenuOperations operations = ChangesetMenuUpdater.GetAvailableMenuOperations(
|
|||
|
mChangesetMenuOperations.GetSelectedChangesetsCount(),
|
|||
|
mIsGluonMode,
|
|||
|
singleSelectedChangeset.BranchId,
|
|||
|
mLoadedBranchId,
|
|||
|
false);
|
|||
|
|
|||
|
AddDiffChangesetMenuItem(
|
|||
|
mDiffChangesetMenuItemContent,
|
|||
|
menu,
|
|||
|
singleSelectedChangeset,
|
|||
|
operations,
|
|||
|
DiffChangesetMenuItem_Click);
|
|||
|
|
|||
|
AddDiffSelectedChangesetsMenuItem(
|
|||
|
mDiffSelectedChangesetsMenuItemContent,
|
|||
|
menu,
|
|||
|
operations,
|
|||
|
DiffSelectedChangesetsMenuItem_Click);
|
|||
|
|
|||
|
if (!IsOnMainBranch(singleSelectedChangeset))
|
|||
|
{
|
|||
|
menu.AddSeparator(string.Empty);
|
|||
|
|
|||
|
AddDiffBranchMenuItem(
|
|||
|
mDiffBranchMenuItemContent,
|
|||
|
menu,
|
|||
|
singleSelectedChangeset,
|
|||
|
operations,
|
|||
|
DiffBranchMenuItem_Click);
|
|||
|
}
|
|||
|
|
|||
|
menu.AddSeparator(string.Empty);
|
|||
|
|
|||
|
AddSwitchToChangesetMenuItem(
|
|||
|
mSwitchToChangesetMenuItemContent,
|
|||
|
menu,
|
|||
|
operations,
|
|||
|
SwitchToChangesetMenuItem_Click);
|
|||
|
|
|||
|
if (mIsGluonMode)
|
|||
|
return;
|
|||
|
|
|||
|
AddBackToMenuItem(
|
|||
|
mRevertToChangesetMenuItemContent,
|
|||
|
menu,
|
|||
|
operations,
|
|||
|
RevertToChangesetMenuItem_Click);
|
|||
|
}
|
|||
|
|
|||
|
void ProcessMenuOperation(
|
|||
|
ChangesetMenuOperations operationToExecute,
|
|||
|
IChangesetMenuOperations changesetMenuOperations)
|
|||
|
{
|
|||
|
if (operationToExecute == ChangesetMenuOperations.DiffChangeset)
|
|||
|
{
|
|||
|
DiffChangesetMenuItem_Click();
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (operationToExecute == ChangesetMenuOperations.DiffSelectedChangesets)
|
|||
|
{
|
|||
|
DiffSelectedChangesetsMenuItem_Click();
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
static void AddDiffChangesetMenuItem(
|
|||
|
GUIContent menuItemContent,
|
|||
|
GenericMenu menu,
|
|||
|
ChangesetExtendedInfo changeset,
|
|||
|
ChangesetMenuOperations operations,
|
|||
|
GenericMenu.MenuFunction menuFunction)
|
|||
|
{
|
|||
|
string changesetName =
|
|||
|
changeset != null ?
|
|||
|
changeset.ChangesetId.ToString() :
|
|||
|
string.Empty;
|
|||
|
|
|||
|
menuItemContent.text = string.Format("{0} {1}",
|
|||
|
PlasticLocalization.GetString(
|
|||
|
PlasticLocalization.Name.AnnotateDiffChangesetMenuItem,
|
|||
|
changesetName),
|
|||
|
GetPlasticShortcut.ForDiff());
|
|||
|
|
|||
|
if (operations.HasFlag(ChangesetMenuOperations.DiffChangeset))
|
|||
|
{
|
|||
|
menu.AddItem(
|
|||
|
menuItemContent,
|
|||
|
false,
|
|||
|
menuFunction);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
menu.AddDisabledItem(
|
|||
|
menuItemContent);
|
|||
|
}
|
|||
|
|
|||
|
static void AddDiffSelectedChangesetsMenuItem(
|
|||
|
GUIContent menuItemContent,
|
|||
|
GenericMenu menu,
|
|||
|
ChangesetMenuOperations operations,
|
|||
|
GenericMenu.MenuFunction menuFunction)
|
|||
|
{
|
|||
|
if (operations.HasFlag(ChangesetMenuOperations.DiffSelectedChangesets))
|
|||
|
{
|
|||
|
menu.AddItem(
|
|||
|
menuItemContent,
|
|||
|
false,
|
|||
|
menuFunction);
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
menu.AddDisabledItem(menuItemContent);
|
|||
|
}
|
|||
|
|
|||
|
static void AddBackToMenuItem(
|
|||
|
GUIContent menuItemContent,
|
|||
|
GenericMenu menu,
|
|||
|
ChangesetMenuOperations operations,
|
|||
|
GenericMenu.MenuFunction menuFunction)
|
|||
|
{
|
|||
|
if (operations.HasFlag(ChangesetMenuOperations.RevertToChangeset))
|
|||
|
{
|
|||
|
menu.AddItem(
|
|||
|
menuItemContent,
|
|||
|
false,
|
|||
|
menuFunction);
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
menu.AddDisabledItem(menuItemContent);
|
|||
|
}
|
|||
|
|
|||
|
static void AddDiffBranchMenuItem(
|
|||
|
GUIContent menuItemContent,
|
|||
|
GenericMenu menu,
|
|||
|
ChangesetExtendedInfo changeset,
|
|||
|
ChangesetMenuOperations operations,
|
|||
|
GenericMenu.MenuFunction menuFunction)
|
|||
|
{
|
|||
|
string branchName = GetBranchName(changeset);
|
|||
|
|
|||
|
menuItemContent.text =
|
|||
|
PlasticLocalization.GetString(PlasticLocalization.Name.AnnotateDiffBranchMenuItem,
|
|||
|
branchName);
|
|||
|
|
|||
|
if (operations.HasFlag(ChangesetMenuOperations.DiffChangeset))
|
|||
|
{
|
|||
|
menu.AddItem(
|
|||
|
menuItemContent,
|
|||
|
false,
|
|||
|
menuFunction);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
menu.AddDisabledItem(
|
|||
|
menuItemContent);
|
|||
|
}
|
|||
|
|
|||
|
static void AddSwitchToChangesetMenuItem(
|
|||
|
GUIContent menuItemContent,
|
|||
|
GenericMenu menu,
|
|||
|
ChangesetMenuOperations operations,
|
|||
|
GenericMenu.MenuFunction menuFunction)
|
|||
|
{
|
|||
|
if (operations.HasFlag(ChangesetMenuOperations.SwitchToChangeset))
|
|||
|
{
|
|||
|
menu.AddItem(
|
|||
|
menuItemContent,
|
|||
|
false,
|
|||
|
menuFunction);
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
menu.AddDisabledItem(menuItemContent);
|
|||
|
}
|
|||
|
|
|||
|
static string GetBranchName(ChangesetExtendedInfo changesetInfo)
|
|||
|
{
|
|||
|
if (changesetInfo == null)
|
|||
|
return string.Empty;
|
|||
|
|
|||
|
string branchName = changesetInfo.BranchName;
|
|||
|
|
|||
|
int lastIndex = changesetInfo.BranchName.LastIndexOf("/");
|
|||
|
|
|||
|
if (lastIndex == -1)
|
|||
|
return branchName;
|
|||
|
|
|||
|
return branchName.Substring(lastIndex + 1);
|
|||
|
}
|
|||
|
|
|||
|
static bool IsOnMainBranch(ChangesetExtendedInfo singleSeletedChangeset)
|
|||
|
{
|
|||
|
if (singleSeletedChangeset == null)
|
|||
|
return false;
|
|||
|
|
|||
|
return singleSeletedChangeset.BranchName == MAIN_BRANCH_NAME;
|
|||
|
}
|
|||
|
|
|||
|
static ChangesetMenuOperations GetMenuOperations(
|
|||
|
Event e, bool isMultipleSelection)
|
|||
|
{
|
|||
|
if (Keyboard.IsControlOrCommandKeyPressed(e) &&
|
|||
|
Keyboard.IsKeyPressed(e, KeyCode.D))
|
|||
|
return isMultipleSelection ?
|
|||
|
ChangesetMenuOperations.DiffSelectedChangesets :
|
|||
|
ChangesetMenuOperations.DiffChangeset;
|
|||
|
|
|||
|
return ChangesetMenuOperations.None;
|
|||
|
}
|
|||
|
|
|||
|
void BuildComponents()
|
|||
|
{
|
|||
|
mDiffChangesetMenuItemContent = new GUIContent(string.Empty);
|
|||
|
mDiffSelectedChangesetsMenuItemContent = new GUIContent(string.Format("{0} {1}",
|
|||
|
PlasticLocalization.GetString(PlasticLocalization.Name.ChangesetMenuItemDiffSelected),
|
|||
|
GetPlasticShortcut.ForDiff()));
|
|||
|
mDiffBranchMenuItemContent = new GUIContent();
|
|||
|
mSwitchToChangesetMenuItemContent = new GUIContent(
|
|||
|
PlasticLocalization.GetString(PlasticLocalization.Name.ChangesetMenuItemSwitchToChangeset));
|
|||
|
mRevertToChangesetMenuItemContent = new GUIContent(
|
|||
|
PlasticLocalization.GetString(PlasticLocalization.Name.ChangesetMenuItemRevertToChangeset));
|
|||
|
}
|
|||
|
|
|||
|
GenericMenu mMenu;
|
|||
|
|
|||
|
GUIContent mDiffChangesetMenuItemContent;
|
|||
|
GUIContent mDiffSelectedChangesetsMenuItemContent;
|
|||
|
GUIContent mDiffBranchMenuItemContent;
|
|||
|
GUIContent mSwitchToChangesetMenuItemContent;
|
|||
|
GUIContent mRevertToChangesetMenuItemContent;
|
|||
|
|
|||
|
readonly WorkspaceInfo mWkInfo;
|
|||
|
readonly IChangesetMenuOperations mChangesetMenuOperations;
|
|||
|
readonly IMenuOperations mMenuOperations;
|
|||
|
readonly LaunchTool.IShowDownloadPlasticExeWindow mShowDownloadPlasticExeWindow;
|
|||
|
readonly bool mIsGluonMode;
|
|||
|
|
|||
|
long mLoadedBranchId = -1;
|
|||
|
|
|||
|
const string MAIN_BRANCH_NAME = "/main";
|
|||
|
}
|
|||
|
}
|