/* Ċ Ġ* ĠCopyright Ġ 2 0 0 0 - 2 0 1 9 Ġ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 . intellij . data vis . r . in lay s . table . filters . gui Ċ Ċ import Ġorg . intellij . data vis . r . in lay s . table . filters . And Filter Ċ import Ġorg . intellij . data vis . r . in lay s . table . filters . Filter Ċ import Ġorg . intellij . data vis . r . in lay s . table . filters . I Filter Ċ import Ġorg . intellij . data vis . r . in lay s . table . filters . gui . editor . Filter Editor Ċ import Ġjava . beans . Property ChangeEvent Ċ import Ġjava . beans . Property ChangeListener Ċ import Ġjava . util .* Ċ import Ġjavax . swing . J Table Ċ import Ġjavax . swing . Row Filter Ċ import Ġjavax . swing . Row Sorter Ċ import Ġjavax . swing . Swing Utilities Ċ import Ġjavax . swing . event . Row Sorter Event Ċ import Ġjavax . swing . event . Row Sorter Listener Ċ Ċ abstract Ġclass ĠAbstract Filters Handler Ġ: ĠAnd Filter (), ĠProperty ChangeListener Ġ{ ĊĠ Ġprivate Ġvar Ġsend Notifications Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġpending Notifications : ĠBoolean Ġ= Ġfalse ĊĠ Ġprivate Ġval Ġauto Selector Ġ= ĠAuto Selector () ĊĠ Ġprivate Ġval Ġeditors Ġ= ĠHashMap < Int , ĠFilter Editor >() ĊĠ Ġprotected Ġvar Ġsort er : ĠRow Sorter < *> ? Ġ= Ġnull ĊĊĠ Ġvar Ġparser Model : ĠI Parser Model ? Ġ= Ġnull ĊĠĠĠ Ġset ( new Parser Model ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( new Parser Model Ġ!= Ġnull Ġ&& Ġnew Parser Model Ġ!== Ġfield ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfield ?. remove Property ChangeListener ( this ) ĊĠĠĠĠĠĠĠ Ġfield Ġ= Ġnew Parser Model ĊĠĠĠĠĠĠĠ Ġnew Parser Model . addProperty ChangeListener ( this ) ĊĠĠĠĠĠĠĠ Ġenable Notifications ( false ) ĊĠĠĠĠĠĠĠ Ġeditors . values . forEach Ġ{ Ġit . reset Filter () Ġ} ĊĠĠĠĠĠĠĠ Ġenable Notifications ( true ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġfield Ġ= Ġnew Parser Model ĊĠĠĠ Ġ} ĊĊĠ Ġvar Ġtable : ĠJ Table ? Ġ= Ġnull ĊĠĠĠ Ġset ( table ) Ġ{ ĊĠĠĠĠĠ Ġchoices Handler . set Inter rupted ( true ) ĊĠĠĠĠĠ Ġval Ġold Table Ġ= Ġthis . table ĊĠĠĠĠĠ Ġfield Ġ= Ġtable ĊĠĠĠĠĠ Ġauto Selector . re placed Table ( old Table , Ġtable ) ĊĠĠĠ Ġ} ĊĠ Ġprotected Ġabstract Ġvar Ġcurrent Filter : ĠRow Filter < *, Ġ* >? ĊĠ Ġprotected Ġabstract Ġval Ġchoices Handler : ĠCho ices Handler ĊĠ Ġabstract Ġvar Ġis Filter On Updates : ĠBoolean ĊĠ Ġabstract Ġvar Ġis Adaptive Choices : ĠBoolean ĊĊĠ Ġprivate Ġvar Ġapplying Filter : ĠFilter ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġon Warning : ĠBoolean Ġ= Ġfalse ĊĊĠ Ġvar Ġis Auto Selection : ĠBoolean ĊĠĠĠ Ġget () Ġ= Ġauto Selector . enabled ĊĠĠĠ Ġset ( enable ) Ġ{ ĊĠĠĠĠĠ Ġauto Selector . enabled Ġ= Ġenable ĊĠĠĠ Ġ} ĊĊĠ Ġvar Ġauto Choices : ĠAuto Choices ? Ġ= Ġnull ĊĠĠĠ Ġset ( mode ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( mode Ġ!= Ġfield ) Ġ{ ĊĠĠĠĠĠĠĠ Ġenable Notifications ( false ) ĊĠĠĠĠĠĠĠ Ġfield Ġ= Ġmode ĊĠĠĠĠĠĠĠ Ġfor Ġ( editor Ġin Ġeditors . values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġeditor . auto Choices Ġ= Ġmode ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġenable Notifications ( true ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġadd Filter Observer Ġ{ Ġnotify Updated Filter () Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġproperty Change ( evt : ĠProperty ChangeEvent ) Ġ{ ĊĠĠĠ Ġval Ġparser Model Ġ= Ġparser Model Ġ?: Ġreturn ĊĠĠĠ Ġval Ġtarget : ĠClass < *> ? ĊĠĠĠ Ġvar Ġformat Change Ġ= Ġfalse ĊĠĠĠ Ġif Ġ( I Parser Model . IGNORE _ CASE _ PROPERTY Ġ== Ġevt . propertyName ) Ġ{ ĊĠĠĠĠĠ Ġtarget Ġ= Ġnull ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġif Ġ( I Parser Model . FORMAT _ PROPERTY Ġ== Ġevt . propertyName ) Ġ{ ĊĠĠĠĠĠĠĠ Ġformat Change Ġ= Ġtrue ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġif Ġ( I Parser Model . COMP AR ATOR _ PROPERTY Ġ!= Ġevt . propertyName ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġcl Ġ= Ġevt . newValue ĊĠĠĠĠĠ Ġif Ġ( cl Ġis ĠClass <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġtarget Ġ= Ġcl ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenable Notifications ( false ) ĊĠĠĠ Ġfor Ġ( editor Ġin Ġeditors . values ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( target Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġeditor . is IgnoreCase Ġ= Ġparser Model . is IgnoreCase ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġif Ġ( editor . model Class Ġ== Ġtarget ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( format Change ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġeditor . format Ġ= Ġparser Model . get Format ( target ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġeditor . comparator Ġ= Ġparser Model . get Comparator ( target ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenable Notifications ( true ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġset Enabled ( enabled : ĠBoolean ) Ġ{ ĊĠĠĠ Ġenable Notifications ( false ) ĊĠĠĠ Ġsuper . setEnabled ( enabled ) ĊĠĠĠ Ġenable Notifications ( true ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġadd Filter ( var arg Ġfilters ToAdd : ĠI Filter ) Ġ{ ĊĠĠĠ Ġchoices Handler . filter Operation ( true ) ĊĠĠĠ Ġsuper . add Filter (* filters ToAdd ) ĊĠĠĠ Ġchoices Handler . filter Operation ( false ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġremove Filter ( var arg Ġfilters ToRemove : ĠI Filter ) Ġ{ ĊĠĠĠ Ġchoices Handler . filter Operation ( true ) ĊĠĠĠ Ġsuper . remove Filter (* filters ToRemove ) ĊĠĠĠ Ġchoices Handler . filter Operation ( false ) ĊĠ Ġ} ĊĊĠ Ġfun Ġadd Filter Editor ( editor : ĠFilter Editor ) Ġ{ ĊĠĠĠ Ġsuper . add Filter ( editor . filter ) ĊĠĠĠ Ġeditors [ editor . model Index ] Ġ= Ġeditor ĊĠĠĠ Ġeditor . auto Choices Ġ= Ġauto Choices ĊĠ Ġ} ĊĊĠ Ġfun Ġremove Filter Editor ( editor : ĠFilter Editor ) Ġ{ ĊĠĠĠ Ġsuper . remove Filter ( editor . filter ) ĊĠĠĠ Ġeditors . remove ( editor . model Index ) ĊĠ Ġ} ĊĊĠ Ġfun Ġupdate Editor Choices ( editor : ĠFilter Editor ) Ġ{ ĊĠĠĠ Ġif Ġ( editor s . contains Value ( editor ) Ġ&& Ġis Enabled ) Ġ{ ĊĠĠĠĠĠ Ġchoices Handler . editor Updated ( editor ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġfilter Updated ( filter : ĠI Filter ) Ġ{ ĊĠĠĠ Ġval Ġwas Enabled Ġ= Ġis Enabled ĊĠĠĠ Ġval Ġfilter Was Disabled Ġ= Ġis Disabled ( filter ) ĊĠĠĠ Ġif Ġ( filter Ġ!== Ġapplying Filter ) Ġ{ ĊĠĠĠĠĠ Ġchoices Handler . filter Updated ( filter , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuper . filter Updated ( filter ) ĊĠĠĠ Ġif Ġ( filter Was Disabled Ġ&& Ġfilter . isEnabled ) Ġ{ ĊĠĠĠĠĠ Ġchoices Handler . filter Enabled ( filter ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġif Ġ( was Enabled Ġ&& Ġ! isEnabled ) Ġ{ ĊĠĠĠĠĠ Ġchoices Handler . all Filters Disabled () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġapply Editor Filter ( filter : ĠFilter ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġret Ġ= Ġchoices Handler . filter Updated ( filter , Ġtrue ) ĊĠĠĠ Ġif Ġ( ret ) Ġ{ ĊĠĠĠĠĠ Ġapplying Filter Ġ= Ġfilter ĊĠĠĠĠĠ Ġfilter . report Filter Updated To Observer s () ĊĠĠĠĠĠ Ġapplying Filter Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġret ĊĠ Ġ} ĊĊĠ Ġfun Ġcon solid ate Filter Changes ( model Index : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠ Ġchoices Handler . con solid ate Filter Changes ( model Index ) ĊĠĠĠ Ġreturn Ġon Warning ĊĠ Ġ} ĊĊĠ Ġfun Ġupdate Table Filter () Ġ{ ĊĠĠĠ Ġpending Notifications Ġ= Ġsort er Ġ== Ġnull ĊĠĠĠ Ġif Ġ( sorter Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġval Ġrf Ġ= Ġif Ġ( isEnabled ()) Ġchoices Handler . getRow Filter () Ġelse Ġnull ĊĠĠĠĠĠ Ġcurrent Filter Ġ= Ġrf ĊĠĠĠĠĠ Ġcheck Warning State () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġget Editors (): ĠCollection < Filter Editor > Ġ{ ĊĠĠĠ Ġreturn Ġeditors . values ĊĠ Ġ} ĊĊĠ Ġfun Ġget Editor ( column : ĠInt ): ĠFilter Editor Ġ{ ĊĠĠĠ Ġreturn Ġeditors [ column ] !! ĊĠ Ġ} ĊĊĠ Ġfun Ġenable Notifications ( enable : ĠBoolean ) Ġ{ ĊĠĠĠ Ġsend Notifications Ġ+= Ġif Ġ( enable ) Ġ 1 Ġelse Ġ- 1 ĊĠĠĠ Ġif Ġ( enable ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( send Notifications Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( choices Handler . set Inter rupted ( false ) Ġ|| Ġpending Notifications ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġupdate Table Filter () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġif Ġ( choices Handler . set Inter rupted ( true )) Ġ{ ĊĠĠĠĠĠ Ġ// Ġupdate Table Filter (); ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġnotify Updated Filter () Ġ{ ĊĠĠĠ Ġif Ġ( send Notifications Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġpending Notifications Ġ= Ġtrue ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġupdate Table Filter () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġtable Updated () Ġ{ ĊĠĠĠ Ġcheck Warning State () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcheck Warning State () Ġ{ ĊĠĠĠ Ġval Ġwarning Ġ= Ġthis . table !!. rowCount Ġ== Ġ 0 Ġ&& Ġthis . table !!. model . rowCount Ġ> Ġ 0 ĊĠĠĠ Ġif Ġ( warning Ġ!= Ġthis . on Warning ) Ġ{ ĊĠĠĠĠĠ Ġthis . on Warning Ġ= Ġwarning ĊĠĠĠĠĠ Ġfor Ġ( editor Ġin Ġget Editors ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġeditor . set Warning ( warning ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġupdate Model () Ġ{ ĊĠĠĠ Ġauto Selector . set Sorter ( table ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġinner Ġclass ĠAuto Selector Ġ: ĠRow Sorter Listener , ĠRunnable , ĠProperty ChangeListener Ġ{ ĊĠĠĠ Ġvar Ġenabled Ġ= ĠFilter Settings . auto Selection ĊĠĠĠĠĠ Ġset ( enable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( field Ġ!= Ġenable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( enable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsort er ?. add Row Sorter Listener ( this ) ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsort er ?. remove Row Sorter Listener ( this ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfield Ġ= Ġenable ĊĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġreplaced Table ( old Table : ĠJ Table ?, Ġnew Table : ĠJ Table ?) Ġ{ ĊĠĠĠĠĠ Ġval Ġevent Ġ= Ġ" row Sorter " ĊĠĠĠĠĠ Ġold Table ?. remove Property ChangeListener ( event , Ġthis ) ĊĊĠĠĠĠĠ Ġnew Table ?. addProperty ChangeListener ( event , Ġthis ) ĊĠĠĠĠĠ Ġset Sorter ( new Table ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġproperty Change ( evt : ĠProperty ChangeEvent ) Ġ{ ĊĠĠĠĠĠ Ġset Sorter ( evt . source Ġas ĠJ Table ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Sorter ( table : ĠJ Table ?) Ġ{ ĊĠĠĠĠĠ Ġsort er ?. remove Row Sorter Listener ( this ) ĊĠĠĠĠĠ Ġcurrent Filter Ġ= Ġnull ĊĠĠĠĠĠ Ġsort er Ġ= Ġnull ĊĠĠĠĠĠ Ġval Ġrow Sorter Ġ= Ġtable ?. row Sorter ĊĠĠĠĠĠ Ġsort er Ġ= Ġrow Sorter ĊĠĠĠĠĠ Ġnotify Updated Filter () ĊĠĠĠĠĠ Ġif Ġ( enabled ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrow Sorter ?. add Row Sorter Listener ( this ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġis Filter On Updates Ġ= Ġis Filter On Updates ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠ Ġif Ġ( sorter ?. view RowCount Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtable ?. selection Model ?. setSelection Interval ( 0 , Ġ 0 ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsort er Changed ( e : ĠRow Sorter Event ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( e . type Ġ== ĠRow Sorter Event . Type . SORT ED Ġ&& Ġe . source . view RowCount Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSw ing Utilities . invoke Later ( this ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ Ċ } Ċ