xeij/LnF.java
//========================================================================================
//  LnF.java
//    en:Look and feel
//    ja:ルックアンドフィール
//  Copyright (C) 2003-2025 Makoto Kamada
//
//  This file is part of the XEiJ (X68000 Emulator in Java).
//  You can use, modify and redistribute the XEiJ if the conditions are met.
//  Read the XEiJ License for more details.
//  https://stdkmd.net/xeij/
//========================================================================================

package xeij;

import java.awt.*;  //BasicStroke,BorderLayout,BoxLayout,Color,Component,Container,Cursor,Desktop,Dimension,Font,Frame,Graphics,Graphics2D,GraphicsDevice,GraphicsEnvironment,GridLayout,Image,Insets,Paint,Point,Rectangle,RenderingHints,Robot,Shape,Stroke,TexturePaint,Toolkit
import java.awt.image.*;  //BufferedImage,DataBuffer,DataBufferByte,DataBufferInt,IndexColorModel
import java.lang.*;  //Boolean,Character,Class,Comparable,Double,Exception,Float,IllegalArgumentException,Integer,Long,Math,Number,Object,Runnable,SecurityException,String,StringBuilder,System
import java.util.*;  //ArrayList,Arrays,Calendar,GregorianCalendar,HashMap,Map,Map.Entry,Timer,TimerTask,TreeMap
import javax.swing.*;  //AbstractSpinnerModel,Box,ButtonGroup,DefaultListModel,ImageIcon,JButton,JCheckBox,JCheckBoxMenuItem,JDialog,JFileChooser,JFrame,JLabel,JList,JMenu,JMenuBar,JMenuItem,JPanel,JRadioButton,JScrollPane,JSpinner,JTextArea,JTextField,JTextPane,JViewport,ScrollPaneConstants,SpinnerListModel,SpinnerNumberModel,SwingConstants,SwingUtilities,UIManager,UIDefaults,UnsupportedLookAndFeelException
import javax.swing.plaf.*;  //ColorUIResource,FontUIResource,IconUIResource,InsetsUIResource
import javax.swing.plaf.metal.*;  //MetalLookAndFeel,MetalTheme,OceanTheme

public class LnF {

  //色
  //  (0,y0),(7,y7),(14,y14)を通る2次関数
  //  y=(y0-2*y7+y14)/98*x^2+(-3*y0+4*y7-y14)/14*x+y0
  public static final int[][] LNF_HSB_INTERPOLATION_TABLE = {
    { 49, 0, 0 },  //x0=(49*y0)/49
    { 39, 13, -3 },  //x1=(39*y0+13*y7-3*y14)/49
    { 30, 24, -5 },  //x2=(30*y0+24*y7-5*y14)/49
    { 22, 33, -6 },  //x3=(22*y0+33*y7-6*y14)/49
    { 15, 40, -6 },  //x4=(15*y0+40*y7-6*y14)/49
    { 9, 45, -5 },  //x5=(9*y0+45*y7-5*y14)/49
    { 4, 48, -3 },  //x6=(4*y0+48*y7-3*y14)/49
    { 0, 49, 0 },  //x7=(49*y7)/49
    { -3, 48, 4 },  //x8=(-3*y0+48*y7+4*y14)/49
    { -5, 45, 9 },  //x9=(-5*y0+45*y7+9*y14)/49
    { -6, 40, 15 },  //x10=(-6*y0+40*y7+15*y14)/49
    { -6, 33, 22 },  //x11=(-6*y0+33*y7+22*y14)/49
    { -5, 24, 30 },  //x12=(-5*y0+24*y7+30*y14)/49
    { -3, 13, 39 },  //x13=(-3*y0+13*y7+39*y14)/49
    { 0, 0, 49 },  //x14=(49*y14)/49
  };
  public static final int[] LNF_DEFAULT_HSB = { 240, 240, 240, 70, 50, 30, 0, 50, 100 };
  public static final int[] lnfHSB = new int[9];  //h0,h7,h14,s0,s7,s14,b0,b7,b14
  public static final int[] lnfRGB = new int[15];  //rgb0,...,rgb14
  public static ColorUIResource lnfSecondary3;
  public static ColorUIResource lnfWhite;
  public static ColorUIResource lnfPrimary3;
  public static ColorUIResource lnfPrimary2;
  public static ColorUIResource lnfSecondary2;
  public static ColorUIResource lnfPrimary1;
  public static ColorUIResource lnfSecondary1;
  public static ColorUIResource lnfBlack;

  //フォント
  public static int lnfFontSizeRequest;
  public static int lnfFontSize;
  public static String[] lnfAvailableFontFamilyNames;
  public static String lnfMonospacedFamily;
  public static Font lnfMonospacedFont;
  public static Font lnfMonospacedFont12;
  public static FontUIResource lnfControlTextFontUIResource;
  public static FontUIResource lnfMenuTextFontUIResource;
  public static FontUIResource lnfSubTextFontUIResource;
  public static FontUIResource lnfSystemTextFontUIResource;
  public static FontUIResource lnfUserTextFontUIResource;
  public static FontUIResource lnfWindowTitleFontUIResource;

  //アイコン
  //  Xマークが左右にはみ出しているイメージ
  //  perl misc/favicon.pl
  public static final BufferedImage LNF_ICON_IMAGE_16 = XEiJ.createImage (
    16, 16,
    "................" +
    "1111111111.11111" +
    "1........1..1..." +
    ".1........1.1..." +
    ".1........1..1.." +
    "..1........1.1.1" +
    "..1........1..1." +
    "...1........1..." +
    "...1........1..." +
    ".1..1........1.." +
    "1.1.1........1.." +
    "..1..1........1." +
    "...1.1........1." +
    "...1..1........1" +
    "11111.1111111111" +
    "................",
    0xff000000,
    0xffffff00
    );
  public static final BufferedImage LNF_ICON_IMAGE_32 = XEiJ.createImage (
    32, 32,
    "................................" +
    "................................" +
    "1111111111111111111...1111111111" +
    "11111111111111111111..1111111111" +
    "11................11...11......." +
    ".11................11..111......" +
    ".11................11...11......" +
    "..11................11..111....." +
    "..11................11...11....." +
    "...11................11..111...1" +
    "...11................11...11..11" +
    "....11................11..111111" +
    "....11................11...1111." +
    ".....11................11..111.." +
    ".....11................11...1..." +
    "......11................11......" +
    "......11................11......" +
    "...1...11................11....." +
    "..111..11................11....." +
    ".1111...11................11...." +
    "111111..11................11...." +
    "11..11...11................11..." +
    "1...111..11................11..." +
    ".....11...11................11.." +
    ".....111..11................11.." +
    "......11...11................11." +
    "......111..11................11." +
    ".......11...11................11" +
    "1111111111..11111111111111111111" +
    "1111111111...1111111111111111111" +
    "................................" +
    "................................",
    0xff000000,
    0xffffff00
    );
  public static final BufferedImage LNF_ICON_IMAGE_48 = XEiJ.createImage (
    48, 48,
    "................................................" +
    "................................................" +
    "................................................" +
    "11111111111111111111111111111....111111111111111" +
    "11111111111111111111111111111....111111111111111" +
    "111111111111111111111111111111....11111111111111" +
    "111........................111....1111.........." +
    "1111........................111....111.........." +
    ".111........................111....1111........." +
    ".1111........................111....111........." +
    "..111........................111....1111........" +
    "..1111........................111....111........" +
    "...111........................111....1111......." +
    "...1111........................111....111......." +
    "....111........................111....1111.....1" +
    "....1111........................111....111....11" +
    ".....111........................111....1111..111" +
    ".....1111........................111....11111111" +
    "......111........................111....1111111." +
    "......1111........................111....11111.." +
    ".......111........................111....1111..." +
    ".......1111........................111....11...." +
    "........111........................111....1....." +
    "........1111........................111........." +
    ".........111........................111........." +
    ".....1...1111........................111........" +
    "....11....111........................111........" +
    "...1111...1111........................111......." +
    "..11111....111........................111......." +
    ".1111111...1111........................111......" +
    "11111111....111........................111......" +
    "111..1111...1111........................111....." +
    "11....111....111........................111....." +
    "1.....1111...1111........................111...." +
    ".......111....111........................111...." +
    ".......1111...1111........................111..." +
    "........111....111........................111..." +
    "........1111...1111........................111.." +
    ".........111....111........................111.." +
    ".........1111...1111........................111." +
    "..........111....111........................111." +
    "..........1111...1111........................111" +
    "11111111111111....111111111111111111111111111111" +
    "111111111111111...111111111111111111111111111111" +
    "111111111111111....11111111111111111111111111111" +
    "................................................" +
    "................................................" +
    "................................................",
    0xff000000,
    0xffffff00
    );
  public static final BufferedImage[] LNF_ICON_IMAGES = {
    LNF_ICON_IMAGE_16,
    LNF_ICON_IMAGE_32,
    LNF_ICON_IMAGE_48,
  };

