SqueakByExample:11.7: Difference between revisions

From 흡혈양파의 번역工房
Jump to navigation Jump to search
(SBE 드래그앤드롭 페이지 추가)
 
(번역수정)
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
==드레그 엔 드롭(Drag-and-drop)==
==드래그 앤 드롭(Drag-and-drop)==


Morphic은 또한 드레그 엔 드롭을 지원합니다. 두 개의 모프(morphs), 수신자(receive) 그리고 드롭된 모프(dopped morph)와 함께 단순한 예시를 점검해 봅시다. 수신자(receiver)는 드롭된 모프(dropped morph)가 주어진 조건을 부합되는 경우에만, 모프(morph)를 수락할 것입니다: 우리의 예시에서 모프(morph)는 반드시 파랑색이 되어야만 합니다. 만약 모프 수락이 거절되면, 드롭된 모프는 무엇을 해야할지를 결정합니다.
Morphic 은 이제까지 배운것 외에도 드래그 앤 드롭을 지원합니다.  




{{CommentSqueak|먼저 수신자 모프(the receiver morph)를 정의합시다:}}
수신자<sup>receiver</sup> 역할의 morph 와 내려놓아지는<sup>dropped</sup> 역할의 morph, 이 2 가지 객체에 대한 간단한 경우를 생각해 보겠습니다.
수신자는 내려놓은 morph 가 주어진 조건을 만족하는 경우에만 내려놓음<sup>drop</sup> 을 수락합니다: 이 예제에서 morph 는 파란색으로 하겠습니다. 수락이 거부되는경우, 내려놓아진 morph 가 뭘 할지도 결정하게 됩니다.




클래스 11.20: 우리가 다른 모프(morphs)드롭 할 수 있는 위치에서 모프를 정의하기
{{CommentSqueak|먼저 수신자 morph를 정의하십시오:}}
 
 
클래스 11.20: 다른 morph 내려놓을 수 있는 morph 를 정의하기
 
<syntaxhighlight lang="smalltalk">
<syntaxhighlight lang="smalltalk">
Morph subclass: #ReceiverMorph
Morph subclass: #ReceiverMorph
Line 13: Line 18:
   classVariableNames: ''
   classVariableNames: ''
   poolDictionaries: ''
   poolDictionaries: ''
   category: 'SBE--Morphic'
   category: 'SBE-Morphic'
</syntaxhighlight>
</syntaxhighlight>




{{CommentSqueak|지금 평상시의 방법으로 initialization 메소드를 정의하겠습니다:}}
{{CommentSqueak|늘 하던것처럼 initialization 메서드를 정의하십시오:}}
 


메서드 11.21: ReceiverMorph 의 초기화


메소드 11.21: ReceiverMorph 초기화 하기
<syntaxhighlight lang="smalltalk">
<syntaxhighlight lang="smalltalk">
ReceiverMorph»initialize
ReceiverMorph»initialize
Line 29: Line 35:




