mirror of
https://github.com/JFormDesigner/FlatLaf.git
synced 2026-02-14 07:47:12 -06:00
IntelliJ Themes Demo: search for .theme.json files in current working directory and show them in themes list
This commit is contained in:
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
package com.formdev.flatlaf.demo.intellijthemes;
|
package com.formdev.flatlaf.demo.intellijthemes;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
*/
|
*/
|
||||||
@@ -24,12 +26,14 @@ class IJThemeInfo
|
|||||||
final String name;
|
final String name;
|
||||||
final String resourceName;
|
final String resourceName;
|
||||||
final String sourceCodeUrl;
|
final String sourceCodeUrl;
|
||||||
|
final File themeFile;
|
||||||
final String lafClassName;
|
final String lafClassName;
|
||||||
|
|
||||||
IJThemeInfo( String name, String resourceName, String sourceCodeUrl, String lafClassName ) {
|
IJThemeInfo( String name, String resourceName, String sourceCodeUrl, File themeFile, String lafClassName ) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.resourceName = resourceName;
|
this.resourceName = resourceName;
|
||||||
this.sourceCodeUrl = sourceCodeUrl;
|
this.sourceCodeUrl = sourceCodeUrl;
|
||||||
|
this.themeFile = themeFile;
|
||||||
this.lafClassName = lafClassName;
|
this.lafClassName = lafClassName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.formdev.flatlaf.demo.intellijthemes;
|
package com.formdev.flatlaf.demo.intellijthemes;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -30,6 +31,7 @@ import com.formdev.flatlaf.util.StringUtils;
|
|||||||
class IJThemesManager
|
class IJThemesManager
|
||||||
{
|
{
|
||||||
final List<IJThemeInfo> bundledThemes = new ArrayList<>();
|
final List<IJThemeInfo> bundledThemes = new ArrayList<>();
|
||||||
|
final List<IJThemeInfo> moreThemes = new ArrayList<>();
|
||||||
|
|
||||||
void loadBundledThemes() {
|
void loadBundledThemes() {
|
||||||
// load themes.properties
|
// load themes.properties
|
||||||
@@ -46,7 +48,22 @@ class IJThemesManager
|
|||||||
String resourceName = (String) e.getKey();
|
String resourceName = (String) e.getKey();
|
||||||
List<String> strs = StringUtils.split( (String) e.getValue(), ',' );
|
List<String> strs = StringUtils.split( (String) e.getValue(), ',' );
|
||||||
|
|
||||||
bundledThemes.add( new IJThemeInfo( strs.get( 0 ), resourceName, strs.get( 1 ), null ) );
|
bundledThemes.add( new IJThemeInfo( strs.get( 0 ), resourceName, strs.get( 1 ), null, null ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void loadThemesFromDirectory() {
|
||||||
|
// get current working directory
|
||||||
|
File directory = new File( "" ).getAbsoluteFile();
|
||||||
|
|
||||||
|
File[] themeFiles = directory.listFiles( (dir, name) -> name.endsWith( ".theme.json" ) );
|
||||||
|
if( themeFiles == null )
|
||||||
|
return;
|
||||||
|
|
||||||
|
moreThemes.clear();
|
||||||
|
for( File f : themeFiles ) {
|
||||||
|
String name = StringUtils.removeTrailing( f.getName(), ".theme.json" );
|
||||||
|
moreThemes.add( new IJThemeInfo( name, null, null, f, null ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,10 @@ import java.awt.Component;
|
|||||||
import java.awt.EventQueue;
|
import java.awt.EventQueue;
|
||||||
import java.beans.PropertyChangeEvent;
|
import java.beans.PropertyChangeEvent;
|
||||||
import java.beans.PropertyChangeListener;
|
import java.beans.PropertyChangeListener;
|
||||||
|
import java.io.FileInputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import javax.swing.border.CompoundBorder;
|
import javax.swing.border.CompoundBorder;
|
||||||
@@ -48,18 +51,43 @@ public class IJThemesPanel
|
|||||||
|
|
||||||
// load theme infos
|
// load theme infos
|
||||||
themesManager.loadBundledThemes();
|
themesManager.loadBundledThemes();
|
||||||
|
themesManager.loadThemesFromDirectory();
|
||||||
|
|
||||||
// sort themes by name
|
// sort themes by name
|
||||||
themes.addAll( themesManager.bundledThemes );
|
Comparator<? super IJThemeInfo> comparator = (t1, t2) -> t1.name.compareToIgnoreCase( t2.name );
|
||||||
themes.sort( (t1, t2) -> t1.name.compareToIgnoreCase( t2.name ) );
|
themesManager.bundledThemes.sort( comparator );
|
||||||
int intellijThemesCount = themes.size();
|
themesManager.moreThemes.sort( comparator );
|
||||||
|
|
||||||
// insert core themes at beginning
|
HashMap<Integer, String> categories = new HashMap<>();
|
||||||
themes.add( 0, new IJThemeInfo( "Flat Light", null, null, FlatLightLaf.class.getName() ) );
|
|
||||||
themes.add( 1, new IJThemeInfo( "Flat Dark", null, null, FlatDarkLaf.class.getName() ) );
|
// add core themes at beginning
|
||||||
themes.add( 2, new IJThemeInfo( "Flat IntelliJ", null, null, FlatIntelliJLaf.class.getName() ) );
|
categories.put( themes.size(), "Core Themes" );
|
||||||
themes.add( 3, new IJThemeInfo( "Flat Darcula", null, null, FlatDarculaLaf.class.getName() ) );
|
themes.add( new IJThemeInfo( "Flat Light", null, null, null, FlatLightLaf.class.getName() ) );
|
||||||
int coreThemesCount = themes.size() - intellijThemesCount;
|
themes.add( new IJThemeInfo( "Flat Dark", null, null, null, FlatDarkLaf.class.getName() ) );
|
||||||
|
themes.add( new IJThemeInfo( "Flat IntelliJ", null, null, null, FlatIntelliJLaf.class.getName() ) );
|
||||||
|
themes.add( new IJThemeInfo( "Flat Darcula", null, null, null, FlatDarculaLaf.class.getName() ) );
|
||||||
|
|
||||||
|
// add bundles themes
|
||||||
|
categories.put( themes.size(), "IntelliJ Themes" );
|
||||||
|
themes.addAll( themesManager.bundledThemes );
|
||||||
|
|
||||||
|
// add themes from directory
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
// fill themes list
|
// fill themes list
|
||||||
themesList.setModel( new AbstractListModel<IJThemeInfo>() {
|
themesList.setModel( new AbstractListModel<IJThemeInfo>() {
|
||||||
@@ -72,19 +100,6 @@ public class IJThemesPanel
|
|||||||
return themes.get( index );
|
return themes.get( index );
|
||||||
}
|
}
|
||||||
} );
|
} );
|
||||||
|
|
||||||
themesList.setCellRenderer( new DefaultListCellRenderer() {
|
|
||||||
@Override
|
|
||||||
public Component getListCellRendererComponent( JList<?> list, Object value,
|
|
||||||
int index, boolean isSelected, boolean cellHasFocus )
|
|
||||||
{
|
|
||||||
String title = (index == 0) ? "Core Themes" : (index == coreThemesCount ? "IntelliJ Themes" : null);
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
} );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void themesListValueChanged( ListSelectionEvent e ) {
|
private void themesListValueChanged( ListSelectionEvent e ) {
|
||||||
@@ -106,6 +121,14 @@ public class IJThemesPanel
|
|||||||
UIManager.setLookAndFeel( themeInfo.lafClassName );
|
UIManager.setLookAndFeel( themeInfo.lafClassName );
|
||||||
} catch( Exception ex ) {
|
} catch( Exception ex ) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
|
showInformationDialog( "Failed to create '" + themeInfo.lafClassName + "'.", ex );
|
||||||
|
}
|
||||||
|
} else if( themeInfo.themeFile != null ) {
|
||||||
|
try {
|
||||||
|
FlatLaf.install( IntelliJTheme.createLaf( new FileInputStream( themeInfo.themeFile ) ) );
|
||||||
|
} catch( Exception ex ) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
showInformationDialog( "Failed to load '" + themeInfo.themeFile + "'.", ex );
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
IntelliJTheme.install( getClass().getResourceAsStream( themeInfo.resourceName ) );
|
IntelliJTheme.install( getClass().getResourceAsStream( themeInfo.resourceName ) );
|
||||||
@@ -114,6 +137,11 @@ public class IJThemesPanel
|
|||||||
FlatLaf.updateUI();
|
FlatLaf.updateUI();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void showInformationDialog( String message, Exception ex ) {
|
||||||
|
JOptionPane.showMessageDialog( null, message + "\n\n" + ex.getMessage(),
|
||||||
|
"FlatLaf", JOptionPane.INFORMATION_MESSAGE );
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addNotify() {
|
public void addNotify() {
|
||||||
super.addNotify();
|
super.addNotify();
|
||||||
|
|||||||
Reference in New Issue
Block a user