  //アイコンのパターンとイメージ
  public static final String[] LNF_NUMBER_PATTERN_ARRAY = {
    (
      "22222222222222" +
      "2............2" +
      "2.1111111111.2" +
      "2.1111111111.2" +
      "2.11......11.2" +
      "2.11......11.2" +
      "2.11......11.2" +
      "2.11......11.2" +
      "2.11......11.2" +
      "2.11......11.2" +
      "2.1111111111.2" +
      "2.1111111111.2" +
      "2............2" +
      "22222222222222"),
    (
      "22222222222222" +
      "2............2" +
      "2.....11.....2" +
      "2.....11.....2" +
      "2.....11.....2" +
      "2.....11.....2" +
      "2.....11.....2" +
      "2.....11.....2" +
      "2.....11.....2" +
      "2.....11.....2" +
      "2.....11.....2" +
      "2.....11.....2" +
      "2............2" +
      "22222222222222"),
    (
      "22222222222222" +
      "2............2" +
      "2.1111111111.2" +
      "2.1111111111.2" +
      "2.........11.2" +
      "2.........11.2" +
      "2.1111111111.2" +
      "2.1111111111.2" +
      "2.11.........2" +
      "2.11.........2" +
      "2.1111111111.2" +
      "2.1111111111.2" +
      "2............2" +
      "22222222222222"),
    (
      "22222222222222" +
      "2............2" +
      "2.1111111111.2" +
      "2.1111111111.2" +
      "2.........11.2" +
      "2.........11.2" +
      "2.1111111111.2" +
      "2.1111111111.2" +
      "2.........11.2" +
      "2.........11.2" +
      "2.1111111111.2" +
      "2.1111111111.2" +
      "2............2" +
      "22222222222222"),
    (
      "22222222222222" +
      "2............2" +
      "2.11......11.2" +
      "2.11......11.2" +
      "2.11......11.2" +
      "2.11......11.2" +
      "2.1111111111.2" +
      "2.1111111111.2" +
      "2.........11.2" +
      "2.........11.2" +
      "2.........11.2" +
      "2.........11.2" +
      "2............2" +
      "22222222222222"),
    (
      "22222222222222" +
      "2............2" +
      "2.1111111111.2" +
      "2.1111111111.2" +
      "2.11.........2" +
      "2.11.........2" +
      "2.1111111111.2" +
      "2.1111111111.2" +
      "2.........11.2" +
      "2.........11.2" +
      "2.1111111111.2" +
      "2.1111111111.2" +
      "2............2" +
      "22222222222222"),
    (
      "22222222222222" +
      "2............2" +
      "2.1111111111.2" +
      "2.1111111111.2" +
      "2.11.........2" +
      "2.11.........2" +
      "2.1111111111.2" +
      "2.1111111111.2" +
      "2.11......11.2" +
      "2.11......11.2" +
      "2.1111111111.2" +
      "2.1111111111.2" +
      "2............2" +
      "22222222222222"),
    (
      "22222222222222" +
      "2............2" +
      "2.1111111111.2" +
      "2.1111111111.2" +
      "2.........11.2" +
      "2.........11.2" +
      "2.........11.2" +
      "2.........11.2" +
      "2.........11.2" +
      "2.........11.2" +
      "2.........11.2" +
      "2.........11.2" +
      "2............2" +
      "22222222222222"),
    (
      "22222222222222" +
      "2............2" +
      "2.1111111111.2" +
      "2.1111111111.2" +
      "2.11......11.2" +
      "2.11......11.2" +
      "2.1111111111.2" +
      "2.1111111111.2" +
      "2.11......11.2" +
      "2.11......11.2" +
      "2.1111111111.2" +
      "2.1111111111.2" +
      "2............2" +
      "22222222222222"),
    (
      "22222222222222" +
      "2............2" +
      "2.1111111111.2" +
      "2.1111111111.2" +
      "2.11......11.2" +
      "2.11......11.2" +
      "2.1111111111.2" +
      "2.1111111111.2" +
      "2.........11.2" +
      "2.........11.2" +
      "2.1111111111.2" +
      "2.1111111111.2" +
      "2............2" +
      "22222222222222"),
    (
      "22222222222222" +
      "2............2" +
      "2.11.1111111.2" +
      "2.11.1111111.2" +
      "2.11.11...11.2" +
      "2.11.11...11.2" +
      "2.11.11...11.2" +
      "2.11.11...11.2" +
      "2.11.11...11.2" +
      "2.11.11...11.2" +
      "2.11.1111111.2" +
      "2.11.1111111.2" +
      "2............2" +
      "22222222222222"),
    (
      "22222222222222" +
      "2............2" +
      "2..11....11..2" +
      "2..11....11..2" +
      "2..11....11..2" +
      "2..11....11..2" +
      "2..11....11..2" +
      "2..11....11..2" +
      "2..11....11..2" +
      "2..11....11..2" +
      "2..11....11..2" +
      "2..11....11..2" +
      "2............2" +
      "22222222222222"),
    (
      "22222222222222" +
      "2............2" +
      "2.11.1111111.2" +
      "2.11.1111111.2" +
      "2.11......11.2" +
      "2.11......11.2" +
      "2.11.1111111.2" +
      "2.11.1111111.2" +
      "2.11.11......2" +
      "2.11.11......2" +
      "2.11.1111111.2" +
      "2.11.1111111.2" +
      "2............2" +
      "22222222222222"),
    (
      "22222222222222" +
      "2............2" +
      "2.11.1111111.2" +
      "2.11.1111111.2" +
      "2.11......11.2" +
      "2.11......11.2" +
      "2.11.1111111.2" +
      "2.11.1111111.2" +
      "2.11......11.2" +
      "2.11......11.2" +
      "2.11.1111111.2" +
      "2.11.1111111.2" +
      "2............2" +
      "22222222222222"),
    (
      "22222222222222" +
      "2............2" +
      "2.11.11...11.2" +
      "2.11.11...11.2" +
      "2.11.11...11.2" +
      "2.11.11...11.2" +
      "2.11.1111111.2" +
      "2.11.1111111.2" +
      "2.11......11.2" +
      "2.11......11.2" +
      "2.11......11.2" +
      "2.11......11.2" +
      "2............2" +
      "22222222222222"),
    (
      "22222222222222" +
      "2............2" +
      "2.11.1111111.2" +
      "2.11.1111111.2" +
      "2.11.11......2" +
      "2.11.11......2" +
      "2.11.1111111.2" +
      "2.11.1111111.2" +
      "2.11......11.2" +
      "2.11......11.2" +
      "2.11.1111111.2" +
      "2.11.1111111.2" +
      "2............2" +
      "22222222222222"),
  };
  public static final Image[] LNF_NUMBER_IMAGE_ARRAY = new Image[LNF_NUMBER_PATTERN_ARRAY.length];
  public static final Image[] LNF_NUMBER_SELECTED_IMAGE_ARRAY = new Image[LNF_NUMBER_PATTERN_ARRAY.length];

  public static final String LNF_EJECT_PATTERN = (
    ".............." +
    "......11......" +
    ".....1..1....." +
    "....1....1...." +
    "...1......1..." +
    "..1........1.." +
    ".1..........1." +
    ".1..........1." +
    ".111111111111." +
    ".............." +
    ".111111111111." +
    ".1..........1." +
    ".1..........1." +
    ".111111111111.");
  public static Image LNF_EJECT_IMAGE;
  public static Image LNF_EJECT_DISABLED_IMAGE;

