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

<class name="presentationFilesList" extends="view" 
       x="0" y="40" height="${ parent.height-40 }" 
        width="${ parent.width }" bgcolor="$once{ canvas.getThemeColor('basebgcolorizer') }">
    
    <event name="onclose" />
    
	<view width="$once{ parent.width-2 }" height="${ parent.height-2 }" 
		  x="1" y="1" bgcolor="white" />

	<attribute name="uploadmodul" value="$once{ canvas.uploadmoduleimg }" type="string" />

    <method name="addPresentationThumb" args="thumbName,no">
        new lz.listPresentationThumbExplorer(this._table._listcontent,{isExplorer:true,
        					uploadmodul:this.uploadmodul,thumbname:thumbName,no:no});
    </method>
    
    <method name="addListpresentationFileOrig" args="originalName,pdfname,swfName,fileExplorerItemId">
    	if ($debug) Debug.write("addListpresentationFileOrig ",originalName,pdfname,swfName,fileExplorerItemId);
        new lz.listPresentationFileOrigExplorer(this._table._listcontent,{
	        				isExplorer:true,
	        				isoriginal:true,
	        				uploadmodul:this.uploadmodul,
	        				originalName:originalName,
	        				pdfname:pdfname,
	        				swfName:swfName,
	        				fileExplorerItemId:fileExplorerItemId
        				});
    </method>
    
    <method name="addListpresentationFilePDF" args="pdfname,swfName,fileExplorerItemId">
    	if ($debug) Debug.write("addListpresentationFilePDF ",originalName,pdfname,swfName,fileExplorerItemId);
        new lz.listPresentationFilePDFExplorer(this._table._listcontent,{
	        				isExplorer:true,
	        				isoriginal:true,
	        				uploadmodul:this.uploadmodul,
	        				pdfname:pdfname,
	        				swfName:swfName,
	        				fileExplorerItemId:fileExplorerItemId
        				});
    </method>
	    
    <method name="resetList">
    	this._table.destroy();
    	new lz.imageListInnerTableExplorer(this,{name:'_table'});
    	this._hideForNonMods.bringToFront();
    </method>
    
    <method name="highlightItem" args="obj">
    	<![CDATA[
    		for (var i=0;i<this._table._listcontent.subviews.length;i++){
    			if (!this._table._listcontent.subviews[i].isPpt){
                    //Debug.write("this._table._listcontent.subviews[i]: ",this._table._listcontent.subviews[i]);
    				this._table._listcontent.subviews[i]._thumbText.setAttribute('text','<font>'+this._table._listcontent.subviews[i].filenamePure+'</font>');
                }
    		}
    		obj._thumbText.setAttribute('text','<font><b>'+obj.filenamePure+'</b></font>');
    	]]>
    </method>
    
	<imageListInnerTableExplorer name="_table" y="20"
						 height="${ parent.height-22 }" />
	
    <view name="_trashBar" layout="axis:x" x="$once{ parent.width - 20 }" y="0">
        <baseChooseIconView name="_trashIcon" labelid="718" height="20" width="19" 
                         resourceN="file_explorer_close_rsc">
            <handler name="onclick">
                parent.parent.onclose.sendEvent();
            </handler>
        </baseChooseIconView>
        <view bgcolor="$once{ canvas.getThemeColor('basebgcolorizer') }" height="20" width="1" />
    </view>
    
</class>

</library>
