<?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.

-->
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" implements="mx.controls.listClasses.IDropInListItemRenderer" horizontalScrollPolicy="off">
	
	<mx:Script>
	<![CDATA[
		import mx.controls.listClasses.BaseListData;

		private var _listData:BaseListData;		
		
		public function get listData():BaseListData
		{
			return _listData;
		}
		
		public function set listData(value:BaseListData):void
		{
			_listData = value;
		}	
		
		override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
		{
			super.updateDisplayList(unscaledWidth, unscaledHeight);
			
			if(data)
			{
				label_name.text = data.@name;
				var iconPath:String = data.@iconPath;
				if(data.@localIconPath.toString().length > 0)
					iconPath = data.@localIconPath;
					
				//Config.IS_ONLINE
				if(iconPath.length > 0)
				{
					if(hasFullPath(data.@iconPath) && data.@localIconPath.toString().length == 0)
					{
						if(Config.IS_ONLINE) {
							image_icon.source = iconPath;
						} else {
							image_icon.source = Config.TREE_NO_ICON;
						}
					} 
					else
					{
						image_icon.source = Config.LOCAL_OBJECTS_ROOT_PATH + iconPath;
					}
				}
				else
				{
					image_icon.source = Config.TREE_NO_ICON;
				}	
			}		
		}
		
		private function hasFullPath(path:String):Boolean
		{
			if(path.indexOf("//") >= 0 || path.indexOf(":") >= 0)
				return true;
			else
				return false;
		}
			
	]]>
	</mx:Script>
	
	<mx:Image id="image_icon" width="18" height="18" />
	<mx:Label id="label_name" x="20" />
	
</mx:Canvas>