  public static final String LNF_OPEN_PATTERN = (
    "...11111111111" +
    "...1.........1" +
    "...1.........1" +
    "11111111111..1" +
    "1.........1..1" +
    "1.........1..1" +
    "1.........1..1" +
    "1.........1..1" +
    "1.........1..1" +
    "1.........1..1" +
    "1.........1111" +
    "1.........1..." +
    "1.........1..." +
    "11111111111...");
  public static Image LNF_OPEN_IMAGE;
  public static Image LNF_OPEN_DISABLED_IMAGE;

  public static final String LNF_PROTECT_PATTERN = (
    "11111111111111" +
    "1............1" +
    "1..........111" +
    "1..........1.." +
    "1..........1.." +
    "1.....11...111" +
    "1....1..1....1" +
    "1....1..1....1" +
    "1.....11.....1" +
    "1.....11.....1" +
    "1.....11.....1" +
    "1.....11.....1" +
    "1.....11.....1" +
    "11111111111111");
  public static Image LNF_PROTECT_IMAGE;
  public static Image LNF_PROTECT_DISABLED_IMAGE;

  public static final String LNF_PROTECT_SELECTED_PATTERN = (
    "11111111111111" +
    "1............1" +
    "1............1" +
    "1............1" +
    "1............1" +
    "1.....11.....1" +
    "1....1..1....1" +
    "1....1..1....1" +
    "1.....11.....1" +
    "1.....11.....1" +
    "1.....11.....1" +
    "1.....11.....1" +
    "1.....11.....1" +
    "11111111111111");
  public static Image LNF_PROTECT_SELECTED_IMAGE;
  public static Image LNF_PROTECT_DISABLED_SELECTED_IMAGE;

  public static final String LNF_HD_PATTERN = (
    ".............." +
    "....111111...." +
    ".111......111." +
    "1............1" +
    "1............1" +
    ".111......111." +
    "1...111111...1" +
    "1............1" +
    ".111......111." +
    "1...111111...1" +
    "1............1" +
    ".111......111." +
    "....111111...." +
    "..............");
  public static ImageIcon LNF_HD_ICON;
  public static ImageIcon LNF_HD_DISABLED_ICON;

  public static final String LNF_MO_PATTERN = (
    "...11111111111" +
    "..1..........1" +
    ".1...1111....1" +
    "1...1....1...1" +
    "1..1......1..1" +
    "1.1...11...1.1" +
    "1.1..1..1..1.1" +
    "1.1..1..1..1.1" +
    "1.1...11...1.1" +
    "1..1......1..1" +
    "1...1....1...1" +
    "1....1111....1" +
    "1............1" +
    "11111111111111");
  public static ImageIcon LNF_MO_ICON;
  public static ImageIcon LNF_MO_DISABLED_ICON;

  public static final String LNF_CD_PATTERN = (
    ".....1111....." +
    "...11....11..." +
    "..1........1.." +
    ".1..........1." +
    ".1....11....1." +
    "1....1..1....1" +
    "1...1....1...1" +
    "1...1....1...1" +
    "1....1..1....1" +
    ".1....11....1." +
    ".1..........1." +
    "..1........1.." +
    "...11....11..." +
    ".....1111.....");
  public static ImageIcon LNF_CD_ICON;
  public static ImageIcon LNF_CD_DISABLED_ICON;

  public static final String LNF_BREAK_PATTERN = (
    "11111111111111111111" +
    "1..................1" +
    "1....11......11....1" +
    "1....111....111....1" +
    "1.....111..111.....1" +
    "1......111111......1" +
    "1.......1111.......1" +
    "1.......1111.......1" +
    "1......111111......1" +
    "1.....111..111.....1" +
    "1....111....111....1" +
    "1....11......11....1" +
    "1..................1" +
    "11111111111111111111"
    );
  public static Image LNF_BREAK_IMAGE;
  public static Image LNF_BREAK_DISABLED_IMAGE;

  public static final String LNF_TRACE_PATTERN = (
    "11111111111111111111" +
    "1..................1" +
    "1..................1" +
    "1....11111.........1" +
    "1....11111.........1" +
    "1.......11.........1" +
    "1.......11...1.....1" +
    "1.......11...11....1" +
    "1.......11111111...1" +
    "1.......11111111...1" +
    "1............11....1" +
    "1............1.....1" +
    "1..................1" +
    "11111111111111111111"
    );
  public static Image LNF_TRACE_IMAGE;
  public static Image LNF_TRACE_DISABLED_IMAGE;

  public static final String LNF_TRACE_10_PATTERN = (
    "11111111111111111111" +
    "1..................1" +
    "1..................1" +
    "1.........1.11111..1" +
    "1.........1.1...1..1" +
    "1..111....1.1...1..1" +
    "1....1....1.1...1..1" +
    "1....1.1..1.1...1..1" +
    "1....1111.1.1...1..1" +
    "1......1..1.1...1..1" +
    "1.........1.11111..1" +
    "1..................1" +
    "1..................1" +
    "11111111111111111111"
    );
  public static Image LNF_TRACE_10_IMAGE;
  public static Image LNF_TRACE_10_DISABLED_IMAGE;

  public static final String LNF_TRACE_100_PATTERN = (
    "11111111111111111111" +
    "1..................1" +
    "1..................1" +
    "1........1.111.111.1" +
    "1........1.1.1.1.1.1" +
    "1.111....1.1.1.1.1.1" +
    "1...1....1.1.1.1.1.1" +
    "1...1.1..1.1.1.1.1.1" +
    "1...1111.1.1.1.1.1.1" +
    "1.....1..1.1.1.1.1.1" +
    "1........1.111.111.1" +
    "1..................1" +
    "1..................1" +
    "11111111111111111111"
    );
  public static Image LNF_TRACE_100_IMAGE;
  public static Image LNF_TRACE_100_DISABLED_IMAGE;

  public static final String LNF_STEP_PATTERN = (
    "11111111111111111111" +
    "1..................1" +
    "1..................1" +
    "1.....111111.......1" +
    "1.....111111.......1" +
    "1.....11..11.......1" +
    "1.....11..11..1....1" +
    "1.....11..11..11...1" +
    "1...1111..1111111..1" +
    "1...1111..1111111..1" +
    "1.............11...1" +
    "1.............1....1" +
    "1..................1" +
    "11111111111111111111"
    );
  public static Image LNF_STEP_IMAGE;
  public static Image LNF_STEP_DISABLED_IMAGE;

  public static final String LNF_STEP_10_PATTERN = (
    "11111111111111111111" +
    "1..................1" +
    "1..................1" +
    "1.........1.11111..1" +
    "1.........1.1...1..1" +
    "1..111....1.1...1..1" +
    "1..1.1....1.1...1..1" +
    "1..1.1.1..1.1...1..1" +
    "1..1.1111.1.1...1..1" +
    "1......1..1.1...1..1" +
    "1.........1.11111..1" +
    "1..................1" +
    "1..................1" +
    "11111111111111111111"
    );
  public static Image LNF_STEP_10_IMAGE;
  public static Image LNF_STEP_10_DISABLED_IMAGE;

  public static final String LNF_STEP_100_PATTERN = (
    "11111111111111111111" +
    "1..................1" +
    "1..................1" +
    "1........1.111.111.1" +
    "1........1.1.1.1.1.1" +
    "1.111....1.1.1.1.1.1" +
    "1.1.1....1.1.1.1.1.1" +
    "1.1.1.1..1.1.1.1.1.1" +
    "1.1.1111.1.1.1.1.1.1" +
    "1.....1..1.1.1.1.1.1" +
    "1........1.111.111.1" +
    "1..................1" +
    "1..................1" +
    "11111111111111111111"
    );
  public static Image LNF_STEP_100_IMAGE;
  public static Image LNF_STEP_100_DISABLED_IMAGE;

  public static final String LNF_STEP_UNTIL_RETURN_PATTERN = (
    "11111111111111111111" +
    "1..................1" +
    "1........1.........1" +
    "1.......11.........1" +
    "1......11111111....1" +
    "1......11111111....1" +
    "1.......11...11....1" +
    "1........1...11....1" +
    "1............11....1" +
    "1....1111111111....1" +
    "1....1111111111....1" +
    "1..................1" +
    "1..................1" +
    "11111111111111111111"
    );
  public static Image LNF_STEP_UNTIL_RETURN_IMAGE;
  public static Image LNF_STEP_UNTIL_RETURN_DISABLED_IMAGE;

