Package net.sf.robocode.ui.editor

Source Code of net.sf.robocode.ui.editor.EditorThemeConfigDialog$EventHandler

/**
* Copyright (c) 2001-2014 Mathew A. Nelson and Robocode contributors
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://robocode.sourceforge.net/license/epl-v10.html
*/
package net.sf.robocode.ui.editor;


import javax.swing.*;
import javax.swing.filechooser.FileFilter;

import net.sf.robocode.io.FileUtil;
import net.sf.robocode.io.Logger;
import net.sf.robocode.ui.editor.theme.ColorAndStyle;
import net.sf.robocode.ui.editor.theme.ColorAndStyleAdapter;
import net.sf.robocode.ui.editor.theme.ComboBoxUtil;
import net.sf.robocode.ui.editor.theme.EditorPropertiesManager;
import net.sf.robocode.ui.editor.theme.EditorThemeProperties;
import net.sf.robocode.ui.editor.theme.EditorThemePropertiesManager;
import net.sf.robocode.ui.editor.theme.IEditorThemeProperties;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.GraphicsEnvironment;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;


/**
* @author Flemming N. Larsen (original)
*
* @since 1.8.3.0
*/
@SuppressWarnings("serial")
public class EditorThemeConfigDialog extends JDialog {

  private static final boolean ONLY_MONOSPACED = true;

  private static final String[] FONT_SIZES = {
    "8", "9", "10", "11", "12", "14", "16", "18", "20", "22", "24", "26", "28", "36", "48", "72"
  };

  private JButton saveButton;
  private JButton closeButton;

  private JComboBox fontNameComboBox;
  private JComboBox fontStyleComboBox;
  private JComboBox fontSizeComboBox;

  private JLabel previewLabel;

  private JComboBox themeComboBox;

  private ColorAndStyle backgroundColorAndStyle;
  private ColorAndStyle lineNumberBackgroundColorAndStyle;
  private ColorAndStyle lineNumberTextColorAndStyle;
  private ColorAndStyle highlightedLineColorAndStyle;
  private ColorAndStyle selectionColorAndStyle;
  private ColorAndStyle selectedTextColorAndStyle;
  private ColorAndStyle normalTextColorAndStyle;
  private ColorAndStyle quotedTextColorAndStyle;
  private ColorAndStyle keywordTextColorAndStyle;
  private ColorAndStyle literalTextColorAndStyle;
  private ColorAndStyle annotationTextColorAndStyle;
  private ColorAndStyle commentTextColorAndStyle;
 
  private final EventHandler eventHandler = new EventHandler();

  public EditorThemeConfigDialog(JFrame owner) {
    super(owner, true);
    initialize();
  }

