2009년 8월 26일 수요일

HDividedBox

liveDragging="true"

 

이렇게 주면 HDividedBox의 사이즈가 변화는 즉시 화면에 반영된다.

2009년 8월 25일 화요일

오늘 내가 죽는다면

오늘 내가 죽는다면 이 일을 할까? 그럴리가.

2009년 8월 16일 일요일

ObjectHandles 선택기능 구현 살펴보기

디자인 툴을 만들기 위해 http://www.rogue-development.com/objectHandles.html를 사용한다. 여러 개의 컴포넌트 중 한 개가 선택되면 기존에 선택되어 있던 것은 해제되고 새로운 것만 선택된다. 이 구조를 어떻게 구현했는지 찾아보니 다음과 같다.

 

1. ObjectHandles의 onMouseDown 발생

2. SelectionManager.instance.setSelected(this); 실행

3. 2번의 setSelected 메소드에서 기존에 선택된 것이 있으면 deselect() 시키고 새로운 것을 select() 한다.

 

화면을 lock 시키면 select되지 않게 만들어야 했다. SelectionManager을 살펴보니 addSelectable, removeSelectable 메소드가 있다. addSelectable에서 _items 라는 곳에 select 가능한 object들이 추가 되는데 SelectionManager는 위에서 쓰는 것처럼 싱글톤이다. 그래서 application 전체의 Object들이 이 곳에 담기게 된다. application 내부 에서 두 개의 design 화면을 띄우고 이쪽은 lock 저쪽은 unlock 시키려고 이 _items를 사용하면 안된다.

Flex의 List에서 아이템을 더블클릭 시 수정할 수 있게 바꾸기

Flex의 List에서 아이템을 더블클릭 하면 수정되게 하고싶을 때가 있다. 아래 링크한 문서에서 Comments에 JabbyPandaUA 라는 사람이 남겨놓은 답이 좋아 보인다.

 

참고 : http://www.adobe.com/cfusion/communityengine/index.cfm?event=showdetails&productId=2&postId=8983

 

addEventListener(ListEvent.ITEM_DOUBLE_CLICK, onItemDoubleClick, false, EventPriority.DEFAULT_HANDLER);


protected function onItemDoubleClick(event : ListEvent) : void {
  
   var isEventPrevented : Boolean = event.isDefaultPrevented();
   if (event.isDefaultPrevented()) {
    return;
   }
                   
   editable = true;
         editedItemPosition = {columnIndex : 0, rowIndex : event.rowIndex};                      
  }

위와 같이 한다. 단순히 editable = true 속성을 지정해 두면 더블 클릭이 아닌 원 클릭에도 수정모드로 들어간다. 위의 코드도 한 번 editable이 되면 계속 editable이 되므로 change 이벤트 등에서 무조건 editable = false; 로 지정해 주니 잘 된다.

event 나중에 처리하기

flexmdi라는 flex에 데스크탑을 구현한 오픈소스가 있다. 여기를 클릭하면 볼 수 있다. 여기 샘플 코드에 괜찮은 설명이 있어서 옮겨 적는다.

 

 

   // the flex framework dispatches all kinds of events
   // in order to avoid catching one of those and throwing a coercion error
   // have your listener accept Event and check the type inside the function
   // this is good practice for all Flex development, not specific to flexmdi
   private function confirmWindowClose(event:Event):void
   {
    if(event is MDIManagerEvent && confirmCloseCb.selected)
    {
     // store a copy of the event in case we want to resume later (user confirms their intention)
     queuedEvent = event.clone() as MDIManagerEvent;
     
     // this is the line that prevents the default behavior from executing as usual
     // because the default handler checks event.isDefaultPrevented()
     event.preventDefault();
     
     Alert.show("Seriously? Close it?", null, 3, null, handleAlertResponse);
    }
   }
   
   // called when the Alert window is closed
   // if the user said yes, we execute the default behavior of playing an effect
   // and then removing the window by sending the stored event to
   // the appropriately named executeDefaultBehavior() method
   private function handleAlertResponse(event:CloseEvent):void
   {
    if(event.detail == mx.controls.Alert.YES)
    {
     mdiCanvas.windowManager.executeDefaultBehavior(queuedEvent);
    }
   }

 

 

윈도우를 닫을 때 발생한 이벤트에서 이벤트를 clone하여 queuedEvent라는 곳에 임시 저장하고 event는 preventDefault() 한다. 만약 사용자가 윈도우를 닫기 원하면 queuedEvent를 처리한다.

 

이벤트를 받을 때 타입체크를 하라는 설명도 보인다.

Flex에서 스크롤바 가장 밑으로 내리기

아래처럼 하면 object에 붙어있는 스크롤바를 가장 하단으로 내릴 수 있다.

 

      object.verticalScrollPosition = object.maxVerticalScrollPosition;
      object.validateNow();

 

적어놨다고 생각했는데 없네.