///////////////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// DrawMeshDecalMaterialList
        /// Draw actual selectable material (looking inside it's folder) list and handle dev's selections
        /// </summary>
        ///////////////////////////////////////////////////////////////////////////////////////////////////////
        public static Material DrawMeshDecalMaterialList(Material actualMaterial, float areaWidth)
        {
            // save actual gui color
            Color actualGuiColor = GUI.color;
            Color bgColor        = GUI.backgroundColor;

            // initialise selected material to actual material
            Material selectedMaterial = actualMaterial;

            EditorGUILayout.Separator();

            // get actual material list from decal's material folder
            bool redoTheList = false;

            for (int i = 0; i < meshDecalMaterialsList.Count; i++)
            {
                if (AssetDatabase.GetAssetPath(meshDecalMaterialsList [i]).Length < 2)
                {
                    redoTheList = true;
                }
            }

            if (redoTheList)
            {
                Debug.Log("Material deleted, redo mesh decal list");
            }

            if ((meshDecalMaterialsList.Count <= 0) || redoTheList)
            {
                meshDecalMaterialsList = EditorBasicFunctions.GetMeshDecalMaterialList();
            }

            // calculate paths
            List <string> localTotalMaterialPathList = new List <string> ();

            for (int i = 0; i < meshDecalMaterialsList.Count; i++)
            {
                string totalPath  = AssetDatabase.GetAssetPath(meshDecalMaterialsList [i]);
                string actualPath = Path.GetDirectoryName(totalPath);

                int index = 0;

                for (int j = 0; j < actualPath.Length; j++)
                {
                    if (actualPath [j] == '/')
                    {
                        index = j;
                    }
                }

                string finalPath = actualPath.Substring(index + 1, actualPath.Length - index - 1);

                localTotalMaterialPathList.Add(finalPath);
            }

            List <string> localMaterialPathList = localTotalMaterialPathList.Distinct().ToList();

            if (!showSystemFolders)
            {
                localMaterialPathList.Remove("System");
            }

            //print ("------------------------------------------");
            //for (int i = 0; i < localMaterialPathList.Count; i++)
            //{
            //print (localMaterialPathList [i]);
            //}

            EditorGUILayout.Separator();
            GenericMeshDecal.actualFolderIndex = EditorGUILayout.Popup(GenericMeshDecal.actualFolderIndex, localMaterialPathList.ToArray(), new GUILayoutOption[] { GUILayout.Width(0.81f * areaWidth) });
            EditorGUILayout.Separator();

            string selectedMaterialPath = BasicDefines.NOT_DEFINED;

            if (localMaterialPathList.Count > 0)
            {
                selectedMaterialPath = localMaterialPathList [GenericMeshDecal.actualFolderIndex];
            }

            // test some things
            int      numberOfMaterialsPerLine = 4;
            bool     begin = false;
            int      cont  = 0;
            bool     actualSelectedElementIsInSelectedPathList = false;
            Material firstElementInActualPath = null;


            // draw materials in editor window
            for (int i = 0; i < Mathf.Ceil((float)meshDecalMaterialsList.Count); i++)
            {
                if (localTotalMaterialPathList [i] == selectedMaterialPath)
                {
                    if (firstElementInActualPath == null)
                    {
                        firstElementInActualPath = meshDecalMaterialsList [i];
                    }

                    if ((selectedMaterial == meshDecalMaterialsList [i]))
                    {
                        actualSelectedElementIsInSelectedPathList = true;
                    }

                    if (cont % numberOfMaterialsPerLine == 0)
                    {
                        GUILayout.BeginHorizontal();
                        begin = true;
                    }

                    if (actualMaterial == meshDecalMaterialsList [i])
                    {
                        GUI.color           = new Color(1, 1, 1, 1);
                        GUI.backgroundColor = new Color(0.6f, 0.0f, 0.6f, 1f);
                    }
                    else
                    {
                        GUI.color           = new Color(1, 1, 1, 1f);
                        GUI.backgroundColor = new Color(1, 1, 1, 0.3f);
                    }

                    float buttonsScale = 0.94f * areaWidth / (numberOfMaterialsPerLine + 0.3f);

                    // test if one material is selected
                    bool selected = GUILayout.Button(new GUIContent(meshDecalMaterialsList [i].mainTexture, meshDecalMaterialsList [i].name), new GUILayoutOption[] {
                        GUILayout.Width(buttonsScale),
                        GUILayout.Height(buttonsScale)
                    });

                    // if selected then is the actual selected material
                    if (selected)
                    {
                        selectedMaterial = meshDecalMaterialsList [i];
                    }

                    if (cont % numberOfMaterialsPerLine == numberOfMaterialsPerLine - 1)
                    {
                        GUILayout.EndHorizontal();
                        begin = false;
                    }

                    cont++;
                }
            }

            if (!actualSelectedElementIsInSelectedPathList && DecalManagerWindow.autoChangeToFirstElementInList)
            {
                //print ("Change to firstElementInActualPath: " + firstElementInActualPath.name);
                selectedMaterial = firstElementInActualPath;
            }

            if (begin)
            {
                EditorGUILayout.EndHorizontal();
            }

            // restore Gui Color
            GUI.color           = actualGuiColor;
            GUI.backgroundColor = bgColor;


            // return actual selected material
            return(selectedMaterial);
        }