만약자 수신자 모프가 드롭된 모프를 수락 또는 접근 거부할 경우를, 우리는 어떤 결정을 해야합니까? 일반적으로, 두 경우의 모프 모두 상호작용(interaction)에 동의해야합니다. 수신자는 그러한 동의를 wantsDroppedMorph:event:에 응답함으로써 수행하며, 첫 번째 인수는 드롭된 모프이며, 두 번째 인수는 마우스 이벤트 이므로, 수신자는 동의할 수 있습니다. 예를 들어, 만약 modifier key가 드롭을 할 때 눌러져 있는지를 보아야 합니다. 드롭된 모프(dropped morph)또한 드롭되고 있는 모프는 또한 수신자가 드롭이 되고 있는 중인 것에 모프가 배치되는 것을 좋아하는지의 여부를 점검하고 볼 수 있는 기회를 부여 받습니다. 메시지 wantsToBeDroppedInto:는 수신자에 발송 되며, 메소드의 디폴트 실행은 (클래스 모프에서),  true로 답변을 내놓습니다.
만약 받는쪽의 morph 는 drop 에 대한 수락 또는 거부를 어떻게 판단할까요? 대부분의 경우, 받는쪽과 내려놓아지는쪽의 양쪽 morph 모두 drop 작업에 동의해야 합니다. drop 을 받는쪽은 wantsDroppedMorph:event: 메시지에 반응하는것으로 행동을 결정할 수 있으며, 이 경우 메시지의 첫번짜 인자는 내려놓아진 morph, 두번째 인자는 마우스 이벤트이므로 drop 을 받는객체는 이 상황에 대한 판단을 할 수 있습니다. 예를들어, 받는객체는 drop 시점에서 어떤 modifier key 가 눌려져 있는지를 조사할 수 있다는거죠. 내려놓아진 morph, 또는 내려놓아지는 과정에 있는 morph 는 수신객체가 drop 을 받는 시점에서 wantToBeDroppedInto: 메시지를 받았을때에 받는객체가 내가 원하는 객체인지 알아볼 수 있는 기회를 가지게 됩니다. wantToBeDroppedInto: 메서드의 기본값(값은 Morph 클래스에 정의되어있습니다)으로 true 를 반환합니다.




메소드 11.22: 모프의 색상에 기초하여, 드롭된 모프 수락하기
메서드 11.22: morph 의 색상을 기준하여, 내려놓아진 morph 를 수락하기
<syntaxhighlight lang="smalltalk">
<syntaxhighlight lang="smalltalk">
ReceiverMorph»wantsDroppedMorph: aMorph event: anEvent
ReceiverMorph»wantsDroppedMorph: aMorph event: anEvent
Line 39: Line 45:
   
   


만약 수신 모프(the receiving morph)그것을 원하지 않을 때, 드롭된 모프에 어떤 현상이 생길까요? 이것에 대한 디폴트 동작은 아무것도 하지 않는 것이며, 곧 다시 말해 드롭된 모프는 수신 모프(the receiving)의 상단에 머무르며 그 수신 모프와 상호작용하지 않습니다. 드롭된 모프를 위한 좀더 직관적인 동작은 그 모프의 원래의 위치로 돌아가는 것입니다. 작업은 수신자가 드롭된 모프를 원하지 않을 때, 메시지 repelsMorph:event:에 true로 답변함으로써 수행될 수 있습니다.  
만약 받는 morph 가 떨어진 morph 를 원하지 않는 다면, 내려놓아진 morph 에는 어떤일이 일어날까요? 이 경우에 대한 기본동작은 아무것도 하지 않는 것으로 되어있으며, 이것은 내려놓아진 morph 가 받는 morph 상단에 위치하며 받는 모프와 상호작용은 하지 않는다는것을 의미합니다. 내려놓아진 morph 에 대한 좀 더 직관적인 동작은 해당되는 morph 의 드래그 이전, 원래의 위치로 돌아가는 것입니다. 이렇게 원래위치로 되돌아가는 작업은 수신객체가 내려놓아진 morph 를 원하지 않을 때, 메시지 repelsMorph:event: 에 true 로 답변할때 진행됩니다.




메소드 11.23: 드롭된 모프가 거절 될 때 그 모프의 동작을 변경하기
메서드 11.23: 내려놓아진 morph 가 거절 될 때 해당되는 morph 의 동작을 변경하기
 
<syntaxhighlight lang="smalltalk">
<syntaxhighlight lang="smalltalk">
ReceiverMorph»repelsMorph: aMorph event: ev
ReceiverMorph>>repelsMorph: aMorph event: ev
   ↑ (self wantsDroppedMorph: aMorph event: ev) not
   ↑ (self wantsDroppedMorph: aMorph event: ev) not
</syntaxhighlight>
</syntaxhighlight>




