// ĠCopyright Ġ 2 0 0 0 - 2 0 1 8 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ package Ġorg . jetbrains . plugins . github . authentication . ui Ċ Ċ import Ġcom . intellij . icons . All Icons Ċ import Ġcom . intellij . openapi . Disposable Ċ import Ġcom . intellij . openapi . action System . An ActionEvent Ċ import Ġcom . intellij . openapi . action System . Common Shortcut s Ċ import Ġcom . intellij . openapi . application . Modal ity State Ċ import Ġcom . intellij . openapi . keymap . Key map Util Ċ import Ġcom . intellij . openapi . progress . Progress Indicator Ċ import Ġcom . intellij . openapi . progress . Task Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . util . Dis poser Ċ import Ġcom . intellij . ui .* Ċ import Ġcom . intellij . ui . Simple Text Attributes . STYLE _ PLAIN Ċ import Ġcom . intellij . ui . Simple Text Attributes . STYLE _ UNDER LINE Ċ import Ġcom . intellij . ui . components . JB List Ċ import Ġcom . intellij . util . progress . Progress Visibility Manager Ċ import Ġcom . intellij . util . ui .* Ċ import Ġcom . intellij . util . ui . components . Border LayoutPanel Ċ import Ġorg . jetbrains . plugins . github . api . Github ApiRequest Executor Ċ import Ġorg . jetbrains . plugins . github . api . Github Api Requests Ċ import Ġorg . jetbrains . plugins . github . api . Github Server Path Ċ import Ġorg . jetbrains . plugins . github . api . data . Github Authenticated User Ċ import Ġorg . jetbrains . plugins . github . authentication . accounts . Github Account Ċ import Ġorg . jetbrains . plugins . github . authentication . accounts . Github Account Manager Ċ import Ġorg . jetbrains . plugins . github . exceptions . Github Authentication Exception Ċ import Ġorg . jetbrains . plugins . github . pull request . avatars . Caching Github Avatar Icons Provider Ċ import Ġorg . jetbrains . plugins . github . util . Caching Github User Avatar Loader Ċ import Ġorg . jetbrains . plugins . github . util . Github Image Res izer Ċ import Ġorg . jetbrains . plugins . github . util . Github UI Util Ċ import Ġjava . awt .* Ċ import Ġjava . awt . event . Mouse Adapter Ċ import Ġjava . awt . event . MouseEvent Ċ import Ġjavax . swing .* Ċ import Ġjavax . swing . event . List Data Event Ċ import Ġjavax . swing . event . List Data Listener Ċ Ċ private Ġconst Ġval ĠLINK _ TAG Ġ= Ġ" EDIT _ LINK " Ċ Ċ internal Ġclass ĠGithub Accounts Panel ( private Ġval Ġproject : ĠProject , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġexecutor Factory : ĠGithub ApiRequest Executor . Factory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġavatar Loader : ĠC aching Github User Avatar Loader , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġimage Res izer : ĠGithub Image Res izer ) Ġ: ĠBorder LayoutPanel (), ĠDis posable Ġ{ ĊĊĠ Ġprivate Ġval Ġaccount Icon Size Ġ= ĠJ B Value . UI Integer (" Github . Profile . Avatar . Size ", Ġ 4 0 ) ĊĊĠ Ġprivate Ġval Ġaccount ListModel Ġ= ĠCollection ListModel < Github Account Decorator >(). apply Ġ{ ĊĠĠĠ Ġ// Ġdisable Ġlink Ġhandler Ġwhen Ġthere Ġare Ġno Ġerrors ĊĠĠĠ Ġadd List Data Listener ( object Ġ: ĠList Data Listener Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġcontents Changed ( e : ĠList Data Event ?) Ġ= Ġset Link Handler Enabled ( items . any Ġ{ Ġit . loading Error Ġ!= Ġnull Ġ}) ĊĠĠĠĠĠ Ġoverride Ġfun Ġinterval Removed ( e : ĠList Data Event ?) Ġ{} ĊĠĠĠĠĠ Ġoverride Ġfun Ġinterval Added ( e : ĠList Data Event ?) Ġ{} ĊĠĠĠ Ġ}) ĊĠ Ġ} ĊĠ Ġprivate Ġval Ġaccount List Ġ= ĠJ B List < Github Account Decorator >( account ListModel ). apply Ġ{ ĊĠĠĠ Ġval Ġdecorator Renderer Ġ= ĠGithub Account Decorator Renderer () ĊĠĠĠ Ġcell Renderer Ġ= Ġdecorator Renderer ĊĠĠĠ ĠUI Util . put Client Property ( this , ĠUI Util . NOT _ IN _ HI ER ARCH Y _ COMPONENTS , ĠlistOf ( decorator Renderer )) ĊĊĠĠĠ Ġselection Mode Ġ= ĠList Selection Model . SINGLE _ SELECTION ĊĠĠĠ Ġempty Text . apply Ġ{ ĊĠĠĠĠĠ Ġappend Text (" No ĠGitHub Ġaccounts Ġadded .") ĊĠĠĠĠĠ Ġappend Secondary Text (" Add Ġaccount ", ĠSimple Text Attributes . LINK _ ATTRIBUTES , Ġ{ Ġadd Account () Ġ}) ĊĠĠĠĠĠ Ġappend Secondary Text (" Ġ(${ Key map Util . getFirst Keyboard Shortcut Text ( Common Shortcut s . getNew ()) })", ĠStatus Text . DEFAULT _ ATTRIBUTES , Ġnull ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġprogress Manager Ġ= Ġcreate List Progress Manager () ĊĠ Ġprivate Ġval Ġerror Link Handler Ġ= Ġcreate Link Activation Listener () ĊĠ Ġprivate Ġvar Ġerror Link Handler Installed Ġ= Ġfalse ĊĠ Ġprivate Ġvar Ġcurrent Tokens Map Ġ= Ġmap Of < Github Account , ĠString ?> () ĊĠ Ġprivate Ġval Ġnew Tokens Map Ġ= Ġmutable Map Of < Github Account , ĠString >() ĊĊĠ Ġinit Ġ{ ĊĠĠĠ ĠaddTo Center ( Toolbar Decorator . create Decorator ( account List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. disable UpDown Actions () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Panel Border ( Ide Border Factory . create Border ( Side Border . TOP Ġor ĠSide Border . BOTTOM )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Add Action Ġ{ Ġadd Account () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Extra Action ( object Ġ: ĠToolbar Decorator . Element ActionButton (" Set Ġdefault ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAll Icons . Actions . Checked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠactionPerformed ( e : ĠAn ActionEvent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( account List . selected Value . project Default ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( account Data Ġin Ġaccount ListModel . items ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( account Data Ġ== Ġaccount List . selected Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Data . project Default Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccount ListModel . contents Changed ( account Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( account Data . project Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Data . project Default Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccount ListModel . contents Changed ( account Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġupdate Button ( e : ĠAn ActionEvent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Enabled Ġ= Ġis Enabled Ġ&& Ġ! account List . selected Value . project Default ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create Panel ()) ĊĊĠĠĠ ĠDis poser . register ( this , Ġprogress Manager ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġadd Account () Ġ{ ĊĠĠĠ Ġval Ġdialog Ġ= ĠGithub Login Dialog ( executor Factory , Ġproject , Ġthis , Ġ:: is Account Unique ) ĊĠĠĠ Ġif Ġ( dialog . show AndGet ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġgithub Account Ġ= ĠGithub Account Manager . create Account ( dialog . get Login (), Ġdialog . getServer ()) ĊĠĠĠĠĠ Ġnew Tokens Map [ github Account ] Ġ= Ġdialog . getToken () ĊĊĠĠĠĠĠ Ġval Ġaccount Data Ġ= ĠGithub Account Decorator ( github Account , Ġfalse ) ĊĠĠĠĠĠ Ġaccount ListModel . add ( account Data ) ĊĠĠĠĠĠ Ġload Account Details ( account Data ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġedit Account ( decorator : ĠGithub Account Decorator ) Ġ{ ĊĠĠĠ Ġval Ġdialog Ġ= ĠGithub Login Dialog ( executor Factory , Ġproject , Ġthis ). apply Ġ{ ĊĠĠĠĠĠ Ġwith Server ( decorator . account . server . toString (), Ġfalse ) ĊĠĠĠĠĠ Ġwith Credentials ( decorator . account . name ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( dialog . show AndGet ()) Ġ{ ĊĠĠĠĠĠ Ġdecorator . account . name Ġ= Ġdialog . get Login () ĊĠĠĠĠĠ Ġnew Tokens Map [ decorator . account ] Ġ= Ġdialog . getToken () ĊĠĠĠĠĠ Ġload Account Details ( decorator ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġis Account Unique ( login : ĠString , Ġserver : ĠGithub Server Path ) Ġ= ĊĠĠĠ Ġaccount ListModel . items . none Ġ{ Ġit . account . name Ġ== Ġlogin Ġ&& Ġit . account . server Ġ== Ġserver Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠMan ages Ġlink Ġhover Ġand Ġclick Ġfor Ġ[ Github Account Decorator Renderer . loading Error ] ĊĠĠ Ġ* ĠSets Ġthe Ġproper Ġcursor Ġand Ġunder lines Ġthe Ġlink Ġon Ġhover ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ see Ġ[ Github Account Decorator . loading Error ] ĊĠĠ Ġ* Ġ@ see Ġ[ Github Account Decorator . show Login Link ] ĊĠĠ Ġ* Ġ@ see Ġ[ Github Account Decorator . error Link Point ed At ] ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġcreate Link Activation Listener () Ġ= Ġobject Ġ: ĠMouse Adapter () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġmouse Moved ( e : ĠMouseEvent ) Ġ{ ĊĠĠĠĠĠ Ġval Ġdecorator Ġ= Ġfind Decorator With Login Link At ( e . point ) ĊĠĠĠĠĠ Ġif Ġ( decorator Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ ĠUI Util . set Cursor ( account List , ĠCursor . get Pre defined Cursor ( Cursor . HAND _ CURSOR )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠUI Util . set Cursor ( account List , ĠCursor . getDefault Cursor ()) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġvar Ġhas Changes Ġ= Ġfalse ĊĠĠĠĠĠ Ġfor Ġ( item Ġin Ġaccount ListModel . items ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Link Point ed At Ġ= Ġitem Ġ== Ġdecorator ĊĠĠĠĠĠĠĠ Ġhas Changes Ġ= Ġhas Changes Ġ|| Ġis Link Point ed At Ġ!= Ġitem . error Link Point ed At ĊĠĠĠĠĠĠĠ Ġitem . error Link Point ed At Ġ= Ġis Link Point ed At ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( has Changes ) Ġaccount ListModel . all Contents Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmouse Clicked ( e : ĠMouseEvent ) Ġ{ ĊĠĠĠĠĠ Ġfind Decorator With Login Link At ( e . point )?. run (:: edit Account ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġmouse Ġis Ġpointed Ġat Ġdecorator Ġerror Ġlink ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġdecorator Ġwith Ġerror Ġlink Ġunder Ġmouse Ġpointer Ġor Ġnull ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfind Decorator With Login Link At ( point : ĠPoint ): ĠGithub Account Decorator ? Ġ{ ĊĠĠĠĠĠ Ġval Ġidx Ġ= Ġaccount List . location To Index ( point ) ĊĠĠĠĠĠ Ġif Ġ( idx Ġ< Ġ 0 ) Ġreturn Ġnull ĊĊĠĠĠĠĠ Ġval Ġcell Bounds Ġ= Ġaccount List . getCell Bounds ( idx , Ġidx ) ĊĠĠĠĠĠ Ġif Ġ(! cell Bounds . contains ( point )) Ġreturn Ġnull ĊĊĠĠĠĠĠ Ġval Ġdecorator Ġ= Ġaccount ListModel . getElement At ( idx ) ĊĠĠĠĠĠ Ġif Ġ( decorator ?. loading Error Ġ== Ġnull ) Ġreturn Ġnull ĊĊĠĠĠĠĠ Ġval Ġrenderer Component Ġ= Ġaccount List . cell Renderer . getList Cell Renderer Component ( account List , Ġdecorator , Ġidx , Ġtrue , Ġtrue ) ĊĠĠĠĠĠ Ġrenderer Component . setBounds ( cell Bounds . x , Ġcell Bounds . y , Ġcell Bounds . width , Ġcell Bounds . height ) ĊĠĠĠĠĠ ĠUI Util . layout Re cursively ( renderer Component ) ĊĊĠĠĠĠĠ Ġval Ġrenderer Relative X Ġ= Ġpoint . x Ġ- Ġcell Bounds . x ĊĠĠĠĠĠ Ġval Ġrenderer Relative Y Ġ= Ġpoint . y Ġ- Ġcell Bounds . y ĊĠĠĠĠĠ Ġval Ġchild Component Ġ= ĠUI Util . get Dee pe st Component At ( renderer Component , Ġrenderer Relative X , Ġrenderer Relative Y ) ĊĠĠĠĠĠ Ġif Ġ( child Component Ġ! is ĠSimple Colo red Component ) Ġreturn Ġnull ĊĊĠĠĠĠĠ Ġval Ġchild Relative X Ġ= Ġrenderer Relative X Ġ- Ġchild Component . parent . x Ġ- Ġchild Component . x ĊĠĠĠĠĠ Ġreturn Ġif Ġ( child Component . get Fragment Tag At ( child Relative X ) Ġ== ĠLINK _ TAG ) Ġdecorator Ġelse Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġset Link Handler Enabled ( enabled : ĠBoolean ) Ġ{ ĊĠĠĠ Ġif Ġ( enabled ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ(! error Link Handler Installed ) Ġ{ ĊĠĠĠĠĠĠĠ Ġaccount List . add Mouse Listener ( error Link Handler ) ĊĠĠĠĠĠĠĠ Ġaccount List . add Mouse Motion Listener ( error Link Handler ) ĊĠĠĠĠĠĠĠ Ġerror Link Handler Installed Ġ= Ġtrue ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġif Ġ( error Link Handler Installed ) Ġ{ ĊĠĠĠĠĠ Ġaccount List . remove Mouse Listener ( error Link Handler ) ĊĠĠĠĠĠ Ġaccount List . remove Mouse Motion Listener ( error Link Handler ) ĊĠĠĠĠĠ Ġerror Link Handler Installed Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġload Existing Accounts Details () Ġ{ ĊĠĠĠ Ġfor Ġ( account Data Ġin Ġaccount ListModel . items ) Ġ{ ĊĠĠĠĠĠ Ġload Account Details ( account Data ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġload Account Details ( account Data : ĠGithub Account Decorator ) Ġ{ ĊĠĠĠ Ġval Ġaccount Ġ= Ġaccount Data . account ĊĠĠĠ Ġval Ġtoken Ġ= Ġnew Tokens Map [ account ] Ġ?: Ġcurrent Tokens Map [ account ] ĊĠĠĠ Ġif Ġ( token Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġaccount ListModel . contents Changed ( account Data . apply Ġ{ ĊĠĠĠĠĠĠĠ Ġloading Error Ġ= Ġ" Missing Ġaccess Ġtoken " ĊĠĠĠĠĠĠĠ Ġshow Login Link Ġ= Ġtrue ĊĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġexecutor Ġ= Ġexecutor Factory . create ( token ) ĊĠĠĠ Ġprogress Manager . run ( object Ġ: ĠTask . Background able ( project , Ġ" Not ĠVis ible ") Ġ{ ĊĠĠĠĠĠ Ġlateinit Ġvar Ġloaded Details : ĠGithub Authenticated User ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġrun ( indicator : ĠProgress Indicator ) Ġ{ ĊĠĠĠĠĠĠĠ Ġloaded Details Ġ= Ġexecutor . execute ( indicator , ĠGithub Api Requests . CurrentUser . get ( account . server )) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess () Ġ{ ĊĠĠĠĠĠĠĠ Ġaccount ListModel . contents Changed ( account Data . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġdetails Ġ= Ġloaded Details ĊĠĠĠĠĠĠĠĠĠ Ġicon Provider Ġ= ĠC aching Github Avatar Icons Provider ( avatar Loader , Ġimage Res izer , Ġexecutor , Ġaccount Icon Size , Ġaccount List ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDis poser . register ( this @ Github Accounts Panel , Ġthis ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġloading Error Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠ Ġshow Login Link Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġon Throwable ( error : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġaccount ListModel . contents Changed ( account Data . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġloading Error Ġ= Ġerror . message . toString () ĊĠĠĠĠĠĠĠĠĠ Ġshow Login Link Ġ= Ġerror Ġis ĠGithub Authentication Exception ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate List Progress Manager () Ġ= Ġobject Ġ: ĠProgress Visibility Manager () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġset Progress Visible ( visible : ĠBoolean ) Ġ= Ġaccount List . set Paint Busy ( visible ) ĊĠĠĠ Ġoverride Ġfun Ġget Modal ity State () Ġ= ĠMod ality State . any () ĊĠ Ġ} ĊĊĠ Ġfun Ġset Accounts ( accounts : ĠMap < Github Account , ĠString ? >, Ġdefault Account : ĠGithub Account ?) Ġ{ ĊĠĠĠ Ġaccount ListModel . removeAll () ĊĠĠĠ Ġaccount ListModel . addAll ( 0 , Ġaccounts . keys . map Ġ{ ĠGithub Account Decorator ( it , Ġit Ġ== Ġdefault Account ) Ġ}) ĊĠĠĠ Ġcurrent Tokens Map Ġ= Ġaccounts ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ@ return Ġlist Ġof Ġaccounts Ġand Ġassociated Ġtokens Ġif Ġnew Ġtoken Ġwas Ġcreated Ġand Ġselected Ġdefault Ġaccount ĊĠĠ Ġ*/ ĊĠ Ġfun Ġget Accounts (): ĠPair < Map < Github Account , ĠString ? >, ĠGithub Account ?> Ġ{ ĊĠĠĠ Ġreturn Ġaccount ListModel . items . associate Ġ{ Ġit . account Ġto Ġnew Tokens Map [ it . account ] Ġ} Ġto ĊĠĠĠĠĠ Ġaccount ListModel . items . find Ġ{ Ġit . project Default Ġ} ?. account ĊĠ Ġ} ĊĊĠ Ġfun Ġclear New Tokens () Ġ= Ġnew Tokens Map . clear () ĊĊĠ Ġfun Ġis Modified ( accounts : ĠSet < Github Account >, Ġdefault Account : ĠGithub Account ?): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġaccount ListModel . items . find Ġ{ Ġit . project Default Ġ} ?. account Ġ!= Ġdefault Account Ġ|| ĊĠĠĠĠĠĠĠĠĠĠ Ġaccount ListModel . items . map Ġ{ Ġit . account Ġ}. toSet () Ġ!= Ġaccounts Ġ|| ĊĠĠĠĠĠĠĠĠĠĠ Ġnew Tokens Map . isNotEmpty () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġdispose () Ġ{} Ċ } Ċ Ċ private Ġclass ĠGithub Account Decorator Renderer Ġ: ĠList Cell Renderer < Github Account Decorator >, ĠJPanel () Ġ{ ĊĠ Ġprivate Ġval Ġaccount Name Ġ= ĠJLabel () ĊĊĠ Ġprivate Ġval Ġserver Name Ġ= ĠJLabel () ĊĠ Ġprivate Ġval Ġprofile Picture Ġ= ĠJLabel () ĊĊĠ Ġprivate Ġval ĠfullName Ġ= ĠJLabel () ĊĊĠ Ġprivate Ġval Ġloading Error Ġ= ĠSimple Colo red Component () ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠUPDATE Ġ[ create Link Activation Listener ] ĠIF ĠYOU ĠCHANGE ĠLAY OUT ĊĠĠ Ġ*/ ĊĠ Ġinit Ġ{ ĊĠĠĠ Ġlayout Ġ= ĠFlow Layout ( Flow Layout . LEFT , Ġ 0 , Ġ 0 ) ĊĠĠĠ Ġborder Ġ= ĠJ BU I . B orders . empty ( 5 , Ġ 8 ) ĊĊĠĠĠ Ġval Ġnames Panel Ġ= ĠJPanel (). apply Ġ{ ĊĠĠĠĠĠ Ġlayout Ġ= ĠGrid BagLayout () ĊĠĠĠĠĠ Ġborder Ġ= ĠJ BU I . B orders . empty ( 0 , Ġ 6 , Ġ 4 , Ġ 6 ) ĊĊĠĠĠĠĠ Ġval Ġbag Ġ= ĠGrid Bag () ĊĠĠĠĠĠĠĠ Ġ. setDefault Insets ( J BU I . in sets Right ( UI Util . DEFAULT _ HG AP )) ĊĠĠĠĠĠĠĠ Ġ. setDefault Anchor ( Grid BagConstraints . WEST ) ĊĠĠĠĠĠĠĠ Ġ. setDefault Fill ( Grid BagConstraints . VERTICAL ) ĊĠĠĠĠĠ Ġadd ( fullName , Ġbag . nextLine (). next ()) ĊĠĠĠĠĠ Ġadd ( account Name , Ġbag . next ()) ĊĠĠĠĠĠ Ġadd ( loading Error , Ġbag . next ()) ĊĠĠĠĠĠ Ġadd ( server Name , Ġbag . nextLine (). cover Line ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġadd ( profile Picture ) ĊĠĠĠ Ġadd ( names Panel ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠgetList Cell Renderer Component ( list : ĠJ List < out ĠGithub Account Decorator >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue : ĠGithub Account Decorator , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Selected : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell Has Focus : ĠBoolean ): ĠComponent Ġ{ ĊĠĠĠ ĠUI Util . setBackground Re cursively ( this , ĠGithub UI Util . List . With T all Row . background ( list , Ġis Selected )) ĊĠĠĠ Ġval Ġprimary TextColor Ġ= ĠGithub UI Util . List . With T all Row . foreground ( list , Ġis Selected ) ĊĠĠĠ Ġval Ġsecondary TextColor Ġ= ĠGithub UI Util . List . With T all Row . secondary Foreground ( list , Ġis Selected ) ĊĊĠĠĠ Ġaccount Name . apply Ġ{ ĊĠĠĠĠĠ Ġtext Ġ= Ġvalue . account . name ĊĠĠĠĠĠ Ġset Bold ( if Ġ( value . details ?. name Ġ== Ġnull ) Ġvalue . project Default Ġelse Ġfalse ) ĊĠĠĠĠĠ Ġforeground Ġ= Ġif Ġ( value . details ?. name Ġ== Ġnull ) Ġprimary TextColor Ġelse Ġsecondary TextColor ĊĠĠĠ Ġ} ĊĠĠĠ Ġserver Name . apply Ġ{ ĊĠĠĠĠĠ Ġtext Ġ= Ġvalue . account . server . toString () ĊĠĠĠĠĠ Ġforeground Ġ= Ġsecondary TextColor ĊĠĠĠ Ġ} ĊĠĠĠ Ġprofile Picture . apply Ġ{ ĊĠĠĠĠĠ Ġicon Ġ= Ġvalue . get Icon () ĊĠĠĠ Ġ} ĊĠĠĠ ĠfullName . apply Ġ{ ĊĠĠĠĠĠ Ġtext Ġ= Ġvalue . details ?. name ĊĠĠĠĠĠ Ġset Bold ( value . project Default ) ĊĠĠĠĠĠ Ġis Visible Ġ= Ġvalue . details ?. name Ġ!= Ġnull ĊĠĠĠĠĠ Ġforeground Ġ= Ġprimary TextColor ĊĠĠĠ Ġ} ĊĠĠĠ Ġloading Error . apply Ġ{ ĊĠĠĠĠĠ Ġclear () ĊĠĠĠĠĠ Ġvalue . loading Error ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġappend ( it , ĠSimple Text Attributes . ERROR _ ATTRIBUTES ) ĊĠĠĠĠĠĠĠ Ġappend (" Ġ") ĊĠĠĠĠĠĠĠ Ġif Ġ( value . show Login Link ) Ġappend (" Log ĠIn ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value . error Link Point ed At ) ĠSimple Text Attributes ( STYLE _ UNDER LINE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ BU I . Current Theme . Link . link Color ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠSimple Text Attributes ( STYLE _ PLAIN , ĠJ BU I . Current Theme . Link . link Color ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLINK _ TAG ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġfun ĠJLabel . setBold ( is Bold : ĠBoolean ) Ġ{ ĊĠĠĠĠĠ Ġfont Ġ= Ġfont . derive Font ( if Ġ( is Bold ) Ġfont . style Ġor ĠFont . BOLD Ġelse Ġfont . style Ġand ĠFont . BOLD . inv ()) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠAccount Ġ+ Ġaux ill ary Ġinfo Ġ+ Ġinfo Ġloading Ġerror Ċ Ġ*/ Ċ private Ġclass ĠGithub Account Decorator ( val Ġaccount : ĠGithub Account , Ġvar Ġproject Default : ĠBoolean ) Ġ{ ĊĠ Ġvar Ġdetails : ĠGithub Authenticated User ? Ġ= Ġnull ĊĠ Ġvar Ġicon Provider : ĠC aching Github Avatar Icons Provider ? Ġ= Ġnull ĊĊĠ Ġvar Ġloading Error : ĠString ? Ġ= Ġnull ĊĠ Ġvar Ġshow Login Link Ġ= Ġfalse ĊĠ Ġvar Ġerror Link Point ed At Ġ= Ġfalse ĊĊĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠ Ġif Ġ( java Class Ġ!= Ġother ?. java Class ) Ġreturn Ġfalse ĊĊĠĠĠ Ġother Ġas ĠGithub Account Decorator ĊĊĠĠĠ Ġif Ġ( account Ġ!= Ġother . account ) Ġreturn Ġfalse ĊĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġaccount . hashCode () ĊĠ Ġ} ĊĊĠ Ġfun Ġget Icon () Ġ= Ġdetails ?. let Ġ{ Ġicon Provider ?. get Icon ( it ) Ġ} Ċ } Ċ