  public static final String LNF_RUN_PATTERN = (
    "11111111111111111111" +
    "1..................1" +
    "1........11........1" +
    "1........111.......1" +
    "1.........111......1" +
    "1..........111.....1" +
    "1....1111111111....1" +
    "1....1111111111....1" +
    "1..........111.....1" +
    "1.........111......1" +
    "1........111.......1" +
    "1........11........1" +
    "1..................1" +
    "11111111111111111111"
    );
  public static Image LNF_RUN_IMAGE;
  public static Image LNF_RUN_DISABLED_IMAGE;

  public static final String LNF_CLEAR_PATTERN = (
    "11111111111111111111" +
    "1..................1" +
    "1....1111111111....1" +
    "1....1........1....1" +
    "1....1.11.....1....1" +
    "1....11..1....1....1" +
    "1....1.11.1..1.....1" +
    "1.....1..1.11.1....1" +
    "1....1....1..11....1" +
    "1....1.....11.1....1" +
    "1....1........1....1" +
    "1....1111111111....1" +
    "1..................1" +
    "11111111111111111111"
    );
  public static Image LNF_CLEAR_IMAGE;
  public static Image LNF_CLEAR_DISABLED_IMAGE;

  public static final String LNF_OLDEST_PATTERN = (
    "11111111111111111111" +
    "1..................1" +
    "1.1111....11....11.1" +
    "1.1..1...1.1...1.1.1" +
    "1.1..1..1..1..1..1.1" +
    "1.1..1.1...1.1...1.1" +
    "1.1..11....11....1.1" +
    "1.1..11....11....1.1" +
    "1.1..1.1...1.1...1.1" +
    "1.1..1..1..1..1..1.1" +
    "1.1..1...1.1...1.1.1" +
    "1.1111....11....11.1" +
    "1..................1" +
    "11111111111111111111"
    );
  public static Image LNF_OLDEST_IMAGE;
  public static Image LNF_OLDEST_DISABLED_IMAGE;

  public static final String LNF_OLDER_PATTERN = (
    "11111111111111111111" +
    "1..................1" +
    "1.......11....11...1" +
    "1......1.1...1.1...1" +
    "1.....1..1..1..1...1" +
    "1....1...1.1...1...1" +
    "1...1....11....1...1" +
    "1...1....11....1...1" +
    "1....1...1.1...1...1" +
    "1.....1..1..1..1...1" +
    "1......1.1...1.1...1" +
    "1.......11....11...1" +
    "1..................1" +
    "11111111111111111111"
    );
  public static Image LNF_OLDER_IMAGE;
  public static Image LNF_OLDER_DISABLED_IMAGE;

  public static final String LNF_PREVIOUS_PATTERN = (
    "11111111111111111111" +
    "1..................1" +
    "1..........11......1" +
    "1.........1.1......1" +
    "1........1..1......1" +
    "1.......1...1......1" +
    "1......1....1......1" +
    "1......1....1......1" +
    "1.......1...1......1" +
    "1........1..1......1" +
    "1.........1.1......1" +
    "1..........11......1" +
    "1..................1" +
    "11111111111111111111"
    );
  public static Image LNF_PREVIOUS_IMAGE;
  public static Image LNF_PREVIOUS_DISABLED_IMAGE;

  public static final String LNF_NEXT_PATTERN = (
    "11111111111111111111" +
    "1..................1" +
    "1......11..........1" +
    "1......1.1.........1" +
    "1......1..1........1" +
    "1......1...1.......1" +
    "1......1....1......1" +
    "1......1....1......1" +
    "1......1...1.......1" +
    "1......1..1........1" +
    "1......1.1.........1" +
    "1......11..........1" +
    "1..................1" +
    "11111111111111111111"
    );
  public static Image LNF_NEXT_IMAGE;
  public static Image LNF_NEXT_DISABLED_IMAGE;

  public static final String LNF_NEWER_PATTERN = (
    "11111111111111111111" +
    "1..................1" +
    "1...11....11.......1" +
    "1...1.1...1.1......1" +
    "1...1..1..1..1.....1" +
    "1...1...1.1...1....1" +
    "1...1....11....1...1" +
    "1...1....11....1...1" +
    "1...1...1.1...1....1" +
    "1...1..1..1..1.....1" +
    "1...1.1...1.1......1" +
    "1...11....11.......1" +
    "1..................1" +
    "11111111111111111111"
    );
  public static Image LNF_NEWER_IMAGE;
  public static Image LNF_NEWER_DISABLED_IMAGE;

  public static final String LNF_NEWEST_PATTERN = (
    "11111111111111111111" +
    "1..................1" +
    "1.11....11....1111.1" +
    "1.1.1...1.1...1..1.1" +
    "1.1..1..1..1..1..1.1" +
    "1.1...1.1...1.1..1.1" +
    "1.1....11....11..1.1" +
    "1.1....11....11..1.1" +
    "1.1...1.1...1.1..1.1" +
    "1.1..1..1..1..1..1.1" +
    "1.1.1...1.1...1..1.1" +
    "1.11....11....1111.1" +
    "1..................1" +
    "11111111111111111111"
    );
  public static Image LNF_NEWEST_IMAGE;
  public static Image LNF_NEWEST_DISABLED_IMAGE;

  public static final String LNF_ORI_BYTE_ZERO_D0_PATTERN = (
    "22222222222222222222" +
    "2..................2" +
    "2..................2" +
    "2...1111....1111...2" +
    "2..1....1..1....1..2" +
    "2..1...11..1...11..2" +
    "2..1..1.1..1..1.1..2" +
    "2..1.1..1..1.1..1..2" +
    "2..11...1..11...1..2" +
    "2..1....1..1....1..2" +
    "2...1111....1111...2" +
    "2..................2" +
    "2..................2" +
    "22222222222222222222"
    );
  public static Image LNF_ORI_BYTE_ZERO_D0_IMAGE;
  public static Image LNF_ORI_BYTE_ZERO_D0_SELECTED_IMAGE;

  public static final String LNF_STOP_ON_ERROR_PATTERN = (
    "22222222222222222222" +
    "2..................2" +
    "2........11........2" +
    "2........11........2" +
    "2........11........2" +
    "2........11........2" +
    "2........11........2" +
    "2........11........2" +
    "2..................2" +
    "2..................2" +
    "2........11........2" +
    "2........11........2" +
    "2..................2" +
    "22222222222222222222"
    );
  public static Image LNF_STOP_ON_ERROR_IMAGE;
  public static Image LNF_STOP_ON_ERROR_SELECTED_IMAGE;

  public static final String LNF_STOP_AT_START_PATTERN = (
    "22222222222222222222" +
    "2..................2" +
    "2..................2" +
    "2..............1...2" +
    "2.............11...2" +
    "2...1111.....1.1...2" +
    "2.......1...1..1...2" +
    "2...11111..1...1...2" +
    "2..1....1.1111111..2" +
    "2..1...11......1...2" +
    "2...111.11.....1...2" +
    "2..................2" +
    "2..................2" +
    "22222222222222222222"
    );
  public static Image LNF_STOP_AT_START_IMAGE;
  public static Image LNF_STOP_AT_START_SELECTED_IMAGE;

  public static final String LNF_RELOAD_PATTERN = (
    "11111111111111111111" +
    "1..................1" +
    "1.......1111.......1" +
    "1......111111.1....1" +
    "1.....11....111....1" +
    "1....11.....111....1" +
    "1....11....1111....1" +
    "1....11............1" +
    "1....11............1" +
    "1.....11....11.....1" +
    "1......111111......1" +
    "1.......1111.......1" +
    "1..................1" +
    "11111111111111111111"
    );
  public static Image LNF_RELOAD_IMAGE;

  public static final String LNF_BACK_TRACE_PATTERN = (
    "22222222222222222222" +
    "2..................2" +
    "2.......1..........2" +
    "2......1.1.........2" +
    "2.....1...1........2" +
    "2....111.111.......2" +
    "2......1.1.........2" +
    "2......1.111111....2" +
    "2......1......1....2" +
    "2......111111.1....2" +
    "2...........1.1....2" +
    "2...........111....2" +
    "2..................2" +
    "22222222222222222222"
    );
  public static Image LNF_BACK_TRACE_IMAGE;
  public static Image LNF_BACK_TRACE_SELECTED_IMAGE;

