SqueakByExample:11.7

From 흡혈양파의 번역工房
Revision as of 05:08, 30 August 2012 by Onionmixer (talk | contribs)
Jump to navigation Jump to search

드레그 엔 드롭(Drag-and-drop)

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


Squeak comment.png먼저 수신자 모프(the receiver morph)를 정의합시다:


클래스 11.20: 우리가 다른 모프(morphs)를 드롭 할 수 있는 위치에서 모프를 정의하기

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


만약자 수신자 모프가 드롭된 모프를 수락 또는 접근 거부할 경우를, 우리는 어떤 결정을 해야합니까? 일반적으로, 두 경우의 모프 모두 상호작용(interaction)에 동의해야합니다. 수신자는 그러한 동의를 wantsDroppedMorph:event:에 응답함으로써 수행하며, 첫 번째 인수는 드롭된 모프이며, 두 번째 인수는 마우스 이벤트 이므로, 수신자는 동의할 수 있습니다. 예를 들어, 만약 modifier key가 드롭을 할 때 눌러져 있는지를 보아야 합니다. 드롭된 모프(dropped morph)는 또한 드롭되고 있는 모프는 또한 수신자가 드롭이 되고 있는 중인 것에 모프가 배치되는 것을 좋아하는지의 여부를 점검하고 볼 수 있는 기회를 부여 받습니다. 메시지 wantsToBeDroppedInto:는 수신자에 발송 되며, 이 메서드의 디폴트 실행은 (클래스 모프에서), true로 답변을 내놓습니다.


메서드 11.22: 모프의 색상에 기초하여, 드롭된 모프 수락하기

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


만약 수신 모프(the receiving morph)가 그것을 원하지 않을 때, 드롭된 모프에 어떤 현상이 생길까요? 이것에 대한 디폴트 동작은 아무것도 하지 않는 것이며, 곧 다시 말해 드롭된 모프는 수신 모프(the receiving)의 상단에 머무르며 그 수신 모프와 상호작용하지 않습니다. 드롭된 모프를 위한 좀더 직관적인 동작은 그 모프의 원래의 위치로 돌아가는 것입니다. 이 작업은 수신자가 드롭된 모프를 원하지 않을 때, 메시지 repelsMorph:event:에 true로 답변함으로써 수행될 수 있습니다.


메서드 11.23: 드롭된 모프가 거절 될 때 그 모프의 동작을 변경하기

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


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


Squeak comment.png워크스페이스에서 ReveiverMorph와 EllipseMorph의 인스턴스들을 만듭니다:

ReceiverMorph new openInWorld.
EllipseMorph new openInWorld.


수신자(the receiver)에 노랑 EllipseMorph를 드레그 엔 드롭합니다. 이것은 거부될 것이며 초기 위치로 다시 발송될 것입니다.


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


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


클래스 11.24 모프를 정의하면, 우리가 ReceiverMorph에 드레그 엔 드롭할 수 있습니다.

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


메서드 11.25: DroppedMorph 초기화 하기

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


지금 우리는 드롭된 모프가 수신자(the receiver)에 의해 거절 될 때, 드롭된 모프가 무엇인지를 지정할 수 있을 것입니다. 여기서 드롭된 모프는 마우스 포인터에 첨부되어 머무르게 될 것입니다:


메서드 11.26: 모프가 드롭 되었지만 거절되지 않았을 때, 반응하기

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


이벤트(event)에 hand 메시지를 발송하는 작업은, 마우스 포인터를 나타내는 HandMorph의 인스턴스인 hand와 그것이 쥐고 있는 모든 것으로 답변을 수행합니다. 여기서 우리는 World에게 hand가 거절된 모프(morph)인 self를 쥐어야 한다고 말합니다.


Squeak comment.pngDroppedMorph의 인스턴스들을 만들고, 수신자 위에 그 인스턴스들을 드레그 엔 드롭합니다.

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


녹색 모프가 거절되므로, 마우스 포인터에 첨부되어 머무르게 됩니다.

Notes