// Ġ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 Ġcom . intellij . ui Ċ Ċ import Ġcom . intellij . icons . All Icons Ċ import Ġcom . intellij . ide . Browser Util Ċ import Ġcom . intellij . ide . Help Tooltip Ċ import Ġcom . intellij . ide . Ide Bundle Ċ import Ġcom . intellij . ide . Ide EventQueue Ċ import Ġcom . intellij . ide . util . Properties Component Ċ import Ġcom . intellij . openapi . Disposable Ċ import Ġcom . intellij . openapi . action System . Shortcut Ċ import Ġcom . intellij . openapi . keymap . Key map Util Ċ import Ġcom . intellij . openapi . ui . popup . Bal loon Ċ import Ġcom . intellij . openapi . ui . popup . JB Popup Factory Ċ import Ġcom . intellij . openapi . ui . popup . JB Popup Listener Ċ import Ġcom . intellij . openapi . ui . popup . Light weight Window Event Ċ import Ġcom . intellij . openapi . util . Dis poser Ċ import Ġcom . intellij . openapi . util . registry . Registry Ċ import Ġcom . intellij . openapi . util . text . Html Builder Ċ import Ġcom . intellij . openapi . util . text . Html Chunk Ċ import Ġcom . intellij . ui . awt . Relative Point Ċ import Ġcom . intellij . ui . components . JB Label Ċ import Ġcom . intellij . ui . components . labels . Link Label Ċ import Ġcom . intellij . ui . components . labels . Link Listener Ċ import Ġcom . intellij . ui . scale . J BU IS cale Ċ import Ġcom . intellij . util . Alarm Ċ import Ġcom . intellij . util . ui . Grid Bag Ċ import Ġcom . intellij . util . ui . J BU I Ċ import Ġcom . intellij . util . ui . UI Util Ċ import Ġorg . jetbrains . annotations . N ls Ċ import Ġorg . jetbrains . annotations . Non N ls Ċ import Ġjava . awt . Color Ċ import Ġjava . awt . Grid BagConstraints Ċ import Ġjava . awt . Grid BagLayout Ċ import Ġjava . awt . event . ActionListener Ċ import Ġjava . awt . event . KeyEvent Ċ import Ġjava . net . URL Ċ import Ġjavax . swing .* Ċ import Ġjavax . swing . event . Ancestor Event Ċ import Ġjavax . swing . pl af . basic . Basic HTML Ċ import Ġjavax . swing . text . View Ċ Ċ class ĠGot It Tooltip (@ Non N ls Ġval Ġid : ĠString , Ġ@ N ls Ġval Ġtext : ĠString , Ġval Ġdis posable : ĠDis posable ) Ġ{ ĊĠ Ġ@ N ls ĊĠ Ġprivate Ġvar Ġheader Ġ: ĠString Ġ= Ġ"" ĊĊĠ Ġ@ N ls ĊĠ Ġprivate Ġvar Ġbutton Label : ĠString Ġ= ĠIde Bundle . message (" got . it . button . name ") ĊĊĠ Ġprivate Ġvar Ġshortcut : ĠShort cut ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġicon : ĠIcon ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġtimeout Ġ: ĠInt Ġ= Ġ- 1 ĊĠ Ġprivate Ġvar Ġlink Ġ: ĠLink Label < Unit >? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġlink Action Ġ: Ġ() Ġ-> ĠUnit Ġ= Ġ{} ĊĠ Ġprivate Ġvar ĠmaxWidth Ġ= ĠMAX _ WIDTH ĊĠ Ġprivate Ġvar Ġshow Close Shortcut Ġ= Ġfalse ĊĠ Ġprivate Ġvar Ġshow Count Ġ= Ġ 1 ĊĠ Ġprivate Ġvar Ġchain Function : Ġ() Ġ-> ĠUnit Ġ= Ġ{} ĊĊĠ Ġvar Ġcan Show Ġ: Ġ( String ) Ġ-> ĠBoolean Ġ= Ġ{ ĠProperties Component . getInstance (). getInt ( it , Ġshow Count ) Ġ> Ġ 0 Ġ} ĊĠ Ġvar Ġon Got It Ġ: Ġ( String ) Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠ ĠProperties Component . getInstance (). let Ġ{ Ġpc Ġ-> ĊĠĠĠĠĠ Ġval Ġvalue Ġ= Ġpc . getInt ( it , Ġshow Count ) ĊĠĠĠĠĠ Ġif Ġ( value Ġ> Ġ 0 ) Ġpc . setValue ( it , Ġ( value Ġ- Ġ 1 ). toString ()) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġalarm Ġ= ĠAlarm () ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠAdd Ġoptional Ġheader Ġto Ġthe Ġtooltip . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġwith Header (@ N ls Ġheader : ĠString ) Ġ: ĠGot It Tooltip Ġ{ ĊĠĠĠ Ġthis . header Ġ= Ġheader ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠAdd Ġoptional Ġshortcut Ġafter Ġmandatory Ġdescription Ġ( text ). ĊĠĠ Ġ*/ ĊĠ Ġfun Ġwith Shortcut ( shortcut : ĠShort cut ) Ġ: ĠGot It Tooltip Ġ{ ĊĠĠĠ Ġthis . shortcut Ġ= Ġshortcut ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSet Ġalternative Ġbutton Ġtext Ġinstead Ġof Ġdefault Ġ" Got ĠIt ". ĊĠĠ Ġ*/ ĊĠ Ġfun Ġwith Button Label (@ N ls Ġlabel : ĠString ) Ġ: ĠGot It Tooltip Ġ{ ĊĠĠĠ Ġthis . button Label Ġ= Ġlabel ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠAdd Ġoptional Ġicon Ġon Ġthe Ġleft Ġof Ġthe Ġheader Ġor Ġdescription . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġwith Icon ( icon : ĠIcon ) Ġ: ĠGot It Tooltip Ġ{ ĊĠĠĠ Ġthis . icon Ġ= Ġicon ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSet Ġclose Ġtimeout . ĠIf Ġset Ġthen Ġtooltip Ġappears Ġwithout Ġ" Got ĠIt " Ġbutton . ĊĠĠ Ġ*/ ĊĠ Ġ@ Jvm Over loads ĊĠ Ġfun Ġwith Timeout ( timeout : ĠInt Ġ= ĠDEFAULT _ TIMEOUT ) Ġ: ĠGot It Tooltip Ġ{ ĊĠĠĠ Ġif Ġ( timeout Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġthis . timeout Ġ= Ġtimeout ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠLimit Ġtooltip Ġbody Ġwidth Ġto Ġthe Ġgiven Ġvalue . ĠBy Ġdefault Ġit 's Ġlimited Ġto Ġ< code > MAX _ WIDTH </ code > Ġpixels . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġwith Max Width ( width : ĠInt ) Ġ: ĠGot It Tooltip Ġ{ ĊĠĠĠ ĠmaxWidth Ġ= Ġwidth ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠAdd Ġoptional Ġlink Ġto Ġthe Ġtooltip . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġwith Link (@ N ls Ġlink Label : ĠString , Ġaction : Ġ() Ġ-> ĠUnit ) Ġ: ĠGot It Tooltip Ġ{ ĊĠĠĠ Ġlink Ġ= ĠLink Label < Unit >( link Label , Ġnull ) ĊĠĠĠ Ġlink Action Ġ= Ġaction ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠAdd Ġoptional Ġlink Ġto Ġthe Ġtooltip . ĠJava Ġversion . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġwith Link (@ N ls Ġlink Label : ĠString , Ġaction : ĠRunnable ) Ġ: ĠGot It Tooltip Ġ{ ĊĠĠĠ Ġreturn Ġwith Link ( link Label ) Ġ{ Ġaction . run () Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠAdd Ġoptional Ġbrowser Ġlink Ġto Ġthe Ġtooltip . ĠLink Ġis Ġrendered Ġwith Ġarrow Ġicon . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġwith Browser Link (@ N ls Ġlink Label : ĠString , Ġurl : ĠURL ) Ġ: ĠGot It Tooltip Ġ{ ĊĠĠĠ Ġlink Ġ= ĠLink Label < Unit >( link Label , ĠAll Icons . Ide . External _ link _ arrow ). apply { Ġhorizontal Text Position Ġ= ĠSw ing Constants . LEFT Ġ} ĊĠĠĠ Ġlink Action Ġ= Ġ{ ĠBrowser Util . browse ( url ) Ġ} ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSet Ġnumber Ġof Ġtimes Ġthe Ġtooltip Ġis Ġshown . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġwith Show Count ( count : ĠInt ) Ġ: ĠGot It Tooltip Ġ{ ĊĠĠĠ Ġif Ġ( count Ġ> Ġ 0 ) Ġshow Count Ġ= Ġcount ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠOptionally Ġshow Ġclose Ġshortcut Ġnext Ġto ĠGot ĠIt Ġbutton ĊĠĠ Ġ*/ ĊĠ Ġfun Ġand Show Close Shortcut () Ġ: ĠGot It Tooltip Ġ{ ĊĠĠĠ Ġshow Close Shortcut Ġ= Ġtrue ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġfun Ġshow Dynamic ( position : ĠBal loon . Position , Ġpoint : Ġ() Ġ-> ĠRelative Point ) Ġ{ ĊĠĠĠ Ġ( point (). component Ġas ĠJ Component ). add Ancestor Listener ( object Ġ: ĠAn cestor Listener Adapter () Ġ{ ĊĠĠĠĠĠ Ġvar Ġbal loon Ġ: ĠBal loon ? Ġ= Ġnull ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġancestor Added ( event : ĠAn cestor Event ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġevent ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġbal loon Ġ= Ġit . component . getClient Property ( PROPERTY _ PREFIX ) Ġas ĠBal loon ? ĊĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( bal loon Ġ== Ġnull Ġ&& Ġcan Show ("$ PROPERTY _ PREFIX .$ id ") Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbal loon Ġ= Ġcreate And Show ( position , Ġpoint ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . component . put Client Property ( PROPERTY _ PREFIX , Ġbal loon ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchain Function () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġancestor Removed ( event : ĠAn cestor Event ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġbal loon ?. hide () ĊĠĠĠĠĠĠĠ Ġbal loon Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġevent ?. component ?. put Client Property ( PROPERTY _ PREFIX , Ġnull ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĠ Ġ} ĊĊĠ Ġfun Ġshow At ( position : ĠBal loon . Position , Ġpoint : ĠRelative Point ) Ġ: ĠBal loon ? Ġ{ ĊĠĠĠ Ġval Ġbal loon Ġ= Ġ( point . component Ġas ĠJ Component ). getClient Property ( PROPERTY _ PREFIX ) ĊĠĠĠ Ġreturn Ġif Ġ( bal loon Ġ== Ġnull Ġ&& Ġcan Show ("$ PROPERTY _ PREFIX .$ id ")) ĊĠĠĠĠĠ Ġcreate And Show ( position , Ġpoint ). also Ġ{ Ġ( point . component Ġas ĠJ Component ). put Client Property ( PROPERTY _ PREFIX , Ġit ) Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġchain Function () ĊĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġshow After ( tooltip : ĠGot It Tooltip , Ġposition : ĠBal loon . Position , Ġpoint : Ġ() Ġ-> ĠRelative Point ) Ġ{ ĊĠĠĠ Ġtooltip . chain Function Ġ= Ġ{ Ġshow At ( position , Ġpoint ()) Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate And Show ( position : ĠBal loon . Position , Ġpoint : ĠRelative Point ) Ġ: ĠBal loon Ġ= Ġcreate Bal loon (). also Ġ{ ĊĠĠĠĠĠ Ġval Ġdispatcher Disposable Ġ= ĠDis poser . new Disposable () ĊĠĠĠĠĠ ĠDis poser . register ( dis posable , Ġdispatcher Disposable ) ĊĊĠĠĠĠĠ Ġit . addListener ( object Ġ: ĠJ B Popup Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Closed ( event : ĠLight weight Window Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġon Got It ("$ PROPERTY _ PREFIX .$ id ") ĊĠĠĠĠĠĠĠĠĠ ĠHelp Tooltip . set Master Popup Open Condition ( point . component , Ġnull ) ĊĠĠĠĠĠĠĠĠĠ Ġ( point . component Ġas ĠJ Component ). put Client Property ( PROPERTY _ PREFIX , Ġnull ) ĊĠĠĠĠĠĠĠĠĠ ĠDis poser . dispose ( dispatcher Disposable ) ĊĠĠĠĠĠĠĠĠĠ Ġchain Function () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠ ĠIde EventQueue . getInstance (). add Dispatcher ( Ide EventQueue . EventDispatcher Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠKeyEvent Ġ&& ĠKey map Util . is Event For Action ( e , ĠCLOSE _ ACTION _ NAME )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġit . hide () ĊĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġfalse ĊĠĠĠĠĠ Ġ}, Ġdispatcher Disposable ) ĊĊĠĠĠĠĠ ĠHelp Tooltip . set Master Popup Open Condition ( point . component ) Ġ{ ĊĠĠĠĠĠĠĠ Ġit . is Disposed ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġit . show ( point , Ġposition ) ĊĠĠĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Bal loon () Ġ: ĠBal loon Ġ{ ĊĠĠĠ Ġvar Ġbutton Ġ: ĠJButton ? Ġ= Ġnull ĊĠĠĠ Ġval Ġbal loon Ġ= ĠJ B Popup Factory . getInstance (). create Bal loon Builder ( create Content Ġ{ Ġbutton Ġ= Ġit Ġ}). ĊĠĠĠĠĠĠĠ Ġset Disposable ( dis posable ). ĊĠĠĠĠĠĠĠ Ġset Hide OnClick Outside ( true ). ĊĠĠĠĠĠĠĠ Ġset Hide On Action ( false ). ĊĠĠĠĠĠĠĠ Ġset Hide On Frame Resize ( false ). ĊĠĠĠĠĠĠĠ Ġset Hide On Key Outside ( false ). ĊĠĠĠĠĠĠĠ Ġset Block Click s Through Bal loon ( true ). ĊĠĠĠĠĠĠĠ Ġset BorderColor ( BORDER _ COLOR ). ĊĠĠĠĠĠĠĠ Ġset Corner To Pointer Distance ( ARROW _ SHIFT ). ĊĠĠĠĠĠĠĠ Ġset Fill Color ( BACKGROUND _ COLOR ). ĊĠĠĠĠĠĠĠ Ġset Pointer Size ( J BU I . size ( 1 6 , Ġ 8 )). ĊĠĠĠĠĠĠĠ Ġcreate Bal loon (). ĊĠĠĠĠĠ Ġapply Ġ{ Ġset Animation Enabled ( false ) Ġ} ĊĊĠĠĠ Ġlink ?. apply { ĊĠĠĠĠĠ Ġset Listener ( Link Listener Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠ Ġlink Action () ĊĠĠĠĠĠĠĠ Ġbal loon . hide ( true ) ĊĠĠĠĠĠ Ġ}, Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġbutton ?. apply Ġ{ ĊĠĠĠĠĠ Ġadd ActionListener ( ActionListener Ġ{ Ġbal loon . hide () Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( timeout Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġalarm . cancel All Requests () ĊĠĠĠĠĠ Ġalarm . add Request ({ Ġbal loon . hide () Ġ}, Ġtimeout ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġbal loon ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Content ( button Supplier : Ġ( JButton ) Ġ-> ĠUnit ) Ġ: ĠJ Component Ġ{ ĊĠĠĠ Ġval Ġpanel Ġ= ĠJPanel ( Grid BagLayout ()) ĊĠĠĠ Ġval Ġgc Ġ= ĠGrid Bag () ĊĠĠĠ Ġval Ġleft Ġ= Ġif Ġ( icon Ġ!= Ġnull ) Ġ 8 Ġelse Ġ 0 ĊĠĠĠ Ġval Ġcolumn Ġ= Ġif Ġ( icon Ġ!= Ġnull ) Ġ 1 Ġelse Ġ 0 ĊĊĠĠĠ Ġicon ?. let Ġ{ Ġpanel . add ( JLabel ( it ), Ġgc . nextLine (). next (). anchor ( Grid BagConstraints . BASE LINE )) Ġ} ĊĊĠĠĠ Ġif Ġ( header . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( icon Ġ== Ġnull ) Ġgc . nextLine () ĊĊĠĠĠĠĠ Ġpanel . add ( JB Label ( Html Chunk . raw ( header ). bold (). wrap With ( Html Chunk . html ()). toString ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgc . set Column ( column ). anchor ( Grid BagConstraints . LINE _ START ). in set Left ( left )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġbuilder Ġ= ĠHtml Builder () ĊĠĠĠ Ġbuilder . append ( Html Chunk . raw ( text )) ĊĠĠĠ Ġshortcut ?. let Ġ{ ĊĠĠĠĠĠ Ġbuilder . append ( Html Chunk . nbsp ()). append ( Html Chunk . nbsp ()). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( Html Chunk . text ( Key map Util . get Shortcut Text ( it )). wrap With ( Html Chunk . font ( Color Util . to Html Color ( SHORT CUT _ COLOR )))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( icon Ġ== Ġnull Ġ|| Ġheader . isNotEmpty ()) Ġgc . nextLine () ĊĠĠĠ Ġpanel . add ( Limit ed Width Label ( builder , ĠmaxWidth ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgc . set Column ( column ). anchor ( Grid BagConstraints . LINE _ START ). in sets ( if Ġ( header . isNotEmpty ()) Ġ 5 Ġelse Ġ 0 , Ġleft , Ġ 0 , Ġ 0 )) ĊĊĠĠĠ Ġlink ?. let Ġ{ ĊĠĠĠĠĠ Ġpanel . add ( it , Ġgc . nextLine (). set Column ( column ). anchor ( Grid BagConstraints . LINE _ START ). in sets ( 5 , Ġleft , Ġ 0 , Ġ 0 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( timeout Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġval Ġbutton Ġ= ĠJButton ( button Label ). apply { ĊĠĠĠĠĠĠĠ Ġis Focus able Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġis Opaque Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġput Client Property (" style Border less ", Ġtrue ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġbutton Supplier ( button ) ĊĊĠĠĠĠĠ Ġif Ġ( show Close Shortcut ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbutton Panel Ġ= ĠJPanel (). apply { Ġis Opaque Ġ= Ġfalse Ġ} ĊĠĠĠĠĠĠĠ Ġbutton Panel . layout Ġ= ĠBox Layout ( button Panel , ĠBox Layout . X _ AXIS ) ĊĠĠĠĠĠĠĠ Ġbutton Panel . add ( button ) ĊĠĠĠĠĠĠĠ Ġbutton Panel . add ( Box . create Horizontal Str ut ( J BU IS cale . scale ( UI Util . DEFAULT _ HG AP ))) ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" Hard Coded StringLiteral ") ĊĠĠĠĠĠĠĠ Ġval Ġclose Shortcut Ġ= ĠJLabel ( Key map Util . get Shortcut Text ( CLOSE _ ACTION _ NAME )). apply Ġ{ Ġforeground Ġ= ĠSH ORT CUT _ COLOR Ġ} ĊĠĠĠĠĠĠĠ Ġbutton Panel . add ( close Shortcut ) ĊĊĠĠĠĠĠĠĠ Ġpanel . add ( button Panel , Ġgc . nextLine (). set Column ( column ). in sets ( 1 1 , Ġleft , Ġ 0 , Ġ 0 ). anchor ( Grid BagConstraints . LINE _ START )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġpanel . add ( button , Ġgc . nextLine (). set Column ( column ). in sets ( 1 1 , Ġleft , Ġ 0 , Ġ 0 ). anchor ( Grid BagConstraints . LINE _ START )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpanel . background Ġ= ĠBACK GROUND _ COLOR ĊĠĠĠ Ġpanel . border Ġ= ĠPAN EL _ M ARG INS ĊĊĠĠĠ Ġreturn Ġpanel ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġval ĠAR ROW _ SHIFT Ġ= ĠJ BU IS cale . scale ( 2 0 ) Ġ+ ĠRegistry . intValue (" ide . bal loon . shadow . size ") Ġ+ ĠBal loon Impl . ARC . get () ĊĠĠĠ Ġconst Ġval ĠPROPERTY _ PREFIX Ġ= Ġ" got . it . tooltip " ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ TIMEOUT Ġ= Ġ 5 0 0 0 Ġ// Ġmilliseconds ĊĠĠĠ Ġprivate Ġconst Ġval ĠCLOSE _ ACTION _ NAME Ġ= Ġ" Close Got It Tooltip " ĊĠĠĠ Ġprivate Ġval ĠMAX _ WIDTH ĠĠ Ġ= ĠJ BU IS cale . scale ( 2 8 0 ) ĊĠĠĠ Ġprivate Ġval ĠSH ORT CUT _ COLOR Ġ= ĠJ B Color . named Color (" ToolTip . shortcut Foreground ", ĠJ B Color ( 0 x 7 8 7 8 7 8 , Ġ 0 x 9 9 9 9 9 9 )) ĊĠĠĠ Ġprivate Ġval ĠBACK GROUND _ COLOR Ġ= ĠJ B Color . named Color (" ToolTip . background ", ĠJ B Color ( 0 xf 7 f 7 f 7 , Ġ 0 x 4 7 4 a 4 c )) ĊĠĠĠ Ġprivate Ġval ĠBORDER _ COLOR Ġ= ĠJ B Color . named Color (" Got It Tooltip . border Color ", ĠJ B Color ( Color ( 0 xcc cccc ), ĠJ B Color . named Color (" ToolTip . border Color ", Ġ 0 x 6 3 6 5 6 9 ))) ĊĊĠĠĠ Ġprivate Ġval ĠPAN EL _ M ARG INS Ġ= ĠJ BU I . B orders . empty ( 7 , Ġ 4 , Ġ 9 , Ġ 9 ) ĊĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠLimited Width Label ( val Ġhtml Builder : ĠHtml Builder , Ġval Ġlimit : ĠInt ) Ġ: ĠJLabel () Ġ{ ĊĠ Ġinit Ġ{ ĊĠĠĠ Ġvar Ġview Ġ= ĠBasic HTML . create HTML View ( this , Ġhtml Builder . wrap With ( Html Chunk . html ()). toString ()) ĊĠĠĠ Ġvar Ġwidth Ġ= Ġview . get Preferred Span ( View . X _ AXIS ) ĊĊĠĠĠ Ġif Ġ( width Ġ< Ġlimit ) Ġ{ ĊĠĠĠĠĠ Ġtext Ġ= Ġhtml Builder . wrap With ( Html Chunk . div ()). wrap With ( Html Chunk . html ()). toString () ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġview Ġ= ĠBasic HTML . create HTML View ( this , Ġhtml Builder . wrap With ( Html Chunk . div (). attr (" width ", Ġlimit )). wrap With ( Html Chunk . html ()). toString ()) ĊĠĠĠĠĠ Ġwidth Ġ= Ġrows ( view ). max Of Ġ{ Ġit . get Preferred Span ( View . X _ AXIS ) Ġ} ĊĠĠĠĠĠ Ġtext Ġ= Ġhtml Builder . wrap With ( Html Chunk . div (). attr (" width ", Ġwidth . toInt ())). wrap With ( Html Chunk . html ()). toString () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġrows ( root : ĠView ) Ġ: ĠCollection < View > Ġ{ ĊĠĠĠ Ġreturn ĠArrayList < View >(). also Ġ{ Ġvisit ( root , Ġit ) Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġvisit ( view : ĠView , Ġcollection : ĠMutable Collection < View >) Ġ{ ĊĠĠĠ Ġval Ġc name Ġ: ĠString ? Ġ= Ġview . java Class . canonical Name ĊĠĠĠ Ġc name ?. let Ġ{ Ġif Ġ( it . contains (" Paragraph View . Row ")) Ġcollection . add ( view ) Ġ} ĊĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġview . view Count ) Ġ{ ĊĠĠĠĠĠ Ġvisit ( view . getView ( i ), Ġcollection ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }