데스크탑에서 사용하는 위젯을 만들었는데,
최소화 하면 상태표시줄에서 없애고 트레이에 아이콘을 삽입해서보여주고 트레이 아이콘을 누르면 화면같은 메뉴가 나오도록 구성.
[Embed(source="/assets/icons/upa16.png")]
[Bindable]
private var Icon16:Class;
/**
* 마우스 오른쪽버튼 메뉴와 시스템트레이 메뉴생성
*
* @Author: chaeya@gmail.com
*/
//마우스오른쪽버튼 메뉴생성, TrayMenu 생성
private function CreateMenu():void {
var bitmap16:Bitmap = new Icon16();
NativeApplication.nativeApplication.icon.bitmaps =[bitmap16.bitmapData];
var trayMenu:NativeMenu = new NativeMenu();
var minimizeManu:NativeMenuItem = new NativeMenuItem("Minimize");
var maximizeManu:NativeMenuItem = new NativeMenuItem("Maximize");
var restoreMenu:NativeMenuItem = new NativeMenuItem("Restore");
var closeMenu:NativeMenuItem = new NativeMenuItem("Close");
Tomcat 5.5 에서 자바빈즈를 사용하는데 문제가 발생해서 해결하는데 3일이나 걸렸습니다. 문제의 원인은 server.xml
설정의 문제였는데요, Tomcat 4.1 까지는 정상적으로 동작한다는 것이 해결의 발목을 잡았습니다. Host 태그의
appBase 내용을 Context 태그의 docBase 로 옮기고 나니 정상적으로 동작하는 것을 확인하였습니다.
server.xml 의 설정값을 어떻게 해야되는지 내용을 알기가 어렵더군요. 아무튼 이렇게 설정하고나니 모든 것이 잘 돌아가고
있습니다. server.xml 에 대해서 아주 쉽고 상냥하게 설명되어 있는 문서가 없을까요? ^^;
FLEX 위젯을 만드는데
사이즈가 너무커서 임으로 달력을 그려서 넣을 일이 생겨서 하나 만들었다.
그리드 로우 추가부분이 이상해서 검토필요.
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="150" height="130" initialize="init()">
<mx:Script>
<![CDATA[
import mx.states.SetStyle;
[Bindable]
private var _txtYearMonth:String=null; //달력에 보이는 year-month 설정
private var _calDate:Date = new Date(); //현재 달력의 날짜 (년, 월) 참조 가능
private var _startDay:uint; //1일이 시작하는 날짜의 요일 (0:일, 1:월 ... 6:토)
private var _endDate:uint; //해당 달의 마지막 날짜
private const PREV:String = "move.previous"; //달력 진행 방향
private const NEXT:String = "move.next";
private const CELL_WIDTH:uint = 30; //요일 셀 설정
private const CELL_HEIGHT:uint = 14;
private const CELLTYPE_MASK:uint = 0x1111; //요일 타입 설정 & | 연산자를 통해 마스킹 처리
private const CELLTYPE_BLANK:uint = 0x0000; //0
private const CELLTYPE_SAT:uint = 0x0100; //256
private const CELLTYPE_SUN:uint = 0x1000; //4096
private function init():void{
drawCalendar(_calDate);
}
/**
* 달력을 이동한다
* @param direction 이동방향 (PREV, NEXT)
* */
private function moveMonth(direction:String):void{
switch(direction){
case PREV:
_calDate.setMonth(_calDate.getMonth()-1);
break;
case NEXT:
_calDate.setMonth(_calDate.getMonth()+1);
break;
}
//월을 받아서 달력그리기
drawCalendar(_calDate);
}
/**
* 달력 년월을 설정한다.
* @txtYearMonth txtYearMonth 날짜 ex) 2009.03
* */
public function set txtYearMonth(txtYearMonth:String):void{
this._txtYearMonth = txtYearMonth;
}
//타이틀 변경 : 변경된 년월을 그려준다.
drawTitle();
}
/**
* 변경된 년월을 그려준다.
* */
private function drawTitle():void{
_txtYearMonth = _calDate.fullYear + "." + (_calDate.month+1) ;
}
/**
* GridRow 생성 : 1주일 - GridRow 스타일 설정
* */
private function getGridRow():GridRow
{
var item:GridRow = new GridRow();
item.percentWidth = 100;
item.height = 14;
return item;
}
/**
* GridItem 생성 : 1일 - GridItem 내부 Label 스타일 설정
* @param row 행 0부터 시작함.
* @param col 열 0부터 시작함.
* */
private function getGridItem(row:uint, col:uint):GridItem
{
var itemType:uint ; //아이템 타입
var startCnt:uint = _startDay;
var inputCnt:uint = row + (col*7);
var calYear:uint = _calDate.fullYear;
var calMonth:uint = _calDate.month;
var calDate:uint = inputCnt - startCnt + 1;
var calDay:uint = _calDate.day;
//입력 범위 밖에 있는 값들 ...
if(startCnt > inputCnt || inputCnt > (_startDay+_endDate-1) ) {
itemType = CELLTYPE_BLANK;
calDate = 0; // 범위 밖(오류) : 날짜를 0으로 강제 셋팅 해준다.
}
else{
itemType = getCellType(new Date(calYear,calMonth,calDate)); //row는 요일과 동일
}
// trace("itemType : "+itemType);
//itemType 에 따른 Grid
var gridItem:GridItem = drawGridItem(itemType,calDate);
return gridItem;
}
/**
* 요일에 대하여 셀의 타입을 반환한다.
* @date 확인하고자 하는 날짜
* */
private function getCellType(date:Date):uint
{
var yy:uint = date.fullYear;
var mm:uint = date.month+1; //월은 0 부터 시작하므로 +1 처리
var dd:uint = date.date;
var day:uint = date.day; //0 : sun, 1 : mon ... , 6 : sat
var cellType:uint = CELLTYPE_BLANK;
if(day==0) cellType+= CELLTYPE_SUN; //요일 정보 추가하기
if(day==6) cellType+= CELLTYPE_SAT;
return cellType;
}
/**
* 그리드 아이템 내부에 들어가는 내용을 그려준다.
* @param type 그리드 타입
* @param date 날짜 (0 : 범위 밖 날짜)
* */
private function drawGridItem(type:uint, date:uint):GridItem{
var gridItem:GridItem = new GridItem();
gridItem.width = CELL_WIDTH;
gridItem.height = CELL_HEIGHT;
gridItem.percentHeight = 100;
gridItem.percentWidth = 100;
gridItem.setStyle("textAlign","center");
gridItem.setStyle("fontWeight","bold");
//레이블 설정
var lbDate:Label = new Label();
if(date==0) lbDate.text = "";
else lbDate.text = String(date);
if((type & CELLTYPE_SAT)== CELLTYPE_SAT){ //날짜 - 토요일
//lbDate.SetStyle("color", "blue");
}
if((type & CELLTYPE_SUN)== CELLTYPE_SUN){ //날짜 - 일요일
//lbDate.SetStyle("color", "red");
}
//그리드안에 LAbel 삽입
gridItem.addChild(lbDate);
return gridItem;
}
/**
* 달력을 그려준다.
* @param date 달력을 그리고자 하는 년월
* */
private function drawCalendar(date:Date):void{
var tmpDate1:Date = new Date(date.fullYear,date.month,1);
var tmpDate2:Date = new Date(date.fullYear,date.month+1,1);
tmpDate2.setDate(tmpDate2.getDate()-1);
_startDay = tmpDate1.getDay(); //1일이 시작하는 날짜의 요일 (0:일, 1:월 ... 6:토)
_endDate = tmpDate2.getDate(); //해당 달의 마지막 날짜
//그리드 초기화 : 그리드 내부에 존재하는 모든 아이템을 제거한다.
initGrid();
//내부 값 삽입
for(var i:uint=0;i<6;i++){ //6주를 그려 줄 수 있도록 구성한다. ex) (4)x7 + (1)x1 + (1)x2 = 6주
var tmpGridRow:GridRow = getGridRow();
for(var j:uint=0;j<7;j++){ //1주일은 7일 임
var tmpGridItem:GridItem = getGridItem(j,i);
tmpGridRow.addChild(tmpGridItem);
}
viewGrid.addChild(tmpGridRow);
}
- separate : 테이블 전체의 외곽선과 각 셀의 외곽선을 각각 표시합니다.
- collapse : 테이블 전체의 외곽 및, 각 셀의 외곽선을 경계에서 중복하여 표시합니다.
ex) TABLE { border-collapse: separate }
위와 같이, 아주 간단하게, 1px 외곽선 테이블(표)를 만들 수 있습니다. 해당 CSS는 IE5이상부터 지원되는 기능이며, FireFox 2.0의 경우도 지원되고 있습니다. (단, border="1"이 아닌 경우, 즉 그 이상의 값을 설정한 경우, FireFox에서는 여유선이 표시됩니다)
참고) 너비나 형식이 다른 외곽선이 포개질 때는 다음과 같은 우선 순위를 가집니다.
border-style:hidden설정 외곽선이 최우선, 너비가 넓은 외곽선이 그 다음의 우선 순위를 가집니다.
너비가 같은 경우에는 double, solid, dashed, dotted, ridge, outset, groove, inset 순서로 표기되며,
색상만 다른 경우에는 셀, 가로열, 가로열 그룹, 세로열, 세로열 그룹, 테이블 순서로 표시됩니다.
Rules
표 내부 셀간의 구분선을 어떻게 표시할 지에 대한, TABLE태그의 속성입니다. 먼저, 적용된 모습을 살펴봅니다.
이상의 HTML 태그 속성과 CSS를 이용하면, 위와 같은 테이블(표)를 손쉽게 제작할 수 있습니다.
FireFox v2.0
위에서 잠깐 언급했듯이, FireFox(v2.0)의 경우, 이전의 Netscape에서 지원하지 않았던 border-collapse스타일을 지원하고 있습니다. 다만, 아래 그림에서와 같이 테두리의 border값을 2px이상으로 설정한 경우, 여유선이 표시되는 현상이 있습니다. 이 경우, 테이블 외곽 테두리를 모두 표기한 경우, 어긋나 보이게 됩니다. 그러나 border값이 1px인 경우에는 IE와 똑같은 스타일로 표시됩니다.
다운받은 파일의 압축을 풀고 환경변수 및 패스를 잡아줍니다 set ANT_HOME=c:\ant
set JAVA_HOME=c:\jdk1.4.2
set PATH=%PATH%;%ANT_HOME%\bin
III. 간단한 Ant 예제
Ant를 이용하여 web application을 구성할 때 다음의 구조를 유지하기를 권장합니다
① build : src, web, docs에서 결과적으로 만들어진 산출물 디렉토리
② dist : build를 배포하기 위한 배포 디렉토리
③ docs : 배포판에 배포할 정적인 문서를 관리할 디렉토리
④ src : /WEB-INF/classes 에 위치할 java 소스 디렉토리
⑤ web : HTML, JSP, 이미지등의 컨텐트 디렉토리 (WEB-INF의 서브디렉토리 포함)
⑥ build.properties : build.xml에서 사용할 properties
⑦ build.xml : ant 명령으로 실행될 설정파일
src에 하나이상의 java 소스를 테스트로 넣어 놓으세요
자 이렇게 디렉토리를 설정하고 build.xml 을 다음 step에 따라 따라 해 BOA요 ^^&
STEP 1. build.xml 의 기본구조
xml을 기본적인 내용을 안다면 이해하기 쉽습니다
하나의 build 파일은 하나의 project로 구성되며 이는 다시 여러 target으로 구성됩니다
target 이란 빌드 과정중 수행해야 할 task들을 모아놓은 job 단위 라고 보면 됩니다
compile target이라 한다면 compile에 관련된 작업들을 모아놓은 그룹이라 생각하면 쉽게 이해 될겁니다
STEP 2. 시~작 Ant 맛보기~
① build.xml에 다음을 입력한 후 저장 합니다
-. project
project는 하나 이상의 target을 정의 합니다 또한 하나의 target은 task의 집합입니다
ant를 실행할 시에 어느 타겟을 실행할 것인지 지정할 수가 있으며 (예: \ant clear)
지정하지 않았을 경우 디폴트로 설정된 값이 사용됩니다 이부분이 default="clear"입니다
-. property
전역변수 설정 혹은 그렇게 사용할 build.properties를 정의 합니다
build.properties에 catalina.home을 정의하였으며 여러 환경이 변하더라도 이 값만
변경해주면 build.xml을 수정없이 바로 실행 가능합니다
-. echo
message 내용을 출력 합니다
-. target
target 이란 task의 집합으로 실질적으로 실행될 코드들의 묶음입니다
여기서는 아무 task도 없습니다
② build.properties에 다음을 입력 후 저장합니다
catalina.home 은 변수로 사용할 것이며 그 값은 C:\Tomcat 5.0입니다
③ 실행
해당 디렉토리로 이동하여 도스창에서 ant 라고 칩니다
STEP 3. 사전작업 하기~
이번 단계에서는 컴파일 하기전 전역변수 선언이나 컴파일 시 클래스 패스 설정을 해봅시다
① build.xml
-. project
이번에는 default 값을 prepare로 하였습니다 고로 target은 prepare가 실행될 것입니다
-. property
역시나 build.properties를 정의하였고 여러 전역변수를 설정하였습니다
build.home 이란 변수에는 ${basedir}/build 값이 정의되었으며
build.home은 ${build.home}으로 사용할수 있습니다
궁금하면 <echo message="${build.home}"/> 등으로 출력해 봅시다~
-. path
${catalina.home} 은 build.properties에서 정의하였다는것을 기역하실겁니다
fileset은 파일들의 집합을 나타내는데 어떤 특정파일만 포함 할수 있거나 혹은 어느 특정파일만 제외할 수 있습니다
javadoc target의 javadoc 태스트를 보면 java 소스가 있는 소스디렉토리와
API를 생성할 타겟 디렉토리를 정해주면 알아서 API를 생성해 줍니다
만들어진 API는 배포버젼의 dist디렉토리로 해주면 더 좋겠지요
dist target은 배포파일인 war를 만듭니다
필요한 문서가 있으면 docs 디렉토리를 만들어 로 복사도 하도록 합시다
jar 태스크는 위의 방식과 같이 사용합니다
② 실행
VI. Ant 실행
① C:\예제\ant -help
ant [options] [target [target2 [target3] ...]]
Options :
-help 이 메세지의 표시
-projecthelp 프로젝트 도움 정보의 출력
-version 버전 정보의 출력과 종료
-diagnostics diagnose 나 report 문제에 도움이 되는 정보의 출력.
-quiet, -q 한층 더 메세지를 적게
-verbose, -v 한층 더 메세지를 많게
-debug 디버그 정보의 출력
-emacs adornments 없이 로그 정보의 생성(produce)
-logfile <file> 로그를 지정 파일에 출력
-l <file> ''
-logger <classname> 로그 생성을 실행하기 위한 클래스
-listener <classname> 프로젝트 청취자(listener) 역할의 class의 인스턴스를 추가
-buildfile <file> 지정된 빌드 파일의 사용
-file <file> ''
-f <file> ''
-D<property>=<value> 지정된 프로퍼티의 값의 사용
-propertyfile <name> 모든 프로퍼티를 파일로부터 로드 (-D프로퍼티보다 전에)
-inputhandler <class> 입력 요청(requests)를 취급하는 클래스
-find <file> 파일시스템의 루트로 향해 빌드파일을 검색하고 그것을 사용
② C:\예제\ant
현재 디렉토리에 있는 build.xml 파일을 이용해, 디폴트 타겟으로 Ant 를 실행합니다.
③ C:\예제\ant compile
현재 디렉토리에 있는 build.xml이 실행되며 파라미터로 compile을 지정하면 project의 default 값을 무시하고 compile target을 실행합니다 물론 depends 가 있다면 먼저 실행합니다
④ C:\예제\ant -buildfile test.xml
현재 디렉토리에 있는 test.xml 파일을 이용해, 디폴트 타겟으로 Ant 를 실행합니다.
⑤ C:\예제\ant -buildfile test.xml dist
현재 디렉토리에 있는 test.xml 파일을 이용해, dist 라는 이름의 타겟으로 Ant 를 실행합니다.