I created a custom border class to create a dashed line border, and I 
added two custom style properties "dashlen" and "gaplen", but I can't 
set them.

In the attached code, the default dashlen and gaplen are 5. 

I create three VBox using the DashBorder, and although I have created 
a type selector style for DashBorder and a class selector style 
tightDashBorder, neither one is applied.

Also, I get errors when I try to access the style properties dashlen 
and gaplen in the <mx:VBox> tag. I can access the borderColor style 
property though.

What more must I do to fix this? Thanks in advance!!!

-------------------- DashBorder.as ---------------------------
package
{
  import mx.skins.RectangularBorder;
  import mx.styles.CSSStyleDeclaration;
  import mx.styles.StyleManager;  
  
  [Style(name="dashlen",type="Number",format="Length",inherit="no")]
  [Style(name="gaplen",type="Number",format="Length",inherit="no")]

  public class DashBorder extends RectangularBorder{
    private static var classConstructed:Boolean = classConstruct();
    private var bStypePropChanged:Boolean = false;    
    private var dashlen:Number = 5;
    private var gaplen:Number = 5;
    
    public function DashBorder(){
      super();
    }

    private static function classConstruct():Boolean {
      if(!StyleManager.getStyleDeclaration("DashBorder")){
        var myBorderStyles:CSSStyleDeclaration = new 
CSSStyleDeclaration();
        myBorderStyles.defaultFactory = function():void{
          this.dashlen = 5;
          this.gaplen = 5;
        }
        StyleManager.setStyleDeclaration("DashBorder", 
myBorderStyles, true);
      }
      return true;
    }
    
   override public function styleChanged(styleProp:String):void {
     super.styleChanged(styleProp);
     if (styleProp=="dashlen" || styleProp=="gaplen"){
       bStypePropChanged=true; 
       invalidateDisplayList();
       return;
     }
   }
    
    override protected function updateDisplayList
      (unscaledWidth:Number, unscaledHeight:Number):void{
      super.updateDisplayList(unscaledWidth, unscaledHeight);
      var borderThickness:int = getStyle("borderThickness");
      var borderColor:int = getStyle("borderColor");
      graphics.clear();
      graphics.lineStyle(borderThickness, borderColor, 1)

      if (bStypePropChanged==true){
        this.dashlen = getStyle("dashlen");
        this.gaplen = getStyle("gaplen");
        bStypePropChanged=false;
      }
      drawBorder(this.x, this.y, unscaledWidth, unscaledHeight,
        this.dashlen, this.gaplen); 
    }

    public function drawLine(x1:Number, y1:Number, x2:Number, 
y2:Number,
      dashlen:Number, gaplen:Number): void {     
      if((x1 != x2) || (y1 != y2)){
        var incrlen:Number = dashlen + gaplen;
      
        var len:Number = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) 
* (y1 - y2));
        var angle:Number = Math.atan((y2 - y1) / (x2 - x1));
        var steps:uint = len / (dashlen + gaplen);
      
        var dashstepx:Number = dashlen * Math.cos(angle);
        if (x2 < x1) dashstepx *= -1;
      
        var dashstepy:Number = dashlen * Math.sin(angle);
      
        var gapstepx:Number = gaplen * Math.cos(angle);
        if (x2 < x1) gapstepx *= -1;
      
        var gapstepy:Number = gaplen * Math.sin(angle);
        var stepcount:uint = 0;
      
        while ((stepcount++) < steps) {        

          var dashstartx:Number;
          var dashstarty:Number;
          var dashendx:Number;
          var dashendy:Number;
        
          if(x1 == x2 && y1 != y2){
            dashstartx = dashendx = x1;
            if(y2 > y1){
              dashstarty = y1 + ((stepcount-1) * (dashlen + 
gaplen));              
              dashendy = dashstarty + dashlen;
            }else{
              dashstarty = y1 - ((stepcount-1) * (dashlen + 
gaplen));              
              dashendy = dashstarty - dashlen;
            }
          }else if(y1 == y2 && x1 != x2){
            dashstarty = dashendy = y1;
            if(x2 > x1){
              dashstartx = x1 + ((stepcount-1) * (dashlen + gaplen));
              dashendx = dashstartx + dashlen;
            }else{
              dashstartx = x1 - ((stepcount-1) * (dashlen + gaplen));
              dashendx = dashstartx - dashlen;
            }
          }
          graphics.moveTo(dashstartx, dashstarty);
          graphics.lineTo(dashendx, dashendy);
        }
      }
    }
    
    private function drawBorder(x1:Number, y1:Number, width:Number, 
height:Number,
      dashlen:Number, gaplen:Number) : void {
      drawLine(x1, y1, x1 + width, y1, dashlen, gaplen);
      drawLine(x1 + width, y1, x1 + width, y1 + height, dashlen, 
gaplen);
      drawLine(x1 + width, y1 + height, x1, y1 + height, dashlen, 
gaplen);
      drawLine(x1, y1 + height, x1, y1, dashlen, gaplen);
    }    
  }
}
------------------- Test.mxml ----------------------------
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml";>
  <mx:Style>
    DashBorder {
      dashlen: 10;
      dashgap: 10;
    }
    
    .tightDashBorder {
      dashlen: 2;
      dashgap: 2;
    }
  </mx:Style>
  <mx:VBox borderSkin="DashBorder" backgroundColor="0xCCCC99"    
    backgroundAlpha="0.8" cornerRadius="14" paddingLeft="20" 
paddingTop="20"    
    paddingRight="20" paddingBottom="20" borderThickness="1" 
borderColor="0xFF0000"
    width="400" height="200" styleName="tightDashBorder">
  </mx:VBox>    
  <mx:VBox borderSkin="DashBorder" backgroundColor="0xCCCC99"    
    backgroundAlpha="0.8" cornerRadius="14" paddingLeft="20" 
paddingTop="20"    
    paddingRight="20" paddingBottom="20" borderThickness="1" 
borderColor="0xFF0000"
    width="30" height="30">
  </mx:VBox>    
  <mx:VBox id="vb" borderSkin="DashBorder" 
backgroundColor="0xCCCC99"    
    backgroundAlpha="0.8" cornerRadius="14" paddingLeft="20" 
paddingTop="20"    
    paddingRight="20" paddingBottom="20" borderThickness="1" 
borderColor="0xFF0000"
    width="10" height="10">
  </mx:VBox>    
</mx:Application>


Reply via email to