/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠSeb astian ĠE rives Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . github . ser ives me j ia . e oc v sim . gui . component . tun er Ċ Ċ import Ġcom . github . ser ives me j ia . e oc v sim . E OC VS im Ċ import Ġcom . github . ser ives me j ia . e oc v sim . gui . component . Popup X Ċ import Ġcom . github . ser ives me j ia . e oc v sim . gui . component . input . Enum ComboBox Ċ import Ġcom . github . ser ives me j ia . e oc v sim . gui . component . input . Size Fields Ċ import Ġcom . github . ser ives me j ia . e oc v sim . tun er . T unable Field Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . swing . Swing Ċ import Ġorg . opencv . core . Size Ċ import Ġorg . opencv . img proc . Img proc Ċ import Ġjava . awt . Dimension Ċ import Ġjava . awt . Grid BagConstraints Ċ import Ġjava . awt . Grid BagLayout Ċ import Ġjavax . swing .* Ċ import Ġjavax . swing . border . Empty Border Ċ Ċ class ĠT unable Field Panel Config ( private Ġval Ġfield Options : ĠT unable Field Panel Options , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġe oc v Sim : ĠE OC VS im ) Ġ: ĠJPanel () Ġ{ ĊĊĠĠĠ Ġvar Ġlocal Config Ġ= Ġe oc v Sim . config . global T unable Fields Config . copy () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġprivate Ġvar Ġlast Apply Popup : ĠPopup X ? Ġ= Ġnull ĊĊĠĠĠ Ġval Ġcurrent Config : ĠConfig ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġlocal Config . copy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply To Config ( config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġconfig ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġslider Range Fields Panel Ġ= ĠJPanel () ĊĊĠĠĠ Ġprivate Ġvar Ġslider Range Fields ĠĠĠĠ Ġ= Ġcreate Range Fields () ĊĠĠĠ Ġprivate Ġval Ġcolor Space ComboBox ĠĠĠ Ġ= ĠEnum ComboBox (" Color Ġspace : Ġ", ĠP icker Color Space :: class . java , ĠP icker Color Space . values ()) ĊĊĠĠĠ Ġprivate Ġval Ġapply To All Button Panel Ġ= ĠJPanel ( Grid BagLayout ()) ĊĠĠĠ Ġprivate Ġval Ġapply To All Button ĠĠĠĠĠ Ġ= ĠJ ToggleButton (" Apply Ġto Ġall Ġfields ...") ĊĊĠĠĠ Ġprivate Ġval Ġapply Modes Panel ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= ĠJPanel () ĊĠĠĠ Ġprivate Ġval Ġapply To All Glob ally Button ĠĠĠ Ġ= ĠJButton (" Glob ally ") ĊĠĠĠ Ġprivate Ġval Ġapply To All Of Same Type Button Ġ Ġ= ĠJButton (" Of Ġthis Ġtype ") ĊĊĠĠĠ Ġprivate Ġval Ġconst Center Bottom Ġ= ĠGridBagConstraints () ĊĊĠĠĠ Ġprivate Ġval Ġconfig Source Label Ġ= ĠJLabel ( local Config . source . description ) ĊĊĠĠĠ Ġprivate Ġval Ġallows Decimal s ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfield Options . field Panel . t unable Field . allow Mode Ġ== ĠT unable Field . Allow Mode . ONLY _ NUMBER S _ DECIMAL ĊĊĠĠĠ Ġprivate Ġval ĠfieldType Class Ġ= Ġfield Options . field Panel . t unable Field :: class . java ĊĊĠĠĠ Ġ// re presents Ġa Ġcolor Ġspace Ġconversion Ġwhen Ġpicking Ġfrom Ġthe Ġviewport . Ġalways ĊĠĠĠ Ġ// convert Ġfrom Ġrgb Ġto Ġthe Ġdesired Ġcolor Ġspace Ġsince Ġthat 's Ġthe Ġcolor Ġspace Ġof ĊĠĠĠ Ġ// the Ġscalar Ġthe ĠColor Picker Ġreturns Ġfrom Ġthe Ġviewport Ġafter Ġpicking . ĊĠĠĠ Ġenum Ġclass ĠP icker Color Space ( val Ġcv t Code : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠY Cr Cb ( Img proc . COLOR _ RGB 2 Y Cr Cb ), ĊĠĠĠĠĠĠĠ ĠH SV ( Img proc . COLOR _ RGB 2 H SV ), ĊĠĠĠĠĠĠĠ ĠRGB ( Img proc . COLOR _ RGBA 2 RGB ), ĊĠĠĠĠĠĠĠ ĠLab ( Img proc . COLOR _ RGB 2 Lab ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠConfig Source ( val Ġdescription : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLOCAL (" From Ġlocal Ġconfig "), ĊĠĠĠĠĠĠĠ ĠGLOBAL (" From Ġglobal Ġconfig "), ĊĠĠĠĠĠĠĠ ĠGLOBAL _ DEFAULT (" From Ġdefault Ġglobal Ġconfig "), ĊĠĠĠĠĠĠĠ ĠTYPE _ SPEC IFIC (" From Ġspecific Ġconfig ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠConfig ( var Ġslider Range : ĠSize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpicker Color Space : ĠP icker Color Space , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfield Panel Mode : ĠT unable Field Panel . Mode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsource : ĠConfig Source ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġlayout Ġ= ĠGrid BagLayout () ĊĊĠĠĠĠĠĠĠ Ġval Ġm Constraints ĠĠ Ġ= ĠGridBagConstraints () ĊĠĠĠĠĠĠĠ Ġm Constraints . ip ady Ġ= Ġ 1 0 ĊĊĠĠĠĠĠĠĠ Ġ// adding Ġinto Ġan Ġindividual Ġpanel Ġso Ġthat Ġwe Ġcan Ġadd ĊĠĠĠĠĠĠĠ Ġ// and Ġremove Ġlater Ġwhen Ġre creating Ġwithout Ġmuch Ġproblem ĊĠĠĠĠĠĠĠ Ġslider Range Fields Panel . add ( slider Range Fields ) ĊĊĠĠĠĠĠĠĠ Ġm Constraints . gridy Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġadd ( slider Range Fields Panel , Ġm Constraints ) ĊĊĠĠĠĠĠĠĠ Ġcolor Space ComboBox . on Select Ġ{ Ġupdate Config Source Label ( current Config ) Ġ} ĊĠĠĠĠĠĠĠ Ġ// combo Ġbox Ġto Ġselect Ġcolor Ġspace ĊĠĠĠĠĠĠĠ Ġcolor Space ComboBox . selected Enum Ġ= Ġlocal Config . picker Color Space ĊĊĠĠĠĠĠĠĠ Ġm Constraints . gridy Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġadd ( color Space ComboBox , Ġm Constraints ) ĊĊĠĠĠĠĠĠĠ Ġ// centering Ġapply Ġto Ġall Ġbutton ... ĊĠĠĠĠĠĠĠ Ġval Ġconst Center ĠĠĠ Ġ= ĠGridBagConstraints () ĊĠĠĠĠĠĠĠ Ġconst Center . anchor Ġ= ĠGridBagConstraints . CENTER ĊĠĠĠĠĠĠĠ Ġconst Center . fill ĠĠ Ġ= ĠGridBagConstraints . HORIZONTAL ĊĠĠĠĠĠĠĠ Ġconst Center . gridy Ġ Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ// add Ġapply Ġto Ġall Ġbutton Ġto Ġa Ġcentered Ġpane ĊĠĠĠĠĠĠĠ Ġapply To All Button Panel . add ( apply To All Button , Ġconst Center ) ĊĊĠĠĠĠĠĠĠ Ġm Constraints . gridy Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġadd ( apply To All Button Panel , Ġm Constraints ) ĊĊĠĠĠĠĠĠĠ Ġ// display Ġor Ġhide Ġapply Ġto Ġall Ġmode Ġbuttons ĊĠĠĠĠĠĠĠ Ġapply To All Button . addActionListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// create Ġa Ġnew Ġpopup Ġfor Ġdisplaying Ġthe Ġapply Ġmodes Ġbutton ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( apply To All Button . isSelected Ġ&& Ġ( last Apply Popup Ġ== Ġnull Ġ|| Ġlast Apply Popup ?. window ?. isVisible Ġ== Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwindow ĠĠ Ġ= ĠSw ing Utilities . getWindow Ancestor ( field Options ) Ġ// gets Ġthe Ġparent Ġframe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= Ġapply To All Button . location On Screen ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpopup ĠĠĠĠĠ Ġ= ĠPopup X ( window , Ġapply Modes Panel , Ġlocation . x , Ġlocation . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Apply Popup Ġ= Ġpopup Ġ// set Ġto Ġa Ġ" last " Ġvariable Ġso Ġthat Ġwe Ġcan Ġhide Ġit Ġlater ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// so Ġthat Ġthe Ġmain Ġconfig Ġpopup Ġdoesn 't Ġget Ġclosed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// when Ġit Ġgets Ġun focused Ġin Ġfavour Ġof Ġthis Ġnew Ġframe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Options . last Config Popup ?. close On Focus Lost Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopup . on Show Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopup . setLocation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopup . window . location . x Ġ- Ġapply Modes Panel . width Ġ/ Ġ 8 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopup . window . location . y Ġ+ Ġapply Modes Panel . height Ġ+ Ġapply To All Button . height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// un toggle Ġthe Ġapply Ġto Ġall Ġbutton Ġif Ġthe Ġpopup Ġcloses ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopup . on Hide Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply To All Button . isSelected Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Options . last Config Popup ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// allow Ġthe Ġmain Ġconfig Ġpopup Ġto Ġclose Ġwhen Ġlo sing Ġfocus Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . close On Focus Lost Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// launch Ġthe Ġwaiting Ġin Ġthe Ġbackground ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// close Ġconfig Ġpopup Ġif Ġstill Ġhasn 't Ġfocused Ġafter Ġa Ġbit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( Dispatch ers . Swing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . window . is Focused Ġ&& Ġ( last Apply Popup Ġ== Ġnull Ġ|| Ġlast Apply Popup ?. window ?. is Focused Ġ== Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . hide () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpopup . show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Apply Popup ?. hide () Ġ// close Ġthe Ġpopup Ġif Ġuser Ġun - toggle d Ġbutton ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġapply Modes Panel . layout Ġ= ĠBox Layout ( apply Modes Panel , ĠBox Layout . LINE _ AXIS ) ĊĊĠĠĠĠĠĠĠ Ġ// apply Ġglobally Ġbutton Ġand Ġdisable Ġtoggle Ġfor Ġapply Ġto Ġall Ġbutton ĊĠĠĠĠĠĠĠ Ġapply To All Glob ally Button . addActionListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Apply Popup ?. hide () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Glob ally () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġapply Modes Panel . add ( apply To All Glob ally Button ) ĊĊĠĠĠĠĠĠĠ Ġ// creates Ġa Ġspace Ġbetween Ġthe Ġapply Ġmode Ġbuttons ĊĠĠĠĠĠĠĠ Ġapply Modes Panel . add ( Box . create Rigid Area ( Dimension ( 5 , Ġ 0 ))) ĊĊĠĠĠĠĠĠĠ Ġ// apply Ġof Ġsame Ġtype Ġbutton Ġand Ġdisable Ġtoggle Ġfor Ġapply Ġto Ġall Ġbutton ĊĠĠĠĠĠĠĠ Ġapply To All Of Same Type Button . addActionListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Apply Popup ?. hide () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Of Same Type () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġapply Modes Panel . add ( apply To All Of Same Type Button ) ĊĊĠĠĠĠĠĠĠ Ġ// add Ġa Ġbit Ġof Ġspace Ġbetween Ġthe Ġupper Ġand Ġlower Ġapply Ġto Ġall Ġbuttons ĊĠĠĠĠĠĠĠ Ġapply Modes Panel . border Ġ= ĠEmpty Border ( 5 , Ġ 0 , Ġ 0 , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġ// add Ġtwo Ġapply Ġto Ġall Ġmodes Ġbuttons Ġto Ġthe Ġbottom Ġcenter ĊĠĠĠĠĠĠĠ Ġconst Center Bottom . anchor Ġ= ĠGridBagConstraints . CENTER ĊĠĠĠĠĠĠĠ Ġconst Center Bottom . fill ĠĠ Ġ= ĠGridBagConstraints . HORIZONTAL ĊĠĠĠĠĠĠĠ Ġconst Center Bottom . gridy Ġ Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġconfig Source Label . horizontal Alignment Ġ= ĠJLabel . CENTER ĊĠĠĠĠĠĠĠ Ġconfig Source Label . vertical Alignment Ġ= ĠJLabel . CENTER ĊĊĠĠĠĠĠĠĠ Ġm Constraints . gridy Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġadd ( config Source Label , Ġm Constraints ) ĊĊĠĠĠĠĠĠĠ Ġapply From E OC VS im Config () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// set Ġthe Ġcurrent Ġconfig Ġvalues Ġand Ġhide Ġapply Ġmodes Ġpanel Ġwhen Ġpanel Ġshow ĊĠĠĠ Ġfun Ġpanel Show () Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Config Gui From Config () ĊĠĠĠĠĠĠĠ Ġapply To All Button . isSelected Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// set Ġthe Ġslider Ġbounds Ġwhen Ġthe Ġpopup Ġgets Ġclosed ĊĠĠĠ Ġfun Ġpanel Hide () Ġ{ ĊĠĠĠĠĠĠĠ Ġapply To Config () ĊĠĠĠĠĠĠĠ Ġupdate Field Gui From Config () ĊĠĠĠĠĠĠĠ Ġlast Apply Popup ?. hide () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// app lies Ġthe Ġconfig Ġof Ġthis Ġt unable Ġfield Ġpanel Ġglobally ĊĠĠĠ Ġprivate Ġfun Ġapply Glob ally () Ġ{ ĊĠĠĠĠĠĠĠ Ġapply To Config () Ġ// s aves Ġthe Ġcurrent Ġvalues Ġto Ġthe Ġcurrent Ġlocal Ġconfig ĊĊĠĠĠĠĠĠĠ Ġlocal Config . source Ġ= ĠConfig Source . GLOBAL Ġ// changes Ġthe Ġsource Ġof Ġthe Ġlocal Ġconfig Ġto Ġglobal ĊĠĠĠĠĠĠĠ Ġe oc v Sim . config . global T unable Fields Config Ġ= Ġlocal Config . copy () ĊĊĠĠĠĠĠĠĠ Ġupdate Config Source Label () ĊĠĠĠĠĠĠĠ Ġfield Options . field Panel . request All Config Re eval () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// app lies Ġthe Ġconfig Ġof Ġthis Ġt unable Ġfield Ġto Ġthis Ġtype Ġspecifically ĊĠĠĠ Ġprivate Ġfun Ġapply Of Same Type () Ġ{ ĊĠĠĠĠĠĠĠ Ġapply To Config () Ġ// s aves Ġthe Ġcurrent Ġvalues Ġto Ġthe Ġcurrent Ġlocal Ġconfig ĊĠĠĠĠĠĠĠ Ġval Ġtype Class Ġ= Ġfield Options . field Panel . t unable Field :: class . java ĊĊĠĠĠĠĠĠĠ Ġlocal Config . source Ġ= ĠConfig Source . TYPE _ SPEC IFIC Ġ// changes Ġthe Ġsource Ġof Ġthe Ġlocal Ġconfig Ġto Ġtype Ġspecific ĊĠĠĠĠĠĠĠ Ġe oc v Sim . config . specific T unable Field Config [ type Class . name ] Ġ= Ġlocal Config . copy () ĊĊĠĠĠĠĠĠĠ Ġupdate Config Source Label () ĊĠĠĠĠĠĠĠ Ġfield Options . field Panel . request All Config Re eval () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// loads Ġthe Ġconfig Ġfrom Ġglobal Ġe oc v Ġsim Ġconfig Ġfile ĊĠĠĠ Ġinternal Ġfun Ġapply From E OC VS im Config () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġspecific Configs Ġ= Ġe oc v Sim . config . specific T unable Field Config ĊĊĠĠĠĠĠĠĠ Ġ// apply Ġspecific Ġconfig Ġif Ġwe Ġhave Ġone , Ġor Ġelse , Ġapply Ġglobal ĊĠĠĠĠĠĠĠ Ġlocal Config Ġ= Ġif ( specific Configs . containsKey ( fieldType Class . name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspecific Configs [ fieldType Class . name ] !!. copy () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe oc v Sim . config . global T unable Fields Config . copy () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġupdate Config Gui From Config () ĊĠĠĠĠĠĠĠ Ġupdate Config Source Label () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// app lies Ġthe Ġcurrent Ġvalues Ġto Ġthe Ġspecified Ġconfig , Ġdefaults Ġto Ġlocal ĊĠĠĠ Ġ@ Suppress (" UN NE C ESS ARY _ SAFE _ CALL ") ĊĠĠĠ Ġprivate Ġfun Ġapply To Config ( config : ĠConfig Ġ= Ġlocal Config ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// if Ġuser Ġentered Ġa Ġvalid Ġnumber Ġand Ġour Ġmax Ġvalue Ġis Ġbigger Ġthan Ġthe Ġminimum ... ĊĠĠĠĠĠĠĠ Ġif ( slider Range Fields . valid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . slider Range Ġ= Ġslider Range Fields . current Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// update Ġslider Ġrange Ġin Ġgui Ġsl iders ... ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( config . slider Range . height Ġ> Ġconfig . slider Range . width Ġ&& Ġconfig Ġ!== Ġlocal Config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Field Gui From Config () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// set Ġthe Ġcolor Ġspace Ġenum Ġto Ġthe Ġconfig Ġif Ġit 's Ġnot Ġnull ĊĠĠĠĠĠĠĠ Ġcolor Space ComboBox . selected Enum ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . picker Color Space Ġ= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// sets Ġthe Ġpanel Ġmode Ġ( sl iders Ġor Ġtext boxes ) Ġto Ġconfig Ġfrom Ġthe Ġcurrent Ġmode ĊĠĠĠĠĠĠĠ Ġif ( field Options . field Panel ?. mode Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . field Panel Mode Ġ= Ġfield Options . field Panel . mode ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Config Source Label ( current Config : ĠConfig Ġ= Ġlocal Config ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// sets Ġto Ġlocal Ġif Ġuser Ġchanged Ġvalues Ġand Ġhasn 't Ġapplied Ġlocally Ġor Ġglobally ĊĠĠĠĠĠĠĠ Ġif ( current Config Ġ!= Ġlocal Config ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Config . source Ġ= ĠConfig Source . LOCAL ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġconfig Source Label . text Ġ= Ġlocal Config . source . description ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// updates Ġthe Ġactual Ġconfiguration Ġdisplayed Ġon Ġthe Ġfield Ġpanel Ġgui ĊĠĠĠ Ġ@ Suppress (" UN NE C ESS ARY _ SAFE _ CALL ") ĊĠĠĠ Ġfun Ġupdate Field Gui From Config () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// sets Ġthe Ġslider Ġrange Ġfrom Ġconfig ĊĠĠĠĠĠĠĠ Ġfield Options . field Panel . set Sl iders Range ( local Config . slider Range . width , Ġlocal Config . slider Range . height ) ĊĠĠĠĠĠĠĠ Ġ// sets Ġthe Ġpanel Ġmode Ġ( sl iders Ġor Ġtext boxes ) Ġto Ġconfig Ġfrom Ġthe Ġcurrent Ġmode ĊĠĠĠĠĠĠĠ Ġif ( field Options . field Panel ?. fields Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Options . field Panel . mode Ġ= Ġlocal Config . field Panel Mode ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// updates Ġthe Ġvalues Ġdisplayed Ġin Ġthis Ġconfig 's Ġui Ġto Ġthe Ġcurrent Ġconfig Ġvalues ĊĠĠĠ Ġprivate Ġfun Ġupdate Config Gui From Config () Ġ{ ĊĠĠĠĠĠĠĠ Ġslider Range Fields Panel . remove ( slider Range Fields ) Ġ// remove Ġold Ġfields ĊĠĠĠĠĠĠĠ Ġslider Range Fields Ġ= Ġcreate Range Fields () Ġ// need Ġto Ġrecreate Ġin Ġorder Ġto Ġset Ġnew Ġvalues ĊĠĠĠĠĠĠĠ Ġslider Range Fields Panel . add ( slider Range Fields ) Ġ// add Ġnew Ġfields ĊĊĠĠĠĠĠĠĠ Ġ// need Ġto Ġre val & rep aint Ġas Ġalways ĊĠĠĠĠĠĠĠ Ġslider Range Fields Panel . re validate (); Ġslider Range Fields Panel . rep aint () ĊĊĠĠĠĠĠĠĠ Ġcolor Space ComboBox . selected Enum Ġ= Ġlocal Config . picker Color Space ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// simple Ġshort Ġhand Ġfor Ġa Ġrepet itive Ġinstantiation ... ĊĠĠĠ Ġprivate Ġfun Ġcreate Range Fields (): ĠSize Fields Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfields Ġ= ĠSize Fields ( local Config . slider Range , Ġallows Decimal s , Ġtrue ," Slider Ġrange :", Ġ" Ġto Ġ") ĊĠĠĠĠĠĠĠ Ġfields . onChange Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Config Source Label ( current Config ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfields ĊĠĠĠ Ġ} Ċ Ċ }