// ĠCopyright Ġ 2 0 0 0 - 2 0 2 1 Ġ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 . ift . lesson Ċ Ċ import Ġcom . intellij . openapi . action System . Common Shortcut s Ċ import Ġcom . intellij . openapi . action System . Keyboard Shortcut Ċ import Ġcom . intellij . openapi . action System . impl . Action MenuItem Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . ui . popup . Bal loon Ċ import Ġcom . intellij . openapi . vcs . ui . Commit Message Ċ import Ġcom . intellij . openapi . wm . Tool Window Id Ċ import Ġcom . intellij . openapi . wm . Tool WindowManager Ċ import Ġcom . intellij . ui . components . Basic Option Button UI Ċ import Ġcom . intellij . ui . table . JB Table Ċ import Ġcom . intellij . vcs . log . Hash Ċ import Ġcom . intellij . vcs . log . V cs Commit Metadata Ċ import Ġcom . intellij . vcs . log . data . V cs Log Data Ċ import Ġcom . intellij . vcs . log . impl . V cs Project Log Ċ import Ġcom . intellij . vcs . log . ui . table . V cs Log Graph Table Ċ import Ġcom . intellij . vcs . log . util . find Branch Ċ import Ġgit 4 idea . Git Notification Ids Holder Ċ import Ġgit 4 idea . i 1 8 n . Git Bundle Ċ import Ġgit 4 idea . ift . Git Less ons Bundle Ċ import Ġgit 4 idea . ift . Git Less ons Util . checkout Branch Ċ import Ġgit 4 idea . ift . Git Less ons Util . highlight Latest Commits From Branch Ċ import Ġgit 4 idea . ift . Git Less ons Util . highlight Sub sequent Commits In Git Log Ċ import Ġgit 4 idea . ift . Git Less ons Util . reset Git Log Window Ċ import Ġgit 4 idea . ift . Git Less ons Util . show Warning If Git Window Closed Ċ import Ġgit 4 idea . ift . Git Less ons Util . trigger On Notification Ċ import Ġgit 4 idea . re base . interactive . dialog . GIT _ INTER ACTIVE _ RE BASE _ DIALOG _ DIMENSION _ KEY Ċ import Ġtraining . dsl .* Ċ import Ġtraining . dsl . Lesson Util . adjust Popup Position Ċ import Ġtraining . dsl . Lesson Util . restore Popup Position Ċ import Ġtraining . ui . Learning Ui Highlighting Manager Ċ import Ġjava . awt . Point Ċ import Ġjava . awt . event . Input Event Ċ import Ġjava . awt . event . KeyEvent Ċ import Ġjavax . swing . JButton Ċ import Ġjavax . swing . J Dialog Ċ import Ġjavax . swing . KeyStroke Ċ Ċ class ĠGit Interactive Re base Lesson Ġ: ĠGit Lesson (" Git . Interactive Re base ", ĠGit Less ons Bundle . message (" git . interactive . re base . lesson . name ")) Ġ{ ĊĠ Ġoverride Ġval Ġexisted File Ġ= Ġ" git / mart ian _ cat . yml " ĊĠ Ġprivate Ġval Ġbranch Name Ġ= Ġ" fixes " ĊĊĠ Ġprivate Ġvar Ġbackup Re base Dialog Location : ĠPoint ? Ġ= Ġnull ĊĊĠ Ġoverride Ġval Ġtest Script Properties Ġ= ĠTask TestContext . Test Script Properties ( skip Testing Ġ= Ġtrue ) ĊĊĠ Ġoverride Ġval Ġlesson Content : ĠLess on Context . () Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠ Ġcheckout Branch ( branch Name ) ĊĊĠĠĠ Ġtask (" Activate Version Control Tool Window ") Ġ{ ĊĠĠĠĠĠ Ġtext ( Git Less ons Bundle . message (" git . interactive . re base . open . git . window ", Ġaction ( it ))) ĊĠĠĠĠĠ Ġstate Check Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtool WindowManager Ġ= ĠTool WindowManager . getInstance ( project ) ĊĠĠĠĠĠĠĠ Ġtool WindowManager . get Tool Window ( Tool Window Id . V CS )?. isVisible Ġ== Ġtrue ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreset Git Log Window () ĊĊĠĠĠ Ġtask Ġ{ ĊĠĠĠĠĠ Ġtext ( Git Less ons Bundle . message (" git . interactive . re base . introduction ")) ĊĠĠĠĠĠ Ġhighlight Latest Commits From Branch ( branch Name , Ġsequence Length Ġ= Ġ 5 , Ġhighlight Inside Ġ= Ġfalse , Ġuse P uls ation Ġ= Ġtrue ) ĊĠĠĠĠĠ Ġproceed Link () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtask Ġ{ ĊĠĠĠĠĠ Ġvar Ġcommit Hash To Highlight : ĠHash ? Ġ= Ġnull ĊĠĠĠĠĠ Ġbefore Ġ{ ĊĠĠĠĠĠĠĠ ĠLearning Ui Highlighting Manager . clear Highlight s () ĊĠĠĠĠĠĠĠ Ġval Ġv cs Data Ġ= ĠV cs Project Log . getInstance ( project ). data Manager ĊĠĠĠĠĠĠĠ Ġcommit Hash To Highlight Ġ= Ġv cs Data ?. findFirst Commit In Branch ( branch Name ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġhighlight Sub sequent Commits In Git Log Ġ{ ĊĠĠĠĠĠĠĠ Ġit . id Ġ== Ġcommit Hash To Highlight ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġinteractive Re base MenuItem Text Ġ= ĠGit Bundle . message (" action . Git . Interactive . Re base . text ") ĊĠĠĠ Ġlateinit Ġvar Ġopen Re base Dialog TaskId : ĠTask Context . TaskId ĊĠĠĠ Ġtask Ġ{ ĊĠĠĠĠĠ Ġopen Re base Dialog TaskId Ġ= ĠtaskId ĊĠĠĠĠĠ Ġtext ( Git Less ons Bundle . message (" git . interactive . re base . open . context . menu ")) ĊĠĠĠĠĠ Ġtext ( Git Less ons Bundle . message (" git . interactive . re base . click . commit . tooltip "), ĊĠĠĠĠĠĠĠĠĠĠ ĠLearning Bal loon Config ( Bal loon . Position . above , Ġ 0 )) ĊĠĠĠĠĠ Ġtrigger By Ui Component And Highlight Ġ{ Ġui : ĠAction MenuItem Ġ-> ĊĠĠĠĠĠĠĠ Ġui . text Ġ== Ġinteractive Re base MenuItem Text ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġshow Warning If Git Window Closed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtask Ġ{ ĊĠĠĠĠĠ Ġtext ( Git Less ons Bundle . message (" git . interactive . re base . choose . interactive . re base ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstrong ( interactive Re base MenuItem Text ))) ĊĠĠĠĠĠ Ġval Ġre bas ing Dialog Title Ġ= ĠGit Bundle . message (" re base . interactive . dialog . title ") ĊĠĠĠĠĠ Ġtrigger By Ui Component And Highlight ( false , Ġfalse ) Ġ{ Ġui : ĠJ Dialog Ġ-> ĊĠĠĠĠĠĠĠ Ġui . title ?. contains ( re bas ing Dialog Title ) Ġ== Ġtrue ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġrestore By Ui ( delay Millis Ġ= Ġdefault Restore Delay ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlateinit Ġvar Ġmoving Commit Text : ĠString ĊĠĠĠ Ġtask Ġ{ ĊĠĠĠĠĠ Ġbefore Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( backup Re base Dialog Location Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġbackup Re base Dialog Location Ġ= Ġadjust Popup Position ( GIT _ INTER ACTIVE _ RE BASE _ DIALOG _ DIMENSION _ KEY ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġtext ( Git Less ons Bundle . message (" git . interactive . re base . select . one . commit ")) ĊĠĠĠĠĠ Ġhighlight Commit In Re base Dialog ( 4 ) ĊĠĠĠĠĠ Ġtrigger By Ui Component And Highlight ( false , Ġfalse ) Ġ{ Ġui : ĠJ B Table Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( ui Ġ! is ĠV cs Log Graph Table ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġmoving Commit Text Ġ= Ġui . model . getValue At ( 4 , Ġ 1 ). toString () ĊĠĠĠĠĠĠĠĠĠ Ġui . selected Row Ġ== Ġ 4 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġrestore By Ui ( open Re base Dialog TaskId ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtask Ġ{ ĊĠĠĠĠĠ Ġval Ġmove Up Shortcut Ġ= ĠCommon Shortcut s . MOVE _ UP . shortcuts . first () Ġas ĠKeyboard Shortcut ĊĠĠĠĠĠ Ġtext ( Git Less ons Bundle . message (" git . interactive . re base . move . commit ", ĠLess on Util . raw KeyStroke ( move Up Shortcut . first KeyStroke ))) ĊĠĠĠĠĠ Ġtrigger By Part Of Component ( highlight Inside Ġ= Ġtrue , Ġuse P uls ation Ġ= Ġfalse ) Ġ{ Ġui : ĠJ B Table Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( ui Ġ! is ĠV cs Log Graph Table ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġui . getCell Rect ( 1 , Ġ 1 , Ġfalse ). apply Ġ{ Ġheight Ġ= Ġ 1 Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġtrigger By Ui Component And Highlight ( false , Ġfalse ) Ġ{ Ġui : ĠJ B Table Ġ-> ĊĠĠĠĠĠĠĠ Ġui . model . getValue At ( 1 , Ġ 1 ). toString () Ġ== Ġmoving Commit Text ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġrestore State Ġ{ ĊĠĠĠĠĠĠĠ ĠThread . currentThread (). stack Trace . find Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġit . className . contains (" Git Interactive Re base Using Log ") ĊĠĠĠĠĠĠĠ Ġ} Ġ== Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtask Ġ{ ĊĠĠĠĠĠ Ġval Ġfix up Shortcut Ġ= ĠKey Stroke . getKey Stroke ( KeyEvent . VK _ F , ĠInput Event . ALT _ DOWN _ MASK ) ĊĠĠĠĠĠ Ġtext ( Git Less ons Bundle . message (" git . interactive . re base . invoke . fix up ", ĠLess on Util . raw KeyStroke ( fix up Shortcut ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstrong ( Git Bundle . message (" re base . entry . action . name . fix up ")) )) ĊĠĠĠĠĠ Ġtrigger By Ui Component And Highlight Ġ{ Ġ_: ĠBasic Option Button UI . Arrow Button Ġ-> Ġtrue Ġ} ĊĠĠĠĠĠ Ġtrigger (" git 4 idea . re base . interactive . dialog . Fix up Action ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtask Ġ{ ĊĠĠĠĠĠ Ġtext ( Git Less ons Bundle . message (" git . interactive . re base . select . three . commits ", ĠLess on Util . raw KeyStroke ( KeyEvent . VK _ SHIFT ))) ĊĠĠĠĠĠ Ġhighlight Sub sequent Commits In Re base Dialog ( start Row In cl Ġ= Ġ 2 , Ġend Row Ex cl Ġ= Ġ 5 ) ĊĠĠĠĠĠ Ġtrigger By Ui Component And Highlight ( false , Ġfalse ) Ġ{ Ġui : ĠJ B Table Ġ-> ĊĠĠĠĠĠĠĠ Ġui . similar Commits Selected () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtask Ġ{ ĊĠĠĠĠĠ Ġval Ġsqu ash Shortcut Ġ= ĠKey Stroke . getKey Stroke ( KeyEvent . VK _ S , ĠInput Event . ALT _ DOWN _ MASK ) ĊĠĠĠĠĠ Ġtext ( Git Less ons Bundle . message (" git . interactive . re base . invoke . squ ash ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLess on Util . raw KeyStroke ( squ ash Shortcut ), Ġstrong ( Git Bundle . message (" re base . entry . action . name . squ ash ")) )) ĊĠĠĠĠĠ Ġtrigger By Ui Component And Highlight Ġ{ Ġ_: ĠBasic Option Button UI . Main Button Ġ-> Ġtrue Ġ} ĊĠĠĠĠĠ Ġtrigger (" git 4 idea . re base . interactive . dialog . S qu ash Action ") ĊĠĠĠĠĠ Ġrestore State Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtable Ġ= Ġprevious . ui Ġas ? ĠJ B Table Ġ?: Ġreturn @ restore State Ġfalse ĊĠĠĠĠĠĠĠ Ġ! table . similar Commits Selected () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtask Ġ{ ĊĠĠĠĠĠ Ġtrigger By Ui Component And Highlight ( false , Ġfalse ) Ġ{ Ġ_: ĠCommit Message Ġ-> Ġtrue Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtask Ġ{ ĊĠĠĠĠĠ Ġval Ġapply Rew ord Shortcut Ġ= ĠCommon Shortcut s . CTRL _ ENTER . shortcuts . first () Ġas ĠKeyboard Shortcut ĊĠĠĠĠĠ Ġtext ( Git Less ons Bundle . message (" git . interactive . re base . apply . re word ", ĠLess on Util . raw KeyStroke ( apply Rew ord Shortcut . first KeyStroke ))) ĊĠĠĠĠĠ Ġstate Check Ġ{ Ġprevious . ui ?. is Showing Ġ!= Ġtrue Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtask Ġ{ ĊĠĠĠĠĠ Ġval Ġstart Re bas ing ButtonText Ġ= ĠGit Bundle . message (" re base . interactive . dialog . start . re base ") ĊĠĠĠĠĠ Ġtext ( Git Less ons Bundle . message (" git . interactive . re base . start . re bas ing ", Ġstrong ( start Re bas ing ButtonText ))) ĊĠĠĠĠĠ Ġtrigger By Ui Component And Highlight ( use P uls ation Ġ= Ġtrue ) Ġ{ Ġui : ĠJButton Ġ-> ĊĠĠĠĠĠĠĠ Ġui . text ?. contains ( start Re bas ing ButtonText ) Ġ== Ġtrue ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġtrigger On Notification Ġ{ ĊĠĠĠĠĠĠĠ Ġit . display Id Ġ== ĠGit Notification Ids Holder . RE BASE _ SUCCESS FUL ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtext ( Git Less ons Bundle . message (" git . interactive . re base . congr at ulations ")) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Lesson End ( project : ĠProject , Ġlesson Passed : ĠBoolean ) Ġ{ ĊĠĠĠ Ġrestore Popup Position ( project , ĠGIT _ INTER ACTIVE _ RE BASE _ DIALOG _ DIMENSION _ KEY , Ġbackup Re base Dialog Location ) ĊĠĠĠ Ġbackup Re base Dialog Location Ġ= Ġnull ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠTask Context . highlight Commit In Re base Dialog ( row Ind : ĠInt ) Ġ{ ĊĠĠĠ Ġhighlight Sub sequent Commits In Re base Dialog ( row Ind , Ġrow Ind Ġ+ Ġ 1 , Ġhighlight Inside Ġ= Ġtrue ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠTask Context . highlight Sub sequent Commits In Re base Dialog ( start Row In cl : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠ Ġend Row Ex cl : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠ Ġhighlight Inside : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠ Ġuse P uls ation : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠ Ġtrigger By Part Of Component ( highlight Inside Ġ= Ġhighlight Inside , Ġuse P uls ation Ġ= Ġuse P uls ation ) Ġ{ Ġui : ĠJ B Table Ġ-> ĊĠĠĠĠĠ Ġif Ġ( ui Ġ! is ĠV cs Log Graph Table ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrect Ġ= Ġui . getCell Rect ( start Row In cl , Ġ 1 , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġrect . height Ġ*= Ġend Row Ex cl Ġ- Ġstart Row In cl ĊĠĠĠĠĠĠĠ Ġrect ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠJ B Table . similar Commits Selected (): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġrows Ġ= Ġselected Rows ĊĠĠĠ Ġreturn Ġrows . size Ġ== Ġ 3 Ġ&& Ġ( 2 .. 4 ). all Ġ{ Ġrows . contains ( it ) Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠV cs Log Data . findFirst Commit In Branch ( branch Name : ĠString ): ĠHash ? Ġ{ ĊĠĠĠ Ġval Ġroot Ġ= Ġroots . single () ĊĠĠĠ Ġval Ġmain Commit Hash Ġ= Ġdata Pack . find Branch (" main ", Ġroot )?. commit Hash ĊĠĠĠ Ġval Ġlast Commit Hash Ġ= Ġdata Pack . find Branch ( branch Name , Ġroot )?. commit Hash ĊĠĠĠ Ġreturn Ġif Ġ( main Commit Hash Ġ!= Ġnull Ġ&& Ġlast Commit Hash Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġvar Ġmetadata Ġ= Ġget Commit Metadata ( last Commit Hash ) ĊĠĠĠĠĠ Ġwhile Ġ( metadata . parents . single () Ġ!= Ġmain Commit Hash ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmetadata Ġ= Ġget Commit Metadata ( metadata . parents . single ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġmetadata . id ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġnull ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠV cs Log Data . get Commit Metadata ( hash : ĠHash ): ĠV cs Commit Metadata Ġ{ ĊĠĠĠ Ġval Ġindex Ġ= Ġget Commit Index ( hash , Ġroots . single ()) ĊĠĠĠ Ġreturn Ġtop Commits Cache [ index ] Ġ?: Ġmini Details Getter . get Commit Data ( index , ĠlistOf ( index )) ĊĠ Ġ} Ċ }