private void DisplayLayersSelector(ref WMSTexture wmsTexture, WMSInfo wmsInfo, out bool layerChanged)
    {
        layerChanged = false;

        EditorGUILayout.BeginVertical(EditorStyles.helpBox);
        EditorGUILayout.LabelField("Layers");

        WMSLayer[] layers = wmsInfo.layers;
        for (int i = 0; i < layers.Length; i++)
        {
            if (layers[i].name != "")
            {
                bool newToggleValue =
                    EditorGUILayout.ToggleLeft(layers[i].title, (wmsTexture.LayerSelected(layers[i].name)));

                layerChanged |= (newToggleValue != wmsTexture.LayerSelected(layers[i].name));
                wmsTexture.SetLayerSelected(layers[i].name, newToggleValue);
            }
        }

        if (wmsTexture.SelectedLayersNumber() == 0)
        {
            EditorGUILayout.HelpBox("No layers selected", MessageType.Warning);
        }

        EditorGUILayout.EndVertical();
    }
    public override void OnInspectorGUI()
    {
        if (Application.isPlaying)
        {
            EditorGUILayout.LabelField("Currently play mode editting is not allowed");
            return;
        }

        WMSTexture wmsTexture = (WMSTexture)target;

        bool serverChanged      = false;
        bool layerChanged       = false;
        bool boundingBoxChanged = false;

        EditorGUILayout.BeginVertical(EditorStyles.helpBox);
        EditorGUILayout.LabelField("Server");
        DisplayServerSelector(ref wmsTexture, out serverChanged);

        if (serverChanged)
        {
            wmsTexture.selectedLayers.Clear();
            RequestWMSInfo(ref wmsTexture);
        }

        RequestStatus requestStatus =
            wmsInfoRequester.GetRequestStatus(wmsTexture.wmsRequestID);

        if (requestStatus != RequestStatus.OK)
        {
            if (requestStatus == RequestStatus.DOWNLOADING)
            {
                EditorGUILayout.HelpBox("Downloading WMS info ...", MessageType.Info);
            }
            else if (requestStatus == RequestStatus.ERROR)
            {
                string errorLog = wmsInfoRequester.GetErrorLog(wmsTexture.wmsRequestID);
                EditorGUILayout.HelpBox("ERROR downloading WMS info: \n" + errorLog, MessageType.Error);
            }

            if (GUI.changed)
            {
                EditorUtility.SetDirty(wmsTexture);
                EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
            }
            EditorGUILayout.EndVertical();
            return;
        }

        WMSInfo wmsInfo = wmsInfoRequester.GetResponse(wmsTexture.wmsRequestID);

        EditorGUILayout.LabelField("Server title: " + wmsInfo.serverTitle);
        EditorGUILayout.LabelField("Server abstract: " + wmsInfo.serverAbstract);
        EditorGUILayout.EndVertical();

        if (wmsInfo.GetLayerTitles().Length > 0)
        {
            DisplayLayersSelector(ref wmsTexture, wmsInfo, out layerChanged);

            if (layerChanged)
            {
                wmsTexture.RequestTexturePreview();
            }

            if (wmsTexture.SelectedLayersNumber() > 0)
            {
                DisplayBoundingBoxPanel(ref wmsTexture, ref wmsInfo, out boundingBoxChanged);
            }
        }
        else
        {
            EditorGUILayout.HelpBox("No layers returned by server", MessageType.Warning);
        }


        if (wmsTexture.IsDownloading())
        {
            EditorGUILayout.HelpBox("Downloading texture from server...", MessageType.Info);
        }


        // Mark the target assert as changed ("dirty") so Unity save it to disk.
        if (GUI.changed)
        {
            EditorUtility.SetDirty(wmsTexture);
            EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
        }
    }