  private void initialize() {
    setTitle("Editor Theme Configurator");
    setLayout(new GridBagLayout());
    setResizable(false);

    // Initialize the font and theme ----
    initializeFontAndTheme();

    getSaveButton().setEnabled(false);

    // ---- General font settings ----

    GridBagConstraints gbc = new GridBagConstraints();
    gbc.insets = new Insets(5, 5, 5, 5);
    gbc.anchor = GridBagConstraints.WEST;

    int gridy = 0;

    gbc.gridx = 0;
    gbc.gridy = gridy;
    gbc.fill = GridBagConstraints.HORIZONTAL;

    gbc.weightx = 0.6;
    add(getFontNamePanel(), gbc);

    gbc.gridx = 1;
    gbc.weightx = 0.3;
    add(getFontStylePanel(), gbc);

    gbc.gridx = 2;
    gbc.weightx = 0.1;
    add(getFontSizePanel(), gbc);
   
    gbc.gridx = 0;
    gbc.gridy = ++gridy;
    gbc.gridwidth = 3;
    gbc.gridheight = 1;

    gbc.fill = GridBagConstraints.BOTH;
    gbc.weightx = 1.0;
    gbc.weighty = 1.0;
    add(getPreviewPanel(), gbc);

    // ----- Theme settings ----

    gbc.weightx = 0;
    gbc.weighty = 0;

    gbc.gridx = 0;
    gbc.gridy = ++gridy;
    gbc.fill = GridBagConstraints.HORIZONTAL;
    gbc.gridwidth = 1;
    add(getThemeComboBox(), gbc);

    // ---- Color buttons and font styles ----
   
    gbc.gridwidth = 1;

    gbc.gridx = 0;
    gbc.gridy = ++gridy;
    gbc.gridwidth = 1;

    gbc.fill = GridBagConstraints.NONE;

    JPanel colorButtonsPanel = new JPanel();
    colorButtonsPanel.setLayout(new GridBagLayout());
    add(colorButtonsPanel, gbc);

    GridBagConstraints gbc2 = new GridBagConstraints();
    gbc2.insets = new Insets(5, 5, 5, 5);
    gbc2.anchor = GridBagConstraints.WEST;

    int gridy2 = 0;

    gbc2.gridy = gridy2++;
    addColoredButtonAndFontStyleToPanel(getBackgroundColorAndStyle(), colorButtonsPanel, gbc2);

    gbc2.gridy = gridy2++;
    addColoredButtonAndFontStyleToPanel(getLineNumberBackgroundColorAndStyle(), colorButtonsPanel, gbc2);

    gbc2.gridy = gridy2++;
    addColoredButtonAndFontStyleToPanel(getLineNumberTextColorAndStyle(), colorButtonsPanel, gbc2);

    gbc2.gridy = gridy2++;
    addColoredButtonAndFontStyleToPanel(getHighlightedLineColorAndStyle(), colorButtonsPanel, gbc2);

    gbc2.gridy = gridy2++;
    addColoredButtonAndFontStyleToPanel(getSelectionColorAndStyle(), colorButtonsPanel, gbc2);

    gbc2.gridy = gridy2++;
    addColoredButtonAndFontStyleToPanel(getSelectedTextColorAndStyle(), colorButtonsPanel, gbc2);

    gbc2.gridy = gridy2++;
    addColoredButtonAndFontStyleToPanel(getNormalTextColorAndStyle(), colorButtonsPanel, gbc2);

    gbc2.gridy = gridy2++;
    addColoredButtonAndFontStyleToPanel(getCommentTextColorAndStyle(), colorButtonsPanel, gbc2);

    gbc2.gridy = gridy2++;
    addColoredButtonAndFontStyleToPanel(getQuotedTextColorAndStyle(), colorButtonsPanel, gbc2);

    gbc2.gridy = gridy2++;
    addColoredButtonAndFontStyleToPanel(getKeywordTextColorAndStyle(), colorButtonsPanel, gbc2);

    gbc2.gridy = gridy2++;
    addColoredButtonAndFontStyleToPanel(getLiteralTextColorAndStyle(), colorButtonsPanel, gbc2);

    gbc2.gridy = gridy2++;
    addColoredButtonAndFontStyleToPanel(getAnnotationTextColorAndStyle(), colorButtonsPanel, gbc2);

    // ------ OK & Cancel buttons ----

    JPanel okCancelPanel = new JPanel();
    okCancelPanel.add(getSaveButton());
    okCancelPanel.add(getCloseButton(), gbc);

    gbc.gridy = ++gridy;
    add(okCancelPanel, gbc);
  }

  private JButton getSaveButton() {
    if (saveButton == null) {
      saveButton = new JButton("Save & Close");
      saveButton.setMnemonic('S');
      saveButton.addActionListener(eventHandler);
    }
    return saveButton;
  }

  private JButton getCloseButton() {
    if (closeButton == null) {
      closeButton = new JButton("Close");
      closeButton.setMnemonic('C');
      closeButton.addActionListener(eventHandler);
    }
    return closeButton;
  }

