using System.IO; using UnityEditor; using UnityEngine; using Codice.Client.Common; using PlasticGui; using Unity.PlasticSCM.Editor.UI; namespace Unity.PlasticSCM.Editor.CloudDrive.Workspaces.DirectoryContent { internal class NewNameDialog : PlasticDialog { protected override Rect DefaultRect { get { var baseRect = base.DefaultRect; return new Rect(baseRect.x, baseRect.y, 500, 200); } } internal static string GetNewNameForCreate( string parentPath, bool bIsDirectory, EditorWindow parentWindow) { return GetNewName( parentPath, string.Empty, bIsDirectory, true, parentWindow); } internal static string GetNewNameForRename( string parentPath, string currentName, bool bIsDirectory, EditorWindow parentWindow) { return GetNewName( parentPath, currentName, bIsDirectory, false, parentWindow); } static string GetNewName( string parentPath, string currentName, bool bIsDirectory, bool bIsCreation, EditorWindow parentWindow) { NewNameDialog dialog = Create( parentPath, currentName, bIsDirectory, bIsCreation); ResponseType dialogResult = dialog.RunModal(parentWindow); if (dialogResult != ResponseType.Ok) return string.Empty; return dialog.mNewName; } static NewNameDialog Create( string parentPath, string currentName, bool bIsDirectory, bool bIsCreation) { var instance = CreateInstance(); instance.mParentPath = parentPath; instance.mCurrentName = currentName; instance.mNewName = currentName; instance.mIsCreation = bIsCreation; instance.mIsDirectory = bIsDirectory; instance.mEnterKeyAction = instance.OkButtonAction; instance.mEscapeKeyAction = instance.CancelButtonAction; instance.mOkButtonText = bIsCreation ? PlasticLocalization.Name.CreateButton.GetString() : PlasticLocalization.Name.RenameButton.GetString(); return instance; } protected override string GetTitle() { if (mIsCreation) return mIsDirectory ? PlasticLocalization.Name.NewDirectoryTitle.GetString() : PlasticLocalization.Name.NewFileTitle.GetString(); return mIsDirectory ? PlasticLocalization.Name.RenameDirectoryTitle.GetString() : PlasticLocalization.Name.RenameFileTitle.GetString(); } protected override void DoComponentsArea() { using (new EditorGUILayout.HorizontalScope()) { string labelText = mIsCreation ? PlasticLocalization.Name.Name.GetString() : PlasticLocalization.Name.NewName.GetString(); GUILayout.Label(labelText, GUILayout.ExpandWidth(false)); GUILayout.Space(10f); GUI.SetNextControlName(NEW_NAME_TEXTAREA_NAME); mNewName = GUILayout.TextField( mNewName, GUILayout.ExpandWidth(true)); FocusTextAreaIfNeeded(NEW_NAME_TEXTAREA_NAME); } } internal override void OkButtonAction() { if (!IsValidInput(mParentPath, mCurrentName, mNewName, mProgressControls)) return; base.OkButtonAction(); } static bool IsValidInput( string parentPath, string oldName, string newName, IProgressControls progressControls) { if (string.IsNullOrEmpty(newName)) { progressControls.ShowError( PlasticLocalization.Name.ItemNameEmpty.GetString()); return false; } if (newName == oldName) { progressControls.ShowError( PlasticLocalization.Name.ProvideDifferentItemName.GetString()); return false; } if (!PathHelper.IsCaseInsensitiveFsSameName(oldName, newName) && IsOnDisk(Path.Combine(parentPath, newName))) { progressControls.ShowError( PlasticLocalization.Name.ItemExists.GetString(newName)); return false; } return true; } static bool IsOnDisk(string path) { return Directory.Exists(path) || File.Exists(path); } string mParentPath; string mCurrentName; string mNewName; bool mIsCreation; bool mIsDirectory; const string NEW_NAME_TEXTAREA_NAME = "new_name_textarea"; } }