# Class: SelectionModel

## Core.Annotations. SelectionModel

Represents a class that contains information about how an annotation should behave when selected.

#### new SelectionModel(annotation, canModify, isSelected, docViewer)

  Create a new selection model.

  ##### Parameters:

  Name | Type | Description
  --- | --- | ---
  `annotation` | Core.Annotations.Annotation | The annotation selected
  `canModify` | boolean | Modification of the annotation is allowed
  `isSelected` | boolean | The annotation is already selected
  `docViewer` | Core.DocumentViewer | An instance of DocumentViewer.

### Members

#### <static> defaultNoPermissionSelectionOutlineColor

  Defines the default color for the annotation selection outline when the user is not permitted to make modifications.

  ##### Type:

  - Core.Annotations.Color

#### <static> defaultSelectionOutlineColor

  Defines the default color for the annotation selection outline.

  ##### Type:

  - Core.Annotations.Color

#### <static> selectionAccuracyPadding

  Defines padding for selection accuracy. Default is 2. Increase this value to make selection more forgiving.

  ##### Type:

  - number

#### <static> selectionOutlineDashSize

  Defines the dash size for the selection outline. Default is 4;

  ##### Type:

  - number

#### <static> selectionOutlineExtraPadding

  Defines the default padding between selection control points. The padding only appears when the control points are too close.

  ##### Type:

  - number

#### <static> selectionOutlineThickness

  Defines thickness of the annotation selection outline. Default is 1.

  ##### Type:

  - number

#### <static> showPaddingWhenAnnotationIsSmall

  Defines if extra padding should be shown when the selected annotation is too small. Default is true.

  ##### Type:

  - boolean

#### <static> useDashedLine

  Defines if a dashed line style should be used for the selection outline. Default is false.

  ##### Type:

  - boolean

### Methods

#### <static> setCustomHandlers(selectionModelClass, selectionModelCustomHandlers)

  Overwrites the functions in SelectionModel(ex: drawSelectionOutline, getDimensions, testSelection).

  ##### Parameters:

  Name | Type | Description
  --- | --- | ---
  `selectionModelClass` | Core.Annotations.SelectionModel | The class (constructor) of the selectionModel
  `selectionModelCustomHandlers` | Core.Annotations.SelectionModel.SelectionModelCustomHandlers | An object containing multiple handlers to overwrite functions on a SelectionModel.

  ##### Example

      const { Annotations } = instance.Core;
      const { SelectionModel, BoxSelectionModel } = Annotations;
      SelectionModel.setCustomHandlers(BoxSelectionModel, {
        // draws a diagonal dashed along across the middle of the selected annotation
         drawSelectionOutline(ctx, annotation, zoom, pageMatrix, { selectionModel, originalDrawSelectionOutline }) {
           if (!(annotation instanceof Annotations.RectangleAnnotation)) {
               originalDrawSelectionOutline(ctx, annotation, zoom, pageMatrix);
               return;
             }
            if (typeof zoom !== 'undefined') {
               ctx.lineWidth = SelectionModel.selectionOutlineThickness / zoom;
             } else {
               ctx.lineWidth = SelectionModel.selectionOutlineThickness;
             }
             if (selectionModel.canModify()) {
               ctx.strokeStyle = SelectionModel.defaultSelectionOutlineColor.toString();
             } else {
               ctx.strokeStyle = SelectionModel.defaultNoPermissionSelectionOutlineColor.toString();
             }
             ctx.beginPath();
             ctx.moveTo(annotation.X, annotation.Y);
             ctx.lineTo(annotation.X + annotation.Width, annotation.Y + annotation.Height);
             ctx.closePath();
             ctx.stroke();
             const dashUnit = SelectionModel.selectionOutlineDashSize / zoom;
             const sequence = [dashUnit, dashUnit];
             ctx.setLineDash(sequence);
             ctx.strokeStyle = 'rgb(255, 255, 255)';
             ctx.stroke();
           },
          // Get the dimension that is extended by 8 both horizontally and vertically
          getDimensions(annotation, { selectionModel, originalGetDimensions }) {
           if (!(annotation instanceof Annotations.RectangleAnnotation)) {
              return originalGetDimensions(annotation);
           }
           const x = annotation.X - 4;
           const y = annotation.Y - 4;
           const width = annotation.Width + 2 * 4;
           const height = annotation.Height + 2 * 4;
           return new Annotations.Rect(x, y, x + width, y + height);
          },
          testSelection(annotation, x, y, pageMatrix, zoom, rotation, { selectionModel, originalTestSelection }) {
            if (annotation instanceof Annotations.RectangleAnnotation) {
              return originalTestSelection(annotation, x, y, pageMatrix, zoom, rotation);;
            }
            return Annotations.SelectionAlgorithm.boundingRectTest(annotation, x, y, zoom);
          }
      })

#### canModify()

  Indicates that the associated annotation is able to be modified

  ##### Returns:

  Type
    boolean

#### drawSelectionOutline(ctx, annotation, zoom)

  Draws the selection outline of the annotation. By default, a rectangle is drawn based on the annotations x, y, width and height.

  ##### Parameters:

  Name | Type | Description
  --- | --- | ---
  `ctx` | CanvasRenderingContext2D |
  `annotation` | Core.Annotations.Annotation |
  `zoom` | number |