  public static final String LNF_USER_PATTERN = (
    "22222222222222222222" +
    "2..................2" +
    "2..................2" +
    "2.....11....11.....2" +
    "2.....11....11.....2" +
    "2.....11....11.....2" +
    "2.....11....11.....2" +
    "2.....11....11.....2" +
    "2.....11....11.....2" +
    "2.....11111111.....2" +
    "2.....11111111.....2" +
    "2..................2" +
    "2..................2" +
    "22222222222222222222"
    );
  public static Image LNF_USER_IMAGE;
  public static Image LNF_USER_SELECTED_IMAGE;

  public static final String LNF_SUPERVISOR_PATTERN = (
    "22222222222222222222" +
    "2..................2" +
    "2..................2" +
    "2.....11111111.....2" +
    "2.....11111111.....2" +
    "2.....11...........2" +
    "2.....11111111.....2" +
    "2.....11111111.....2" +
    "2...........11.....2" +
    "2.....11111111.....2" +
    "2.....11111111.....2" +
    "2..................2" +
    "2..................2" +
    "22222222222222222222"
    );
  public static Image LNF_SUPERVISOR_IMAGE;
  public static Image LNF_SUPERVISOR_SELECTED_IMAGE;

  public static final String LNF_NORMAL_PATTERN = (
    "22222222222222222222" +
    "2..................2" +
    "2..................2" +
    "2.....11....11.....2" +
    "2.....111...11.....2" +
    "2.....1111..11.....2" +
    "2.....11111.11.....2" +
    "2.....11.11111.....2" +
    "2.....11..1111.....2" +
    "2.....11...111.....2" +
    "2.....11....11.....2" +
    "2..................2" +
    "2..................2" +
    "22222222222222222222"
    );
  public static Image LNF_NORMAL_IMAGE;
  public static Image LNF_NORMAL_SELECTED_IMAGE;

  public static final String LNF_INTERRUPT_PATTERN = (
    "22222222222222222222" +
    "2..................2" +
    "2..................2" +
    "2......111111......2" +
    "2......111111......2" +
    "2........11........2" +
    "2........11........2" +
    "2........11........2" +
    "2........11........2" +
    "2......111111......2" +
    "2......111111......2" +
    "2..................2" +
    "2..................2" +
    "22222222222222222222"
    );
  public static Image LNF_INTERRUPT_IMAGE;
  public static Image LNF_INTERRUPT_SELECTED_IMAGE;

  public static final String LNF_REGS_PATTERN = (
    "22222222222222222222" +
    "2..................2" +
    "2..................2" +
    "2......111111......2" +
    "2......111111......2" +
    "2......11..11......2" +
    "2......111111......2" +
    "2......111111......2" +
    "2......1111........2" +
    "2......11.11.......2" +
    "2......11..11......2" +
    "2..................2" +
    "2..................2" +
    "22222222222222222222"
    );
  public static Image LNF_REGS_IMAGE;
  public static Image LNF_REGS_SELECTED_IMAGE;

  public static final String LNF_ADDRESS_PATTERN = (
    "22222222222222222222" +
    "2..................2" +
    "2........22........2" +
    "2......222222......2" +
    "2.....22222222.....2" +
    "2.....22.22........2" +
    "2.....2222222......2" +
    "2......2222222.....2" +
    "2........22.22.....2" +
    "2.....22222222.....2" +
    "2......222222......2" +
    "2........22........2" +
    "2..................2" +
    "22222222222222222222"
    );
  public static Image LNF_ADDRESS_IMAGE;

  public static final String LNF_OFFSET_PATTERN = (
    "22222222222222222222" +
    "2..................2" +
    "2......22..........2" +
    "2......22..........2" +
    "2......22..........2" +
    "2......22..........2" +
    "2......22..........2" +
    "2......22..........2" +
    "2......22..........2" +
    "2......22..........2" +
    "2......2222222.....2" +
    "2......2222222.....2" +
    "2..................2" +
    "22222222222222222222"
    );
  public static Image LNF_OFFSET_IMAGE;

  public static final String LNF_BOTH_PATTERN = (
    "22222222222222222222" +
    "2..................2" +
    "2....22....22......2" +
    "2..222222..22......2" +
    "2.22222222.22......2" +
    "2.22.22....22......2" +
    "2.2222222..22......2" +
    "2..2222222.22......2" +
    "2....22.22.22......2" +
    "2.22222222.22......2" +
    "2..222222..2222222.2" +
    "2....22....2222222.2" +
    "2..................2" +
    "22222222222222222222"
    );
  public static Image LNF_BOTH_IMAGE;

  //lnfInit ()
  //  Look&Feelを初期化する
  //  既存のコンポーネントのUIを切り替えると部分的に更新されず汚くなることがあるのでコンポーネントを作る前に行うこと
  //  既存のコンポーネントのUIを切り替える方法
  //    SwingUtilities.updateComponentTreeUI (rootPaneContainer.getRootPane ());
  public static void lnfInit () {

    if (false) {
      //利用可能なすべてのLook&Feelを表示する
      //  UIManager.setLookAndFeel(info.getClassName())とするとLook&Feelが変更される
      //  Metal以外はJavaのバージョンによって位置が異なる場合があるらしい
      System.out.println ("\n[UIManager.getInstalledLookAndFeels()]");
      for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels ()) {
        System.out.println ("        //  " + info.getName () + " = " + info.getClassName ());
        //  Metal = javax.swing.plaf.metal.MetalLookAndFeel
        //  Nimbus = javax.swing.plaf.nimbus.NimbusLookAndFeel
        //  CDE/Motif = com.sun.java.swing.plaf.motif.MotifLookAndFeel
        //  Windows = com.sun.java.swing.plaf.windows.WindowsLookAndFeel
        //  Windows Classic = com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel
      }
    }

    if (false) {
      //UIDefaultsをダンプする
      System.out.println ("\n[UIManager.getDefaults()]");
      TreeMap<String,String> m = new TreeMap<String,String> ();
      //UIManager.getDefaults ().forEach ((k, v) -> m.put (k.toString (), v.toString ()));  //UIManager.getDefaults()はHashtable<Object,Object>
      //なぜかUIManager.getDefaults().forEach(BiConsumer)がBiConsumerを1回も呼び出さずに終了してしまう
      for (Map.Entry<Object,Object> e : UIManager.getDefaults ().entrySet ()) {
        m.put (e.getKey ().toString (), e.getValue ().toString ());
      }
      m.forEach ((k, v) -> System.out.println (k + " = " + v));
    }

