This example shows how to create a class that derives from ImageViewerInteractiveMode to implement rotation when the user clicks and drags the viewer.
example.html
<!DOCTYPE html><html><head><title>Rotate Interactive Mode</title><link href="example.css" rel="stylesheet" type="text/css" /><script type="text/javascript" src="Leadtools.js"></script><script type="text/javascript" src="Leadtools.Controls.js"></script><script type="text/javascript" src="example.js"></script></head><body onload="run()"><div id="controlsDiv"><div><label for="interactiveModeSelect">Interactive mode:</label><select id="interactiveModeSelect"><option>PanZoom</option><option>Rotate</option></select><input id="testButton" type="button" value="Test" /></div></div><div><textarea name="debugTextArea" cols="80" rows="10"></textarea><input type="button" id="debugClearButton" value="Clear" /></div><div id="imageViewerDiv" /></body></html>
example.css
html, body{margin: 0px;padding: 0px;min-height: 100%;height: 100%;overflow: hidden;overflow: hidden;background: white;font-family: helvetica;font-size: 10pt;-ms-touch-action: none;-webkit-user-select: none;-webkit-text-size-adjust: none;}#imageViewerDiv{border: 1px solid #000000;background-color: #7F7F7F;width: 400px;height: 400px;}
example.js
'use strict';// Registers our namespaceType.registerNamespace('demo');// RotateInteractiveModeEventArgs begin// Data for our custom event// ctordemo.RotateInteractiveModeEventArgs = function demo_RotateInteractiveModeEventArgs(rotateAngle) {// Since we are deriving from a LEADTOOLS type, we need to call initializeBasedemo.RotateInteractiveModeEventArgs.initializeBase(this);this._rotateAngle = rotateAngle;}demo.RotateInteractiveModeEventArgs.prototype = {// function to return the rotate angleget_rotateAngle: function () {return this._rotateAngle;}};// Define our propertiesObject.defineProperty(demo.RotateInteractiveModeEventArgs.prototype, 'rotateAngle', { get: demo.RotateInteractiveModeEventArgs.prototype.get_rotateAngle, enumerable: true, configurable: true });// Register this classdemo.RotateInteractiveModeEventArgs.registerClass('demo.RotateInteractiveModeEventArgs', lt.LeadEventArgs);// RotateInteractiveModeEventArgs end// RotateInteractiveMode begin// Class that derives from a LEADTOOLS lt.Controls.ImageViewerInteractiveMode classdemo.RotateInteractiveMode = function demo_RotateInteractiveMode() {demo.RotateInteractiveMode.initializeBase(this);// Create our eventthis._rotate = lt.LeadEvent.create(this, 'rotate');// Event handlersthis._dragStartedHandler = null;this._dragDeltaHandler = null;this._dragCompletedHandler = null;}demo.RotateInteractiveMode.prototype = {// We must provide an implementation for nameget_name: function () {return 'Rotate';},// Our eventget_rotate: function () {return this._rotate;},// Called when the mode is started// This is an overridden methodstart: function (viewer) {// Call the base class start methoddemo.RotateInteractiveMode.callBaseMethod(this, 'start', [viewer]);// Subscribe to the dragStarted, dragDelta and dragCompleted eventsvar service = this.interactiveService;var _this = this;this._dragStartedHandler = service.dragStarted.add(function (sender, e) {_this.dragStarted(sender, e);});this._dragDeltaHandler = service.dragDelta.add(function (sender, e) {_this.dragDelta(sender, e);});this._dragCompletedHandler = service.dragCompleted.add(function (sender, e) {_this.dragCompleted(sender, e);});},// Called when the mode is stoppedstop: function (viewer) {// Check if we have startedif (this.isStarted) {// Unsubscribe from the eventsvar service = this.interactiveService;service.dragStarted.remove(this._dragStartedHandler);service.dragDelta.remove(this._dragDeltaHandler);service.dragCompleted.remove(this._dragCompletedHandler);// Call the base class stop methoddemo.RotateInteractiveMode.callBaseMethod(this, 'stop', [viewer]);}},// Called when the user starts a drag operationdragStarted: function (sender, e) {// This will check if the mouse button (if any) is correct and if we are on top of the imageif (this.canStartWork(e)) {// Inform whoever is listening that we have started workingthis.onWorkStarted(lt.LeadEventArgs.empty);}},// Called when the user is draggingdragDelta: function (sender, e) {// If we are not working (for example, the user has clicked the mouse outside the image) then// nothing to doif (!this.isWorking) {return;}// Perform our operation. Get the change of the drag then increase// or decrease the current rotation angle depending on the directionvar viewer = this.imageViewerControl;var change = e.change; // this is a lt.LeadPointD objectvar delta = 2;var oldRotateAngle = viewer.rotateAngle;if (change.x > 0) {viewer.rotateAngle = viewer.rotateAngle - delta;} else if (change.x < 0) {viewer.rotateAngle = viewer.rotateAngle + delta;}if (viewer.rotateAngle != oldRotateAngle) {// The rotate angle has changed, fire our eventthis._rotate.invoke(this, new demo.RotateInteractiveModeEventArgs(viewer.rotateAngle));}},// Called when the user stops draggingdragCompleted: function (sender, e) {// If we are working, signal completionif (this.isWorking) {this.onWorkCompleted(lt.LeadEventArgs.empty);}}};// Define our propertiesObject.defineProperty(demo.RotateInteractiveMode.prototype, 'name', { get: demo.RotateInteractiveMode.prototype.get_name, enumerable: true, configurable: true });Object.defineProperty(demo.RotateInteractiveMode.prototype, 'rotate', { get: demo.RotateInteractiveMode.prototype.get_rotate, enumerable: true, configurable: true });// Register this classdemo.RotateInteractiveMode.registerClass('demo.RotateInteractiveMode', lt.Controls.ImageViewerInteractiveMode);// RotateInteractiveMode endfunction run() {// Create the viewervar imageViewerCreateOptions = new lt.Controls.ImageViewerCreateOptions('imageViewerDiv', 'myViewer');var viewer = new lt.Controls.ImageViewer(imageViewerCreateOptions);// Create a new instance of our custom interactive modevar rotateInteractiveMode = new demo.RotateInteractiveMode();// Subscribe to our custom eventvar rotateEventHandler = rotateInteractiveMode.rotate.add(function (sender, e) {console.log('Rotate angle: ' + e.rotateAngle);});// Setup interactive modes, pan zoom and our custom rotate modevar interactiveModes = [new lt.Controls.ImageViewerPanZoomInteractiveMode(),rotateInteractiveMode];var interactiveModeSelect = document.getElementById('interactiveModeSelect');interactiveModeSelect.addEventListener('change', function () {viewer.defaultInteractiveMode = interactiveModes[interactiveModeSelect.selectedIndex];if (demo.RotateInteractiveMode.isInstanceOfType(viewer.defaultInteractiveMode)) {alert('rotate');} else if (lt.Controls.ImageViewerPanZoomInteractiveMode.isInstanceOfType(viewer.defaultInteractiveMode)) {alert('pan zoom');}}, false);viewer.defaultInteractiveMode = interactiveModes[0];// Finally, set an image into the viewer (change this to a valid URL)viewer.imageUrl = 'http://example/image.jpg';}