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

<!--- base class for the item list views-->
<class name="baseContentListItem" extends="view" 
	   layout="axis:x;spacing:0" bgcolor="0xFFFFFF" >
	
	<attribute name="isselected" value="false" type="boolean"/>
	
	<method name="select">
		this.isselected = true;
		this.setAttribute('bgcolor',canvas.getThemeColor('baseMouseOvercolorizer'));
	</method>
	
	<method name="deselect">
		this.isselected = false;
		this.setAttribute('bgcolor',0xFFFFFF);
	</method>
	
	<method name="doDeselect">
		this.deselect();
	</method>
	
	<handler name="onmouseover">
		if (!this.isselected) {
			this.setAttribute('bgcolor',canvas.getThemeColor('baseMouseOvercolorizer'));
		}
	</handler>
	
	<handler name="onmouseout">
		if (!this.isselected) {
			this.setAttribute('bgcolor',0xFFFFFF);
		} else {
			this.setAttribute('bgcolor',canvas.getThemeColor('baseMouseOvercolorizer'));
		}
	</handler>
	
	<handler name="onclick">
		if ($debug) Debug.write("baseContentListItem -- onclick");
		this.parent.parent.parent.parent.onclickedItem.sendEvent(this);
	</handler>
    
    <handler name="ondblclick">
		this.parent.parent.parent.parent.ondblclickedItem.sendEvent(this);
	</handler>
	
    <attribute name="obj" value="null" />

</class>

</library>
