<?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="chatBarMenu" extends="view" width="${ parent.width }" x="0" 
    height="20" layout="axis:x;spacing:1;inset:2" bgcolor="$once{ canvas.getThemeColor('baseMousecolorizer') }">
    
    <attribute name="staticwidth" type="number" value="120" />
    <attribute name="currentBtn" value="null" />
    
    <event name="onRemoveWindow" />
    
    <method name="getCurrentSize">
        <![CDATA[
            if ( ((this.subviews.length+1)*(this.staticwidth+1)) <= this.width) {
                return this.staticwidth;
            } else {
                var newwidth = Math.round((this.width-this.subviews.length)/(this.subviews.length+1));
                for (var i=0;i<this.subviews.length;i++) {
                    this.subviews[i].setAttribute('width',newwidth);
                }
                return newwidth;
            }   
        ]]>
    </method>
    
    <handler name="onwidth">
        <![CDATA[
            if ( ((this.subviews.length)*(this.staticwidth+1)) <= this.width) {
                for (var i=0;i<this.subviews.length;i++) {
                    this.subviews[i].setAttribute('width',this.staticwidth);
                }
            } else {
                var newwidth = Math.round((this.width-this.subviews.length)/(this.subviews.length));
                for (var i=0;i<this.subviews.length;i++) {
                    this.subviews[i].setAttribute('width',newwidth);
                }
            } 
        ]]>
    </handler>
    
    <method name="removeObject" args="btn">
    	this.removeObjectSynced(btn);
    	if ($debug) Debug.write("removeObject :: ",btn);
    	this.onRemoveWindow.sendEvent(btn.objRef.refObj.publicSID);
    </method>
    
    <method name="removeObjectSynced" args="btn">
    	var removeCurrent = false;
    	if (this.currentBtn == btn){
    		removeCurrent = true;
    	}
    	btn.objRef.destroy();
        btn.destroy();
        if (this.subviews.length != 0) {
	        if (removeCurrent) {
	        	this.sendActiveWindowSynced(this.subviews[this.subviews.length-1]);
	        }
        }
        
    </method>

    
    <method name="sendActiveWindow" args="btn,win">
        if ($debug) Debug.write("sendActiveWindow: ", btn, win);
        this.sendActiveWindowSynced(btn);
    </method>
    
    <method name="sendActiveWindowSynced" args="btn">
    	<![CDATA[
            if (this.currentBtn != null){
                this.currentBtn.isactive=false;
                this.currentBtn.objRef.setAttribute("visibility", "hidden");
                if ($debug) Debug.write("sendActiveWindow1: ",this.currentBtn);
                this.currentBtn._minimizebtn_mo.setAttribute('visibility','hidden');
                this.currentBtn._minimizebtn_dn.setAttribute('visibility','hidden');
            }
            this.currentBtn = btn;
            this.currentBtn.objRef.setAttribute("visibility","visible");
        	this.currentBtn.objRef.bringToFront();
            if ($debug)  //Debug.write("sendActiveWindow2: ",this.currentBtn);
            this.currentBtn._minimizebtn_mo.setAttribute('visibility','hidden');
            this.currentBtn._minimizebtn_dn.setAttribute('visibility','visible');
            this.currentBtn.isactive=true;
	       	this.currentBtn.objRef.sendActiveWindow();
        ]]>
    </method>
    
</class>

</library>
