<?xml version="1.0" encoding="utf-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License.  You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<s:FormItem xmlns:fx="http://ns.adobe.com/mxml/2009"
            xmlns:s="library://ns.adobe.com/flex/spark"
            xmlns:mx="library://ns.adobe.com/flex/mx"
            xmlns:parsley="http://www.spicefactory.org/parsley"
            creationComplete="creationCompleteHandler(event)"
            label="{propertyName}">


    <fx:Declarations>
        <parsley:Configure/>
    </fx:Declarations>

    <s:Image id="iconImage" source="{installationPathValidated ? Asset.CHECKED : Asset.UNCHECKED}"/>
    <s:helpContent>
        <s:VGroup>
            <s:Label text="{resourceManager.getString('SettingsWindow', 'SHOULD_BE_IN_PATH')}"/>
            <mx:LinkButton label="{helpUrlText}"
                           click="navigateToURL(new URLRequest(helpUrl));"/>
        </s:VGroup>
    </s:helpContent>
    <fx:Script><![CDATA[
        import flash.filesystem.File;

        import mx.events.FlexEvent;

        import org.apache.flex.utilities.developerToolSuite.presentation.graphic.Asset;

        private var _file:File;

        [Bindable]
        public var installationPathValidated:Boolean;
        [Bindable]
        public var propertyName:String;
        [Bindable]
        public var helpLabelResourcesString:String;
        [Bindable]
        public var helpUrlText:String;
        [Bindable]
        public var helpUrl:String;
        [Bindable]
        public var validateVcsMessageClass:Class;

        public var dispatch:Function;

        private function creationCompleteHandler(event:FlexEvent):void {
            if (dispatch) {
                dispatch(new validateVcsMessageClass());
            }
        }
        ]]></fx:Script>
</s:FormItem>
