2010년 4월 6일 화요일
같은 AIR 애플리케이션 여러번
2010년 3월 25일 목요일
AIR NativeWindow에서 Window 얻는 방법
2009년 11월 25일 수요일
stackoverflow, yakov fain
http://stackoverflow.com/ 이 알고보니 Joel Spolsky랑 Jeff Atwood가 만든 거였다.
다른 서비스로 http://stackexchange.com/ 이 있다. 같은 엔진인데 각자 운영을 할 수 있나 보다. 유료다.
yakov fain이 돈을 내고 stackexchange.com 을 시작한다고 한다. 여기를 보면 관련 포스트를 볼 수 있다.
아래는 그 주소
2009년 11월 2일 월요일
BrowserManager로 URL 변경 알아내기
bm.addEventListener(BrowserChangeEvent.BROWSER_URL_CHANGE, onURLChange);
bm.setFragment("key=" + value);
를 하면 URL이 바뀌고 히스토리에 추가된다.
onURLChagne 에서 o.value를 얻어서 사용할 수 있다.
BrowserManager를 사용한 URL 파싱
BrowserManager
var bm:IBrowserManager = BrowserManager.getInstance();
bm.init();
bm.url : full url
bm.base : # 앞
bm.fragment : # 뒤
URLUtil
URLUtil.getPort(bm.url); // 8080
URLUtil.getProtocol(bm.url); // http
URLUtil.getServerName(bm.url); // localhost
URLUtil.getServerNameWithPort(bm.url); // localhost:8080
// 세미콜론으로 나뉘어진 url 단편들을 액션스크립트 객체로 파싱
var o:Object = URLUtil.stringToObject(bm.fragment);
ObjectUtil
// ★ Object를 찍어보기
ObjectUtil.toString(o);
// #id=goojoono;name=KooJunHo 대소문자 구분 함.
o.id == "goojoono"
o.name == "KooJunHo"
2009년 11월 1일 일요일
XML 다루기
http://koojunho.textcube.com/22
http://koojunho.textcube.com/38
http://koojunho.textcube.com/55
몇 번의 고민을 통해 XML을 직접 데이터로 사용하기 보다는 XML의 엘리먼트들을 잘 표현하는 Object로 바꿔주고 컬렉션을 통해 사용하는 것이 좋을 것 같다는 결론을 내렸다. (물론 여전히 상황따라 다를 수 있다는 전제를 깐다. ㅎ)
XML만을 사용하는 경우 XML을 데이터로 주고받는 상황에서 문제가 많이 생긴다. 어떤 XML 엘리먼트건 XML로 받을 수 있기 때문에 해당 값이 내가 받고자 하는 엘리먼트인지 아닌지를 판단하는 문제는 런타임으로 넘어가게 된다. XML이 수정되는 경우라도 컴파일 타임에는 아무런 문제를 일으키지 않기 때문에 모든 문제를 런타임으로 넘기게 된다. 문제가 런타임으로 넘어가면 프로그램의 해당 부분을 실행하기 전까지 문제가 있는지 아닌지 알 수 없게된다.
Object라고 해서 데이터가 수정될 때 아무런 작업이 필요 없는 것은 아니다. XML을 파싱해서 객체로 만들어 주는 과정과 자료구조를 만들어 주는 과정이 필요하다. 게다가 검색기능은 E4X, XPath 등에 비해 훨씬 귀찮다. 그러나 데이터가 바뀌고 클래스를 바꾸면 해당 값을 사용하는 모든 클래스들이 반응하게 된다. XML에서 특정 엘리먼트의 데이터를 다루는 방법이 바뀔경우 캡슐화된 클래스 내에서 처리방법만 바꿔주면 그 클래스를 사용하는 모든 클라이언트 코드가 자동으로 바뀌는 셈이다.
그렇지만 XML을 클래스로 만드는 것도 일은 일이다. 그래서 유닛테스트 프레임워크를 사용해서 완성된 XML을 기반으로 클래스를 만들면서 테스트를 하면 구현이 필요한 클래스의 나머지 일부가 어떤 것인지를 에러로 보여주는 클래스를 구현했다. 만약 내가 어떤 엘리먼트의 자식 엘리먼트로 <title />을 추가하고 실행을 했다면, 알 수 없는 title이라는 존재를 인식한 객체가 예외를 발생시키는 구조다. AS3.0에서 this[elementName] 으로 접근하여 값을 집어넣게 하는 방식으로 처리했다. this객체가 dynamic 클래스의 인스턴스는 아니기 때문에 동적으로 값을 넣을 수 없으면 예외를 던지는 것이다.
직접 XML을 클래스로 바꾸는 작업도 같이 진행했는데 처음에는 더뎌 보였지만 기반 클래스가 갖춰지자 테스트에 의존해서 클래스를 만들어 내는 쪽이 더 빨리 끝났다. 별로 머리 쓸 일이 없게 해준다.
엘리먼트마다 클래스가 생겨서 해당 엘리먼트 또는 자식 엘리먼트들을 처리하기 위한 기능들을 추가할 수 있게 됐다. 예를 들어 날짜를 갖고있는 XML이 있다면 XML로 접근했을 때 텍스트일 뿐이고 나중에 클라이언트 코드에서 해당 XML을 Date 클래스 등으로 변환해 주어야 한다. 클래스로 구현이 되어 있는 경우는 미리 그 작업을 베이스 코드에서 해주기 때문에 편해 보인다.
물론 XML을 OOP 구조로 치환 했을때 데이터를 제대로 표현했다고 하기에는 무리가 있다. 객체를 사용하는 게 더 좋다고 결론을 내렸다지만 XML을 객체로 치환하는 게 중요한 게 아니라 XML로 표현 된 데이터를 객체로 제대로 표현하는 게 더 중요하다. 사람의 고민이 필요한 부분에선 이 클래스들도 영 쓸모가 없다. 그래서 중요한 것은 만드려는 게 무엇인가를 먼저 봐야 하는 거고, 그 보다 더 좋은건 XML 정의하는 과정에도 참여하는 게 더 좋았을 텐데, 아직 설명은 못들었고 주말엔 쉬어야 한다는 생각이 갑자기 들었기 때문에. 오케이 여기까지. ㅎ
String2Date
var date:Date = DateField.stringToDate(dateXML.toString(), "YYYY-MM-DD");
String을 Date로 바꿀때.
2009년 9월 29일 화요일
flex-mojos
Maven 쓸 생각이다. 이유는 다 귀찮아서, 이고. 이미 콘솔에서 테스트도 성공했고 hudson에도 붙였다. 문제는 테스트는 hudson에서 아직 안되고 있다는 점. adobe도 flex-mojos 쓴데잖아.
http://www.sonatype.com/people/2009/09/flexpmd-adobe-using-flexmojos/
2009년 9월 8일 화요일
버튼에 프로그래밍 스킨 적용
ProgrammaticSkin을 상속받아 스킨 클래스를 만들고 버튼에 적용할 수 있다. 아래 둘 중 한 가지 방법으로 적용 가능하다.
클래스 : <mx:Button upSkin="{SkinClass} ....
문자열 : <mx:Button upSkin="com.domain.skin.SkinClass" ....
2009년 9월 2일 수요일
2009년 8월 26일 수요일
HDividedBox
liveDragging="true"
이렇게 주면 HDividedBox의 사이즈가 변화는 즉시 화면에 반영된다.
2009년 8월 23일 일요일
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; 로 지정해 주니 잘 된다.
Flex에서 스크롤바 가장 밑으로 내리기
아래처럼 하면 object에 붙어있는 스크롤바를 가장 하단으로 내릴 수 있다.
object.verticalScrollPosition = object.maxVerticalScrollPosition;
object.validateNow();
적어놨다고 생각했는데 없네.
2009년 8월 14일 금요일
기술세미나 2009 Flex4 활용 및 UX 구현 테크닉
어제 2009년 8월 13일 Flex4 활용 및 UX 구현 테크닉을 주제로 세미나가 있었다. OkGosu.Net의 옥상훈님, 한국키스코의 배준균님 그리고 위콘 커뮤니케이션의 지용호님이 세미나를 진행 하셨다. 주제는 각각 UX 구현 테크닉, BlazeDS 활용, Flex 4의 새로운 기능에 대한 것이었다.
2009년 8월 13일 목요일
backgroundImage 늘리기
2009년 8월 12일 수요일
PureMVC 사용에 대한 고민 4
Yakov Fain 중심으로 찾아가면 뭐가 많다. farata에서 공개한 Clear Toolkit을 대충 봤다. Enterprise Development with Flex: Best Practices for RIA Developers 사봐야겠다.
참고 :
+ Anti Flex Frameworks, Shall We? - http://www.flex888.com/768/anti-flex-frameworks-shall-we.html
+ Clear Toolkit - http://sourceforge.net/projects/cleartoolkit/
모르겠다. List의 Label 변경 시점에 변경된 Label 얻기
Flex에서 List에 editable="true"으로 주면 label을 편집할 수 있다. 그리고 itemEditEnd의 이벤트 핸들러를 지정하면 item이 변경되고 나서 event를 받을 수 있다.
그런데 이 이벤트에서 변경된 아이템의 label을 얻기위해 list.selectedItem으로 title을 얻어봤으나 얻어지지 않았다. 그래서 저장한 XML 일부가 반영되지 않았다.
급해서 저장시점에 list를 돌며 저장하는 방법으로 바꿨음.
Flex로 Design tool 만드려면
Flex로 Design tool 만들때 컴포넌트들을 리사이징하고 위치를 조정하기 위한 핸들러의 구현이 필요할 수 있다. MFC에서는 CRectTracker라는 것을 지원 했는데 Flex에서는 그런 것을 직접 지원하지는 않는다.
아래 주소의 라이브러리를 사용하면 이를 쉽게 구현할 수 있다.
http://code.google.com/p/flex-object-handles/wiki/ObjectHandlesUsage