code: /*
   * Copyright (c) 2008-2019 Emmanuel Dupuy.
   * This project is distributed under the GPLv3 license.
   * This is a Copyleft license that gives the user the right to use,
   * copy and modify the code freely for non-commercial purposes.
   */
  
  package org.jd.gui.service.preferencespanel;
  
  import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
  import org.fife.ui.rsyntaxtextarea.Theme;
  import org.jd.gui.spi.PreferencesPanel;
  import org.jd.gui.util.exception.ExceptionUtil;
  
  import javax.swing.*;
  import javax.swing.event.DocumentEvent;
  import javax.swing.event.DocumentListener;
  import java.awt.*;
  import java.io.IOException;
  import java.util.Map;
  
  public class ViewerPreferencesProvider extends JPanel implements PreferencesPanel, DocumentListener {
      protected static final int MIN_VALUE = 2;
      protected static final int MAX_VALUE = 40;
      protected static final String FONT_SIZE_KEY = "ViewerPreferences.fontSize";
  
      protected PreferencesPanel.PreferencesPanelChangeListener listener = null;
      protected JTextField fontSizeTextField;
      protected Color errorBackgroundColor = Color.RED;
      protected Color defaultBackgroundColor;
  
      public ViewerPreferencesProvider() {
          super(new BorderLayout());
  
          add(new JLabel("Font size (" + MIN_VALUE + ".." + MAX_VALUE + "): "), BorderLayout.WEST);
  
          fontSizeTextField = new JTextField();
          fontSizeTextField.getDocument().addDocumentListener(this);
          add(fontSizeTextField, BorderLayout.CENTER);
  
          defaultBackgroundColor = fontSizeTextField.getBackground();
      }
  
      // --- PreferencesPanel --- //
      @Override public String getPreferencesGroupTitle() { return "Viewer"; }
      @Override public String getPreferencesPanelTitle() { return "Appearance"; }
      @Override public JComponent getPanel() { return this; }
  
      @Override public void init(Color errorBackgroundColor) {
          this.errorBackgroundColor = errorBackgroundColor;
      }
  
      @Override public boolean isActivated() { return true; }
  
      @Override
      public void loadPreferences(Map<String, String> preferences) {
          String fontSize = preferences.get(FONT_SIZE_KEY);
  
          if (fontSize == null) {
              // Search default value for the current platform
              RSyntaxTextArea textArea = new RSyntaxTextArea();
  
              try {
                  Theme theme = Theme.load(getClass().getClassLoader().getResourceAsStream("rsyntaxtextarea/themes/eclipse.xml"));
                  theme.apply(textArea);
              } catch (IOException e) {
                  assert ExceptionUtil.printStackTrace(e);
              }
  
              fontSize = String.valueOf(textArea.getFont().getSize());
          }
  
          fontSizeTextField.setText(fontSize);
          fontSizeTextField.setCaretPosition(fontSizeTextField.getText().length());
      }
  
      @Override
      public void savePreferences(Map<String, String> preferences) {
          preferences.put(FONT_SIZE_KEY, fontSizeTextField.getText());
      }
  
      @Override
      public boolean arePreferencesValid() {
          try {
              int i = Integer.valueOf(fontSizeTextField.getText());
              return (i >= MIN_VALUE) && (i <= MAX_VALUE);
          } catch (NumberFormatException e) {
              assert ExceptionUtil.printStackTrace(e);
              return false;
          }
      }
  
      @Override
      public void addPreferencesChangeListener(PreferencesPanel.PreferencesPanelChangeListener listener) {
          this.listener = listener;
      }
  
      // --- DocumentListener --- //
      @Override public void insertUpdate(DocumentEvent e) { onTextChange(); }
      @Override public void removeUpdate(DocumentEvent e) { onTextChange(); }
      @Override public void changedUpdate(DocumentEvent e) { onTextChange(); }
  
      public void onTextChange() {
          fontSizeTextField.setBackground(arePreferencesValid() ? defaultBackgroundColor : errorBackgroundColor);
  
          if (listener != null) {
              listener.preferencesPanelChanged(this);
          }
      }
  }
  