여기까지가 수신자에 관한 우리가 알아야 할 필요가 있는 모든 내용입니다.  
여기까지가, 수신객체에 대해 알아야할 모든 내용입니다.  
 


{{CommentSqueak|워크스페이스에서 ReveiverMorph 와 EllipseMorph 의 인스턴스를 생성해주세요:}}


{{CommentSqueak|워크스페이스에서 ReveiverMorph와 EllipseMorph의 인스턴스들을 만듭니다:}}
<syntaxhighlight lang="smalltalk">
<syntaxhighlight lang="smalltalk">
ReceiverMorph new openInWorld.
ReceiverMorph new openInWorld.
Line 59: Line 67:




수신자(the receiver)에 노랑 '''EllipseMorph'''를 드레그 엔 드롭합니다. 이것은 거부될 것이며 초기 위치로 다시 발송될 것입니다.
수신객체에 노란색의 '''EllipseMorph''' 를 드래그 앤 드롭합니다. 이 작업은 거부될 것이며 떨어뜨려진 객체는 초기 위치로 다시 이동되겠죠.
 


{{CommentSqueak|이 동작을 변경 하기 위해, Inspector 를 사용하여 타원 morph 의 색상을 변경하십시오. 파랑 모프는 반드시 {{Template:HighlightBold|ReceiverMorph}} 에 대해서는 수락되어야만 합니다.}}


{{CommentSqueak|이 동작 변경을 하기 위해, 인스펙터(inspector)를 사용하여 타원 모프(ellipse morph)의 색상을 변경합니다. 파랑 모프(Blue morphs)는 반드시 {{Template:HighlightBold|ReceiverMorph}}에 의해 수락되어야만 합니다.}}


DroppedMorph 라는 이름을 가진 Morph 클래스의 특별한 서브클래스를 만들고, 이것을 이용해서 좀 더 많은 실험을 해보도록 하겠습니다:


DroppedMorph로 작명한 모프의 특정 클래스를 만들면, 우리가 좀더 실험을 할 수 있습니다:


클래스 11.24: ReceiverMorph 에 드래그 앤 드롭을 할 수 있도록 morph 를 정의하겠습니다.


클래스 11.24 모프를 정의하면, 우리가 ReceiverMorph에 드레그 엔 드롭할 수 있습니다.
<syntaxhighlight lang="smalltalk">
<syntaxhighlight lang="smalltalk">
Morph subclass: #DroppedMorph
Morph subclass: #DroppedMorph
Line 74: Line 83:
   classVariableNames: ''
   classVariableNames: ''
   poolDictionaries: ''
   poolDictionaries: ''
   category: 'SBE--Morphic'
   category: 'SBE-Morphic'
</syntaxhighlight>
</syntaxhighlight>




메소드 11.25: DroppedMorph 초기화 하기
메서드 11.25: DroppedMorph 초기화 하기
 
<syntaxhighlight lang="smalltalk">
<syntaxhighlight lang="smalltalk">
DroppedMorph»initialize
DroppedMorph>>initialize
   super initialize.
   super initialize.
   color := Color blue.
   color := Color blue.
Line 87: Line 97:




지금 우리는 드롭된 모프가 수신자(the receiver)에 의해 거절 될 때, 드롭된 모프가 무엇인지를 지정할 있을 것입니다. 여기서 드롭된 모프는 마우스 포인터에 첨부되어 머무르게 될 것입니다:
떨어지게된 morph 가 받는객체에서 거절될때, 해야할 작업을 설정할 있습니다. 여기서, morph 는 마우스 포인터에 달려있게 될겁니다"
 


메서드 11.26: 모프를 내려다 놓았지만, 거절되지 않았다면 반응하기


메소드 11.26: 모프가 드롭 되었지만 거절되지 않았을 때, 반응하기
<syntaxhighlight lang="smalltalk">
<syntaxhighlight lang="smalltalk">
DroppedMorph»rejectDropMorphEvent: anEvent
DroppedMorph»rejectDropMorphEvent: anEvent
Line 101: Line 112:




