[ActionScript] GroupingCollection2 클래스를 이용한 그룹핑(Grouping)

플래시빌더 4.7은 언제 정식 출시되나.. 지금 사용하고 있는 4.6의 차트 컴포넌트에 약간의 버그가 있고 4.7에서는 해결되기를 기대해 봅니다. 특히 4.7은 스레드 개념을 지원함으로써 더욱 유연한 개발이 가능할 것으로 기대됩니다. 이 스레드 개념은 HTML5의 Worker 기능에서 많은 힌트를 얻어 이번에 추가한 기능이 아닌가 싶습니다. 여튼………

어떤 데이터가 있다면.. 동일한 값을 가지는 녀석들을 묶는데.. 이렇게 1차적으로 묶인 녀석들에 대해서 또 한번 다른 필드의 동일한 값으로 또 묶어 그룹핑하는데 요긴하게 사용한 클래스입니다. 이 클래스의 존재를 모른체 직접 코드를 한땀.. 한땀.. 땀 한방울.. 땀 두방울 흘리며 코딩했답니다. 물론 지금은 이 클래스를 이용해 기능 개발을 했구요.

var grouping:GroupingCollection2 = new GroupingCollection2();
grouping.source = new ArrayCollection(rows);
grouping.grouping = new Grouping();
grouping.grouping.fields = 
    [ new GroupingField("FIELD1"), new GroupingField("FIELD2") ];
grouping.refresh();

성의없이.. 막 코드로 시작합니다. rows가 그룹핑할 배열(Array)입니다. 이 배열의 요소는 FIELD1과 FIELD2라는 이름의 속성값이 있습니다. 일단 FIELD1에 대해 동일한 요소들을 한번 묶고.. 다시 이렇게 묶인 그룹들을 대상으로 FIELD2로 또 한번 묶습니다.

결과적으로 그룹핑된 컬렉션은 grouping 객체(위의 코드 참조)의 getRoot 매서드를 통해 얻습니다. getRoot()의 결과에 대한 클래스 타입은, 배열을 대상으로 그룹핑 했으므로 ArrayCollection 타입입니다.

그룹핑되기 이전에는 단순한 1차원 배열이였던 것이 GroupingCollection2 클래스를 통해 그룹핑되면 3차원 배열이 됩니다. 이 3차원으로 재가공된 배열(실제로는 ArrayCollection 클래스 타입)의 원소들을 하나 하나 참조해야할 때가 있습니다. 설명하기엔 무척….. 염병같고……………. 걍 코드.. 예제 코드 나갑니다. ;-|

var groupingRows:ArrayCollection = grouping.getRoot() as ArrayCollection;
var driverNameAndCarNumber:Object = new Object();
for(i=0; i{
    var D1:Object = groupingRows.getItemAt(i);
    D1["iconIndex"] = 0;
     
    var carName:String = D1.GroupLabel;
    var D2:ArrayCollection = D1.children as ArrayCollection; 

    for(var j:int=0; j    {
        var item:Object = D2.getItemAt(j);
        var driverName:String = item.GroupLabel;
        item["iconIndex"] = 1;
      
        var D3:ArrayCollection = item.children as ArrayCollection;
        for(var k:int=0; k        {
            var lastItem:Object = D3.getItemAt(k);
            lastItem["iconIndex"] = 2;
        }
      
        var sortField:SortField = new SortField();
        sortField.name = "GroupLabel";
        var sort:Sort = new Sort();
        sort.fields = [sortField];
        D3.sort = sort;
        D3.refresh();
    }
}

이 코드는 그룹핑된 내부의 요소드를 또 다시 정렬해줌과 동시에 아이콘 적용을 위해 아이콘 인덱스 번호를 넣어주는 코드입니다. 시간이 지난후에 이 코드를 보고 제 스스로 이해할 수 있다면… 과연 그럴 수 있을까.. 싶습니다.,

[ActionScript] DataGrid(Spark)의 각 셀값 읽기

var iCol:int = 0;
var rows:XMLListCollection = grid.dataProvider as XMLListCollection;
var columns:ArrayList = grid.columns as ArrayList;
var cntCols:int = columns.length;
   
for(var iRow:int=0; iRow{
    var row:Object = rows[iRow];
    
    for(iCol=0; iCol    {
        var column:GridColumn = columns.getItemAt(iCol) as GridColumn;
        var key:String = column.dataField;
        var value:String = row[key]; // Cell Value !!

        ...
    }
}

ActionScript를 통한 코드 작성이 무슨 퍼즐도 아니고…. 이리 저리 코드 조합해 나가는 재미가… 하나도 없군요… ㅡ_ㅡ; 위 코드 조합해 내느라 2시간 정도 걸렸습니다.. 나중에 또 다시 이런 시간 허비가 없도록 하기 위해 포스팅합니다..

[ActionScript] 문자열에 대한 Trim 함수

액션 스크립트는 문자열에 대한 Trim 함수를 제공하지 않습니다. 해서 제가 사용하고 있는 Trim 함수를 소개해 드립니다. 재귀호출 함수를 사용해서 그다지 속도는 나질 않지만…. 제가 사용함에 있어서 문제가 없기에 소개해 드립니다.

public class StringHelper
{
    static public function trim(str:String, char:String):String {
        return trimBack(trimFront(str, char), char);
    }
  
    static public function trimFront(str:String, char:String):String {
        char = stringToCharacter(char);
        if (str.charAt(0) == char) {
            str = trimFront(str.substring(1), char);
        }
        return str;
    }
  
    static public function trimBack(str:String, char:String):String {
        char = stringToCharacter(char);
        if (str.charAt(str.length - 1) == char) {
            str = trimBack(str.substring(0, str.length - 1), char);
        }
        return str;
    }

    static public function stringToCharacter(str:String):String {
        if (str.length == 1) {
            return str;
        }
        return str.slice(0, 1);
    }
}

사용방법은 StringHelper.trim(”    ABC    “, ” “)와 같으며 이에 대한 결과는 “ABC”가 됩니다. 참고로 이 함수는 제가 만든 것이 아니고 외국의 블로그에서 발췌해 사용한 것인데… 어느 블로그인지.. 시간이 많이 흘러 알수가 없네요..

[ActionScript] object에 저장된 값 읽기

액션스크립트의 최상위 객체인 Object는 해쉬 테이블 자료구조입니다. 즉, 키와 값으로 구성된 리스트입니다. 키의 타입은 문자열이며 값의 타입은 다시 Object라고 이해하면 별 무리가 없을 것입니다. Object의 이러한 특성으로 인해 액션스크립트를 이용해 매우 유연한 코딩을 가능하게 해줌과 동시에 이러한 애매모호한 타입에 대해 별도의 문서와 주석이 없을 경우 유지보수에 상당한 비용이 발생하게 됩니다. 뭐 여튼… Object에 저장된 키와 값에 대한 리스트를 얻어오는 코드가 이 글의 주요 정리 내용입니다. 필요할때.. 맨날~ 까먹기에.. 정리해 봅니다.

for(var key:String in _conditionsCtrls)
{
    var wc:IWhereConditionable = _conditionsCtrls[key] as IWhereConditionable;

    ....

위의 코드에서 Object 타입의 _conditionsCtrls에 저장된 키 문자열을 key라는 변수에 할당하고 이렇게 얻은 키를 통해 _conditionsCtrls[key]와 같은 형식으로 Object 타입의 값을 얻어옵니다. Object 타입이니.. 형변환을 통해 원하는 타입으로 변환할 수 있습니다.