    //色
    //  以下の順序で明るさを変化させると綺麗に見える
    //  secondary3  アクティブでないウインドウのタイトルバーとメニューバーとコンテンツの背景
    //    control                        コントロール・カラー
    //    menuBackground                 メニューのバックグラウンド・カラー
    //    windowTitleInactiveBackground  アクティブでないウィンドウ・タイトルのバックグラウンド・カラー
    //  white       ウインドウのタイトルバーのドットとクローズボタンなどの溝とメニューのボーダーの明るい部分
    //    controlHighlight               コントロール・ハイライト・カラー
    //    primaryControlHighlight        一次コントロール・ハイライト・カラー
    //    separatorBackground            セパレータのバックグラウンド・カラー
    //    white                          白
    //    windowBackground               ウィンドウのバックグラウンド・カラー
    //  primary3    アクティブなウインドウのタイトルバーの背景
    //    primaryControl                 一次コントロール・カラー
    //    textHighlightColor             テキスト・ハイライト・カラー
    //    windowTitleBackground          ウィンドウ・タイトルのバックグラウンド・カラー
    //  primary2    アクティブなウインドウの枠の溝の明るい部分とメニューバーの上のボーダーと選択されているメニューの背景
    //    desktopColor                   デスクトップ・カラー
    //    focusColor                     フォーカス・カラー
    //    menuSelectedBackground         選択されたメニューのバックグラウンド・カラー
    //    primaryControlShadow           一次コントロール・シャドウ・カラー
    //  secondary2  アクティブでないウインドウの枠の溝の明るい部分とメニューバーの上のボーダーとメニューバーの下のボーダー
    //    controlDisabled                無効なコントロールのコントロール・カラー
    //    controlShadow                  コントロール・シャドウ・カラー
    //    inactiveControlTextColor       アクティブでないコントロール・テキスト・カラー
    //    inactiveSystemTextColor        アクティブでないシステム・テキスト・カラー
    //    menuDisabledForeground         無効なメニューのフォアグラウンド・カラー
    //  primary1    アクティブなウインドウの枠とクローズボタンなどの溝の底
    //    acceleratorForeground          アクセラレータのフォアグラウンド・カラー
    //    primaryControlDarkShadow       一次コントロール・ダーク・シャドウ・カラー
    //    separatorForeground            セパレータのフォアグラウンド・カラー
    //  secondary1  アクティブでないウインドウの枠とクローズボタンなどの溝の底とタイトルバーのドットの暗い部分
    //    controlDarkShadow              コントロール・ダーク・シャドウ・カラー
    //  black       ウインドウの枠とクローズボタンなどの溝の暗い部分とタイトルバーの文字とメニューの文字
    //    acceleratorSelectedForeground  選択されたアクセラレータのフォアグラウンド・カラー
    //    black                          黒
    //    controlInfo                    制御情報カラー
    //    controlTextColor               コントロール・テキスト・カラー
    //    highlightedTextColor           ハイライト・テキストのテキスト・カラー
    //    menuForeground                 メニューのフォアグラウンド・カラー
    //    menuSelectedForeground         選択されたメニューのフォアグラウンド・カラー
    //    primaryControlInfo             一次制御情報カラー
    //    systemTextColor                システム・テキスト・カラー
    //    userTextColor                  ユーザー・テキスト・カラー
    //    windowTitleForeground          ウィンドウ・タイトルのフォアグラウンド・カラー
    //    windowTitleInactiveForeground  アクティブでないウィンドウ・タイトルのフォアグラウンド・カラー
    {
      int[] a = Settings.sgsGetIntArray ("hhssbb", -1, -1);
      boolean ok = a.length == 6;
      for (int i = 0; ok && i < 6; i++) {
        ok = 0 <= a[i] && a[i] <= (i < 2 ? 2000 : 1000);
      }
      if (ok) {
        for (int i = 0; i < 3; i++) {
          lnfHSB[3 * i    ] = (a[2 * i    ] * (i == 0 ? 360 : 100) + 500) / 1000;
          lnfHSB[3 * i + 2] = (a[2 * i + 1] * (i == 0 ? 360 : 100) + 500) / 1000;
          lnfHSB[3 * i + 1] = (lnfHSB[3 * i    ] +
                               lnfHSB[3 * i + 2]) / 2;
        }
      } else {
        a = Settings.sgsGetIntArray ("hsb", -1, -1);
        ok = a.length == 9;
        for (int i = 0; ok && i < 9; i++) {
          ok = 0 <= a[i] && a[i] <= (i < 3 ? 720 : 100);
        }
        System.arraycopy (ok ? a : LNF_DEFAULT_HSB, 0, lnfHSB, 0, 9);
      }
    }
    for (int i = 0; i <= 14; i++) {
      int[] t = LNF_HSB_INTERPOLATION_TABLE[i];
      float h = (float) (t[0] * lnfHSB[0] + t[1] * lnfHSB[1] + t[2] * lnfHSB[2]) / (49.0F * 360.0F);
      float s = (float) (t[0] * lnfHSB[3] + t[1] * lnfHSB[4] + t[2] * lnfHSB[5]) / (49.0F * 100.0F);
      float b = (float) (t[0] * lnfHSB[6] + t[1] * lnfHSB[7] + t[2] * lnfHSB[8]) / (49.0F * 100.0F);
      lnfRGB[i] = Color.HSBtoRGB (h,
                                  Math.max (0.0F, Math.min (1.0F, s)),
                                  Math.max (0.0F, Math.min (1.0F, b)));
    }
    lnfSecondary3 = new ColorUIResource (lnfRGB[0]);
    lnfWhite      = new ColorUIResource (lnfRGB[2]);
    lnfPrimary3   = new ColorUIResource (lnfRGB[4]);
    lnfPrimary2   = new ColorUIResource (lnfRGB[6]);
    lnfSecondary2 = new ColorUIResource (lnfRGB[8]);
    lnfPrimary1   = new ColorUIResource (lnfRGB[10]);
    lnfSecondary1 = new ColorUIResource (lnfRGB[12]);
    lnfBlack      = new ColorUIResource (lnfRGB[14]);

    //フォント
    //  フォントサイズを変更できるようにする
    lnfFontSizeRequest = Math.max (10, Math.min (18, Settings.sgsGetInt ("fontsize", 14))) & -2;  //10,12,14,16,18
    lnfFontSize = lnfFontSizeRequest;
    //  "Monospaced"を"MS ゴシック"にする
    //  /lib/fontconfig.properties.src
    //  の
    //  monospaced.plain.japanese=MS Gothic
    //  は変わっていないが"MS Gothic"が通らなくなったらしい
    //  "MS ゴシック"は通る
    //  スマートな修正方法が思いつかなかったので面倒だが全部書き換える
    lnfAvailableFontFamilyNames = GraphicsEnvironment.getLocalGraphicsEnvironment ().getAvailableFontFamilyNames ();
    lnfMonospacedFamily = (Arrays.asList (lnfAvailableFontFamilyNames).contains ("MS ゴシック") ? "MS ゴシック" :
                           "Monospaced");
    lnfMonospacedFont = new Font (lnfMonospacedFamily, Font.PLAIN, lnfFontSize);
    lnfMonospacedFont12 = new Font (lnfMonospacedFamily, Font.PLAIN, 12);
    //  日本語はボールドにすると読みにくいのでプレーンにする
    //  ControlTextFont=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12]
    //  MenuTextFont=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12]
    //  SubTextFont=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=plain,size=10]
    //  SystemTextFont=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=plain,size=12]
    //  UserTextFont=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=plain,size=12]
    //  WindowTitleFont=javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12]
    lnfControlTextFontUIResource = new FontUIResource ("Dialog", Font.PLAIN, lnfFontSize);
    lnfMenuTextFontUIResource = new FontUIResource ("Dialog", Font.PLAIN, lnfFontSize);
    lnfSubTextFontUIResource = new FontUIResource ("Dialog", Font.PLAIN, lnfFontSize * 5 / 6);
    lnfSystemTextFontUIResource = new FontUIResource ("Dialog", Font.PLAIN, lnfFontSize);
    lnfUserTextFontUIResource = new FontUIResource ("Dialog", Font.PLAIN, lnfFontSize);
    lnfWindowTitleFontUIResource = new FontUIResource ("Dialog", Font.PLAIN, lnfFontSize);

    //Look&Feel
    JFrame.setDefaultLookAndFeelDecorated (true);
    JDialog.setDefaultLookAndFeelDecorated (true);
    MetalLookAndFeel.setCurrentTheme (new XEiJTheme ());
    try {
      UIManager.setLookAndFeel (new MetalLookAndFeel ());
    } catch (UnsupportedLookAndFeelException ulafe) {
    }

    //アイコン
    for (int i = 0; i < LNF_NUMBER_PATTERN_ARRAY.length; i++) {
      LNF_NUMBER_IMAGE_ARRAY[i] = XEiJ.createImage (14, 14, LNF_NUMBER_PATTERN_ARRAY[i], lnfRGB[0], lnfRGB[12], lnfRGB[0]);
      LNF_NUMBER_SELECTED_IMAGE_ARRAY[i] = XEiJ.createImage (14, 14, LNF_NUMBER_PATTERN_ARRAY[i], lnfRGB[0], lnfRGB[12], lnfRGB[12]);
    }

    LNF_EJECT_IMAGE = XEiJ.createImage (14, 14, LNF_EJECT_PATTERN, lnfRGB[0], lnfRGB[12]);
    LNF_EJECT_DISABLED_IMAGE = XEiJ.createImage (14, 14, LNF_EJECT_PATTERN, lnfRGB[0], lnfRGB[6]);

    LNF_OPEN_IMAGE = XEiJ.createImage (14, 14, LNF_OPEN_PATTERN, lnfRGB[0], lnfRGB[12]);
    LNF_OPEN_DISABLED_IMAGE = XEiJ.createImage (14, 14, LNF_OPEN_PATTERN, lnfRGB[0], lnfRGB[6]);

