From 0f0f21a7b1fd935e01c22575f153d28a8a234cb8 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 13 Nov 2019 13:54:17 +0100 Subject: [PATCH] IntelliJ Themes Demo: refresh themes list (from current working directory) on window activation --- .../demo/intellijthemes/IJThemesManager.java | 15 ++++ .../demo/intellijthemes/IJThemesPanel.java | 81 +++++++++++++++---- 2 files changed, 81 insertions(+), 15 deletions(-) diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/intellijthemes/IJThemesManager.java b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/intellijthemes/IJThemesManager.java index b3d6c9ce..bdb4314c 100644 --- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/intellijthemes/IJThemesManager.java +++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/intellijthemes/IJThemesManager.java @@ -20,6 +20,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; @@ -32,6 +33,7 @@ class IJThemesManager { final List bundledThemes = new ArrayList<>(); final List moreThemes = new ArrayList<>(); + private final Map lastModifiedMap = new HashMap<>(); void loadBundledThemes() { // load themes.properties @@ -44,6 +46,7 @@ class IJThemesManager } // add info about bundled themes + bundledThemes.clear(); for( Map.Entry e : properties.entrySet() ) { String resourceName = (String) e.getKey(); List strs = StringUtils.split( (String) e.getValue(), ',' ); @@ -60,10 +63,22 @@ class IJThemesManager if( themeFiles == null ) return; + lastModifiedMap.clear(); + lastModifiedMap.put( directory, directory.lastModified() ); + moreThemes.clear(); for( File f : themeFiles ) { String name = StringUtils.removeTrailing( f.getName(), ".theme.json" ); moreThemes.add( new IJThemeInfo( name, null, null, f, null ) ); + lastModifiedMap.put( f, f.lastModified() ); } } + + boolean hasThemesFromDirectoryChanged() { + for( Map.Entry e : lastModifiedMap.entrySet() ) { + if( e.getKey().lastModified() != e.getValue().longValue() ) + return true; + } + return false; + } } diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/intellijthemes/IJThemesPanel.java b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/intellijthemes/IJThemesPanel.java index c199964e..24b8c251 100644 --- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/intellijthemes/IJThemesPanel.java +++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/intellijthemes/IJThemesPanel.java @@ -18,6 +18,10 @@ package com.formdev.flatlaf.demo.intellijthemes; import java.awt.Component; import java.awt.EventQueue; +import java.awt.Window; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.event.WindowListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.FileInputStream; @@ -25,6 +29,7 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.List; +import java.util.Objects; import javax.swing.*; import javax.swing.border.CompoundBorder; import javax.swing.event.*; @@ -44,11 +49,37 @@ public class IJThemesPanel { private final IJThemesManager themesManager = new IJThemesManager(); private final List themes = new ArrayList<>(); + private final HashMap categories = new HashMap<>(); private final PropertyChangeListener lafListener = this::lafChanged; + private final WindowListener windowListener = new WindowAdapter() { + @Override + public void windowActivated( WindowEvent e ) { + IJThemesPanel.this.windowActivated(); + } + }; + private Window window; public IJThemesPanel() { initComponents(); + // create renderer + themesList.setCellRenderer( new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent( JList list, Object value, + int index, boolean isSelected, boolean cellHasFocus ) + { + String title = categories.get( index ); + JComponent c = (JComponent) super.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus ); + if( title != null ) + c.setBorder( new CompoundBorder( new ListCellTitledBorder( themesList, title ), c.getBorder() ) ); + return c; + } + } ); + + updateThemesList(); + } + + private void updateThemesList() { // load theme infos themesManager.loadBundledThemes(); themesManager.loadThemesFromDirectory(); @@ -58,7 +89,8 @@ public class IJThemesPanel themesManager.bundledThemes.sort( comparator ); themesManager.moreThemes.sort( comparator ); - HashMap categories = new HashMap<>(); + themes.clear(); + categories.clear(); // add core themes at beginning categories.put( themes.size(), "Core Themes" ); @@ -75,19 +107,8 @@ public class IJThemesPanel categories.put( themes.size(), "Current Directory" ); themes.addAll( themesManager.moreThemes ); - // create renderer - themesList.setCellRenderer( new DefaultListCellRenderer() { - @Override - public Component getListCellRendererComponent( JList list, Object value, - int index, boolean isSelected, boolean cellHasFocus ) - { - String title = categories.get( index ); - JComponent c = (JComponent) super.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus ); - if( title != null ) - c.setBorder( new CompoundBorder( new ListCellTitledBorder( themesList, title ), c.getBorder() ) ); - return c; - } - } ); + // remember selection + IJThemeInfo oldSel = themesList.getSelectedValue(); // fill themes list themesList.setModel( new AbstractListModel() { @@ -100,6 +121,21 @@ public class IJThemesPanel return themes.get( index ); } } ); + + // restore selection + if( oldSel != null ) { + for( int i = 0; i < themes.size(); i++ ) { + IJThemeInfo theme = themes.get( i ); + if( oldSel.name.equals( theme.name ) && + Objects.equals( oldSel.resourceName, theme.resourceName ) && + Objects.equals( oldSel.themeFile, theme.themeFile ) && + Objects.equals( oldSel.lafClassName, theme.lafClassName ) ) + { + themesList.setSelectedIndex( i ); + break; + } + } + } } private void themesListValueChanged( ListSelectionEvent e ) { @@ -148,6 +184,10 @@ public class IJThemesPanel selectedCurrentLookAndFeel(); UIManager.addPropertyChangeListener( lafListener ); + + window = SwingUtilities.windowForComponent( this ); + if( window != null ) + window.addWindowListener( windowListener ); } @Override @@ -155,13 +195,24 @@ public class IJThemesPanel super.removeNotify(); UIManager.removePropertyChangeListener( lafListener ); + + if( window != null ) { + window.removeWindowListener( windowListener ); + window = null; + } } - void lafChanged( PropertyChangeEvent e ) { + private void lafChanged( PropertyChangeEvent e ) { if( "lookAndFeel".equals( e.getPropertyName() ) ) selectedCurrentLookAndFeel(); } + private void windowActivated() { + // refresh themes list on window activation + if( themesManager.hasThemesFromDirectoryChanged() ) + updateThemesList(); + } + private void selectedCurrentLookAndFeel() { LookAndFeel lookAndFeel = UIManager.getLookAndFeel();