  private JComboBox getFontNameComboBox() {
    if (fontNameComboBox == null) {
      String[] fontFamilyNames = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
      List<String> fontFamilyNameList = Arrays.asList(fontFamilyNames);

      List<String> fontNameList = new ArrayList<String>();

      if (ONLY_MONOSPACED) {
        for (String monospacedFontName : getMonospacedFontNames()) {
          if (fontFamilyNameList.contains(monospacedFontName)) {
            fontNameList.add(monospacedFontName);
          }
        }
      } else {
        fontNameList.addAll(fontFamilyNameList);
      }
      if (!fontNameList.contains("Monospaced")) {
        fontNameList.add("Monospaced");
      }
      Collections.sort(fontNameList);
     
      fontNameComboBox = new JComboBox(fontNameList.toArray());
      fontNameComboBox.setRenderer(new FontCellRenderer());

      fontNameComboBox.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
          EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties();

          String oldFontName = themeProps.getFontName();
          String newFontName = ComboBoxUtil.getSelectedName(fontNameComboBox);
          if (!newFontName.equals(oldFontName)) {
            String oldThemeName = themeProps.getThemeName();
            String newThemeName = ComboBoxUtil.getSelectedName(getThemeComboBox());
            if (newThemeName.equals(oldThemeName)) {
              themeProps.setFontName(newFontName);
              updateSaveButton();
            }
          }
        }
      });
    }
    return fontNameComboBox;
  }

  private JComboBox getFontStyleComboBox() {
    if (fontStyleComboBox == null) {
      fontStyleComboBox = ComboBoxUtil.createFontStyleComboBox(FontStyle.PLAIN);

      fontStyleComboBox.addActionListener(
          new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
          EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties();

          FontStyle oldFontStyle = themeProps.getNormalTextStyle();
          FontStyle newFontStyle = ComboBoxUtil.getSelectedStyle(getFontStyleComboBox());
          if (newFontStyle != oldFontStyle) {
            themeProps.setNormalTextStyle(newFontStyle);

            ComboBoxUtil.setSelected(getNormalTextColorAndStyle().getFontStyleComboBox(),
                (String) getFontStyleComboBox().getSelectedItem());

            updateSaveButton();
          }
        }       
      });
    }
    return fontStyleComboBox;
  }
 
  private JComboBox getFontSizeComboBox() {
    if (fontSizeComboBox == null) {
      fontSizeComboBox = new JComboBox(FONT_SIZES);
      fontSizeComboBox.setSelectedIndex(5);

      fontSizeComboBox.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
          EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties();

          int oldFontSize = themeProps.getFontSize();
          int newFontSize = Integer.parseInt((String) getFontSizeComboBox().getSelectedItem());
          if (newFontSize != oldFontSize) {
            themeProps.setFontSize(newFontSize);
            updateSaveButton();
          }
        }
      });
    }
    return fontSizeComboBox;
  }

  private JPanel getFontNamePanel() {
    JPanel panel = new JPanel();
    JLabel label = new JLabel("Font Name");

    panel.setLayout(new GridBagLayout());

    GridBagConstraints gbc = new GridBagConstraints();

    gbc.gridx = 0;
    gbc.gridy = 0;
    gbc.anchor = GridBagConstraints.NORTHWEST;
    panel.add(label, gbc);

    gbc.gridx = 0;
    gbc.gridy = 1;
    gbc.fill = GridBagConstraints.HORIZONTAL;
    gbc.weightx = 1.0;
    panel.add(getFontNameComboBox(), gbc);

    return panel;
  }

  private JPanel getFontStylePanel() {
    JPanel panel = new JPanel();
    JLabel label = new JLabel("Style");

    panel.setLayout(new GridBagLayout());

    GridBagConstraints gbc = new GridBagConstraints();

    gbc.gridx = 0;
    gbc.gridy = 0;
    gbc.anchor = GridBagConstraints.NORTHWEST;
    panel.add(label, gbc);

    gbc.gridx = 0;
    gbc.gridy = 1;
    gbc.fill = GridBagConstraints.HORIZONTAL;
    gbc.weightx = 1.0;
    panel.add(getFontStyleComboBox(), gbc);

    return panel;
  }

  private JPanel getFontSizePanel() {
    JPanel panel = new JPanel();
    JLabel label = new JLabel("Size");

    panel.setLayout(new GridBagLayout());

    GridBagConstraints gbc = new GridBagConstraints();

    gbc.gridx = 0;
    gbc.gridy = 0;
    gbc.anchor = GridBagConstraints.NORTHWEST;
    panel.add(label, gbc);

    gbc.gridx = 0;
    gbc.gridy = 1;
    gbc.fill = GridBagConstraints.HORIZONTAL;
    gbc.weightx = 1.0;
    panel.add(getFontSizeComboBox(), gbc);

    return panel;
  }

  private JLabel getPreviewLabel() {
    if (previewLabel == null) {
      previewLabel = new JLabel("AaBbYyZz");
    }
    return previewLabel;
  }
 
  private JPanel getPreviewPanel() {
    final JPanel panel = new JPanel();
    panel.setLayout(new GridBagLayout());

    panel.setBorder(BorderFactory.createEtchedBorder());
    panel.setBackground(Color.WHITE);
    panel.setForeground(Color.BLACK);
    panel.setPreferredSize(new Dimension(400, 120));

    ActionListener actionListener = new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        setPreviewLabelFont(panel);
        panel.repaint();
      }
    };

    getFontNameComboBox().addActionListener(actionListener);
    getFontStyleComboBox().addActionListener(actionListener);
    getFontSizeComboBox().addActionListener(actionListener);

    setPreviewLabelFont(panel);
    panel.add(getPreviewLabel(), SwingConstants.CENTER);
   
    return panel;
  }

  private ColorAndStyle getBackgroundColorAndStyle() {
    if (backgroundColorAndStyle == null) {
      EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
      backgroundColorAndStyle = new ColorAndStyle("Background Color", props.getBackgroundColor(), null);
      backgroundColorAndStyle.addListener(new ColorAndStyleAdapter() {
        @Override
        public void colorChanged(Color newColor) {
          EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
          themeProps.setBackgroundColor(newColor);

          updateSaveButton();
        }
      });
    }
    return backgroundColorAndStyle;
  }

  private ColorAndStyle getLineNumberBackgroundColorAndStyle() {
    if (lineNumberBackgroundColorAndStyle == null) {
      EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
      lineNumberBackgroundColorAndStyle = new ColorAndStyle("Line Number Background Color",
          props.getLineNumberBackgroundColor(), null);
      lineNumberBackgroundColorAndStyle.addListener(new ColorAndStyleAdapter() {
        @Override
        public void colorChanged(Color newColor) {
          EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
          themeProps.setLineNumberBackgroundColor(newColor);

          updateSaveButton();
        }
      });
    }
    return lineNumberBackgroundColorAndStyle;
  }

  private ColorAndStyle getLineNumberTextColorAndStyle() {
    if (lineNumberTextColorAndStyle == null) {
      EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
      lineNumberTextColorAndStyle = new ColorAndStyle("Line Number Text Color", props.getLineNumberTextColor(),
          null);
      lineNumberTextColorAndStyle.addListener(new ColorAndStyleAdapter() {
        @Override
        public void colorChanged(Color newColor) {
          EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
          themeProps.setLineNumberTextColor(newColor);

          updateSaveButton();
        }
      });
    }
    return lineNumberTextColorAndStyle;
  }

  private ColorAndStyle getHighlightedLineColorAndStyle() {
    if (highlightedLineColorAndStyle == null) {
      EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
      highlightedLineColorAndStyle = new ColorAndStyle("Highlighted Line Color", props.getHighlightedLineColor(),
          null);
      highlightedLineColorAndStyle.addListener(new ColorAndStyleAdapter() {
        @Override
        public void colorChanged(Color newColor) {
          EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
          themeProps.setHighlightedLineColor(newColor);
         
          updateSaveButton();
        }
      });
    }
    return highlightedLineColorAndStyle;
  }

  private ColorAndStyle getSelectionColorAndStyle() {
    if (selectionColorAndStyle == null) {
      EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
      selectionColorAndStyle = new ColorAndStyle("Selection Color", props.getSelectionColor(), null);
      selectionColorAndStyle.addListener(new ColorAndStyleAdapter() {
        @Override
        public void colorChanged(Color newColor) {
          EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
          themeProps.setSelectionColor(newColor);

          updateSaveButton();
        }
      });
    }
    return selectionColorAndStyle;
  }

  private ColorAndStyle getSelectedTextColorAndStyle() {
    if (selectedTextColorAndStyle == null) {
      EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
      selectedTextColorAndStyle = new ColorAndStyle("Selected Text Color", props.getSelectedTextColor(), null);
      selectedTextColorAndStyle.addListener(new ColorAndStyleAdapter() {
        @Override
        public void colorChanged(Color newColor) {
          EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
          themeProps.setSelectedTextColor(newColor);
        }
      });
    }
    return selectedTextColorAndStyle;
  }

  private ColorAndStyle getNormalTextColorAndStyle() {
    if (normalTextColorAndStyle == null) {
      EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
      normalTextColorAndStyle = new ColorAndStyle("Normal Text Color", props.getNormalTextColor(),
          props.getNormalTextStyle());
      normalTextColorAndStyle.addListener(new ColorAndStyleAdapter() {
        @Override
        public void colorChanged(Color newColor) {
          EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
          themeProps.setNormalTextColor(newColor);

          updateSaveButton();
        }

        @Override
        public void styleChanged(FontStyle newStyle) {
          EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
          themeProps.setNormalTextStyle(newStyle);

          updateSaveButton();

          // Make sure to update the font style combo box
          ComboBoxUtil.setSelected(getFontStyleComboBox(), newStyle);
        }
      });
    }
    return normalTextColorAndStyle;
  }

  private ColorAndStyle getQuotedTextColorAndStyle() {
    if (quotedTextColorAndStyle == null) {
      EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
      quotedTextColorAndStyle = new ColorAndStyle("Quoted Text Color", props.getQuotedTextColor(),
          props.getQuotedTextStyle());
      quotedTextColorAndStyle.addListener(new ColorAndStyleAdapter() {
        @Override
        public void colorChanged(Color newColor) {
          EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
          themeProps.setQuotedTextColor(newColor);

          updateSaveButton();
        }

        @Override
        public void styleChanged(FontStyle newStyle) {
          EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
          themeProps.setQuotedTextStyle(newStyle);

          updateSaveButton();
        }
      });
    }
    return quotedTextColorAndStyle;
  }

  private ColorAndStyle getKeywordTextColorAndStyle() {
    if (keywordTextColorAndStyle == null) {
      EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
      keywordTextColorAndStyle = new ColorAndStyle("Keyword Color", props.getKeywordTextColor(),
          props.getKeywordTextStyle());
      keywordTextColorAndStyle.addListener(new ColorAndStyleAdapter() {
        @Override
        public void colorChanged(Color newColor) {
          EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
          themeProps.setKeywordTextColor(newColor);

          updateSaveButton();
        }

        @Override
        public void styleChanged(FontStyle newStyle) {
          EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
          themeProps.setKeywordTextStyle(newStyle);

          updateSaveButton();
        }
      });
    }
    return keywordTextColorAndStyle;
  }

  private ColorAndStyle getLiteralTextColorAndStyle() {
    if (literalTextColorAndStyle == null) {
      EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
      literalTextColorAndStyle = new ColorAndStyle("Literal Color", props.getLiteralTextColor(),
          props.getLiteralTextStyle());
      literalTextColorAndStyle.addListener(new ColorAndStyleAdapter() {
        @Override
        public void colorChanged(Color newColor) {
          EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
          themeProps.setLiteralTextColor(newColor);

          updateSaveButton();
        }

        @Override
        public void styleChanged(FontStyle newStyle) {
          EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
          themeProps.setLiteralTextStyle(newStyle);

          updateSaveButton();
        }
      });
    }
    return literalTextColorAndStyle;
  }

  private ColorAndStyle getAnnotationTextColorAndStyle() {
    if (annotationTextColorAndStyle == null) {
      EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
      annotationTextColorAndStyle = new ColorAndStyle("Annotation Color", props.getAnnotationTextColor(),
          props.getAnnotationTextStyle());
      annotationTextColorAndStyle.addListener(new ColorAndStyleAdapter() {
        @Override
        public void colorChanged(Color newColor) {
          EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
          themeProps.setAnnotationTextColor(newColor);

          updateSaveButton();
        }

        @Override
        public void styleChanged(FontStyle newStyle) {
          EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
          themeProps.setAnnotationTextStyle(newStyle);

          updateSaveButton();
        }
      });
    }
    return annotationTextColorAndStyle;
  }

  private ColorAndStyle getCommentTextColorAndStyle() {
    if (commentTextColorAndStyle == null) {
      EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
      commentTextColorAndStyle = new ColorAndStyle("Comment Color", props.getCommentTextColor(),
          props.getCommentTextStyle());
      commentTextColorAndStyle.addListener(new ColorAndStyleAdapter() {
        @Override
        public void colorChanged(Color newColor) {
          EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
          themeProps.setCommentTextColor(newColor);

          updateSaveButton();
        }

        @Override
        public void styleChanged(FontStyle newStyle) {
          EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
          themeProps.setCommentTextStyle(newStyle);

          updateSaveButton();
        }
      });
    }
    return commentTextColorAndStyle;
  }

  private JComboBox getThemeComboBox() {
    if (themeComboBox == null) {
      final String fileExt = EditorThemePropertiesManager.getFileExt();
     
      File[] themeFiles = FileUtil.getEditorThemeConfigDir().listFiles(new java.io.FileFilter() {
        public boolean accept(File filepath) {
          return filepath.getName().endsWith(fileExt);
        }
      });

      List<String> themeNames = new ArrayList<String>();
      for (File file : themeFiles) {
        String themeName = file.getName();
        themeName = themeName.substring(0, themeName.lastIndexOf(fileExt));
        themeNames.add(themeName);
      }
 
      themeComboBox = new JComboBox(themeNames.toArray())
      themeComboBox.addActionListener(eventHandler);
    }
    return themeComboBox;
  }

  private void setPreviewLabelFont(JPanel panel) {
    String fontName = (String) getFontNameComboBox().getSelectedItem();
    int fontStyleFlags = FontStyle.fromName((String) getFontStyleComboBox().getSelectedItem()).getFontStyleFlags();
    int fontSize = Integer.parseInt((String) getFontSizeComboBox().getSelectedItem());

    Font font = new Font(fontName, fontStyleFlags, fontSize);
   
    getPreviewLabel().setFont(font);

    FontMetrics fontMetrics = panel.getFontMetrics(font);

    int width = fontMetrics.stringWidth(getPreviewLabel().getText());
    int height = fontMetrics.getHeight();

    getPreviewLabel().setPreferredSize(new Dimension(width, height));
  }

  private void initializeFontAndTheme() {
    // Read the theme properties
    IEditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties();

    // Set selected theme
    ComboBoxUtil.setSelected(getThemeComboBox(), themeProps.getThemeName());

    // Set selected font name
    ComboBoxUtil.setSelected(getFontNameComboBox(), themeProps.getFontName());

    // Set selected font style
    ComboBoxUtil.setSelected(getFontStyleComboBox(), themeProps.getNormalTextStyle());

    // Set selected font size
    ComboBoxUtil.setSelected(getFontSizeComboBox(), "" + themeProps.getFontSize());
  }

  private class EventHandler implements ActionListener {
    public void actionPerformed(ActionEvent e) {
      Object source = e.getSource();
      if (source.equals(getThemeComboBox())) {
        performThemeComboBoxAction();
      } else if (e.getSource().equals(getSaveButton())) {
        performSaveButtonAction();
      } else if (e.getSource().equals(getCloseButton())) {
        dispose();
      }
    }
  }

  private List<String> getMonospacedFontNames() {
    List<String> monospacedFontNames = new ArrayList<String>();
   
    Font[] allFonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();
    for (Font font : allFonts) {
      if (isMonospaced(font)) {
        monospacedFontNames.add(font.getFontName());
      }
    }
    return monospacedFontNames;
  }
 
  private boolean isMonospaced(Font font) {
    FontMetrics fontMetrics = getFontMetrics(font);

    int lastCharWidth = -1;

    for (int charCode = 0; charCode < 128; charCode++) {
      if (Character.isValidCodePoint(charCode) && (Character.isLetter(charCode) || Character.isDigit(charCode))) {
        int charWidth = fontMetrics.charWidth((char) charCode);
        if (lastCharWidth >= 0 && charWidth != lastCharWidth) {
          return false; // font is not mono-spaced
        }
        lastCharWidth = charWidth;
      }
    }
    return true; // font is mono-spaced
  }

  private static void addColoredButtonAndFontStyleToPanel(ColorAndStyle group, JPanel panel, GridBagConstraints gbc) {
    gbc.gridx = 0;
    panel.add(group.getColoredButton(), gbc);

    gbc.gridx = 1;
    panel.add(group.getLabel(), gbc);

    if (group.getFontStyleComboBox() != null) {
      gbc.gridx = 2;
      panel.add(group.getFontStyleComboBox(), gbc);
    }
  }

  private void udateComponentsTheme(final String themeName) {
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        // Store current theme name
        EditorPropertiesManager.getEditorProperties().setThemeName(themeName);
        EditorPropertiesManager.saveEditorProperties();

        // Load theme properties
        File filepath = EditorThemePropertiesManager.getFilepath(themeName);
        EditorThemePropertiesManager.loadEditorThemeProperties(filepath);

        EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties();

        ComboBoxUtil.setSelected(getFontNameComboBox(), themeProps.getFontName());
        ComboBoxUtil.setSelected(getFontSizeComboBox(), "" + themeProps.getFontSize());

        getBackgroundColorAndStyle().setSelectedColor(themeProps.getBackgroundColor());

        getLineNumberBackgroundColorAndStyle().setSelectedColor(themeProps.getLineNumberBackgroundColor());
        getLineNumberTextColorAndStyle().setSelectedColor(themeProps.getLineNumberTextColor());

        getHighlightedLineColorAndStyle().setSelectedColor(themeProps.getHighlightedLineColor());

        getSelectionColorAndStyle().setSelectedColor(themeProps.getSelectionColor());
        getSelectedTextColorAndStyle().setSelectedColor(themeProps.getSelectedTextColor());

        getNormalTextColorAndStyle().setSelectedColor(themeProps.getNormalTextColor());
        getNormalTextColorAndStyle().setSelectedStyle(themeProps.getNormalTextStyle());

        getCommentTextColorAndStyle().setSelectedColor(themeProps.getCommentTextColor());
        getCommentTextColorAndStyle().setSelectedStyle(themeProps.getCommentTextStyle());

        getQuotedTextColorAndStyle().setSelectedColor(themeProps.getQuotedTextColor());
        getQuotedTextColorAndStyle().setSelectedStyle(themeProps.getQuotedTextStyle());

        getKeywordTextColorAndStyle().setSelectedColor(themeProps.getKeywordTextColor());
        getKeywordTextColorAndStyle().setSelectedStyle(themeProps.getKeywordTextStyle());

        getLiteralTextColorAndStyle().setSelectedColor(themeProps.getLiteralTextColor());
        getLiteralTextColorAndStyle().setSelectedStyle(themeProps.getLiteralTextStyle());

        getAnnotationTextColorAndStyle().setSelectedColor(themeProps.getAnnotationTextColor());
        getAnnotationTextColorAndStyle().setSelectedStyle(themeProps.getAnnotationTextStyle());

        updateSaveButton();
      }
    });
  }

  private void updateSaveButton() {
    EditorThemeProperties props = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
    boolean enabled = props.isChanged();
    getSaveButton().setEnabled(enabled);
  }
 
  private void performThemeComboBoxAction() {
    EditorThemeProperties currentThemeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties();

    String oldThemeName = currentThemeProps.getThemeName();
    String newThemeName = (String) getThemeComboBox().getSelectedItem();
    if (!oldThemeName.equals(newThemeName)) {
      if (currentThemeProps.isChanged()) {
        Object[] options = { "Yes, save changes", "No, forget changes", "Cancel"};

        int option = JOptionPane.showOptionDialog(null,
            "Changes have been made to the theme:\n" + oldThemeName
            + "\nDo you want save the changes to this theme?",
            "Warning",
            JOptionPane.YES_NO_CANCEL_OPTION,
            JOptionPane.QUESTION_MESSAGE,
            null,
            options,
            options[2]);

        if (option == JOptionPane.YES_OPTION) {
          File filepath = EditorThemePropertiesManager.getFilepath(oldThemeName);
          if (filepath != null && !filepath.exists()) {
            try {
              filepath.createNewFile();
            } catch (IOException e) {
              Logger.logError(e);
              return;
            }
          }
          EditorThemePropertiesManager.saveEditorThemeProperties(filepath);

        } else if (option == JOptionPane.CANCEL_OPTION) {
          ComboBoxUtil.setSelected(getThemeComboBox(), oldThemeName);
          return;
        }
      }
      // Switch to new theme
      udateComponentsTheme(newThemeName);
    }
  }
 
  private void performSaveButtonAction() {
    String themeName = "My theme";
    File file = EditorThemePropertiesManager.getFilepath(themeName);

    JFileChooser saveThemeDialog = new JFileChooser(FileUtil.getEditorThemeConfigDir());
    saveThemeDialog.setDialogTitle("Save Theme");
    saveThemeDialog.setSelectedFile(file);

    FileFilter fileFilter = new FileFilter() {
      @Override
      public boolean accept(File filepath) {
        return filepath.getName().endsWith(EditorThemePropertiesManager.getFileExt());
      }

      @Override
      public String getDescription() {
        return "Robocode Editor Theme properties";
      }
    };

    saveThemeDialog.addChoosableFileFilter(fileFilter);
    saveThemeDialog.setAcceptAllFileFilterUsed(false);

    int returnState = saveThemeDialog.showSaveDialog(this);

    file = saveThemeDialog.getSelectedFile();

    if (!file.getName().endsWith(EditorThemePropertiesManager.getFileExt())) {
      file = new File(file.getAbsolutePath() + EditorThemePropertiesManager.getFileExt());
    }

    if (!FileUtil.isFilenameValid(file.getName())) {
      JOptionPane.showMessageDialog(this, "Not a valid file name:\n" + file.getName(), "Error",
          JOptionPane.ERROR_MESSAGE);

    } else if (returnState == JFileChooser.APPROVE_OPTION) {
     
      if (file.exists()) {
        Object[] options = { "Yes, overwrite", "No, do not overwrite"};
       
        int option = JOptionPane.showOptionDialog(this,
            "File already exists:\n" + file.getName() + "\nDo you want to overwrite this file?", "Warning",
            JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[1]);
       
        if (option == JOptionPane.NO_OPTION) {
          return;
        }
      } else {
        try {
          file.createNewFile(); // File must be created if it does not exist already
        } catch (IOException e) {
          Logger.logError(e);
          return;
        }
      }

      ComboBoxUtil.setSelected(getThemeComboBox(), themeName);
      EditorPropertiesManager.getEditorProperties().setThemeName(themeName);
      EditorPropertiesManager.saveEditorProperties();

      EditorThemeProperties themeProps = EditorThemePropertiesManager.getCurrentEditorThemeProperties();
      themeProps.setThemeName(themeName);

      themeProps.setFontName(ComboBoxUtil.getSelectedName(getFontNameComboBox()));
      themeProps.setFontSize(Integer.parseInt(ComboBoxUtil.getSelectedName(getFontSizeComboBox())));

      EditorThemePropertiesManager.saveEditorThemeProperties(file);

      dispose(); // Only when save was successful

    } else if (returnState == JFileChooser.ERROR_OPTION) {
      JOptionPane.showMessageDialog(this, "The editor theme was not saved.", "Warning",
          JOptionPane.WARNING_MESSAGE);
    }
  }

  private class FontCellRenderer extends DefaultListCellRenderer {

    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
      JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);

      Font font = new Font((String) value, Font.PLAIN, 20);
      if (font.canDisplayUpTo(label.getText()) == -1) { // -1 means, can display all of the string
        label.setFont(font);
      }
      return label;
    }
  }
}
TOP

Related Classes of net.sf.robocode.ui.editor.EditorThemeConfigDialog$EventHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.