이벤트(event)에 hand 메시지를 발송하는 작업은, 마우스 포인터를 나타내는 HandMorph의 인스턴스인 hand와 그것이 쥐고 있는 모든 것으로 답변을 수행합니다. 여기서 우리는 World에게 hand가 거절된 모프(morph)self를 쥐어야 한다고 말합니다.  
이벤트에 hand 메세지를 보내면, HangMorph 의 인스턴스인 hand 를 반환하며, 이 객체는 마우스 포인터를 나타내고있고, 마우스 포인터에 대한건 뭐든지 가지고 있습니다. 여기서 drop 이 거부된 morph 인 self 를 잡고있어야 한다고 world 에게 지시하고 있죠.
 


{{CommentSqueak|DroppedMorph의 인스턴스들을 만들고, 수신자 위에 해당 인스턴스들을 끌어다 놓으십시오.}}


{{CommentSqueak|DroppedMorph의 인스턴스들을 만들고, 수신자 위에 그 인스턴스들을 드레그 엔 드롭합니다.}}
<syntaxhighlight lang="smalltalk">
<syntaxhighlight lang="smalltalk">
ReceiverMorph new openInWorld.
ReceiverMorph new openInWorld.
Line 112: Line 124:




녹색 모프가 거절되므로, 마우스 포인터에 첨부되어 머무르게 됩니다.
녹색의 morph 는 거절되었으므로, 마우스 포인터에 잡혀있게 됩니다..
 
 


==Notes==
==Notes==

Latest revision as of 09:06, 15 September 2013

드래그 앤 드롭(Drag-and-drop)

Morphic 은 이제까지 배운것 외에도 드래그 앤 드롭을 지원합니다.


수신자receiver 역할의 morph 와 내려놓아지는dropped 역할의 morph, 이 2 가지 객체에 대한 간단한 경우를 생각해 보겠습니다. 수신자는 내려놓은 morph 가 주어진 조건을 만족하는 경우에만 내려놓음drop 을 수락합니다: 이 예제에서 morph 는 파란색으로 하겠습니다. 수락이 거부되는경우, 내려놓아진 morph 가 뭘 할지도 결정하게 됩니다.


Squeak comment.png먼저 수신자 morph를 정의하십시오:


클래스 11.20: 다른 morph 를 내려놓을 수 있는 morph 를 정의하기

Morph subclass: #ReceiverMorph
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
  category: 'SBE-Morphic'


Squeak comment.png늘 하던것처럼 initialization 메서드를 정의하십시오:


메서드 11.21: ReceiverMorph 의 초기화

ReceiverMorph»initialize
  super initialize.
  color := Color red.
  bounds := 0 @ 0 extent: 200 @ 200


만약 받는쪽의 morph 는 drop 에 대한 수락 또는 거부를 어떻게 판단할까요? 대부분의 경우, 받는쪽과 내려놓아지는쪽의 양쪽 morph 모두 drop 작업에 동의해야 합니다. drop 을 받는쪽은 wantsDroppedMorph:event: 메시지에 반응하는것으로 행동을 결정할 수 있으며, 이 경우 메시지의 첫번짜 인자는 내려놓아진 morph, 두번째 인자는 마우스 이벤트이므로 drop 을 받는객체는 이 상황에 대한 판단을 할 수 있습니다. 예를들어, 받는객체는 drop 시점에서 어떤 modifier key 가 눌려져 있는지를 조사할 수 있다는거죠. 내려놓아진 morph, 또는 내려놓아지는 과정에 있는 morph 는 수신객체가 drop 을 받는 시점에서 wantToBeDroppedInto: 메시지를 받았을때에 받는객체가 내가 원하는 객체인지 알아볼 수 있는 기회를 가지게 됩니다. wantToBeDroppedInto: 메서드의 기본값(이 값은 Morph 클래스에 정의되어있습니다)으로 true 를 반환합니다.


