// Path: src/main/java/com/athaydes/logfx/config/HighlightGroups.java
// public final class HighlightGroups {
//     private final ObservableSet<LogFile> observableFiles;
//     private final ObservableMap<String, ObservableList<HighlightExpression>> configByGroupName;
// 
//     private InvalidationListener invalidationListener;
// 
//     public HighlightGroups( ObservableSet<LogFile> observableFiles ) {
//         this.observableFiles = observableFiles;
//         configByGroupName = FXCollections.observableMap( new LinkedHashMap<>( 4 ) );
//         configByGroupName.put( "", createNewExpressions( null ) );
//     }
// 
//     public ObservableList<HighlightExpression> getByName( String name ) {
//         return configByGroupName.get( name );
//     }
// 
//     public ObservableList<HighlightExpression> getDefault() {
//         return configByGroupName.get( "" );
//     }
// 
//     public ObservableList<HighlightExpression> add( String groupName ) {
//         return configByGroupName.computeIfAbsent( groupName,
//                 this::createNewExpressions );
//     }
// 
//     public void remove( String groupName ) {
//         if ( groupName.isEmpty() ) {
//             return;
//         }
//         configByGroupName.remove( groupName );
//         observableFiles.stream()
//                 .filter( it -> groupName.equals( it.getHighlightGroup() ) )
//                 .forEach( file -> file.highlightGroupProperty().setValue( "" ) );
//     }
// 
//     public void renameGroup( String oldName, String newName ) {
//         configByGroupName.put( newName, configByGroupName.remove( oldName ) );
//         observableFiles.stream()
//                 .filter( it -> oldName.equals( it.getHighlightGroup() ) )
//                 .forEach( file -> file.highlightGroupProperty().setValue( newName ) );
//     }
// 
//     public Set<String> groupNames() {
//         return Collections.unmodifiableSet( configByGroupName.keySet() );
//     }
// 
//     public Map<String, ObservableList<HighlightExpression>> toMap() {
//         return Collections.unmodifiableMap( configByGroupName );
//     }
// 
//     public void addGroupNameListener( InvalidationListener listener ) {
//         configByGroupName.addListener( listener );
//     }
// 
//     public void removeGroupNameListener( InvalidationListener listener ) {
//         configByGroupName.removeListener( listener );
//     }
// 
//     public void clear() {
//         configByGroupName.clear();
//         configByGroupName.put( "", createNewExpressions( null ) );
//     }
// 
//     void setListener( InvalidationListener listener ) {
//         if ( invalidationListener != null ) throw new RuntimeException( "invalidation listener has already been set" );
//         invalidationListener = listener;
//         configByGroupName.addListener( listener );
//         configByGroupName.values().forEach( ( v ) -> v.addListener( listener ) );
//     }
// 
//     private ObservableList<HighlightExpression> createNewExpressions( Object ignore ) {
//         ObservableList<HighlightExpression> newList = FXCollections.observableArrayList();
//         if ( invalidationListener != null ) newList.addListener( invalidationListener );
//         return newList;
//     }
// }


import com.athaydes.logfx.config.HighlightGroups;
import javafx.application.Platform;
import javafx.beans.InvalidationListener;
import javafx.scene.control.ChoiceBox;
import javafx.util.StringConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
package com.athaydes.logfx.ui;



public final class HighlightGroupSelector extends ChoiceBox<String> {

    private static final Logger logger = LoggerFactory.getLogger( HighlightGroupSelector.class );

// Path: src/main/java/com/athaydes/logfx/config/HighlightGroups.java
// public final class HighlightGroups {
//     private final ObservableSet<LogFile> observableFiles;
//     private final ObservableMap<String, ObservableList<HighlightExpression>> configByGroupName;
// 
//     private InvalidationListener invalidationListener;
// 
//     public HighlightGroups( ObservableSet<LogFile> observableFiles ) {
//         this.observableFiles = observableFiles;
//         configByGroupName = FXCollections.observableMap( new LinkedHashMap<>( 4 ) );
//         configByGroupName.put( "", createNewExpressions( null ) );
//     }
// 
//     public ObservableList<HighlightExpression> getByName( String name ) {
//         return configByGroupName.get( name );
//     }
// 
//     public ObservableList<HighlightExpression> getDefault() {
//         return configByGroupName.get( "" );
//     }
// 
//     public ObservableList<HighlightExpression> add( String groupName ) {
//         return configByGroupName.computeIfAbsent( groupName,
//                 this::createNewExpressions );
//     }
// 
//     public void remove( String groupName ) {
//         if ( groupName.isEmpty() ) {
//             return;
//         }
//         configByGroupName.remove( groupName );
//         observableFiles.stream()
//                 .filter( it -> groupName.equals( it.getHighlightGroup() ) )
//                 .forEach( file -> file.highlightGroupProperty().setValue( "" ) );
//     }
// 
//     public void renameGroup( String oldName, String newName ) {
//         configByGroupName.put( newName, configByGroupName.remove( oldName ) );
//         observableFiles.stream()
//                 .filter( it -> oldName.equals( it.getHighlightGroup() ) )
//                 .forEach( file -> file.highlightGroupProperty().setValue( newName ) );
//     }
// 
//     public Set<String> groupNames() {
//         return Collections.unmodifiableSet( configByGroupName.keySet() );
//     }
// 
//     public Map<String, ObservableList<HighlightExpression>> toMap() {
//         return Collections.unmodifiableMap( configByGroupName );
//     }
// 
//     public void addGroupNameListener( InvalidationListener listener ) {
//         configByGroupName.addListener( listener );
//     }
// 
//     public void removeGroupNameListener( InvalidationListener listener ) {
//         configByGroupName.removeListener( listener );
//     }
// 
//     public void clear() {
//         configByGroupName.clear();
//         configByGroupName.put( "", createNewExpressions( null ) );
//     }
// 
//     void setListener( InvalidationListener listener ) {
//         if ( invalidationListener != null ) throw new RuntimeException( "invalidation listener has already been set" );
//         invalidationListener = listener;
//         configByGroupName.addListener( listener );
//         configByGroupName.values().forEach( ( v ) -> v.addListener( listener ) );
//     }
// 
//     private ObservableList<HighlightExpression> createNewExpressions( Object ignore ) {
//         ObservableList<HighlightExpression> newList = FXCollections.observableArrayList();
//         if ( invalidationListener != null ) newList.addListener( invalidationListener );
//         return newList;
//     }
// }


// Path: src/main/java/com/athaydes/logfx/ui/HighlightGroupSelector.java
import com.athaydes.logfx.config.HighlightGroups;
import javafx.application.Platform;
import javafx.beans.InvalidationListener;
import javafx.scene.control.ChoiceBox;
import javafx.util.StringConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;

package com.athaydes.logfx.ui;



public final class HighlightGroupSelector extends ChoiceBox<String> {

    private static final Logger logger = LoggerFactory.getLogger( HighlightGroupSelector.class );

    private final HighlightGroups highlightGroups;