|
5th
|
2004-04-27 18:33:44, Á¶È¸ : 2,793, Ãßõ : 318 |
- Download #1 : tree_1.zip (2.8 KB), Download : 71

¿äÁò curl ¿¡ ´ëÇØ °ü½ÉÀ» °¡Áö°í °øºÎÇϱ⠽ÃÀÛÇÏ¿´´Âµ¥¿ä,
´ÙÀ½Àº Á¦°¡ ¸¸µé¾îº» ÆÄÀÏÀÔ´Ï´Ù.
Àß ¸¸µéÁø ¸øÇßÁö¸¸ ÃʽÉÀÚ ºÐµé°Ô µµ¿òÀÌ µÉ±îÇØ¼ ,Àúµµ Çѹø, °Á·Π¿Ã·Áº¸¾Ò½À´Ï´Ù.
[Æ®¸®±¸Á¶ ¸¸µé±â#1]
°£´ÜÈ÷ Æ®¸®¸¦ ¸¸µé¾îº¸´Â °ÁÂÀÔ´Ï´Ù.
(À©µµ¿ì Ž»ö±â, Æú´õâÀÇ ±¸Á¶¶ó°í »ý°¢ÇÏ½Ã¸é µË´Ï´Ù.)
¾Æ·¡ ¼Ò½º´Â ¹®Á¦Á¡ÀÌ ÀÖÁö¸¸, À̹ø °Á¿¡¼´Â ´ë·«ÀûÀÎ ±¸Á¶¸¸ ÆÄ¾ÇÇϰí,
´ÙÀ½ °Á¿¡¼ ¹®Á¦Á¡À» °íÄ£ÈÄ, À̹ÌÁöµµ Ãß°¡Çؼ »ç¿ëÇØº¸°Ú½À´Ï´Ù.
Àüü¼Ò½º - start.curl
------------------------------------------------------------------------
{curl 3.0 applet}
{curl-file-attributes character-encoding = "euc-kr"}
{applet manifest = "manifest.mcurl"}
||================================================================== (1)
{define-class public open TTreeNode
field protected flabel : String
field public parent : #TTreeNode
field public items : {Array-of TTreeNode} = {{Array-of TTreeNode}}
field public status : String
{constructor public {default
label : String,
parent : #TTreeNode = null,
status : String = "-"
}
set self.flabel = label
set self.parent = parent
set self.status = status
}
{setter public open {label label:String}:void
set self.flabel = label
}
{getter public open {label}:String
{return self.flabel}
}
{getter public open {size}:int
{return self.items.size}
}
{getter public open {has-child?}:bool
{if (self.items.size>0) then
{return true}
else
{return false}
}
}
{method public open {append tn:TTreeNode}:void
set tn.parent = self
{self.items.append tn}
}
}
||================================================================== (2)
{define-class public open TTreeControl {inherits Frame}
field protected fvb : VBox = {VBox}
field protected ftn : #TTreeNode
{constructor public {default
tn : #TTreeNode = null,
...
}
set self.ftn = tn
{construct-super ...}
{self.refresh-controls}
{self.add self.fvb}
}
{method public open {refresh-controls}:void
{self.fvb.clear}
{if self.ftn != null then
{self.make-tree self.ftn, 0}
}
}
{method public open {make-tree tn : #TTreeNode, indent : int} : void
{if tn == null then
{return}
}
let fr : Frame = {Frame width=10px}
{if tn.has-child? then
{fr.add tn.status}
set fr.cursor=cursor-hand
{fr.add-event-handler
{on PointerPress do
{if tn.status=="+" then
set tn.status="-"
{self.refresh-controls}
elseif tn.status=="-" then
set tn.status="+"
{self.refresh-controls}
}
}
}
}
{self.fvb.add
{HBox
{Fill width=10px * indent},
fr,
tn.label
}
}
{if tn.status == "-" then
{for i:int = 0 below tn.size do
let tn_temp:TTreeNode=tn.items[i]
{self.make-tree tn_temp, indent+1}
}
}
}
}
||================================================================== (3)
{value
let tn : TTreeNode = {TTreeNode "root"}
let tn2 : TTreeNode = {TTreeNode "CCC"}
{tn.append {TTreeNode "AAA", parent=tn}}
{tn.append {TTreeNode "BBB" }}
{tn.append tn2}
{tn2.append {TTreeNode "111" }}
{tn2.append {TTreeNode "222" }}
{HBox
{TTreeControl tn=tn,
width=100px, height=100px, background="beige"
}
}
}
----------------------------------------------------------------------
<°á°ú>

----------------------------------------------------------------------
ÀÌ ÆÄÀÏÀº Å©°Ô 3 ±¸Á¶·Î ÀÌ·ç¾îÁ³½À´Ï´Ù. (ÁÖ¼®ÀÇ ¹øÈ£Ç¥½Ã ÂüÁ¶)
¸íÈ®ÇÏ°Ô ³ª´²ÁöÁø ¾Ê¾ÒÁö¸¸, ´ë·« MVC ÆÐÅÏÀ» »ý°¢ÇÏ½Ã¸é µÉµíÇÕ´Ï´Ù.
(1) TTreeNode class : Model
(2) TTreeControl class : Control
(3) value : View
(1) TTreeNode class
- ¼³¸í ÆíÀÇ»ó, À§ °á°ú ȸéÀÇ °¡·ÎÁÙ Çϳª¸¦ ¡°³ëµå¡±¶ó°í Ç¥ÇöÇϰڽÀ´Ï´Ù.
- ¡°³ëµå¡±¸¦ Ç¥ÇöÇϱâÀ§ÇÑ Å¬·¡½º¶ó°í »ý°¢ÇÏ½Ã¸é µË´Ï´Ù.
- ¡°³ëµå¡±ÀÇ ±âº» ±¸Á¶, ÇÏÀ§³ëµå¿¡ ´ëÇÑ Á¤º¸, À̸§/»çÀÌÁ ¹ÝȯÇÏ´Â ¸Þ¼ÒµåµîÀ» Æ÷ÇÔÇϰí ÀÖ½À´Ï´Ù.
============================================================
¿ì¼±, ¸â¹öº¯¼öµéÀ» ¼±¾ðÇϰڽÀ´Ï´Ù.
-----------------------------------------------------------
field protected flabel : String
field public parent : #TTreeNode
field public items : {Array-of TTreeNode} = {{Array-of TTreeNode}}
field public status : String
-----------------------------------------------------------
-> flabel : ³ëµåÀÇ ÅØ½ºÆ®¸í.
-> parent : »óÀ§ ³ëµå. data typeÀÎ TTreeNode¾ÕÀÇ #±âÈ£´Â null°ª Çã¿ëÀ» ÀǹÌÇÕ´Ï´Ù.
-> items : ÇÏÀ§ ³ëµåµéÀÇ ÁýÇÕ. ¹è¿·Î ¼±¾ð.
-> status : ³ëµåÀÇ È®Àå/Ãà¼Ò(- / +)µÈ »óŸ¦ ¼³Á¤.
============================================================
´ÙÀ½Àº »ý¼ºÀÚ(constructor)ÀÔ´Ï´Ù.
-----------------------------------------------------------
{constructor public {default
label : String,
parent : #TTreeNode = null,
status : String = "-"
}
set self.flabel = label
set self.parent = parent
set self.status = status
}
-----------------------------------------------------------
»ý¼ºÀÚÀÇ argument·Î´Â ³ëµåÀÇ ÅØ½ºÆ®¸í°ú, »óÀ§³ëµå, ³ëµåÀÇ È®Àå/Ãà¼Ò»óŸ¦ ¹Þ¾Æ ¼³Á¤ÇÕ´Ï´Ù.
items¸¦ ¼³Á¤ÇÏ´Â ºÎºÐÀÌ ¾ø´Âµ¥ items´Â ÇÏÀ§ ³ëµåµéÀÌ ¹è¿ÇüÅ·Πµé¾î°¥ º¯¼öÀÔ´Ï´Ù.
ÀÚ¼¼ÇÑ ¼³¸íÀº Àá½Ã µÚ¿¡...
¡Ø tip :
curl¿¡¼ »ý¼ºÀÚ, ¸Þ¼Òµå, ÇÁ·Î½ÃÁ®ÀÇ ¼±¾ð½Ã,
argumentµé Áß¿¡ ÃʱⰪÀÌ ÇÒ´çµÇ¾îÀÖ´Â argument´Â optionÀÇ Àǹ̸¦ °¡Áý´Ï´Ù.
Áï, È£ÃâµÉ¶§, argument¿¡ °ªÀÌ ³Ñ¾î¿À¸é ±× °ªÀÌ ÇÒ´çµÇ°í,
±×·¸Áö ¾ÊÀ» °æ¿ì¿¡´Â default °ªÀÌ »ç¿ëµË´Ï´Ù.
¿¹¸¦µé¾î, À§ÀÇ »ý¼ºÀÚÀÇ °æ¿ì parent¿Í status°¡ optionó·³ µ¿ÀÛÇÕ´Ï´Ù.
¶ÇÇÑ, argument¿¡ °ªÀ» ÇÒ´çÇÏÁö ¾Ê¾ÒÀ» °æ¿ì, ¹Ýµå½Ã ¿ÜºÎ¿¡¼ °ªÀ» ÇÒ´çÇØÁà¾ß ÇÕ´Ï´Ù.
argument¿¡ °ªÀ» ÇÒ´çÇÏÁö ¾Ê°í, ¿ÜºÎ¿¡¼µµ °ªÀÌ Àü´ÞµÇÁö ¾Ê¾ÒÀ» °æ¿ì´Â
¸â¹ö¸é¼ö ¼±¾ðÇÒ¶§ Ãʱâȸ¦ ÇØÁÖ¾î¾ß ÇÕ´Ï´Ù.
============================================================
Accessor #1
-----------------------------------------------------------
{setter public open {label label:String}:void
set self.flabel = label
}
{getter public open {label}:String
{return self.flabel}
}
-----------------------------------------------------------
setter & getter¸¦ ÀÌ¿ëÇÏ¿© ³ëµå¸íÀ» ¼³Á¤ÇÏ°í °ªÀ» °¡Á®¿É´Ï´Ù.
setter ÀÇ °æ¿ì, ÀÌ ÆÄÀÏ¿¡¼± ¾²ÀÌÁø ¾ÊÁö¸¸ Çü½ÄÀûÀ¸·Î ¸¸µé¾îÁÖ¾ú½À´Ï´Ù.
getter ¸¦ »ç¿ëÇÏ¿© label °ª(³ëµå¸í)À» ¹ÝȯÇϰí ÀÖ½À´Ï´Ù.
¡Ø tip :
setter¿Í getter´Â °°Àº À̸§(ÀÌ ÆÄÀÏÀÇ °æ¿ì, label)À» »ç¿ëÇÏ¿©µµ µË´Ï´Ù.
ÇÏÁö¸¸,
ÀÌ Accessor¸¦ ÅëÇØ Á¢±ÙÇÏ´Â ¸â¹öº¯¼ö À̸§°ú argument·Î »ç¿ëµÇ´Â À̸§Àº ¹Ýµå½Ã ´Þ¶ó¾ß ÇÕ´Ï´Ù.
µû¶ó¼ ¸â¹öº¯¼öÀÇ À̸§ÀÌ labelÀÌ ¾Æ´Ñ flabel·Î ¼±¾ðÀÌ µÇ¾ú½À´Ï´Ù.
============================================================
Accessor #2
-----------------------------------------------------------
{getter public open {size}:int
{return self.items.size}
}
{getter public open {has-child?}:bool
{if (self.items.size>0) then
{return true}
else
{return false}
}
}
-----------------------------------------------------------
{size}´Â Çö ³ëµå°¡ °¡Áö°íÀÖ´Â ÇÏÀ§ ³ëµå °³¼ö¸¦ ±¸ÇÏ¿© ¹ÝÈ¯ÇØÁÝ´Ï´Ù.
itemsÀÇ data typeÀº ArrayÀÔ´Ï´Ù.
Array classÀÇ ¡°size¡± Accessor¸¦ »ç¿ëÇÏ¿©, ÀÌ ¹è¿ÀÌ ¸î °³¸¦ °¡Áö°í ÀÖ´ÂÁö °ªÀ» ±¸ÇØÁÝ´Ï´Ù.
{has-child?}´Â Çö ³ëµå°¡ child¸¦ °¡Áö°í ÀÖ´ÂÁö ¾ø´ÂÁö,
size¸¦ ÅëÇØ ÆÇº°ÇÏ¿© true/false¸¦ ¹Ýȯ½ÃÄÑÁÖ°í ÀÖ½À´Ï´Ù.
¡Ø tip :
setter, getter°¡ ÀÏ¹Ý ¸Þ¼Òµå¿Í ºñ±³ÇÏ¿© ´Ù¸¥ Á¡Àº ¸Þ¼Òµå°¡ ¾Æ´Ï¶ó Accessor¶ó´Â Á¡ÀÔ´Ï´Ù.
Ç¥±â ¹æ½ÄÀÌ Á¶±Ý ´Ù¸£´Ù´ÂÁ¡ ¿Ü¿¡ ¸Þ¼Òµå¿Í Å©°Ô ´Ù¸¥ Á¡Àº ¾ø´Ù´Â »ý°¢ÀÌ µì´Ï´Ù. ¾ÆÁ÷Àº¡¦¡¦
============================================================
method
-----------------------------------------------------------
{method public open {append tn:TTreeNode}:void
set tn.parent = self
{self.items.append tn}
}
-----------------------------------------------------------
Çö ³ëµå¿¡ ÇÏÀ§ ³ëµå¸¦ Ãß°¡½ÃŰ´Â ¸Þ¼ÒµåÀÔ´Ï´Ù. ³ëµå¸¦ Ãß°¡ÇÏ¿© items¿¡ ¹è¿·Î ÀúÀåÇÕ´Ï´Ù.
Çö ³ëµå´Â argument·Î ¹Þ¾ÆµéÀÎ ³ëµå(tn)ÀÇ »óÀ§³ëµå°¡ µÇ°í,
argument·Î ¹Þ¾ÆµéÀÎ ³ëµå(tn)´Â Çö ³ëµåÀÇ ÇÏÀ§ ³ëµå°¡ µË´Ï´Ù.
¾ð¶æ º¸¸é °°Àº ¸»À̰í, ½ÇÁ¦·Î set tn.parent = self ¸¦ ÁÖ¼® ó¸®ÇÏ¿©µµ °á°ú ȸéÀº °°°Ô ³ª¿É´Ï´Ù.
ÇÏÁö¸¸,
³»ºÎÀûÀ¸·Î »óÀ§³ëµå¿Í ÇÏÀ§³ëµå°£¿¡ ¼·Î ÂüÁ¶µÇ°í ÀÖ¾î¾ß Çϱ⠶§¹®¿¡,
µÎ ¹®ÀåÀº ¸ðµÎ ±â¼úµÇ¾î¾ß ÇÕ´Ï´Ù.
(2) TTreeControl class
- ³ëµåÀÇ »ý¼º°ú ȸé Ãâ·ÂÀ» ÇÏ´Â ¸Þ¼ÒµåµéÀÌ ÀÖ½À´Ï´Ù.
============================================================
»ý¼ºÀÚ(constructor)
-----------------------------------------------------------
{constructor public {default
tn : #TTreeNode = null,
...
}
set self.ftn = tn
{construct-super ...}
{self.refresh-controls}
{self.add self.fvb}
}
-----------------------------------------------------------
³ëµå¸¦ ¹Þ¾Æ ÇÒ´ç½Ã۰í,
»óÀ§ÀÇ Frame »ý¼ºÀÚ¸¦ È£ÃâÇÏ¿© FrameÀÇ ¸ðµç ±â´ÉµéÀ» »ç¿ëÇÒ ¼ö ÀÖ°ÔÇÕ´Ï´Ù.
±×¸®°í refresh-controls ¸Þ¼Òµå¸¦ È£ÃâÇÏ¿© ȸé Ãâ·ÂÀ» ÇÕ´Ï´Ù.
============================================================
ȸé Ãâ·Â ¸Þ¼Òµå
-----------------------------------------------------------
{method public open {refresh-controls}:void
{self.fvb.clear}
{if self.ftn != null then
{self.make-tree self.ftn, 0}
}
}
-----------------------------------------------------------
ÀÌ ¸Þ¼Òµå°¡ È£ÃâµÇ¸é ÇöÀç ȸéÀ» Áö¿ó´Ï´Ù.
±×¸®°í, ³ëµå°¡ NullÀÌ ¾Æ´Ï¸é,
make-tree ¸Þ¼Òµå¸¦ È£Ãâ, ÇöÀç ³ëµå¿Í µé¿©¾²±â°ª 0À» ÁÖ¾î, ³ëµå¸¦ ´Ù½Ã ¸¸µì´Ï´Ù.
============================================================
³ëµå »ý¼º ¸Þ¼Òµå (¼Ò½º°¡ ¸ÕÀú, ±× ¾Æ·¡°¡ ¼³¸íÀÔ´Ï´Ù.)
-----------------------------------------------------------
{method public open {make-tree tn : #TTreeNode, indent : int} : void
{if tn == null then
{return}
}
-----------------------------------------------------------
argument·Î ¹ÞÀº ³ëµå°¡ Null À̸é, ³ëµå¸¦ ´õÀÌ»ó ¸¸µéÁö ¾Ê°í, ÀÌ ÀÌÈÄ´Â ½ÇÇàÇÏÁö ¾Ê½À´Ï´Ù.
-----------------------------------------------------------
let fr : Frame = {Frame width=10px}
{if tn.has-child? then
{fr.add tn.status}
set fr.cursor=cursor-hand
{fr.add-event-handler
{on PointerPress do
{if tn.status=="+" then
set tn.status="-"
{self.refresh-controls}
elseif tn.status=="-" then
set tn.status="+"
{self.refresh-controls}
}
}
}
}
-----------------------------------------------------------
fr Àº "+ / - "¸¦ Ãâ·ÂÇϱâ À§ÇÑ ÇÁ·¹ÀÓÀÔ´Ï´Ù.
ÇÏÀ§ ³ëµå¸¦ °¡Áø °æ¿ì¿¡¸¸, ´ÙÀ½À» ¼öÇàÇÕ´Ï´Ù.
ÇÁ·¹ÀÓ(fr)¿¡ ¡°+ / -¡°¸¦ Ãß°¡ÇÕ´Ï´Ù.
ÇÁ·¹ÀÓ¿¡ ¸¶¿ì½º Æ÷ÀÎÅ͸¦ ¿Ã·ÈÀ» ¶§, È»ìÇ¥ ¸ð¾ç¿¡¼ ¼Õ°¡¶ô ¸ð¾çÀ¸·Î ¹Ù²Ù±â À§ÇÑ ¼³Á¤À» ÇÕ´Ï´Ù.
ÇÁ·¹ÀÓÀ» Ŭ¸¯ÇßÀ» ¶§, Áï, ¡°+ / -¡°¸¦ Ŭ¸¯ÇßÀ»¶§,
Æ®¸® ¸ð¾çÀÌ ¹Ù²î±â À§ÇØ, ÇÁ·¹ÀÓ¿¡ À̺¥Æ®¸¦ Ãß°¡ÇÕ´Ï´Ù.
¡°+¡± »óÅÂÀ϶§ Ŭ¸¯À» Çϸé, status¸¦ ¡°-¡°·Î ¹Ù²Ù°í,
ȸéÀ» ´Ù½Ã Ãâ·ÂÇϱâ À§ÇØ, refresh-controls ¸Þ¼Òµå¸¦ È£ÃâÇÕ´Ï´Ù.
¹Ý´ë·Î, ¡°-¡± »óÅÂÀ϶§ Ŭ¸¯À» Çϸé, status¸¦ ¡°+¡°·Î ¹Ù²Ù°í,
ȸéÀ» ´Ù½Ã Ãâ·ÂÇϱâ À§ÇØ, refresh-controls ¸Þ¼Òµå¸¦ È£ÃâÇÕ´Ï´Ù.
-----------------------------------------------------------
{self.fvb.add
{HBox
{Fill width=10px * indent},
fr,
tn.label
}
}
-----------------------------------------------------------
³ëµåÀÇ ·¹º§¿¡ µû¶ó µé¿©¾²±â¸¦ ÇÑ ÈÄ, ¡°+ / -¡°¸¦ Ãâ·ÂÇϰí, ³ëµå¸íÀ» Ãâ·ÂÇÕ´Ï´Ù.
³ëµåÀÇ ÇÏÀ§ ³ëµå°¡ ¾øÀ¸¸é ¡°+ / -¡°´Â Ãâ·ÂÀÌ µÇÁö ¾Ê½À´Ï´Ù.
-----------------------------------------------------------
{if tn.status == "-" then
{for i:int = 0 below tn.size do
let tn_temp:TTreeNode=tn.items[i]
{self.make-tree tn_temp, indent+1}
}
}
}
-----------------------------------------------------------
³ëµå°¡ È®ÀåµÈ "-" »óÅÂÀ̸é ÇÏÀ§ ³ëµå¸¦ ¸¸µé°í, "+" »óÅÂÀÌ¸é ¸¸µé Çʿ䰡 ¾ø½À´Ï´Ù.
Áï, ¡°+¡± »óÅÂÀ϶§´Â ȸé»ó¿¡ ÇÏÀ§ ³ëµå¸¦ Ãâ·ÂÇÏÁö ¾Ê½À´Ï´Ù.
¡°-¡°ÀÎ °æ¿ì¿¡¸¸ ±× ÇÏÀ§ ³ëµå¸¦ ¸¸µé°í, ȸ鿡 ÇÏÀ§ ³ëµå±îÁö ¸ðµÎ Ãâ·ÂÇÏ°Ô µË´Ï´Ù.
ȸé»ó¿¡ º¸ÀÌ´À³Ä, ¾È º¸ÀÌ´À³Ä¸¸ »ý°¢ÇÕ´Ï´Ù.
¡°-¡°ÀÎ È®ÀåµÈ »óÅÂÀϰæ¿ì, ÇÏÀ§ ³ëµå¸¦ Çϳª¾¿ °¡Á®¿Í Àӽú¯¼ö¿¡ ÇÒ´çÇϰí,
ÀÌ ³ëµå¿¡ ´ëÇØ¼ ´Ù½Ã make-tree ¸Þ¼Òµå¸¦ È£ÃâÇÕ´Ï´Ù.(Àç±ÍÈ£Ãâ)
(3) value
- ³ëµåµéÀ» »ý¼ºÇÏ¿© ȸ鿡 º¸¿©ÁÖ´Â ºÎºÐÀÔ´Ï´Ù.
============================================================
{value
let tn : TTreeNode = {TTreeNode "root"}
let tn2 : TTreeNode = {TTreeNode "CCC"}
{tn.append {TTreeNode "AAA" }}
{tn.append {TTreeNode "BBB" }}
{tn.append tn2}|| {TTreeNode "CCC" }
{tn2.append {TTreeNode "111" }}
{tn2.append {TTreeNode "222" }}
{HBox
{TTreeControl tn=tn,
width=100px, height=100px, background="beige"
}
}
}
-----------------------------------------------------------
³ëµå¸¦ »ý¼ºÇϴµ¥,
root ¾Æ·¡ ù¹øÂ° ³ëµå±îÁö´Â append ¸Þ¼Òµå¸¦ È£ÃâÇÏ¿© Ãß°¡ÇÏÁö¸¸,
¡°CCC¡±ÀÇ °æ¿ìó·³ ±× ¾Æ·¡ ¶Ç ³ëµå°¡ ÀÖ´Â °æ¿ì, ´Ù½Ã °´Ã¼¸¦ »ý¼ºÇÏ¿© Ãß°¡Çϰí ÀÖ½À´Ï´Ù.
´Ù¼Ò ºÒÆíÇÑ ¹æ¹ýÀÌÁö¸¸, ÀÌ ºÎºÐÀº ´ÙÀ½ °Á¿¡¼ °íÃÄÁý´Ï´Ù.
HBox ¾È¿¡´Â »ý¼ºµÈ ³ëµå¸¦ TreeControl¿¡ ³Ñ°ÜÁÖ°í ÀÖ½À´Ï´Ù.
-----------------------------------------------------------
½ÇÇàµÇ´Â ¼ø¼´Â (3)Value ºÎºÐºÎÅÍ ½ÃÀÛÇÏ¿© ´ÙÀ½°ú °°ÀÌ µË´Ï´Ù.
TTreeNode¸¦ »ý¼º -> TTreeControl¿¡ ³Ñ°ÜÁÖ°í -> TTreeControl »ý¼ºÀÚ ½ÇÇà -> ¡¦È£ÃâµÇ´Â ¸Þ¼Òµå¡¦.
±×·³, ´ÙÀ½ °Á¿¡¼ °è¼ÓÇϰڽÀ´Ï´Ù.
- 5th -
|
|
|