3535import java .awt .Frame ;
3636import java .awt .event .ActionEvent ;
3737import java .awt .event .ActionListener ;
38+ import java .util .ArrayList ;
3839import java .util .Collection ;
3940import java .util .Collections ;
4041import java .util .LinkedList ;
4142import java .util .List ;
4243import java .util .Optional ;
43- import java .util .function .Predicate ;
4444
4545import javax .swing .Box ;
4646import javax .swing .JComboBox ;
@@ -66,13 +66,16 @@ public class LibraryManagerUI extends InstallerJDialog<ContributedLibraryRelease
6666
6767 private final JComboBox typeChooser ;
6868 private final LibraryInstaller installer ;
69- private Predicate <ContributedLibraryReleases > typeFilter ;
7069
7170 @ Override
7271 protected FilteredAbstractTableModel createContribModel () {
7372 return new LibrariesIndexTableModel ();
7473 }
7574
75+ private LibrariesIndexTableModel getContribModel () {
76+ return (LibrariesIndexTableModel ) contribModel ;
77+ }
78+
7679 @ Override
7780 protected TableCellRenderer createCellRenderer () {
7881 return new ContributedLibraryTableCellRenderer ();
@@ -115,63 +118,60 @@ public LibraryManagerUI(Frame parent, LibraryInstaller installer) {
115118 }
116119
117120 protected final ActionListener typeChooserActionListener = new ActionListener () {
118-
119121 @ Override
120122 public void actionPerformed (ActionEvent event ) {
121123 DropdownItem <ContributedLibraryReleases > selected = (DropdownItem <ContributedLibraryReleases >) typeChooser .getSelectedItem ();
122124 previousRowAtPoint = -1 ;
123- if (selected != null && typeFilter != selected .getFilterPredicate ()) {
124- typeFilter = selected .getFilterPredicate ();
125+ if (selected != null && extraFilter != selected .getFilterPredicate ()) {
126+ extraFilter = selected .getFilterPredicate ();
125127 if (contribTable .getCellEditor () != null ) {
126128 contribTable .getCellEditor ().stopCellEditing ();
127129 }
128- updateIndexFilter (filters , categoryFilter .and (typeFilter ));
130+ updateIndexFilter (filters , categoryFilter .and (extraFilter ));
129131 }
130132 }
131133 };
132134
135+ private Collection <String > oldCategories = new ArrayList <>();
136+ private Collection <String > oldTypes = new ArrayList <>();
137+
133138 public void updateUI () {
134- DropdownItem <ContributedLibraryReleases > previouslySelectedCategory = (DropdownItem <ContributedLibraryReleases >) categoryChooser .getSelectedItem ();
135- DropdownItem <ContributedLibraryReleases > previouslySelectedType = (DropdownItem <ContributedLibraryReleases >) typeChooser .getSelectedItem ();
139+ // Check if categories or types have changed
140+ Collection <String > categories = BaseNoGui .librariesIndexer .getIndex ().getCategories ();
141+ List <String > types = new LinkedList <>(BaseNoGui .librariesIndexer .getIndex ().getTypes ());
142+ Collections .sort (types , new LibraryTypeComparator ());
136143
137- categoryChooser .removeActionListener (categoryChooserActionListener );
138- typeChooser .removeActionListener (typeChooserActionListener );
144+ if (categories .equals (oldCategories ) && types .equals (oldTypes )) {
145+ return ;
146+ }
147+ oldCategories = categories ;
148+ oldTypes = types ;
139149
140150 // Load categories
141151 categoryFilter = x -> true ;
152+ categoryChooser .removeActionListener (categoryChooserActionListener );
142153 categoryChooser .removeAllItems ();
143154 categoryChooser .addItem (new DropdownAllLibraries ());
144- Collection <String > categories = BaseNoGui .librariesIndexer .getIndex ().getCategories ();
145155 for (String category : categories ) {
146156 categoryChooser .addItem (new DropdownLibraryOfCategoryItem (category ));
147157 }
148-
149158 categoryChooser .setEnabled (categoryChooser .getItemCount () > 1 );
150-
151159 categoryChooser .addActionListener (categoryChooserActionListener );
152- if (previouslySelectedCategory != null ) {
153- categoryChooser .setSelectedItem (previouslySelectedCategory );
154- } else {
155- categoryChooser .setSelectedIndex (0 );
156- }
160+ categoryChooser .setSelectedIndex (0 );
157161
158- typeFilter = x -> true ;
162+ // Load types
163+ extraFilter = x -> true ;
164+ typeChooser .removeActionListener (typeChooserActionListener );
159165 typeChooser .removeAllItems ();
160166 typeChooser .addItem (new DropdownAllLibraries ());
161167 typeChooser .addItem (new DropdownUpdatableLibrariesItem ());
162168 typeChooser .addItem (new DropdownInstalledLibraryItem ());
163- List <String > types = new LinkedList <>(BaseNoGui .librariesIndexer .getIndex ().getTypes ());
164- Collections .sort (types , new LibraryTypeComparator ());
165169 for (String type : types ) {
166170 typeChooser .addItem (new DropdownLibraryOfTypeItem (type ));
167171 }
168172 typeChooser .setEnabled (typeChooser .getItemCount () > 1 );
169173 typeChooser .addActionListener (typeChooserActionListener );
170- if (previouslySelectedType != null ) {
171- typeChooser .setSelectedItem (previouslySelectedType );
172- } else {
173- typeChooser .setSelectedIndex (0 );
174- }
174+ typeChooser .setSelectedIndex (0 );
175175
176176 filterField .setEnabled (contribModel .getRowCount () > 0 );
177177 }
@@ -201,8 +201,11 @@ protected void onUpdatePressed() {
201201 try {
202202 setProgressVisible (true , "" );
203203 installer .updateIndex (this ::setProgress );
204- ((LibrariesIndexTableModel ) contribModel ).update ();
205204 onIndexesUpdated ();
205+ if (contribTable .getCellEditor () != null ) {
206+ contribTable .getCellEditor ().stopCellEditing ();
207+ }
208+ getContribModel ().update ();
206209 } catch (Exception e ) {
207210 throw new RuntimeException (e );
208211 } finally {
@@ -238,12 +241,11 @@ public void onInstallPressed(final ContributedLibrary lib) {
238241 } else {
239242 installer .install (lib , this ::setProgress );
240243 }
241- // TODO: Do a better job in refreshing only the needed element
244+ onIndexesUpdated ();
242245 if (contribTable .getCellEditor () != null ) {
243246 contribTable .getCellEditor ().stopCellEditing ();
244247 }
245- ((LibrariesIndexTableModel ) contribModel ).update ();
246- onIndexesUpdated ();
248+ getContribModel ().update ();
247249 } catch (Exception e ) {
248250 throw new RuntimeException (e );
249251 } finally {
@@ -270,12 +272,11 @@ public void onRemovePressed(final ContributedLibrary lib) {
270272 try {
271273 setProgressVisible (true , tr ("Removing..." ));
272274 installer .remove (lib , this ::setProgress );
273- // TODO: Do a better job in refreshing only the needed element
275+ onIndexesUpdated ();
274276 if (contribTable .getCellEditor () != null ) {
275277 contribTable .getCellEditor ().stopCellEditing ();
276278 }
277- ((LibrariesIndexTableModel ) contribModel ).update ();
278- onIndexesUpdated ();
279+ getContribModel ().update ();
279280 } catch (Exception e ) {
280281 throw new RuntimeException (e );
281282 } finally {
0 commit comments