<?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="guiPresenter" extends="view" width="250" height="400" 
    clickable="$once{ this.isdragable }"
	onmousedown="this._startDragState(this)" onmouseup="this._removeDragState(this)" >
    
    <handler name="oninit">
        this.setShadow();
    </handler>
    
    <method name="setShadow">
        <![CDATA[
        if (this.isinited && this.hasshadow){
            this.normalMC = this.getDisplayObject();
            this.displacementMap = new flash.filters.DropShadowFilter();
            this.normalMC.filters = [this.displacementMap];
        }
        ]]>              
    </method>	    

    <attribute name="hasshadow" value="true" type="boolean" />
          
	<!--- The Title of this Box -->
	<attribute name="title" value="defaulttitle" type="string" />
	
	<!--- if this Box should be closeable -->
	<attribute name="closable" value="true" type="boolean" />
    
    <!--- if this Box should be resizeable  -->
    <attribute name="resizeable" value="true" type="boolean" />
	
	<!--- Can this Box be docked to others and 
			the width/height of parent compoent barrier -->
	<attribute name="docking" value="true" type="boolean" />
	
	<!--- Hard to explain but its clear if you play around 
		with that. Its the number of minimum pixels before 
		the "docking" effect will be there -->
	<attribute name="dockingbarrier" value="15" type="number" />

	<!---@keywords private the list of connected views -->
	<attribute name="dockinglist" value="null" />
	
	<!--- @keywords private temp-older of x-distance to docked-Box  -->
	<attribute name="tempXdistance" value="0" type="number" />

	<!--- @keywords private temp-older of y-distance to docked-Box  -->
	<attribute name="tempYdistance" value="0" type="number" />
	
	<!--- @keywords private is the Box minimized  -->
	<attribute name="isopen" value="true" type="boolean" />
	
	<!--- @keywords private is the Box minimized  -->
	<attribute name="open" value="true" type="boolean" />	
	
	<!--- @keywords private  -->
	<attribute name="initheight" value="0" type="number" />
    
    <!--- @keywords private show minimize, maximize, close buttons -->
    <attribute name="fullToolBar" value="true" type="boolean" />
    
    <attribute name="maximizable" value="true" type="boolean" />
    
    <attribute name="minimizable" value="true" type="boolean" />
    
    <attribute name="minimized" value="false" type="boolean" />
    
    <attribute name="customMinimizeMethod" value="false" type="boolean" />
    
    <attribute name="initialHeight" value="0" type="number"/>
    
    <!--- @keywords private if this window is dragable -->
    <attribute name="isdragable" value="true" type="boolean" />
    
    <attribute name="_barmenuButtonRef" value="null" />
    
    <!--- if this Box should be resizeable  -->
    <attribute name="ismaximized" value="false" type="boolean" />    
    <attribute name="maxi_x" value="0" type="number" />
    <attribute name="maxi_y" value="0" type="number" />
    <attribute name="maxi_height" value="0" type="number" />
    <attribute name="maxi_width" value="0" type="number" />
    
    <attribute name="isresizeing" value="false" type="boolean" />
    
	<attribute name="labelid" type="number" setter="setLabelId(labelid)" />
	<method name="setLabelId" args="id">
		this.labelid=id;
		this.setAttribute('title',canvas.getLabelName(this.labelid));
	</method>    
	
	<!--- the Event will be thrown if you close the Box -->
	<event name="onclose" />    
    
	<!--- the Event will be thrown if you do click on it and drag -->
	<event name="onactivate" />   
    
    <!--- this Event will be triggered after resizing -->
    <event name="onresized" />
    
	<!--- @keywords private store initial height so toggleopen can reset height  -->
	<handler name="oninit">
		this.initheight=this.height;
		//Debug.write("this.isopen: ",this.isopen);
		if (!this.open) toggleopen();
	</handler>
    
    <handler name="onwidth" args="w">
        <![CDATA[
            if (this.isresizeing){
                if (w<_titlebar._title.width+70) {
                    this.setAttribute('width',_titlebar._title.width+71); 
                    this._resizeview.onmouseup.sendEvent();
                }
            }
        ]]>
    </handler>
    
    <handler name="onheight" args="h">
        <![CDATA[
            if (this.isresizeing){
                if (h<40) {
                    this.setAttribute('height',41); 
                    this._resizeview.onmouseup.sendEvent();
                }
            }
        ]]>
    </handler>
    
	<method name="close">
		if (this.onclose) this.onclose.sendEvent();
        if (this._barmenuButtonRef!=null){
            this._barmenuButtonRef.destroy();
            this._barmenuButtonRef.parent.onwidth.sendEvent();
        }
		this.destroy();
	</method>
    
    <method name="minimize">
        <![CDATA[
	        this.setAttribute("minimized",true);
	        
	        this._titlebar._toolbar._minimize.setAttribute("visibility","hidden");
	        this._titlebar._toolbar._maximize2.setAttribute("visibility","visible");
	        
	        if (this.customMinimizeMethod) {
	            return;
	        }
	        
	        for (var eg in this.subviews) {
	            if (this.subviews[eg].name != "_titlebar" 
	                    && this.subviews[eg].name != "_bg") {
	                 this.subviews[eg].setAttribute("visibility","hidden");   
	            }
	        }
            
	        this.initialHeight = this.height;
	        //this.setAttribute("height",20);
            this._minimizeZoom.setAttribute("to",20);
            this._minimizeZoom.doStart();
        ]]>
    </method>
    
    <method name="reminimize">
        <![CDATA[
	        this.setAttribute("minimized",false);
	        
	        this._titlebar._toolbar._minimize.setAttribute("visibility","visible");
	        this._titlebar._toolbar._maximize2.setAttribute("visibility","hidden");
	        
	        if (this.customMinimizeMethod) {
	            return;
	        }
	        
	        //this.setAttribute("height",this.initialHeight); 
            this._minimizeZoom.setAttribute("to",this.initialHeight);
            this._minimizeZoom.doStart();
        ]]>
    </method>
    
    <method name="reminimizeComplete">
        <![CDATA[
	        if (!this.minimized) {
	            
	            for (var eg in this.subviews) {
	                if (this.subviews[eg].name != "_titlebar" 
	                        && this.subviews[eg].name != "_bg") {
	                     this.subviews[eg].setAttribute("visibility","visible");   
	                }
	            }
	            
	            if (!this.resizeable) {
	                this._resizeview.setAttribute("visibility","hidden");   
	            }
	        
	        }
        ]]>
    </method>
	
	<method name="toggleopen">
		//////Debug.write("this.isopen",this.isopen);
		this.setAttribute('isopen',!this.isopen);
		if (this.isopen){
			_calcdockingList();
			for (var eg in this.dockinglist){
				if(this.dockinglist[eg].docking){
					//////Debug.write("this.dockinglist[eg]: ",this.dockinglist[eg].title);
					//////Debug.write("open new y",this.y+this.initheight);
					this.dockinglist[eg].toggleOpenByParent(this.initheight-22);
					this.dockinglist[eg].setAttribute('y',this.y+this.initheight);
					
				}
			}			
			this.setAttribute('height',this.initheight);
		} else {
			_calcdockingList();
			for (var eg in this.dockinglist){
				if(this.dockinglist[eg].docking){
					//////Debug.write("this.dockinglist[eg]: ",this.dockinglist[eg].title);
					this.dockinglist[eg].toggleOpenByParent(-(this.initheight-22));
					this.dockinglist[eg].setAttribute('y',this.y+22);
				}
			}	
			this.setAttribute('height',22);		
		}
	</method>
	
	<method name="toggleOpenByParent" args="changeY">
		//////Debug.write("+++++ toggleOpenByParent +++++ changeY: ",this.title,changeY);
		var tempList=new Array();
		<![CDATA[
		//check for dockable stuff which is connected to this Box
		for (var eg in this.parent.subviews){
			//check that you do not calc with yourself
			if (this.parent.subviews[eg]!=this && this.parent.subviews[eg].docking){
				// there are 4 cases which have to be proofed to check every possible situation
				var proof=false;
				//////Debug.write("found some: ",this.parent.subviews[eg].title);
				//top box-border
				if  ( ( ((this.y+this.height)-this.parent.subviews[eg].y) < 1 ) && ( ((this.y+this.height)-this.parent.subviews[eg].y) > -1 ) && ( (this.x+this.width) > this.parent.subviews[eg].x )  && ( this.x < (this.parent.subviews[eg].x+this.parent.subviews[eg].width) ) ){
					proof=true;
				}
					
				if (proof) tempList.push(this.parent.subviews[eg]);
			}
		}
		]]>
		//////Debug.write("tempList.length: ",tempList.length);
		if (tempList.length!=0){
			for (var eg in tempList){
				if(tempList[eg].docking){
					//////Debug.write("toggleOpenByParent 1 [eg],changeY: ",tempList[eg].title,changeY);
					tempList[eg].toggleOpenByParent(changeY);
					tempList[eg].setAttribute('y',tempList[eg].y+changeY);
				}
			}	
		}
		
	</method>
    
    <method name="activate">
        this.onactivate.sendEvent();
        this.bringToFront();
        if (this._barmenuButtonRef!=null) this._barmenuButtonRef.sendActiveWindow(this);
    </method>
    
    <method name="rsapply">
        this.isresizeing=true;
        this.rs.apply();
    </method>
    
    <method name="rsremove">
        this.rs.remove();
        this.isresizeing=false;
        //Debug.write("rsremove",this,this.isinited);
        this.onresized.sendEvent();
    </method>    
    	
	<!--- @keywords private  -->
	<method name="_removeDragState" args="obj">
        if (!this.ismaximized){
            //It's important to remove the dragger and do docking stuff before you check for conencted Boxes
            dragger.remove();
            if (obj==this){
                if (docking) arrangePosition();
            } else {
                if (docking) _lookforParentOnly(obj);
            }
                
            //check for connected Boxes
            for (var eg in this.dockinglist){
                if(this.dockinglist[eg].docking){
                    this.dockinglist[eg]._removeDragState(this);
                }
            }
        }
	</method>


	
	<!--- @keywords private
		the arg obj is needed because the dragging can be called by the Box itself
		or by a Box which is connected to this Box!  -->
	<method name="_startDragState" args="obj">
        this.activate();
        if (!this.ismaximized){
            _calcdockingList();
            for (var eg in this.dockinglist){
                if(this.dockinglist[eg].docking){
                    this.dockinglist[eg]._startDragState(this);
                }
            }
            //store position cause it wasn't dragged by itself
            if (obj!=this){
                storeAdjustmentToParent(obj.x,obj.y);
            }
            dragger.apply();
        }
	</method>
	
	<!--- Calc the List of Boxes which will be dragged and setposition if this Box
		will be dragged,docked or minimized/maximized  -->
	<method name="_calcdockingList">
		//Clear list of conencted Boxes
		this.dockinglist=new Array();
		<![CDATA[
		//check for dockable stuff which is connected to this Box
		for (var eg in this.parent.subviews){
			//check that you do not calc with yourself
			if (this.parent.subviews[eg]!=this && this.parent.subviews[eg].docking){
				// there are 4 cases which have to be proofed to check every possible situation
				var proof=false;

				//top box-border
				if  ( ( ((this.y+this.height)-this.parent.subviews[eg].y) < 1 ) && ( ((this.y+this.height)-this.parent.subviews[eg].y) > -1 ) && ( (this.x+this.width) > this.parent.subviews[eg].x )  && ( this.x < (this.parent.subviews[eg].x+this.parent.subviews[eg].width) ) ){
					proof=true;
				}

				if (proof) this.dockinglist.push(this.parent.subviews[eg]);
			}
		}
		]]>
		//////Debug.write("this.dockinglist.length:",this.dockinglist.length);
	</method>
	
	<!--- @keywords private  -->
	<method name="arrangePosition">
		//do the magic
		//the idea is: look for all on the view container one level above this one
		//and look for the width/height and 0/0 and look for "dockable" stuff there
		var newx=this.x;
		var newy=this.y;
	  
		<![CDATA[
				
		for (var eg in this.parent.subviews){
			//check that you do not calc with yourself
			if (this.parent.subviews[eg]!=this && this.parent.subviews[eg].docking){
				// there are 4 cases which have to be proofed to check every possible situation
				//left box-border
				if ( ( ((this.x+this.width)-this.parent.subviews[eg].x) < this.dockingbarrier ) && ( ((this.x+this.width)-this.parent.subviews[eg].x) > -this.dockingbarrier ) &&  ( (this.y+this.height) > this.parent.subviews[eg].y ) &&  ( this.y < (this.parent.subviews[eg].y+this.parent.subviews[eg].height) ) ){
					newx= ( this.parent.subviews[eg].x - this.width );
				}
				//right box-border
				if ( ( ((this.parent.subviews[eg].x+this.parent.subviews[eg].width)-this.x)<this.dockingbarrier ) && ( ((this.parent.subviews[eg].x+this.parent.subviews[eg].width)-this.x)>-this.dockingbarrier ) &&  ( (this.y+this.height) > this.parent.subviews[eg].y ) &&  ( this.y < (this.parent.subviews[eg].y+this.parent.subviews[eg].height) ) ){
					newx= ( this.parent.subviews[eg].x + this.parent.subviews[eg].width );
				}
				//top box-border
				if  ( ( ((this.y+this.height)-this.parent.subviews[eg].y) < this.dockingbarrier ) && ( ((this.y+this.height)-this.parent.subviews[eg].y) > -this.dockingbarrier ) && ( (this.x+this.width) > this.parent.subviews[eg].x )  && ( this.x < (this.parent.subviews[eg].x+this.parent.subviews[eg].width) ) ){
					newy = this.parent.subviews[eg].y-this.height;
				}
				//bottom box-border
				if ( ( ((this.parent.subviews[eg].y+this.parent.subviews[eg].height)-this.y) < this.dockingbarrier ) && ( ((this.parent.subviews[eg].y+this.parent.subviews[eg].height)-this.y) > -this.dockingbarrier ) && ( (this.x+this.width) > this.parent.subviews[eg].x )  && ( this.x < (this.parent.subviews[eg].x+this.parent.subviews[eg].width) ) ){
					newy = this.parent.subviews[eg].y+this.parent.subviews[eg].height;
				}
			}
		}
		
		//Check for Borders
		//should be done _after_ checking for other dockable stuff so it gets 
		//priority to dock against the border of parent view
		if (this.x<this.dockingbarrier){
			newx=0;
		}
		if (this.y<this.dockingbarrier){
			newy=0;
		}
		if ( (this.parent.width-(this.x+this.width))<this.dockingbarrier){
			newx=this.parent.width-this.width;
		}
		if ( (this.parent.height-(this.y+this.height))<this.dockingbarrier){
			newy=this.parent.height-this.height;
		}

		//set position
		this.setAttribute('x',newx);
		this.setAttribute('y',newy);
		]]>
	</method>
	
	<method name="storeAdjustmentToParent" args="objX,objY">
		this.tempXdistance=objX-this.x;
		this.tempYdistance=objY-this.y;
	</method>
	
	<!--- @keywords private 
		this method is needed because if the dragging end and
		it was not dragged _itself_ it was draged just because a connected
		dockable Box was dragged than it could be that the connected
		Box was forced to dock against something different onmouseup
		so you have to rearrange the old "adjustment"	-->
	<method name="_lookforParentOnly" args="obj">
		<![CDATA[		
		var newx=obj.x-tempXdistance;
		var newy=obj.y-tempYdistance;
		
		this.setAttribute('x',newx);
		this.setAttribute('y',newy);
		]]>
	</method>
	
	<dragstate name="dragger" />
    
	<view name="_bg" width="${ this.parent.width }" height="${ this.parent.height }" 
        bgcolor="$once{ canvas.getThemeColor('basebgcolorizer') }" > 
        <view width="${ this.parent.width-2 }" height="${ this.parent.height-2 }"
             x="1" y="1" bgcolor="$once{ canvas.getThemeColor('mainBackgroundColor') }" />
    </view>        
    
	<view x="1" y="1" width="${ this.parent.width-1 }" height="20" name="_titlebar" >
		<!-- stretches="width" -->
		<gradientview x="0" width="${ this.parent.width }" height="20"
				colorFrom="$once{ canvas.getThemeColor('baseMousecolorizer') }"
				colorTo="$once{ canvas.getThemeColor('styleMenuBarBaseColor') }" >
		</gradientview>
		
        <text fontsize="10" height="17" x="6" y="1" text="${ this.parent.parent.title }" 
			fgcolor="0xFFFFFF" resize="true" fontstyle="bold" />
			
	    <view name="_toolbar" visibility="$once{ ((parent.parent.fullToolBar) ? 'visible' : 'hidden' ) }" 
	        x="${ parent.width-this.width-2 }" layout="axis:x;spacing:0" y="2">     
            
            <miniIconsPresenter name="_minimize"
                visibility="$once{ ((parent.parent.parent.minimizable) ? 'visible' : 'hidden' ) }" 
                iconRessourceName="btn_presenter_minimize">
                <handler name="onclick">
                    this.parent.parent.parent.minimize();
                </handler>
                <labelTooltip labelid="856" />
            </miniIconsPresenter>
            
            <miniIconsPresenter name="_maximize2" visibility="hidden"
                iconRessourceName="btn_presenter_maximize">
                <handler name="onclick">
                    this.parent.parent.parent.reminimize();
                </handler>
                <labelTooltip labelid="857" />
            </miniIconsPresenter>
            
	        <miniIconsPresenter name="_close"
	            visibility="$once{ ((parent.parent.parent.closable) ? 'visible' : 'hidden' ) }"
	            iconRessourceName="btn_presenter_close2">
	            <handler name="onclick">
	                this.parent.parent.parent.close();
	            </handler>
	            <labelTooltip labelid="430" />
	        </miniIconsPresenter>  
            
	    </view>  			
	</view>
    <handler name="onaddsubview" args="v">
		//Debug.write("onaddsubview",v);
		if (v.parent.subviews.length>2) this._resizeview.bringToFront();
    </handler>
    <view visibility="$once{ ((this.parent.resizeable) ? 'visible' : 'hidden' ) }"
        name="_resizeview" x="${ this.parent.width - 16 }" 
        y="${ this.parent.height - 16 }" resource="explorer_resize_rsc" 
        cursor="explorer_resizemouse_rsc" onmousedown="this.parent.rsapply()"
        onmouseup="this.parent.rsremove()" >
        <labelTooltip text="resize" />
    </view>    
    <resizestate name="rs"/>
    
    <animator name="_minimizeZoom" attribute="height" 
              duration="750" to="20" start="false">
        <handler name="onstop" args="s">
            parent.reminimizeComplete();
        </handler>
    </animator>
    
</class>

<class name="miniIconsPresenter" extends="view">
    
    <attribute name="iconRessourceName" value="" type="string"/>
    
    <handler name="onmouseover">
        this._bg.setAttribute("bgcolor",0xFFFFFF);
        this._bg.setAttribute("visibility","visible");
    </handler>
    
    <handler name="onmouseout">
        this._bg.setAttribute("visibility","hidden");
    </handler>
    
    <handler name="onmousedown">
        this._bg.setAttribute("bgcolor",canvas.getThemeColor('basebgcolorizer'));
        this._bg.setAttribute("visibility","visible");
    </handler>
    
    <handler name="onmouseup">
        this._bg.setAttribute("visibility","hidden");
    </handler>
    
    <view name="_bg" visibility="hidden" opacity="0.7"
          width="14" height="14" x="1" y="1" bgcolor="0xFFFFFF" />
          
    <view name="_itemRsc" resource="$once{ parent.iconRessourceName }" />
    
</class>

</library>