메서드 11.22: morph 의 색상을 기준하여, 내려놓아진 morph 를 수락하기

ReceiverMorph»wantsDroppedMorph: aMorph event: anEvent
   aMorph color = Color blue


만약 받는 morph 가 떨어진 morph 를 원하지 않는 다면, 내려놓아진 morph 에는 어떤일이 일어날까요? 이 경우에 대한 기본동작은 아무것도 하지 않는 것으로 되어있으며, 이것은 내려놓아진 morph 가 받는 morph 상단에 위치하며 받는 모프와 상호작용은 하지 않는다는것을 의미합니다. 내려놓아진 morph 에 대한 좀 더 직관적인 동작은 해당되는 morph 의 드래그 이전, 원래의 위치로 돌아가는 것입니다. 이렇게 원래위치로 되돌아가는 작업은 수신객체가 내려놓아진 morph 를 원하지 않을 때, 메시지 repelsMorph:event: 에 true 로 답변할때 진행됩니다.


메서드 11.23: 내려놓아진 morph 가 거절 될 때 해당되는 morph 의 동작을 변경하기

ReceiverMorph>>repelsMorph: aMorph event: ev
   (self wantsDroppedMorph: aMorph event: ev) not


여기까지가, 수신객체에 대해 알아야할 모든 내용입니다.


Squeak comment.png워크스페이스에서 ReveiverMorph 와 EllipseMorph 의 인스턴스를 생성해주세요:

ReceiverMorph new openInWorld.
EllipseMorph new openInWorld.


수신객체에 노란색의 EllipseMorph 를 드래그 앤 드롭합니다. 이 작업은 거부될 것이며 떨어뜨려진 객체는 초기 위치로 다시 이동되겠죠.


Squeak comment.png이 동작을 변경 하기 위해, Inspector 를 사용하여 타원 morph 의 색상을 변경하십시오. 파랑 모프는 반드시 ReceiverMorph 에 대해서는 수락되어야만 합니다.


DroppedMorph 라는 이름을 가진 Morph 클래스의 특별한 서브클래스를 만들고, 이것을 이용해서 좀 더 많은 실험을 해보도록 하겠습니다:


클래스 11.24: ReceiverMorph 에 드래그 앤 드롭을 할 수 있도록 morph 를 정의하겠습니다.

Morph subclass: #DroppedMorph
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
  category: 'SBE-Morphic'


메서드 11.25: DroppedMorph 초기화 하기

DroppedMorph>>initialize
  super initialize.
  color := Color blue.
  self position: 250@100


떨어지게된 morph 가 받는객체에서 거절될때, 해야할 작업을 설정할 수 있습니다. 여기서, morph 는 마우스 포인터에 달려있게 될겁니다"


메서드 11.26: 모프를 내려다 놓았지만, 거절되지 않았다면 반응하기

DroppedMorph»rejectDropMorphEvent: anEvent
  |h|
  h := anEvent hand.
  WorldState
    addDeferredUIMessage: [h grabMorph: self].
  anEvent wasHandled: true


이벤트에 hand 메세지를 보내면, HangMorph 의 인스턴스인 hand 를 반환하며, 이 객체는 마우스 포인터를 나타내고있고, 마우스 포인터에 대한건 뭐든지 가지고 있습니다. 여기서 drop 이 거부된 morph 인 self 를 잡고있어야 한다고 world 에게 지시하고 있죠.


Squeak comment.pngDroppedMorph의 인스턴스들을 만들고, 수신자 위에 해당 인스턴스들을 끌어다 놓으십시오.

ReceiverMorph new openInWorld.
(DroppedMorph new color: Color blue) openInWorld.
(DroppedMorph new color: Color green) openInWorld.


녹색의 morph 는 거절되었으므로, 마우스 포인터에 잡혀있게 됩니다..


Notes