private void RaiseShaderNameChanged(ShaderNameChangedEventArgs e)
 {
     SetNewShaderName(e);
     if (!e.OldValue.Equals(e.Shader.Name))
     {
         e.Shader.Move(Workspace);
     }
 }
        private void SetNewShaderName(ShaderNameChangedEventArgs e)
        {
            string newValue = e.NewValue;
            string oldValue = e.OldValue;
            Shader shader   = e.Shader;
            string extension;

            if (shader.ShaderType == ShaderType.Header)
            {
                extension = ".hlsli";
            }
            else
            {
                extension = ".hlsl";
            }

            // Check if new name is a valid filename, if not reset to old
            try
            {
                if (string.IsNullOrWhiteSpace(newValue) || newValue.LastIndexOf('.') == 0 || !newValue.Equals(Path.GetFileName(newValue)))
                {
                    shader.Name = oldValue;
                    return;
                }
            }
            catch (Exception)
            {
                shader.Name = oldValue;
                return;
            }

            // Check if it ends with the correct extension, if not add it
            if (!newValue.EndsWith(extension))
            {
                int startPos = newValue.LastIndexOf('.');
                if (startPos == -1)
                {
                    startPos = newValue.Length;
                }
                newValue = newValue.Substring(0, startPos) + extension;
            }

            // If filename already in use add a counter
            IEnumerable <string> shaders = shader.Group.Shaders.Where((s) => s != shader).Select((s) => s.Name);
            string filename = Path.GetFileNameWithoutExtension(newValue);
            int    counter  = 0;

            while (shaders.Contains(newValue))
            {
                ++counter;
                newValue = $"{filename}_{counter.ToString("D3")}{extension}";
                if (counter == 999)
                {
                    // Unable to find free name
                    shader.Name = oldValue;
                    return;
                }
            }
            shader.Name = newValue;

            shader.Group.Save(Workspace);
        }