#### getControlHandles()

  Returns the ControlHandle objects associated with this selection model.

  ##### Returns:

  An array of ControlHandleObject
  Type
    Array.<Core.Annotations.ControlHandle>

#### getDimensions(annotation)

  Gets the dimensions {x, y, width, height} of the selection bounding box. It may be different from the annotation's bounding box. e.g. The selection bounding box may have a padding.

  ##### Parameters:

  Name | Type | Description
  --- | --- | ---
  `annotation` | Core.Annotations.Annotation |

  ##### Returns:

  Type
    Core.Math.Rect

#### isSelected()

  Indicates that the associated annotation is already selected. This can be useful to implement different selection behaviors when an annotation is selected.

  ##### Returns:

  Type
    boolean

#### testControlHandles(annotation, zoom, x, y)

  Hit detection for each control handle.

  ##### Parameters:

  Name | Type | Description
  --- | --- | ---
  `annotation` | Core.Annotations.Annotation |
  `zoom` | number |
  `x` | number |
  `y` | number |

  ##### Returns:

  The control handle that was hit
  Type
    Core.Annotations.ControlHandle

#### testSelection(annotation, x, y, pageMatrix, zoom, rotation)

  Determines if the provided point is a hit on the selected annotationhandle. * See Core.Annotations.SelectionAlgorithm for usuable selection algorithms.

  ##### Parameters:

  Name | Type | Description
  --- | --- | ---
  `annotation` | Core.Annotations.Annotation | the annotation
  `x` | number | the x-coordinate of the point to test, in page coordinates
  `y` | number | the y-coordinate of the point to test, in page coordinates
  `pageMatrix` | object | the page matrix of the page the annotation is on
  `zoom` | number | the zoom level of the page the annotation is on
  `rotation` | Core.PageRotation | the rotation of the page the annotation is on

  ##### Returns:

  true if the provided point is a hit
  Type
    boolean

### Type Definitions

#### CustomDrawSelectionOutlineHandler(ctx, annotation, zoom, pageMatrix, options)

  Callback that gets passed to drawSelectionOutlineHandler in setCustomHandlers.

  ##### Parameters:

  Name | Type | Description
  --- | --- | ---
  `ctx` | CanvasRenderingContext2D | A canvas context
  `annotation` | Core.Annotations.Annotation | The annotation being selected
  `zoom` | number | the current zoom level of the document
  `pageMatrix` | object | The transformation matrix for the page that the annotation is on
  `options` | object | Additional options and parameters ###### Properties
  Name | Type | Description
  --- | --- | ---
  `selectionModel` | Core.Annotations.SelectionModel | The selection model of the annotation which is currently selected.
  `originalDrawSelectionOutline` | function | The original draw function of this selection model

#### CustomGetDimensionsHandler(annotation, selectionBox, zoom, options)

  Callback that gets passed to getDimensionsHandler in setCustomHandlers.

  ##### Parameters:

  Name | Type | Description
  --- | --- | ---
  `annotation` | Core.Annotations.Annotation | The annotation being selected
  `selectionBox` | Core.Math.Rect |
  `zoom` | number | the current zoom level of the document
  `options` | object | Optional options ###### Properties
  Name | Type | Description
  --- | --- | ---
  `selectionModel` | Core.Annotations.SelectionModel | The selection model of the annotation which is currently selected.
  `originalGetDimensions` | function | The original getDimensions function of this selection model

  ##### Returns:

  Type
    Core.Math.Rect

#### CustomTestSelectionHandler(x, y, pageMatrix, zoom, rotation, options)

  Callback that gets passed to testSelectionHandler in setCustomHandlers.

  ##### Parameters:

  Name | Type | Description
  --- | --- | ---
  `x` | number | The x-coordinate of the point to test, in page coordinates
  `y` | number | The y-coordinate of the point to test, in page coordinates
  `pageMatrix` | object | the page matrix of the page the annotation is on
  `zoom` | number | The zoom level of the page the annotation is on
  `rotation` | Core.PageRotation | The rotation of the page the annotation is on
  `options` | object | Optional options ###### Properties
  Name | Type | Description
  --- | --- | ---
  `selectionModel` | Core.Annotations.SelectionModel | The selection model of the annotation which is currently selected.
  `originalTestSelection` | function | The original draw function of this selection model

  ##### Returns:

  Type
    boolean

#### SelectionModelCustomHandlers

  A collection of functions that overwrite the original functions in SelectionModel

  ##### Type:

  - object

  ##### Properties:

  Name | Type | Argument | Description
  --- | --- | --- | ---
  `drawSelectionOutline` | Core.Annotations.SelectionModel.CustomDrawSelectionOutlineHandler | <optional> | Changes how a selection model is drawn within WebViewer.
  `getDimensions` | Core.Annotations.SelectionModel.CustomGetDimensionsHandler | <optional> | Gets the rect of the selection bounding box.
  `testSelection` | Core.Annotations.SelectionModel.CustomTestSelectionHandler | <optional> | Determines if the provided point is a hit on the selected annotation handle.

#### Search results