    LNF_PROTECT_IMAGE = XEiJ.createImage (14, 14, LNF_PROTECT_PATTERN, lnfRGB[0], lnfRGB[12]);
    LNF_PROTECT_DISABLED_IMAGE = XEiJ.createImage (14, 14, LNF_PROTECT_PATTERN, lnfRGB[0], lnfRGB[6]);
    LNF_PROTECT_SELECTED_IMAGE = XEiJ.createImage (14, 14, LNF_PROTECT_SELECTED_PATTERN, lnfRGB[0], lnfRGB[12]);
    LNF_PROTECT_DISABLED_SELECTED_IMAGE = XEiJ.createImage (14, 14, LNF_PROTECT_SELECTED_PATTERN, lnfRGB[0], lnfRGB[6]);

    LNF_HD_ICON = new ImageIcon (XEiJ.createImage (14, 14, LNF_HD_PATTERN, lnfRGB[0], lnfRGB[12]));
    LNF_HD_DISABLED_ICON = new ImageIcon (XEiJ.createImage (14, 14, LNF_HD_PATTERN, lnfRGB[0], lnfRGB[6]));

    LNF_MO_ICON = new ImageIcon (XEiJ.createImage (14, 14, LNF_MO_PATTERN, lnfRGB[0], lnfRGB[12]));
    LNF_MO_DISABLED_ICON = new ImageIcon (XEiJ.createImage (14, 14, LNF_MO_PATTERN, lnfRGB[0], lnfRGB[6]));

    LNF_CD_ICON = new ImageIcon (XEiJ.createImage (14, 14, LNF_CD_PATTERN, lnfRGB[0], lnfRGB[12]));
    LNF_CD_DISABLED_ICON = new ImageIcon (XEiJ.createImage (14, 14, LNF_CD_PATTERN, lnfRGB[0], lnfRGB[6]));

    LNF_BREAK_IMAGE = XEiJ.createImage (20, 14, LNF_BREAK_PATTERN, lnfRGB[0], lnfRGB[12]);
    LNF_BREAK_DISABLED_IMAGE= XEiJ.createImage (20, 14, LNF_BREAK_PATTERN, lnfRGB[0], lnfRGB[6]);

    LNF_TRACE_IMAGE = XEiJ.createImage (20, 14, LNF_TRACE_PATTERN, lnfRGB[0], lnfRGB[12]);
    LNF_TRACE_DISABLED_IMAGE= XEiJ.createImage (20, 14, LNF_TRACE_PATTERN, lnfRGB[0], lnfRGB[6]);

    LNF_TRACE_10_IMAGE = XEiJ.createImage (20, 14, LNF_TRACE_10_PATTERN, lnfRGB[0], lnfRGB[12]);
    LNF_TRACE_10_DISABLED_IMAGE= XEiJ.createImage (20, 14, LNF_TRACE_10_PATTERN, lnfRGB[0], lnfRGB[6]);

    LNF_TRACE_100_IMAGE = XEiJ.createImage (20, 14, LNF_TRACE_100_PATTERN, lnfRGB[0], lnfRGB[12]);
    LNF_TRACE_100_DISABLED_IMAGE= XEiJ.createImage (20, 14, LNF_TRACE_100_PATTERN, lnfRGB[0], lnfRGB[6]);

    LNF_STEP_IMAGE = XEiJ.createImage (20, 14, LNF_STEP_PATTERN, lnfRGB[0], lnfRGB[12]);
    LNF_STEP_DISABLED_IMAGE= XEiJ.createImage (20, 14, LNF_STEP_PATTERN, lnfRGB[0], lnfRGB[6]);

    LNF_STEP_10_IMAGE = XEiJ.createImage (20, 14, LNF_STEP_10_PATTERN, lnfRGB[0], lnfRGB[12]);
    LNF_STEP_10_DISABLED_IMAGE= XEiJ.createImage (20, 14, LNF_STEP_10_PATTERN, lnfRGB[0], lnfRGB[6]);

    LNF_STEP_100_IMAGE = XEiJ.createImage (20, 14, LNF_STEP_100_PATTERN, lnfRGB[0], lnfRGB[12]);
    LNF_STEP_100_DISABLED_IMAGE= XEiJ.createImage (20, 14, LNF_STEP_100_PATTERN, lnfRGB[0], lnfRGB[6]);

    LNF_STEP_UNTIL_RETURN_IMAGE = XEiJ.createImage (20, 14, LNF_STEP_UNTIL_RETURN_PATTERN, lnfRGB[0], lnfRGB[12]);
    LNF_STEP_UNTIL_RETURN_DISABLED_IMAGE= XEiJ.createImage (20, 14, LNF_STEP_UNTIL_RETURN_PATTERN, lnfRGB[0], lnfRGB[6]);

    LNF_RUN_IMAGE = XEiJ.createImage (20, 14, LNF_RUN_PATTERN, lnfRGB[0], lnfRGB[12]);
    LNF_RUN_DISABLED_IMAGE= XEiJ.createImage (20, 14, LNF_RUN_PATTERN, lnfRGB[0], lnfRGB[6]);

    LNF_CLEAR_IMAGE = XEiJ.createImage (20, 14, LNF_CLEAR_PATTERN, lnfRGB[0], lnfRGB[12]);
    LNF_CLEAR_DISABLED_IMAGE= XEiJ.createImage (20, 14, LNF_CLEAR_PATTERN, lnfRGB[0], lnfRGB[6]);

    LNF_OLDEST_IMAGE = XEiJ.createImage (20, 14, LNF_OLDEST_PATTERN, lnfRGB[0], lnfRGB[12]);
    LNF_OLDEST_DISABLED_IMAGE= XEiJ.createImage (20, 14, LNF_OLDEST_PATTERN, lnfRGB[0], lnfRGB[6]);

    LNF_OLDER_IMAGE = XEiJ.createImage (20, 14, LNF_OLDER_PATTERN, lnfRGB[0], lnfRGB[12]);
    LNF_OLDER_DISABLED_IMAGE= XEiJ.createImage (20, 14, LNF_OLDER_PATTERN, lnfRGB[0], lnfRGB[6]);

    LNF_PREVIOUS_IMAGE = XEiJ.createImage (20, 14, LNF_PREVIOUS_PATTERN, lnfRGB[0], lnfRGB[12]);
    LNF_PREVIOUS_DISABLED_IMAGE= XEiJ.createImage (20, 14, LNF_PREVIOUS_PATTERN, lnfRGB[0], lnfRGB[6]);

    LNF_NEXT_IMAGE = XEiJ.createImage (20, 14, LNF_NEXT_PATTERN, lnfRGB[0], lnfRGB[12]);
    LNF_NEXT_DISABLED_IMAGE= XEiJ.createImage (20, 14, LNF_NEXT_PATTERN, lnfRGB[0], lnfRGB[6]);

    LNF_NEWER_IMAGE = XEiJ.createImage (20, 14, LNF_NEWER_PATTERN, lnfRGB[0], lnfRGB[12]);
    LNF_NEWER_DISABLED_IMAGE= XEiJ.createImage (20, 14, LNF_NEWER_PATTERN, lnfRGB[0], lnfRGB[6]);

    LNF_NEWEST_IMAGE = XEiJ.createImage (20, 14, LNF_NEWEST_PATTERN, lnfRGB[0], lnfRGB[12]);
    LNF_NEWEST_DISABLED_IMAGE= XEiJ.createImage (20, 14, LNF_NEWEST_PATTERN, lnfRGB[0], lnfRGB[6]);

    LNF_ORI_BYTE_ZERO_D0_IMAGE = XEiJ.createImage (20, 14, LNF_ORI_BYTE_ZERO_D0_PATTERN, lnfRGB[0], lnfRGB[6], lnfRGB[12]);
    LNF_ORI_BYTE_ZERO_D0_SELECTED_IMAGE= XEiJ.createImage (20, 14, LNF_ORI_BYTE_ZERO_D0_PATTERN, lnfRGB[0], lnfRGB[12], lnfRGB[12]);

    LNF_STOP_ON_ERROR_IMAGE = XEiJ.createImage (20, 14, LNF_STOP_ON_ERROR_PATTERN, lnfRGB[0], lnfRGB[6], lnfRGB[12]);
    LNF_STOP_ON_ERROR_SELECTED_IMAGE= XEiJ.createImage (20, 14, LNF_STOP_ON_ERROR_PATTERN, lnfRGB[0], lnfRGB[12], lnfRGB[12]);

