This topic describes how to create a custom event handler class to handle events in an ENVIView. You may find it more convenient to create a single class to hold all of your event handlers as opposed to writing separate functions for each type of event (mouse, keyboard, etc.) throughout your code. Just set the EVENT_HANDLER property of ENVIView to the name of the event handler class.

Syntax


The event handler class can contain any combination of the following methods:

Result = ENVIView.MouseDown(View, X, Y, Button, KeyMods, Clicks)

Result = ENVIView.MouseMotion(View, X, Y, KeyMods)

Result = ENVIView.MouseUp(View, X, Y, Button)

Result = ENVIView.MouseWheel(View, X, Y, Delta, KeyMods)

Result = ENVIView.KeyHandler(View, IsASCII, Character, KeyValue, X, Y, Press, Release, KeyMods)

Result = ENVIView.SelectChange(View, Graphic, Mode, WasSelected)

Arguments


View

A reference to an ENVIView object in which the mouse event occurred.

X

The x-coordinate location of the mouse cursor (in device coordinates) at the time of the event.

Y

The y-coordinate location of the mouse cursor (in device coordinates) at the time of the event.

Button

The value of the clicked mouse button. Possible values are:

  • 1: Left
  • 2: Middle
  • 4: Right

Character

If the IsASCII argument is a non-zero value, Character is set to a byte value corresponding to the ASCII character of the pressed key. Otherwise, it is set to 0.

Clicks

A value indicating how many button clicks occurred:

  • 1: Single click
  • 2: Double click

Delta

A value indicating the direction and number of movements of the mouse wheel. Pushing the wheel forward generates positive values, while pulling it backward generates negative values. The magnitude of the value depends on the device setting for the individual mouse, but it is usually limited to small integer values such as +1, -1, +2, -2, etc.

Graphic

The graphic to be selected or un-selected.

IsASCII

A byte value that indicates whether the keyboard event corresponds to an ASCII character. If it is a non-zero value, the Character argument is set to a byte value corresponding to the character of the ASCII pressed key. If it is 0, the KeyValue argument is set to a numeric value indicating the pressed key.

KeyMods

A bitwise mask value indicating which modifier keys are active at the time the mouse event happens:

  • 1: Shift
  • 2: Control
  • 4: Caps Lock
  • 8: Alt

KeyValue

If the IsASCII argument is set to 0, KeyValue is set to a value that indicates the pressed key. Otherwise, it is set to 0. The possible values are:

  • 1: Shift
  • 2: Control
  • 3: Caps Lock
  • 4: Alt
  • 5: Left
  • 6: Right
  • 7: Up
  • 8: Down
  • 9: Page Up
  • 10: Page Down
  • 11: Home
  • 12: End

Note: On East Asian (Chinese, Japanese, Korean) localized Windows operating systems with an Asian language pack installed, characters entered in the Windows Input Method Manager (IMM) composition window are returned in the KeyValue argument as unsigned integers representing a Wide character (Unicode value). The IDL I18N_WIDECHARTOMULTIBYTE routine can convert these characters to multi-byte strings. For more information, see "Internationalizing Code" in the IDL Help.

Mode

A value representing the mode used for the current selection. Possible values are:

  • 0: Unselect
  • 1: Select
  • 2: Toggled selection
  • 3: Additive

Press

A value indicating that this event represents a key press. This argument is non-zero if the event is a result of pressing the key.

Release

A value indicating that this event represents a key release. This argument is non-zero if the event is a result of releasing the key.

WasSelected

A value of 1 indicates an item was selected prior to the event; a value of 0 indicates an item was not selected.

Example


The following example shows how to create a custom event handler that contains the keyboard and selection change handler code examples in one program.

Copy and paste the following code to a file named ExampleAPIEventsClass.pro, compile it, then run it.

FUNCTION ExampleAPIEventsClass::KeyHandler, View, $
  IsASCII, Character, KeyValue, X, Y, Press, Release, KeyMods
  IF IsASCII && Press THEN BEGIN
    CASE STRING(Character) of
      'z': view.Zoom
      'Z': view.Zoom, /OUT
      ELSE:
     ENDCASE
  ENDIF
  RETURN, 0 ; Skip default event handling
END
 
FUNCTION ExampleAPIEventsClass::SelectChange, View, $
  graphic, mode, isSelected
  IF ISA(graphic) && ISA(graphic, 'ENVIRASTERLAYER') && ~isSelected THEN BEGIN
    View.ClearSnailTrail
  ENDIF
  RETURN, 1 ; Perform default event handling
END
 
PRO ExampleAPIEventsClass__define
  ; Subclass from GraphicsEventAdapter.
  void = {ExampleAPIEventsClass, INHERITS GraphicsEventAdapter, $
    X0: 0, Y0:0, BUTTONDOWN:0, POLY:OBJ_NEW()}
END
 
PRO ExampleAPIEventsClass
  ; Launch the application
  e = ENVI()
  
  ; Open an image file
  file = FILEPATH('qb_boulder_msi', ROOT_DIR=e.ROOT_DIR, $
    SUBDIRECTORY = ['data'])
  raster = e.OpenRaster(file)
 
  ; Create two layers
  view1 = e.GetView()
  v1layer1 = view1.CreateLayer(raster)
  v1layer2 = view1.CreateLayer(raster, /CIR)
  view1.SHOW_OVERVIEW = 1
  view1.SHOW_SNAIL_TRAIL = 1
 
  ; Create two layers in another view in opposite order
  view2 = e.CreateView()
  v2layer1 = view2.CreateLayer(raster, /CIR)
  v2layer2 = view2.CreateLayer(raster)
  view2.SHOW_OVERVIEW = 1
  view2.SHOW_SNAIL_TRAIL = 1
 
  ; This example uses the same event handler for both views, but
  ; you may have cases when you want to use different event handlers
  ; for different views.
  eventHandler = obj_new('ExampleAPIEventsClass')
  view1.SetProperty, EVENT_HANDLER=eventHandler
  view2.SetProperty, EVENT_HANDLER=eventHandler
END