1  /*
     2   Copyright aswing.org, see the LICENCE.txt.
     3  */
     4  import org.aswing.AbstractButton;
     5  import org.aswing.border.Border;
     6  import org.aswing.Component;
     7  import org.aswing.Container;
     8  import org.aswing.Event;
     9  import org.aswing.JCheckBox;
    10  import org.aswing.JRadioButton;
    11  import org.aswing.JToolBar;
    12  import org.aswing.LookAndFeel;
    13  import org.aswing.plaf.ToolBarUI;
    14  import org.aswing.UIManager;
    15  import org.aswing.utils.Delegate;
    16  import org.aswing.utils.HashMap;
    17  
    18  /**
    19   * XXX this UI used some reflection way, so take care this when this things changed:
    20   * <ul>
    21   * <li> Component.opaque property name, see method ____judgeBackgroundPainting of this class
    22   * <li> Component.isOpaque method
    23   * </ul>
    24   * @author iiley
    25   */
    26  class org.aswing.plaf.basic.BasicToolBarUI extends ToolBarUI {
    27  	
    28  	private var toolBar:JToolBar;
    29  	private var toolBarButtonBorder:Border;
    30  	private var buttonBordersBak:HashMap;
    31  	private var opaqueBak:HashMap;
    32  	
    33  	private var buttonAddRemoveListener:Object;
    34  	
    35  	public function BasicToolBarUI() {
    36  		super();
    37  		toolBarButtonBorder = UIManager.getBorder("ToolBar.buttonBorder");
    38  		buttonBordersBak = new HashMap();
    39  		opaqueBak = new HashMap();
    40  	}
    41  	
    42  	
    43      public function installUI(c:Component):Void{
    44      	var b:JToolBar = JToolBar(c);
    45      	toolBar = b;
    46          installDefaults(b);
    47          initallComponents(b);
    48          installListeners(b);
    49      }
    50  
    51  	private function installDefaults(b:JToolBar):Void{
    52          // load shared instance defaults
    53          var pp:String = "ToolBar.";
    54          LookAndFeel.installColorsAndFont(b, pp + "background", pp + "foreground", pp + "font");
    55          LookAndFeel.installBorder(b, pp + "border");
    56          LookAndFeel.installBasicProperties(b, pp);
    57  	}
    58  			
    59  	private function initallComponents(b:JToolBar):Void{
    60  	}
    61  	
    62  	private function installListeners(b:JToolBar):Void{
    63  		buttonAddRemoveListener = new Object();
    64  		buttonAddRemoveListener[Container.ON_COM_ADDED] = Delegate.create(this, __childAdded);
    65  		buttonAddRemoveListener[Container.ON_COM_REMOVED] = Delegate.create(this, __childRemoved);
    66  		b.addEventListener(buttonAddRemoveListener);
    67  	}
    68  	
    69  	
    70      public function uninstallUI(c:Component):Void{
    71      	var b:JToolBar = JToolBar(c);
    72          uninstallDefaults(b);
    73          uninstallListeners(b);
    74          uninstallComponents(b);
    75      }
    76      
    77      private function uninstallDefaults(b:JToolBar):Void{
    78      	LookAndFeel.uninstallBorder(b);
    79      }
    80      
    81      private function uninstallComponents(b:JToolBar):Void{
    82      }    
    83      
    84      private function uninstallListeners(b:JToolBar):Void{
    85      	b.removeEventListener(buttonAddRemoveListener);
    86      }
    87  	
    88  	//-------------------------------------------------------------------
    89  	//set to toolbar button style border
    90  	private function __childAdded(event:Event):Void{
    91  		var button:AbstractButton = AbstractButton(event.com);
    92  		if(button != null && !(button instanceof JCheckBox || button instanceof JRadioButton)){
    93  			var border:Border = button.getBorder();
    94  			if(border == null){
    95  				buttonBordersBak.put(button.getID(), border);
    96  			}
    97  			button.setBorder(toolBarButtonBorder);
    98  			opaqueBak.put(button.getID(), button.isOpaque);
    99  			button.isOpaque = Delegate.create(this, ____judgeBackgroundPainting, button);
   100  		}
   101  	}
   102  	
   103  	private function ____judgeBackgroundPainting(button:AbstractButton):Boolean{
   104  		var obj:Object = button;
   105  		return obj.opaque && (button.getModel().isRollOver() || button.getModel().isSelected());
   106  	}
   107  	
   108  	//back to the button's original border
   109  	private function __childRemoved(event:Event):Void{
   110  		var button:AbstractButton = AbstractButton(event.com);
   111  		if(button != null && !(button instanceof JCheckBox || button instanceof JRadioButton)){
   112  			button.setBorder(Border(buttonBordersBak.remove(button.getID())));
   113  			button.isOpaque = opaqueBak.remove(button.getID());
   114  		}
   115  	}	
   116  }
   117