/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 - 2 0 2 1 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġorg . jetbrains . project or . server . core . convert . to A wt Ċ Ċ import Ġorg . jetbrains . project or . common . protocol . to Server . Client MouseEvent Ċ import Ġorg . jetbrains . project or . common . protocol . to Server . Client Wheel Event Ċ import Ġorg . jetbrains . project or . common . protocol . to Server . Mouse Modifier Ċ import Ġorg . jetbrains . project or . server . core . Ready Client Settings . Touch State Ċ import Ġorg . jetbrains . project or . server . core . convert . to Client . round To Infinity Ċ import Ġorg . jetbrains . project or . server . core . util . getProperty Ċ import Ġjava . awt . Component Ċ import Ġjava . awt . event . Input Event Ċ import Ġjava . awt . event . MouseEvent Ċ import Ġjava . awt . event . Mouse Wheel Event Ċ import Ġkotlin . math . absolute Value Ċ Ċ private Ġconst Ġval ĠDEFAULT _ SCROLL _ AMOUNT Ġ= Ġ 1 Ċ Ċ // Ġtodo : Ġ 1 0 0 Ġis Ġjust Ġa Ġrandom Ġbut Ġreasonable Ġnumber ; Ċ // ĠĠĠĠĠĠ Ġneed Ġto Ġcalculate Ġthis Ġnumber Ġfrom Ġthe Ġcontext , Ċ // ĠĠĠĠĠĠ Ġmaybe Ġuse Ġthe Ġclient 's Ġscaling Ġratio Ċ private Ġconst Ġval ĠDEFAULT _ PIXEL _ PER _ UNIT Ġ= Ġ 1 0 0 Ċ Ċ public Ġconst Ġval ĠPIX EL _ PER _ UNIT _ ENV _ NAME : ĠString Ġ= Ġ" ORG _ J ET BR AIN S _ PROJECT OR _ SERVER _ PIXEL _ PER _ UNIT " Ċ private Ġval ĠPIX EL _ PER _ UNIT Ġ= ĠgetProperty ( PIXEL _ PER _ UNIT _ ENV _ NAME )?. toInt () Ġ?: ĠDEFAULT _ PIXEL _ PER _ UNIT Ċ Ċ // Ġtodo : Ġ 3 Ġis Ġa Ġwild Ġguess Ġ( scaling Ġfactor Ġof Ġmobile Ġdevices ), Ġneed Ġto Ġget Ġthis Ġnumber Ġfrom Ġthe Ġcontext Ċ private Ġval ĠTO UCH _ PIXEL _ PER _ UNIT Ġ= Ġ 3 Ġ* ĠPIX EL _ PER _ UNIT Ċ private Ġconst Ġval ĠPIX EL _ DELTA _ EN OU GH _ FOR _ SCROLL ING Ġ= Ġ 1 0 Ċ Ċ public Ġfun Ġcalculate New Touch State ( ĊĠ Ġshifted Message : ĠClient MouseEvent , ĊĠ Ġmessage : ĠClient MouseEvent , ĊĠ Ġcurrent Touch State : ĠTouch State , Ċ ): ĠTouch State ? Ġ{ ĊĠ Ġfun Ġis En ough Delta For Scrolling ( previous Touch State : ĠTouch State . Scrolling , Ġnew X : ĠInt , Ġnew Y : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠ Ġ// Ġreduce Ġnumber Ġof Ġscroll Ġevents Ġto Ġmake Ġdelt as Ġbigger . ĊĠĠĠ Ġ// Ġthis Ġhelps Ġwhen Ġto Ġgenerate Ġproper ĠMouse Wheel Events Ġwith Ġcorrect Ġtransformation Ġof Ġpixels Ġto Ġscroll Ġunits ĊĊĠĠĠ Ġreturn Ġ( new X Ġ- Ġprevious Touch State . last X ). absolute Value Ġ> ĠPIX EL _ DELTA _ EN OU GH _ FOR _ SCROLL ING Ġ|| ĊĠĠĠĠĠĠĠĠĠĠ Ġ( new Y Ġ- Ġprevious Touch State . last Y ). absolute Value Ġ> ĠPIX EL _ DELTA _ EN OU GH _ FOR _ SCROLL ING ĊĠ Ġ} ĊĊĠ Ġreturn Ġwhen Ġ( shift ed Message . mouse EventType ) Ġ{ ĊĠĠĠ ĠClient MouseEvent . Mouse EventType . UP Ġ-> ĠTouch State . Released ĊĠĠĠ ĠClient MouseEvent . Mouse EventType . DOWN Ġ-> ĠTouch State . Only Pressed ( message . time Stamp , Ġshifted Message . x , Ġshifted Message . y ) ĊĠĠĠ ĠClient MouseEvent . Mouse EventType . TO UCH _ DR AG Ġ-> Ġwhen Ġ( current Touch State ) Ġ{ ĊĠĠĠĠĠ Ġis ĠTouch State . Scrolling Ġ-> Ġwhen Ġ( is En ough Delta For Scrolling ( current Touch State , Ġshifted Message . x , Ġshifted Message . y )) Ġ{ ĊĠĠĠĠĠĠĠ Ġtrue Ġ-> ĠTouch State . Scrolling ( current Touch State . initial X , Ġcurrent Touch State . initial Y , Ġshifted Message . x , Ġshifted Message . y ) ĊĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġis ĠTouch State . Dragging Ġ-> ĠTouch State . Dragging ĊĠĠĠĠĠ Ġis ĠTouch State . Only Pressed Ġ-> Ġwhen Ġ( current Touch State . connection Millis Ġ+ Ġ 5 0 0 Ġ< Ġshifted Message . time Stamp ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtrue Ġ-> ĠTouch State . Dragging ĊĠĠĠĠĠĠĠ Ġfalse Ġ-> ĠTouch State . Scrolling ( current Touch State . last X , Ġcurrent Touch State . last Y , Ġshifted Message . x , Ġshifted Message . y ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġis ĠTouch State . Released Ġ-> ĠTouch State . Released Ġ Ġ// Ġdrag Ġevents Ġshouldn 't Ġcome Ġwhen Ġtouch Ġis Ġnot Ġpressing Ġso Ġlet 's Ġskip Ġit ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ-> Ġcurrent Touch State ĊĠ Ġ} Ċ } Ċ Ċ public Ġfun Ġcreate MouseEvent ( ĊĠ Ġsource : ĠComponent , ĊĠ Ġevent : ĠClient MouseEvent , ĊĠ Ġprevious Touch State : ĠTouch State , ĊĠ Ġnew Touch State : ĠTouch State , ĊĠ Ġconnection Millis : ĠLong , Ċ ): ĠMouseEvent Ġ{ ĊĠ Ġval Ġlocation On Screen Ġ= Ġsource . location On Screen ĊĊĠ Ġval Ġid Ġ= Ġwhen Ġ( event . mouse EventType ) Ġ{ ĊĠĠĠ ĠClient MouseEvent . Mouse EventType . MOVE Ġ-> ĠMouseEvent . MOUSE _ MOVED ĊĠĠĠ ĠClient MouseEvent . Mouse EventType . DOWN Ġ-> ĠMouseEvent . MOUSE _ PRES SED ĊĠĠĠ ĠClient MouseEvent . Mouse EventType . UP Ġ-> ĠMouseEvent . MOUSE _ RELEASE D ĊĠĠĠ ĠClient MouseEvent . Mouse EventType . CLICK Ġ-> ĠMouseEvent . MOUSE _ CLICK ED ĊĠĠĠ ĠClient MouseEvent . Mouse EventType . OUT Ġ-> ĠMouseEvent . MOUSE _ EXIT ED ĊĠĠĠ ĠClient MouseEvent . Mouse EventType . DR AG Ġ-> ĠMouseEvent . MOUSE _ DR AG GED ĊĠĠĠ ĠClient MouseEvent . Mouse EventType . TO UCH _ DR AG Ġ-> Ġ{ ĊĠĠĠĠĠ Ġif Ġ( previous Touch State Ġis ĠTouch State . With Coordinates Ġ&& Ġnew Touch State Ġis ĠTouch State . Scrolling ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelta X Ġ= Ġnew Touch State . last X Ġ- Ġprevious Touch State . last X ĊĠĠĠĠĠĠĠ Ġval Ġdelta Y Ġ= Ġnew Touch State . last Y Ġ- Ġprevious Touch State . last Y ĊĊĠĠĠĠĠĠĠ Ġfun Ġis Horizontal (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġdelta X . absolute Value Ġ> Ġdelta Y . absolute Value ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġ( wheel Delta , Ġmodifiers ) Ġ= Ġif Ġ( is Horizontal ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġdelta X Ġto Ġ( event . modifiers . to Mouse Int () Ġor ĠInput Event . SHIFT _ DOWN _ MASK ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġdelta Y Ġto Ġevent . modifiers . to Mouse Int () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġneg ated Wheel Delta Ġ= Ġ- wheel Delta Ġ Ġ// Ġtouch Ġscrolling Ġis Ġusually Ġtreated Ġin Ġreverse Ġdirection ĊĊĠĠĠĠĠĠĠ Ġval Ġnormalized Wheel Delta Ġ= Ġneg ated Wheel Delta . toDouble () Ġ/ ĠTO UCH _ PIXEL _ PER _ UNIT ĊĠĠĠĠĠĠĠ Ġval Ġnot Null Normalized Wheel Delta Ġ= Ġround To Infinity ( normalized Wheel Delta ). toInt () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠMouse Wheel Event ( ĊĠĠĠĠĠĠĠĠĠ Ġsource , ĊĠĠĠĠĠĠĠĠĠ ĠMouseEvent . MOUSE _ W HE EL , Ġconnection Millis Ġ+ Ġevent . time Stamp , Ġmodifiers , ĊĠĠĠĠĠĠĠĠĠ Ġnew Touch State . initial X Ġ- Ġlocation On Screen . x , Ġnew Touch State . initial Y Ġ- Ġlocation On Screen . y , ĊĠĠĠĠĠĠĠĠĠ Ġnew Touch State . initial X Ġ- Ġlocation On Screen . x , Ġnew Touch State . initial Y Ġ- Ġlocation On Screen . y , Ġ 0 , Ġfalse , ĊĠĠĠĠĠĠĠĠĠ ĠMouse Wheel Event . W HE EL _ UNIT _ SCROLL , ĠDEFAULT _ SCROLL _ AMOUNT , Ġnot Null Normalized Wheel Delta , Ġnormalized Wheel Delta ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ ĠMouseEvent . MOUSE _ DR AG GED ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġval Ġa wt Event Button Ġ= Ġwhen Ġ( event . mouse EventType ) Ġ{ ĊĠĠĠ ĠClient MouseEvent . Mouse EventType . MOVE , ĊĠĠĠ ĠClient MouseEvent . Mouse EventType . OUT , ĊĠĠĠ Ġ-> ĠMouseEvent . NO BUTTON ĊĊĠĠĠ Ġelse Ġ-> Ġevent . button Ġ+ Ġ 1 ĊĠ Ġ} ĊĊĠ Ġval Ġmodifiers Ġ= Ġevent . modifiers . to Mouse Int () ĊĠ Ġval Ġbutton Modifier Ġ= Ġif Ġ( awt Event Button Ġ== ĠMouseEvent . NO BUTTON Ġ|| Ġevent . mouse EventType Ġ== ĠClient MouseEvent . Mouse EventType . UP ) Ġ{ ĊĠĠĠĠ 0 ĊĠ Ġ} ĊĠ Ġelse Ġ{ ĊĠĠĠ ĠInput Event . get Mask For Button ( awt Event Button ) ĊĠ Ġ} ĊĊĠ Ġval Ġcan Trigger Popup Ġ= Ġa wt Event Button Ġ== ĠMouseEvent . BUTTON 3 Ġ&& Ġid Ġ== ĠMouseEvent . MOUSE _ PRES SED ĊĊĠ Ġreturn ĠMouseEvent ( ĊĠĠĠ Ġsource , ĊĠĠĠ Ġid , ĊĠĠĠ Ġconnection Millis Ġ+ Ġevent . time Stamp , ĊĠĠĠ Ġmodifiers Ġor Ġbutton Modifier , ĊĠĠĠ Ġevent . x Ġ- Ġlocation On Screen . x , Ġevent . y Ġ- Ġlocation On Screen . y , ĊĠĠĠ Ġevent . click Count , Ġcan Trigger Popup , Ġa wt Event Button ĊĠ Ġ) Ċ } Ċ Ċ public Ġfun Ġcreate Mouse Wheel Event ( source : ĠComponent , Ġevent : ĠClient Wheel Event , Ġconnection Millis : ĠLong ): ĠMouse Wheel Event Ġ{ ĊĠ Ġfun Ġis Horizontal ( event : ĠClient Wheel Event ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġevent . delta X . absolute Value Ġ> Ġevent . delta Y . absolute Value ĊĠ Ġ} ĊĊĠ Ġval Ġ( wheel Delta , Ġmodifiers ) Ġ= Ġif Ġ( is Horizontal ( event )) Ġ{ ĊĠĠĠ Ġevent . delta X Ġto Ġ( event . modifiers . to Mouse Int () Ġor ĠInput Event . SHIFT _ DOWN _ MASK ) ĊĠ Ġ} ĊĠ Ġelse Ġ{ ĊĠĠĠ Ġevent . delta Y Ġto Ġevent . modifiers . to Mouse Int () ĊĠ Ġ} ĊĊĠ Ġval Ġ( mode , Ġnormalized Wheel Delta ) Ġ= Ġwhen Ġ( event . mode ) Ġ{ ĊĠĠĠ ĠClient Wheel Event . Scrolling Mode . PIXEL Ġ-> ĠMouse Wheel Event . W HE EL _ UNIT _ SCROLL Ġto Ġwheel Delta Ġ/ ĠPIX EL _ PER _ UNIT ĊĠĠĠ ĠClient Wheel Event . Scrolling Mode . LINE Ġ-> ĠMouse Wheel Event . W HE EL _ UNIT _ SCROLL Ġto Ġwheel Delta ĊĠĠĠ ĠClient Wheel Event . Scrolling Mode . PAGE Ġ-> ĠMouse Wheel Event . W HE EL _ BLOCK _ SCROLL Ġto Ġwheel Delta ĊĠ Ġ} ĊĠ Ġval Ġnot Null Normalized Wheel Delta Ġ= Ġround To Infinity ( normalized Wheel Delta ). toInt () ĊĊĠ Ġval Ġlocation On Screen Ġ= Ġsource . location On Screen ĊĊĠ Ġreturn ĠMouse Wheel Event ( ĊĠĠĠ Ġsource , ĠMouseEvent . MOUSE _ W HE EL , Ġconnection Millis Ġ+ Ġevent . time Stamp , Ġmodifiers , ĊĠĠĠ Ġevent . x Ġ- Ġlocation On Screen . x , Ġevent . y Ġ- Ġlocation On Screen . y , ĊĠĠĠ Ġevent . x Ġ- Ġlocation On Screen . x , Ġevent . y Ġ- Ġlocation On Screen . y , Ġ 0 , Ġfalse , ĊĠĠĠ Ġmode , ĠDEFAULT _ SCROLL _ AMOUNT , Ġnot Null Normalized Wheel Delta , Ġnormalized Wheel Delta ĊĠ Ġ) Ċ } Ċ Ċ private Ġval Ġmouse Modifier Mask Ġ= Ġmap Of ( ĊĠ ĠMouse Modifier . ALT _ KEY Ġto ĠInput Event . ALT _ DOWN _ MASK , ĊĠ ĠMouse Modifier . CTRL _ KEY Ġto ĠInput Event . CTRL _ DOWN _ MASK , ĊĠ ĠMouse Modifier . SHIFT _ KEY Ġto ĠInput Event . SHIFT _ DOWN _ MASK , ĊĠ ĠMouse Modifier . META _ KEY Ġto ĠInput Event . META _ DOWN _ MASK Ċ ) Ċ Ċ private Ġfun ĠSet < Mouse Modifier >. to Mouse Int (): ĠInt Ġ{ ĊĠ Ġreturn Ġmap ( mouse Modifier Mask :: getValue ). fold ( 0 , ĠInt :: or ) Ċ } Ċ