    LNF_STOP_AT_START_IMAGE = XEiJ.createImage (20, 14, LNF_STOP_AT_START_PATTERN, lnfRGB[0], lnfRGB[6], lnfRGB[12]);
    LNF_STOP_AT_START_SELECTED_IMAGE= XEiJ.createImage (20, 14, LNF_STOP_AT_START_PATTERN, lnfRGB[0], lnfRGB[12], lnfRGB[12]);

    LNF_RELOAD_IMAGE = XEiJ.createImage (20, 14, LNF_RELOAD_PATTERN, lnfRGB[0], lnfRGB[12]);

    LNF_BACK_TRACE_IMAGE = XEiJ.createImage (20, 14, LNF_BACK_TRACE_PATTERN, lnfRGB[0], lnfRGB[6], lnfRGB[12]);
    LNF_BACK_TRACE_SELECTED_IMAGE = XEiJ.createImage (20, 14, LNF_BACK_TRACE_PATTERN, lnfRGB[0], lnfRGB[12], lnfRGB[12]);

    LNF_USER_IMAGE = XEiJ.createImage (20, 14, LNF_USER_PATTERN, lnfRGB[0], lnfRGB[6], lnfRGB[12]);
    LNF_USER_SELECTED_IMAGE = XEiJ.createImage (20, 14, LNF_USER_PATTERN, lnfRGB[0], lnfRGB[12], lnfRGB[12]);

    LNF_SUPERVISOR_IMAGE = XEiJ.createImage (20, 14, LNF_SUPERVISOR_PATTERN, lnfRGB[0], lnfRGB[6], lnfRGB[12]);
    LNF_SUPERVISOR_SELECTED_IMAGE = XEiJ.createImage (20, 14, LNF_SUPERVISOR_PATTERN, lnfRGB[0], lnfRGB[12], lnfRGB[12]);

    LNF_NORMAL_IMAGE = XEiJ.createImage (20, 14, LNF_NORMAL_PATTERN, lnfRGB[0], lnfRGB[6], lnfRGB[12]);
    LNF_NORMAL_SELECTED_IMAGE = XEiJ.createImage (20, 14, LNF_NORMAL_PATTERN, lnfRGB[0], lnfRGB[12], lnfRGB[12]);

    LNF_INTERRUPT_IMAGE = XEiJ.createImage (20, 14, LNF_INTERRUPT_PATTERN, lnfRGB[0], lnfRGB[6], lnfRGB[12]);
    LNF_INTERRUPT_SELECTED_IMAGE = XEiJ.createImage (20, 14, LNF_INTERRUPT_PATTERN, lnfRGB[0], lnfRGB[12], lnfRGB[12]);

    LNF_REGS_IMAGE = XEiJ.createImage (20, 14, LNF_REGS_PATTERN, lnfRGB[0], lnfRGB[6], lnfRGB[12]);
    LNF_REGS_SELECTED_IMAGE = XEiJ.createImage (20, 14, LNF_REGS_PATTERN, lnfRGB[0], lnfRGB[12], lnfRGB[12]);

    LNF_ADDRESS_IMAGE = XEiJ.createImage (20, 14, LNF_ADDRESS_PATTERN, lnfRGB[0], lnfRGB[6], lnfRGB[12]);
    LNF_OFFSET_IMAGE = XEiJ.createImage (20, 14, LNF_OFFSET_PATTERN, lnfRGB[0], lnfRGB[6], lnfRGB[12]);
    LNF_BOTH_IMAGE = XEiJ.createImage (20, 14, LNF_BOTH_PATTERN, lnfRGB[0], lnfRGB[6], lnfRGB[12]);

  }  //lnfInit()

  //lnfTini ()
  //  後始末
  public static void lnfTini () {
    //色
    Settings.sgsPutIntArray ("hsb", lnfHSB, -1);
    Settings.sgsPutString ("hhssbb", "none");
    //フォントサイズ
    Settings.sgsPutInt ("fontsize", lnfFontSizeRequest);
  }



  //$$XET XEiJのテーマ
  public static class XEiJTheme extends MetalTheme {

    //名前
    @Override public String getName () {
      return "XEiJ";
    }  //getName()

    //色
    //  背景を黒にする
    //  以下の順序で明るさを変化させると綺麗に見える
    //  secondary3
    //    アクティブでないウインドウのタイトルバーの背景
    //    メニューバーの背景
    //    コンテンツの背景
    //  white
    //    ウインドウのタイトルバーのドットの明るい部分(左上)
    //    クローズボタンなどの溝の明るい部分
    //    メニューのボーダーの明るい部分
    //  primary3
    //    アクティブなウインドウのタイトルバーの背景
    //  primary2
    //    アクティブなウインドウの枠の溝の明るい部分
    //    アクティブなウインドウのメニューバーの上のボーダー
    //    選択されているメニューの背景
    //  secondary2
    //    アクティブでないウインドウの枠の溝の明るい部分
    //    アクティブでないウインドウのメニューバーの上のボーダー
    //    メニューバーの下のボーダー
    //  primary1
    //    アクティブなウインドウの枠
    //    アクティブなウインドウのクローズボタンなどの溝の底
    //  secondary1
    //    アクティブでないウインドウの枠
    //    アクティブでないウインドウのクローズボタンなどの溝の底
    //    アクティブでないウインドウのタイトルバーのドットの暗い部分(右下)
    //  black
    //    ウインドウの枠の溝の暗い部分
    //    クローズボタンなどの溝の暗い部分
    //    タイトルバーの文字
    //    メニューの文字
    @Override protected ColorUIResource getSecondary3 () {
      return lnfSecondary3;
    }  //getSecondary3()
    @Override protected ColorUIResource getWhite () {
      return lnfWhite;
    }  //getWhite()
    @Override protected ColorUIResource getPrimary3 () {
      return lnfPrimary3;
    }  //getPrimary3()
    @Override protected ColorUIResource getPrimary2 () {
      return lnfPrimary2;
    }  //getPrimary2()
    @Override protected ColorUIResource getSecondary2 () {
      return lnfSecondary2;
    }  //getSecondary2()
    @Override protected ColorUIResource getPrimary1 () {
      return lnfPrimary1;
    }  //getPrimary1()
    @Override protected ColorUIResource getSecondary1 () {
      return lnfSecondary1;
    }  //getSecondary1()
    @Override protected ColorUIResource getBlack () {
      return lnfBlack;
    }  //getBlack()

    //フォント
    @Override public FontUIResource getControlTextFont () {
      return lnfControlTextFontUIResource;
    }  //getControlTextFont()
    @Override public FontUIResource getMenuTextFont () {
      return lnfMenuTextFontUIResource;
    }  //getMenuTextFont()
    @Override public FontUIResource getSubTextFont () {
      return lnfSubTextFontUIResource;
    }  //getSubTextFont()
    @Override public FontUIResource getSystemTextFont () {
      return lnfSystemTextFontUIResource;
    }  //getSystemTextFont()
    @Override public FontUIResource getUserTextFont () {
      return lnfUserTextFontUIResource;
    }  //getUserTextFont()
    @Override public FontUIResource getWindowTitleFont () {
      return lnfWindowTitleFontUIResource;
    }  //getWindowTitleFont()

    //カスタム
    @Override public void addCustomEntriesToTable (UIDefaults table) {
      super.addCustomEntriesToTable (table);
      table.putDefaults (new Object[] {
        //ボタン
        //  隙間を詰める
        "Button.margin", new InsetsUIResource (1, 7, 1, 7),  //2,14,2,14
        //アイコン
        //  ウインドウのタイトルバーの左端のアイコンはこれだけで変更できる
        //  タスクバーのアイコンはこれだけでは変更できない
        //    おそらく変更する前にコピーされている
        //  メインのウインドウだけwindow.setIconImage(LNF_ICON_IMAGE_16)などと書くことにする
        "InternalFrame.icon", new IconUIResource (new ImageIcon (LNF_ICON_IMAGE_16)),
      });
    }  //addCustomEntriesToTable(UIDefaults)

  }  //class XEiJTheme



}  //class LnF