// ĠCopyright Ġ 2 0 0 0 - 2 0 2 0 Ġ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 Ġgit 4 idea . update Ċ Ċ import Ġcom . intellij . code Insight . completion . Completion ResultSet Ċ import Ġcom . intellij . code Insight . lookup . Lookup Element Builder Ċ import Ġcom . intellij . dv cs . D vcs Util Ċ import Ġcom . intellij . openapi . components . service Ċ import Ġcom . intellij . openapi . diagnostic . logger Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . ui . ComboBox Ċ import Ġcom . intellij . openapi . ui . Dialog Wrapper Ċ import Ġcom . intellij . openapi . util . text . Html Builder Ċ import Ġcom . intellij . openapi . util . text . Html Chunk Ċ import Ġcom . intellij . openapi . vcs . V cs Notifier Ċ import Ġcom . intellij . ui . Collection ComboBox Model Ċ import Ġcom . intellij . ui . Mutable Collection ComboBox Model Ċ import Ġcom . intellij . ui . Simple List Cell Renderer Ċ import Ġcom . intellij . util . TextField Completion Provider Ċ import Ġcom . intellij . util . text Completion . TextField With Completion Ċ import Ġcom . intellij . util . ui . JB Dimension Ċ import Ġcom . intellij . util . ui . J BU I Ċ import Ġgit 4 idea . Git Notification Ids Holder . Companion . FIX _ TRACK ED _ NOT _ ON _ BRANCH Ċ import Ġgit 4 idea . Git Remote Branch Ċ import Ġgit 4 idea . branch . Git Branch Pair Ċ import Ġgit 4 idea . config . Git V cs Settings Ċ import Ġgit 4 idea . config . Update Method Ċ import Ġgit 4 idea . i 1 8 n . Git Bundle Ċ import Ġgit 4 idea . repo . Git Repository Ċ import Ġgit 4 idea . repo . Git Repository Manager Ċ import Ġnet . mig info com . layout . CC Ċ import Ġnet . mig info com . layout . LC Ċ import Ġnet . mig info com . swing . M ig Layout Ċ import Ġjava . awt . event . Focus Adapter Ċ import Ġjava . awt . event . Focus Event Ċ import Ġjava . awt . event . Item Event Ċ import Ġjava . awt . event . KeyEvent Ċ import Ġjavax . swing .* Ċ Ċ internal Ġclass ĠFix Tracked Branch Dialog ( private Ġval Ġproject : ĠProject ) Ġ: ĠDialog Wrapper ( project ) Ġ{ ĊĊĠ Ġprivate Ġval Ġv cs Notifier Ġ= Ġproject . service < V cs Notifier >() ĊĊĠ Ġprivate Ġval Ġrepositories Ġ= ĠD vcs Util . sort Repositories ( Git Repository Manager . getInstance ( project ). repositories ) ĊĊĠ Ġprivate Ġval Ġbranches Ġ= Ġrepositories . associate With Ġ{ Ġrepository Ġ-> ĊĠĠĠ Ġrepository . branches . remote Branches . groupBy Ġ{ Ġbranch Ġ-> Ġbranch . remote Ġ} ĊĠ Ġ} ĊĊĠ Ġvar Ġupdate Config Ġ= Ġcollect Update Config (); Ġprivate Ġset ĊĊĠ Ġvar Ġupdate Method Ġ= ĠGit V cs Settings . getInstance ( project ). update Method ; Ġprivate Ġset ĊĊĠ Ġprivate Ġval Ġrepository Field Ġ= Ġcreate Repository Field () ĊĠ Ġprivate Ġval Ġremote Field Ġ= Ġcreate Remote Field () ĊĠ Ġprivate Ġval Ġbranch Field Ġ= Ġcreate Branch Field () ĊĠ Ġprivate Ġval Ġset As Tracked Branch Field Ġ= ĠJ CheckBox ( Git Bundle . message (" tracked . branch . fix . dialog . set . as . tracked ")). apply Ġ{ ĊĠĠĠ Ġmnemonic Ġ= ĠKeyEvent . VK _ S ĊĠ Ġ} ĊĠ Ġprivate Ġval Ġupdate Method Button Group Ġ= Ġcreate Update Method Button Group () ĊĊĠ Ġprivate Ġval Ġpanel Ġ= Ġcreate Panel () ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġtitle Ġ= ĠGit Bundle . message (" tracked . branch . fix . dialog . title ") ĊĠĠĠ Ġset OK ButtonText ( Git Bundle . message (" tracked . branch . fix . dialog . ok . button . text ")) ĊĠĠĠ Ġinit () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġcreate Center Panel () Ġ= Ġpanel ĊĊĠ Ġoverride Ġfun Ġget Preferred Focused Component () Ġ= Ġbranch Field ĊĊĠ Ġfun Ġshould Set As Tracked Branch () Ġ= Ġset As Tracked Branch Field . isSelected ĊĊĠ Ġprivate Ġfun Ġcollect Update Config (): ĠMutable Map < Git Repository , ĠGit Branch Pair > Ġ{ ĊĠĠĠ Ġval Ġmap Ġ= Ġmutable Map Of < Git Repository , ĠGit Branch Pair >() ĊĊĠĠĠ Ġval Ġrepos Not On Branch Ġ= Ġrepositories . filter Ġ{ Ġit . current Branch Ġ== Ġnull Ġ}. join ToString Ġ{ ĠD vcs Util . get Short Repository Name ( it ) Ġ} ĊĠĠĠ Ġif Ġ( repos Not On Branch . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġmessage Ġ= ĠHtml Builder () ĊĠĠĠĠĠĠĠ Ġ. append ( Git Bundle . message (" tracked . branch . fix . dialog . not . on . branch . message ")) ĊĠĠĠĠĠĠĠ Ġ. append ( Html Chunk . br ()) ĊĠĠĠĠĠĠĠ Ġ. append ( repos Not On Branch ) ĊĠĠĠĠĠĠĠ Ġ. toString () ĊĠĠĠĠĠ Ġv cs Notifier . notify Important Warning ( FIX _ TRACK ED _ NOT _ ON _ BRANCH , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGit Bundle . message (" tracked . branch . fix . dialog . not . on . branch . title "), Ġmessage ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfor Ġ( repository Ġin Ġrepositories ) Ġ{ ĊĠĠĠĠĠ Ġval Ġlocal Branch Ġ= Ġrepository . current Branch ĊĠĠĠĠĠ Ġif Ġ( local Branch Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtracked Branch Ġ= Ġlocal Branch . find Tracked Branch ( repository ) Ġ?: Ġget Branch Matching Local ( repository ) ĊĠĠĠĠĠĠĠ Ġif Ġ( tracked Branch Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġmap [ repository ] Ġ= ĠGit Branch Pair ( local Branch , Ġtracked Branch ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġmap ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Selected Repository () Ġ= Ġrepository Field . item ĊĊĠ Ġprivate Ġfun Ġget Matching Branch ( repository : ĠGit Repository , Ġpredicate : Ġ( Git Remote Branch ) Ġ-> ĠBoolean ): ĠGit Remote Branch ? Ġ{ ĊĠĠĠ Ġreturn Ġbranches [ repository ]?. values ?. flatten ()?. first OrNull ( predicate ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Branch Matching Local ( repository : ĠGit Repository ): ĠGit Remote Branch ? Ġ{ ĊĠĠĠ Ġreturn Ġget Matching Branch ( repository ) Ġ{ Ġbranch Ġ-> ĊĠĠĠĠĠ Ġbranch . name For Remote Operations Ġ== Ġrepository . current Branch Name ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Matching Branches ( repository : ĠGit Repository , Ġinput : ĠString ): ĠList < Git Remote Branch > Ġ{ ĊĠĠĠ Ġreturn Ġbranches [ repository ]?. values ?. flatten ()?. filter Ġ{ Ġbranch Ġ-> ĊĠĠĠĠĠ Ġbranch . name For Remote Operations . contains ( input ) ĊĠĠĠ Ġ} Ġ?: Ġempty List () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġset Branch ToUpdate From ( repository : ĠGit Repository , Ġtracked Branch : ĠGit Remote Branch ?) Ġ{ ĊĠĠĠ Ġif Ġ( tracked Branch Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġbranch Pair Ġ= Ġupdate Config [ repository ] ĊĠĠĠ Ġif Ġ( branch Pair Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġupdate Config [ repository ] Ġ= ĠGit Branch Pair ( branch Pair . source , Ġtracked Branch ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġval Ġlocal Branch Ġ= Ġrepository . current Branch ĊĠĠĠĠĠ Ġif Ġ( local Branch Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . warn (" V CS Ġroot Ġis Ġnot Ġon Ġbranch : Ġ${ repository . root }") ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġupdate Config [ repository ] Ġ= ĠGit Branch Pair ( local Branch , Ġtracked Branch ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Panel () Ġ= ĠJPanel (). apply Ġ{ ĊĠĠĠ Ġlayout Ġ= ĠM ig Layout ( ĊĠĠĠĠĠ ĠLC (). in sets (" 0 "). hide Mode ( 3 )) ĊĊĠĠĠ Ġval Ġshow Repository Field Ġ= Ġrepositories . size Ġ> Ġ 1 ĊĊĠĠĠ Ġadd ( JLabel ( Git Bundle . message (" pull . dialog . git . root ")). apply Ġ{ ĊĠĠĠĠĠ Ġlabel For Ġ= Ġrepository Field ĊĠĠĠĠĠ Ġdisplayed Mnemonic Ġ= ĠKeyEvent . VK _ G ĊĠĠĠĠĠ Ġis Visible Ġ= Ġshow Repository Field ĊĠĠĠ Ġ}) ĊĠĠĠ Ġadd ( repository Field . apply Ġ{ Ġis Visible Ġ= Ġshow Repository Field Ġ}, ĠCC (). span X ( 3 )) ĊĊĠĠĠ Ġadd ( JLabel ( Git Bundle . message (" pull . dialog . from ")). apply Ġ{ ĊĠĠĠĠĠ Ġlabel For Ġ= Ġremote Field ĊĠĠĠĠĠ Ġdisplayed Mnemonic Ġ= ĠKeyEvent . VK _ F ĊĠĠĠ Ġ}, ĠCC (). newline ()) ĊĠĠĠ Ġadd ( remote Field , ĠCC ()) ĊĊĠĠĠ Ġadd ( JLabel ("/ "), ĠCC ()) ĊĠĠĠ Ġadd ( branch Field , ĠCC (). push X (). grow X (). min Width ("${ J BU I . scale ( 2 5 0 )} px "). shrink X ( 0 f )) ĊĊĠĠĠ Ġif Ġ( show Set As Tracked Field ()) Ġ{ ĊĠĠĠĠĠ Ġadd ( set As Tracked Branch Field , ĠCC (). newline (). span X ( 4 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġadd ( update Method Button Group , ĠCC (). newline (). span X ( 4 )) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġshow Set As Tracked Field () Ġ= Ġrepositories . any Ġ{ Ġrepo Ġ-> Ġrepo . current Branch ?. find Tracked Branch ( repo ) Ġ== Ġnull Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Repository Field () Ġ= ĠCombo Box ( Collection ComboBox Model ( repositories )). apply Ġ{ ĊĠĠĠ Ġpreferred Size Ġ= ĠJ B Dimension ( J BU I . scale ( 9 0 ), Ġpreferred Size . height , Ġtrue ) ĊĠĠĠ Ġrenderer Ġ= ĠSimple List Cell Renderer . create ("") Ġ{ Ġrepository Ġ-> ĊĠĠĠĠĠ ĠD vcs Util . get Short Repository Name ( repository ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġadd Item Listener Ġ{ Ġe Ġ-> ĊĠĠĠĠĠ Ġif Ġ( e . state Change Ġ== ĠItem Event . SELECTED ĊĠĠĠĠĠĠĠĠĠ Ġ&& Ġe . item Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Remote Field ( e . item Ġas ĠGit Repository ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Remote Field () Ġ= ĠCombo Box ( Mutable Collection ComboBox Model ( repositories [ 0 ]. rem otes . to Mutable List ())). apply Ġ{ ĊĠĠĠ Ġpreferred Size Ġ= ĠJ B Dimension ( J BU I . scale ( 9 0 ), Ġpreferred Size . height , Ġtrue ) ĊĠĠĠ Ġrenderer Ġ= ĠSimple List Cell Renderer . create ("") Ġ{ Ġremote Ġ-> ĊĠĠĠĠĠ Ġremote . name ĊĠĠĠ Ġ} ĊĠĠĠ Ġadd Item Listener Ġ{ Ġe Ġ-> ĊĠĠĠĠĠ Ġif Ġ( e . state Change Ġ== ĠItem Event . SELECTED ĊĠĠĠĠĠĠĠĠĠ Ġ&& Ġe . item Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Branch Field () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Branch Field (): ĠTextField With Completion Ġ{ ĊĠĠĠ Ġreturn ĠTextField With Completion ( ĊĠĠĠĠĠ Ġproject , ĊĠĠĠĠĠ Ġcreate Branches Completion Provider (), ĊĠĠĠĠĠ Ġget Branch Matching Local ( getSelected Repository ()) ?. name For Remote Operations Ġ?: Ġ"", ĊĠĠĠĠĠ Ġtrue , ĊĠĠĠĠĠ Ġtrue , ĊĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠ Ġsize Ġ= ĠJ B Dimension ( 2 5 0 , Ġ 2 8 ) ĊĊĠĠĠĠĠ Ġset Placeholder ( Git Bundle . message (" tracked . branch . fix . dialog . branch . placeholder ")) ĊĊĠĠĠĠĠ Ġadd Focus Listener ( object Ġ: ĠFocus Adapter () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfocus Lost ( e : ĠFocus Event ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( text . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Branch ToUpdate From ( getSelected Repository (), Ġget Matching Branch ( getSelected Repository ()) Ġ{ Ġbranch Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbranch . name For Remote Operations Ġ== Ġtext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Branches Completion Provider () Ġ= Ġobject Ġ: ĠTextField Completion Provider () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġadd Completion Variants ( text : ĠString , Ġoffset : ĠInt , Ġprefix : ĠString , Ġresult : ĠCompletion ResultSet ) Ġ{ ĊĠĠĠĠĠ Ġget Matching Branches ( getSelected Repository (), Ġtext ) ĊĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġbranch Ġ-> Ġresult . addElement ( Lookup Element Builder . create ( branch . name For Remote Operations )) Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Update Method Button Group () Ġ= ĠJPanel (). apply Ġ{ ĊĠĠĠ Ġlayout Ġ= ĠM ig Layout ( LC (). in sets (" 0 ")) ĊĊĠĠĠ Ġval Ġbutton Group Ġ= ĠButton Group () ĊĊĠĠĠ ĠlistOf ( Update Method . MERGE , ĠUpdate Method . RE BASE ). forEach Ġ{ Ġmethod Ġ-> ĊĠĠĠĠĠ Ġval Ġradio Button Ġ= ĠJ RadioButton ( method . presentation ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġmnemonic Ġ= Ġmethod . name [ 0 ]. toInt () ĊĠĠĠĠĠĠĠ Ġmodel . isSelected Ġ= Ġupdate Method Ġ== Ġmethod ĊĠĠĠĠĠĠĠ Ġadd ActionListener Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġupdate Method Ġ= Ġmethod ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġbutton Group . add ( radioButton ) ĊĠĠĠĠĠ Ġadd ( radioButton , ĠCC (). newline ()) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĊĠ Ġprivate Ġfun Ġupdate Remote Field ( repository : ĠGit Repository ) Ġ{ ĊĠĠĠ Ġ( remote Field . model Ġas ĠMutable Collection ComboBox Model ). update ( repository . rem otes . to Mutable List ()) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġupdate Branch Field () Ġ{ ĊĠĠĠ Ġbranch Field . text Ġ= Ġget Branch Matching Local ( getSelected Repository ()) ?. name For Remote Operations Ġ?: Ġ"" ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġval ĠLOG Ġ= Ġlogger < Fix Tracked Branch Dialog >() ĊĠ Ġ} Ċ }