Advertisement
Guest User

Untitled

a guest
Mar 6th, 2013
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 74.24 KB | None | 0 0
  1. package GogoWood;
  2.  
  3. import java.awt.image.BufferedImage;
  4. import java.awt.Point;
  5. import java.awt.Font;
  6. import java.awt.Graphics;
  7. import java.awt.Color;
  8. import java.awt.Frame;
  9. import java.awt.Dimension;
  10. import java.io.BufferedReader;
  11. import java.io.File;
  12. import java.io.FilenameFilter;
  13. import java.io.FileOutputStream;
  14. import java.io.ObjectOutputStream;
  15. import java.io.FileInputStream;
  16. import java.io.FileReader;
  17. import java.io.IOException;
  18. import java.io.ObjectInputStream;
  19. import javax.swing.BorderFactory;
  20. import javax.swing.JOptionPane;
  21. import javax.swing.DefaultListModel;
  22. import javax.swing.ListModel;
  23. import javax.swing.JTextField;
  24. import javax.swing.ImageIcon;
  25. import java.util.List;
  26. import java.util.ArrayList;
  27. import java.util.Random;
  28. import javax.imageio.ImageIO;
  29. import javax.swing.JFileChooser;
  30. import javax.swing.filechooser.FileNameExtensionFilter;
  31.  
  32. import javax.sound.sampled.AudioSystem;
  33. import javax.sound.sampled.AudioInputStream;
  34. import javax.sound.sampled.Clip;
  35.  
  36. //библиотека проигрывателя трекерной музыки
  37. import static jouvieje.bass.Bass.*;
  38. import jouvieje.bass.BassInit;
  39. import jouvieje.bass.structures.HMUSIC;
  40. import static jouvieje.bass.defines.BASS_MUSIC.BASS_MUSIC_RAMPS;
  41. import static GogoWood.Device.*;
  42. import java.awt.Image;
  43. import java.net.URL;
  44. import jouvieje.bass.structures.HSTREAM;
  45. import java.nio.ByteBuffer;
  46. import jouvieje.bass.structures.HCHANNEL;
  47. import jouvieje.bass.utils.ObjectPointer;
  48. import static jouvieje.bass.defines.BASS_CONFIG.BASS_CONFIG_GVOL_STREAM;
  49. import static jouvieje.bass.defines.BASS_CONFIG.BASS_CONFIG_GVOL_MUSIC;
  50.  
  51. public class MainFrame extends javax.swing.JFrame {
  52.    
  53.     public Setting setting;//объект со всеми настройками игры
  54.    
  55.     private List<Word> currentDictionary = new ArrayList<Word>();//объект с текущим словарем
  56.     private File currentDictionaryFile;//файл текущего словаря
  57.    
  58.     private int currentDictionarySize;//число слов в словаре при открытии
  59.     private int translateCounter = 0;//число переводов в словаре при открытии
  60.     private int rightAnswerCounter = 0;
  61.     private int wrongAnswerCounter = 0;
  62.     private int showRightTranslateCounter = 0;//число нажатий "Показать правильный ответ"
  63.    
  64.     private int currentWordIndex;//индекс текущего слова в коллекции currentDictionary
  65.     private Word currentWord;//текущее слово
  66.     private int currentTranslateIndex;//индекс текущего перевода для текущего слова
  67.     private int currentRightTranslateIndex;//индекс верного ответа в списке с переводами
  68.     private int currentWrongTranslateIndex;//индекс неверного ответа в списке с переводами
  69.    
  70.     private Random randGen = new Random();
  71.     private boolean isStarted = false;//переменная-состояние программы: начато или нет обучение
  72.        
  73.     //состояние обработчиков событий списка с переводами
  74.     private boolean translatesListMouseListener = true;
  75.    
  76.     //блокировка действий в обработчике события EVT_FormComponentResized
  77.     private boolean blockEVT_FormComponentResized = false;
  78.    
  79.     //текущий музыкальный трек
  80.     private HMUSIC mod = null;
  81.    
  82.     public static void main(String args[]) {
  83.         /* Set the Nimbus look and feel */
  84.         //<editor-fold defaultstate="collapsed" desc=" Look and feel Setting code (optional) ">
  85.         /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
  86.          * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
  87.          */
  88.         try {
  89.             for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
  90.                 if ("Windows".equals(info.getName())) {
  91.                     javax.swing.UIManager.setLookAndFeel(info.getClassName());
  92.                     //break;
  93.                 }
  94.             }
  95.         } catch (ClassNotFoundException ex) {
  96.             java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
  97.         } catch (InstantiationException ex) {
  98.             java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
  99.         } catch (IllegalAccessException ex) {
  100.             java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
  101.         } catch (javax.swing.UnsupportedLookAndFeelException ex) {
  102.             java.util.logging.Logger.getLogger(MainFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
  103.         }
  104.         //</editor-fold>
  105.  
  106.         /* Create and display the form */
  107.         java.awt.EventQueue.invokeLater(new Runnable() {
  108.             public void run() {
  109.                 new MainFrame().setVisible(true);
  110.             }
  111.         });
  112.     }
  113.    
  114.     //главный класс - основное окно программы
  115.     public MainFrame() {    
  116.         //проверка 1-ый это запуск или нет и создание необходимымых файлов
  117.         File appData = new File(setting.appData + File.separator + "setting.bin");
  118.         if(!appData.exists())
  119.             CreateAppFiles();
  120.         ReadSetting();//чтение файла с настройками
  121.        
  122.         //инициализация компонентов
  123.         initComponents();
  124.         this.setLocationRelativeTo(null);
  125.        
  126.         //иконка окна
  127.         try
  128.         {
  129.             setIconImage(ImageIO.read(MainFrame.class.getResource("/resources/tree.png")));
  130.         } catch (IOException e1) {
  131.             e1.printStackTrace();
  132.         }
  133.        
  134.         //заголовок окна  
  135.         setTitle(setting.appName + " v" + setting.version + setting.title);
  136.         LabelWord.setText(setting.appName + " v" + setting.version);
  137.         LabelStatPanelMainFrame.setText("© " + setting.authorName + ". Все права защищены. ");
  138.        
  139.         //============УСТАНОВКА ЗНАЧЕНИЙ ЭЛЕМЕНТОВ ФОРМЫ========================
  140.         if((File)setting.currentSettings.get("dic_selectedDictionary") != null){
  141.             Start.setEnabled(true);
  142.         }
  143.        
  144.         PanelAmount.setVisible(false);
  145.        
  146.         //инициализация библиотеки для проигрывания трекерной музыки
  147.         BassInit.loadLibraries();
  148.         if(BassInit.NATIVEBASS_LIBRARY_VERSION() != BassInit.NATIVEBASS_JAR_VERSION()) {
  149.             System.out.printf("Error!  NativeBass library version (%08x) is different to jar version (%08x)\n",
  150.                             BassInit.NATIVEBASS_LIBRARY_VERSION(), BassInit.NATIVEBASS_JAR_VERSION());
  151.             return;
  152.         }
  153.                
  154.         /* Initialize default output device */
  155.         BASS_Init(forceNoSoundDevice(-1), forceFrequency(44100), 0, null, null);
  156.         BASS_SetConfig(BASS_CONFIG_GVOL_MUSIC, 3500);
  157.        
  158.         //запуск изучения слов(если возможно)
  159.         File currentDictionary = (File)setting.currentSettings.get("dic_selectedDictionary");
  160.         if(currentDictionary != null){
  161.             Start(currentDictionary);
  162.         }
  163.        
  164.         //применение настроек
  165.         SetSetting();
  166.     }
  167.  
  168.     //=======================ПОЛЬЗОВАТЕЛЬСКИЕ ФУНКЦИИ===========================
  169.     //функция открывающая словарь
  170.     private void OpenDictionary() {  
  171.         JFileChooser fileopen = new JFileChooser("txt");
  172.         fileopen.setFileFilter(new FileNameExtensionFilter("TXT file", "txt"));
  173.         fileopen.setSelectedFile((File)setting.currentSettings.get("dic_recentDictionary"));
  174.         int res = fileopen.showDialog(null, "Открыть файл");
  175.        
  176.         if (res == JFileChooser.APPROVE_OPTION)
  177.         {
  178.             setting.currentSettings.put("dic_recentDictionary", fileopen.getSelectedFile());//запоминание последнего открытого файла
  179.            
  180.             Start(fileopen.getSelectedFile());
  181.         }
  182.     }
  183.    
  184.     //функция закрывающая словарь
  185.     private void Stop() {
  186.         TranslatesList.setListData(new Object[0]);
  187.         translatesListMouseListener = false;
  188.        
  189.         currentDictionary.clear();
  190.         LabelWord.setText(setting.appName + " v" + setting.version);
  191.         LabelStatPanelMainFrame.setText("© " + setting.authorName + ". Все права защищены. ");
  192.        
  193.         ShowTranslate.setEnabled(false);
  194.         NextWord.setEnabled(false);
  195.        
  196.         ShowTranslateButton.setEnabled(false);
  197.         NextWordButton.setEnabled(false);
  198.        
  199.         CloseDictionary.setEnabled(false);
  200.        
  201.         isStarted = false;
  202.         //ShowMessage("");        
  203.     }
  204.    
  205.     //функция добавляющая словарь в список словарей
  206.     public String AddDictionary(File dictionary) {  
  207.         //проверка вновь добавленного словаря на корректность и если словарь правильного формата - добавить его в список
  208.         if(CreateDictionary(dictionary)) {
  209.             //проверка нет ли такого словаря уже в списке
  210.             List<File> dictionaryPathList = (List<File>)setting.currentSettings.get("dic_dictionaryPathList");
  211.             boolean willAdd = true;
  212.             for (File file : dictionaryPathList) {
  213.                 if(file.getAbsolutePath().equals(dictionary.getAbsolutePath())){
  214.                     willAdd = false;
  215.                 }
  216.             }
  217.             if(willAdd){
  218.                 dictionaryPathList.add(dictionary);
  219.                 setting.currentSettings.put("dic_selectedDictionary", dictionary);
  220.                 return "OK";
  221.             }
  222.             else
  223.                 return "Такой словарь уже имеется в списке.";
  224.         }
  225.         return "Некорректный формат словаря, выберите другой словарь.";
  226.     }
  227.    
  228.     //функция создающая словарь(заполняющая словами коллекцию) на основе пути к словарю
  229.     private boolean CreateDictionary(File file) {  
  230.         try{
  231.             //currentDictionary.clear();
  232.            
  233.             List<Word> temp_CurrentDictionary = new ArrayList<Word>();
  234.             BufferedReader br = new BufferedReader(new FileReader(file));
  235.             while (true) {
  236.                 String line = br.readLine();
  237.                 if(line == null)
  238.                     break;
  239.                 else{
  240.                     List<Translate> translates = new ArrayList<Translate>();//коллекция с переводами  
  241.  
  242.                     //разделить слово и перевод
  243.                     String[] strWordsTranslations = line.split("/");
  244.  
  245.                     //разделить группы переводов
  246.                     String[] strTranslationsGroup = strWordsTranslations[1].split("(\\d+\\))");
  247.  
  248.                     //разделить переводы в группах
  249.                     int i = 0;
  250.                     //если в переводах есть группы родственных значений перевода - начинать обход групп с индекса 1, а не
  251.                     //с индекса 0, так как под этим индексом лежит "", если групп нет - под индексом 0 лежит одна единственная группа
  252.                     if(strTranslationsGroup.length > 1){
  253.                         i = 1;
  254.                     }
  255.                     for(; i < strTranslationsGroup.length; i++){
  256.                         String[] strTranslations = strTranslationsGroup[i].split(",");
  257.  
  258.                         //добавление переводов в коллекцию с переводами
  259.                         for(int j = 0; j < strTranslations.length; j++){
  260.                             translates.add(new Translate(strTranslations[j].trim()));
  261.                         }
  262.                     }
  263.                     temp_CurrentDictionary.add(new Word(strWordsTranslations[0], translates));
  264.                 }
  265.             }
  266.             currentDictionary.clear();
  267.             currentDictionary.addAll(temp_CurrentDictionary);
  268.             return true;//в случае успеха создания словаря
  269.         } catch(Exception e) {
  270.             //currentDictionary.clear();
  271.             return false;//в случае ошибки создания словаря
  272.         }
  273.     }
  274.    
  275.     //функция запускающая тест
  276.     private void Start(File dictionary) {
  277.         //если тест запущен - остановить его и сбросить необходимые переменные
  278.         if(isStarted)
  279.                 Stop();
  280.        
  281.         if(dictionary.exists()){
  282.             if(CreateDictionary(dictionary)){
  283.                 //запомнить текущий открытый словарь(для работы кнопки "Еще раз", если пользователь после окончания теста захочет пройти его еще раз)
  284.                 currentDictionaryFile = dictionary;
  285.                
  286.                 currentDictionarySize = currentDictionary.size();
  287.                 translateCounter =  TranslateCounter();
  288.                 rightAnswerCounter = wrongAnswerCounter = showRightTranslateCounter = 0;
  289.                
  290.                 translatesListMouseListener = true;
  291.  
  292.                 blockEVT_FormComponentResized = false;
  293.                 setSize((Dimension)setting.currentSettings.get("com_windowSize"));
  294.                 setResizable(true);
  295.  
  296.                 PanelMainFrame.setVisible(true);
  297.                 PanelAmount.setVisible(false);
  298.                
  299.                 ShowTranslate.setEnabled(true);
  300.                 NextWord.setEnabled(true);
  301.                
  302.                 ShowTranslateButton.setEnabled(true);
  303.                 NextWordButton.setEnabled(true);
  304.                
  305.                 //остановить муз. трек, если проигрывается
  306.                 if(mod != null){
  307.                     BASS_ChannelStop(mod.asInt());
  308.                 }
  309.                
  310.                 ShowWord();
  311.                 isStarted = true;
  312.                
  313.                 CloseDictionary.setEnabled(true);
  314.             }
  315.             else{
  316.                 JOptionPane.showMessageDialog(this, "Некорректный формат словаря, выберите другой словарь.", setting.appName + " " + setting.version + " - сообщение", JOptionPane.WARNING_MESSAGE);
  317.                 setting.DeleteDictionary(dictionary);
  318.             }
  319.         }
  320.         else{
  321.             JOptionPane.showMessageDialog(this, "Файла данного словаря уже не существует, выберите другой словарь.", setting.appName + " " + setting.version + " - сообщение", JOptionPane.WARNING_MESSAGE);
  322.             setting.DeleteDictionary(dictionary);
  323.         }
  324.     }
  325.    
  326.     //функция показывающая слово и заполняющая список ответов
  327.     private void ShowWord() {
  328.         //если в коллекции с текущим словарем нет больше слов - остановить тест, закрыть словарь и вывести сообщение об окончании теста
  329.         if(currentDictionary.isEmpty()){
  330.             Stop();
  331.             ShowAmount();
  332.             return;
  333.         }
  334.        
  335.         //-------------------------выборка слова--------------------------------
  336.         int index = randGen.nextInt(currentDictionary.size());
  337.         currentWordIndex = index;
  338.         currentWord = currentDictionary.get(index);
  339.         //LabelWord.setText("<html><body style=\"margin:4px\">" + word.word + "</body></html>");
  340.         LabelWord.setText(currentWord.word);
  341.        
  342.         //---------------------выборка вариантов ответов------------------------
  343.         List<Word> currentDictionaryTemp = new ArrayList<Word>(currentDictionary);//временный объект с текущим словарем
  344.         List<Translate> translates = new ArrayList<Translate>();//коллекция с переводами
  345.         //удаление выбранного слова с его переводами, чтобы оно не использовалось более для выборки ложных ответов
  346.         currentDictionaryTemp.remove(index);        
  347.        
  348.         //если во временном объекте с текущим словарем есть еще слова - выбирать ложные ответы, если нет - вариант ответа один
  349.         if(!currentDictionaryTemp.isEmpty()){
  350.             //1. выбор ложных ответов
  351.             for(int i = 0; i < (int)setting.currentSettings.get("mod_countOfSuggestedTranslate") - 1; i++){
  352.                 index = randGen.nextInt(currentDictionaryTemp.size());
  353.                
  354.                 int translateIndex = currentDictionaryTemp.get(index).GetRandomTranslateIndex();
  355.                 String translate = currentDictionaryTemp.get(index).translates.get(translateIndex).translate;
  356.                 translates.add(new Translate(translate));
  357.                
  358.                 currentDictionaryTemp.remove(index);//удалить это слово из временного словаря, чтобы оно больше не участвовало в выборке ложных ответов
  359.                
  360.                 //прекратить выборку ложных ответов, если уже не осталось слов
  361.                 if(currentDictionaryTemp.isEmpty())
  362.                     break;
  363.             }
  364.            
  365.             //2. добавление правильного ответа в случайную позицию
  366.             //генерация случайной позициии
  367.             index = randGen.nextInt(translates.size() + 1);    
  368.             currentRightTranslateIndex = index;
  369.  
  370.             //выбор случайного перевода
  371.             currentTranslateIndex = currentWord.GetRandomTranslateIndex();
  372.             translates.add(index, new Translate(currentWord.translates.get(currentTranslateIndex).translate));
  373.         }
  374.         else{
  375.             //выбор случайного перевода
  376.             currentTranslateIndex = currentWord.GetRandomTranslateIndex();
  377.             currentRightTranslateIndex = 0;
  378.             translates.add(new Translate(currentWord.translates.get(currentTranslateIndex).translate));
  379.         }
  380.        
  381.         //заполнение списка ответов
  382.         //установка ListCellRenderer
  383.         Font font = (Font)setting.currentSettings.get("foc_Default_translatesListFont");
  384.         Color fontColor = (Color)setting.currentSettings.get("foc_Default_translatesListForeground");
  385.         BackgroundType backgroundType = (BackgroundType)setting.currentSettings.get("foc_Default_translatesListBackgroundType");
  386.         Color backgroundColor = (Color)setting.currentSettings.get("foc_Default_translatesListBackground");
  387.         BackgroundType selectionType  = (BackgroundType)setting.currentSettings.get("foc_Default_translatesListSelectionType");  
  388.         Color selectionBackgroundColor = (Color)setting.currentSettings.get("foc_Default_translatesListSelectionBackground");
  389.         ((ImageJList)TranslatesList).setListCellRenderer(font, fontColor, backgroundType, backgroundColor, selectionType, selectionBackgroundColor);
  390.                
  391.         DefaultListModel listModel = new DefaultListModel();
  392.         for(int i = 0; i < translates.size(); i++){      
  393.             Object listItem[] = {translates.get(i).translate};      
  394.             listModel.addElement(listItem);
  395.         }
  396.         TranslatesList.setModel(listModel);
  397.        
  398.         ShowStat("showStat");
  399.     }
  400.    
  401.     //функция показывающая правильный ответ
  402.     private void ShowRightTranslate() {  
  403.         if(isStarted){
  404.             showRightTranslateCounter ++;
  405.            
  406.             //выделение зеленым цветом правильного варианта ответа
  407.             //установка ListCellRenderer
  408.             Font font = (Font)setting.currentSettings.get("foc_Default_translatesListFont");
  409.             Color fontColor = (Color)setting.currentSettings.get("foc_Default_translatesListForeground");
  410.             BackgroundType backgroundType = (BackgroundType)setting.currentSettings.get("foc_Default_translatesListBackgroundType");
  411.             Color backgroundColor = (Color)setting.currentSettings.get("foc_Default_translatesListBackground");
  412.             BackgroundType selectionType  = BackgroundType.COLOR;  
  413.             Color selectionBackgroundColor = Color.GREEN;
  414.             ((ImageJList)TranslatesList).setListCellRenderer(font, fontColor, backgroundType, backgroundColor, selectionType, selectionBackgroundColor);
  415.             //перезагрузка списка переводов
  416.             ((ImageJList)TranslatesList).Reload();
  417.            
  418.             TranslatesList.setSelectedIndex(currentRightTranslateIndex);
  419.         }
  420.     }
  421.    
  422.     //функция показывающая следущее слово
  423.     private void NextWord() {
  424.         if(isStarted){
  425.             TranslatesList.setEnabled(true);
  426.             translatesListMouseListener = true;
  427.            
  428.             PanelAnswerResult.repaint();//стереть значек ответа
  429.            
  430.             ShowWord();
  431.         }
  432.     }
  433.    
  434.     //функция проверяющая ответ пользователя и обновляющая статистику
  435.     private boolean CheckAnswer(int selectedIndex) {  
  436.         boolean res;
  437.        
  438.         //если ответ неверный
  439.         if(selectedIndex != currentRightTranslateIndex){
  440.             wrongAnswerCounter ++;
  441.             try
  442.             {
  443.                 BufferedImage image = ImageIO.read(MainFrame.class.getResource("/resources/wrong_answer.png"));
  444.                 PanelAnswerResult.getGraphics().drawImage(image, 14, 4, null);
  445.             } catch (IOException e1) {
  446.                 e1.printStackTrace();
  447.             }
  448.             res = false;
  449.        
  450.             //проигрывать звуки, если они разрешены
  451.             if((boolean)setting.currentSettings.get("mod_soundEnable")){
  452.                 try {
  453.                 AudioInputStream AIS_wrong_wav = AudioSystem.getAudioInputStream(MainFrame.class.getResourceAsStream("/resources/wrong.wav"));      
  454.                 Clip wrong_wav = AudioSystem.getClip();
  455.                 wrong_wav.open(AIS_wrong_wav);
  456.                 wrong_wav.start();  
  457.                 } catch (Exception ex) {
  458.                     ex.printStackTrace();
  459.                 }
  460.             }
  461.         }
  462.         //если ответ верный
  463.         else{
  464.             currentDictionary.get(currentWordIndex).translates.get(currentTranslateIndex).answerCounter ++;
  465.             rightAnswerCounter ++;
  466.             try
  467.             {
  468.                 BufferedImage image = ImageIO.read(MainFrame.class.getResource("/resources/right_answer.png"));
  469.                 PanelAnswerResult.getGraphics().drawImage(image, 14, 4, null);
  470.             } catch (IOException e1) {
  471.                 e1.printStackTrace();
  472.             }
  473.            
  474.             //проверка не дадено ли уже достаточное количество верных ответов для данного перевода
  475.             if(currentDictionary.get(currentWordIndex).translates.get(currentTranslateIndex).answerCounter == (int)setting.currentSettings.get("mod_requestCountOfProveAnsvers")){
  476.                 currentDictionary.get(currentWordIndex).translates.remove(currentTranslateIndex);
  477.             }
  478.             //проверка есть ли еще переводы для текущего слова и ненужно ли уже удалить само слово
  479.             if(currentDictionary.get(currentWordIndex).translates.isEmpty()){
  480.                 currentDictionary.remove(currentWordIndex);
  481.             }
  482.             res = true;
  483.            
  484.             //проигрывать звуки, если они разрешены
  485.             if((boolean)setting.currentSettings.get("mod_soundEnable")){
  486.                 try {
  487.                     AudioInputStream AIS_right_wav = AudioSystem.getAudioInputStream(MainFrame.class.getResourceAsStream("/resources/right.wav"));      
  488.                     Clip right_wav = AudioSystem.getClip();
  489.                     right_wav.open(AIS_right_wav);
  490.                     right_wav.start();  
  491.                 } catch (Exception ex) {
  492.                     ex.printStackTrace();
  493.                 }
  494.             }
  495.         }
  496.        
  497.         return res;
  498.     }
  499.    
  500.     //функция выводящая статистику после окончания теста
  501.     private void ShowAmount() {
  502.         //изменение размеров окна для вывода статистики
  503.         blockEVT_FormComponentResized = true;
  504.         setSize(600, 420);
  505.         setResizable(false);
  506.        
  507.         PanelMainFrame.setVisible(false);
  508.         PanelAmount.setVisible(true);
  509.        
  510.         String text = "<html>" +
  511.                           "<body style=\"margin-right:6px\">" +
  512.                               "<table>" +
  513.                                   "<tr>" +
  514.                                       "<td align=\"right\">" +
  515.                                           "Слов в словаре: " +
  516.                                       "</td>" +
  517.                                       "<td>" +
  518.                                           currentDictionarySize +
  519.                                       "</td>" +
  520.                                   "</tr>" +
  521.                                   "<tr>" +
  522.                                       "<td align=\"right\">" +
  523.                                           "Переводов: " +
  524.                                       "</td>" +
  525.                                       "<td>" +
  526.                                           translateCounter +
  527.                                       "</td>" +
  528.                                   "</tr>" +
  529.                
  530.                                   "<tr>" +
  531.                                       "<td colspan=2>" +
  532.                                           "<hr>" +
  533.                                       "</td>" +
  534.                                   "</tr>" +
  535.                
  536.                                   "<tr>" +
  537.                                       "<td align=\"right\">" +
  538.                                           "Верных ответов: " +
  539.                                       "</td>" +
  540.                                       "<td>" +
  541.                                            rightAnswerCounter +
  542.                                       "</td>" +
  543.                                   "</tr>" +
  544.                                   "<tr>" +
  545.                                       "<td align=\"right\">" +
  546.                                           "Неверных ответов: " +
  547.                                       "</td>" +
  548.                                       "<td>" +
  549.                                            wrongAnswerCounter +
  550.                                       "</td>" +
  551.                                   "</tr>" +
  552.                                   "<tr>" +
  553.                                       "<td colspan=2>" +
  554.                                           "<hr>" +
  555.                                       "</td>" +
  556.                                   "</tr>" +
  557.                                   "<tr>" +
  558.                                       "<td align=\"right\">" +
  559.                                           "Нажатий \"Показать перевод\": " +
  560.                                       "</td>" +
  561.                                       "<td>" +
  562.                                           showRightTranslateCounter +
  563.                                       "</td>" +
  564.                                   "</tr>" +
  565.                               "</table>" +
  566.                           "</body>" +
  567.                       "</html>";      
  568.         LabelStatPanelAmount.setText(text);
  569.            
  570.         double percentOfRightAnswer = ((double)rightAnswerCounter / (rightAnswerCounter + wrongAnswerCounter)) * 100;
  571.         LabelEvaluation.setText("Процент правильных ответов: " + Math.round(percentOfRightAnswer) + "%");
  572.        
  573.         //финальный звук
  574.         if((boolean)setting.currentSettings.get("mod_soundEnable") && (boolean)setting.currentSettings.get("mod_finalSound")){
  575.             try {
  576.                 File folder = new File(setting.appData + File.separator + "music" + File.separator);
  577.                 File[] listOfFiles = folder.listFiles();
  578.                 String fileName = listOfFiles[randGen.nextInt(listOfFiles.length)].getName();
  579.                
  580.                 mod = BASS_MusicLoad(false, setting.appData + File.separator + "music" + File.separator + fileName, 0, 0, BASS_MUSIC_RAMPS, 0);
  581.                 if(mod != null) {
  582.                     BASS_ChannelPlay(mod.asInt(), false);                    
  583.             }
  584.             } catch (Exception ex) {
  585.                 //ex.printStackTrace();
  586.             }
  587.         }
  588.     }
  589.    
  590.     //функция подсчета количества оставшихся переводов в текущем словаре
  591.     private int TranslateCounter() {  
  592.         int counter = 0;
  593.         for(Word word : currentDictionary){
  594.             counter += word.translates.size();
  595.         }
  596.         return counter;
  597.     }
  598.    
  599.     //применение настроек из объекта настроек и обновление состояния элементов формы
  600.     public void SetSetting() {
  601.                try {
  602.                //Common setting
  603.                setSize((Dimension)setting.currentSettings.get("com_windowSize"));
  604.  
  605.                //=================Font and Color Scheme=========================
  606.                //--------------------------word---------------------------------
  607.                LabelWord.setFont((Font)setting.currentSettings.get("foc_Default_wordFont"));
  608.                LabelWord.setForeground((Color)setting.currentSettings.get("foc_Default_wordForeground"));
  609.                switch ((BackgroundType)setting.currentSettings.get("foc_Default_wordBackgroundType")) {
  610.                     case COLOR:
  611.                         LabelWord.setOpaque(true);
  612.                         LabelWord.setBackground((Color)setting.currentSettings.get("foc_Default_wordBackground"));
  613.                         break;
  614.                     case TRANSPARENT:
  615.                         LabelWord.setOpaque(false);
  616.                         LabelWord.repaint();
  617.                         break;
  618.                     default:
  619.                         break;
  620.                 }
  621.                LabelWord.setBorder(BorderFactory.createLineBorder((Color)setting.currentSettings.get("foc_Default_wordBorderColor"), (int)setting.currentSettings.get("foc_Default_wordBorderSize")));
  622.  
  623.                //установка позиции слова
  624.                 switch((WordPosition)setting.currentSettings.get("foc_wordPosition")) {
  625.                     case WORD_POSITION_LEFT:
  626.                         LabelWord.setHorizontalAlignment(JTextField.LEFT);
  627.                         break;
  628.                     case WORD_POSITION_CENTER:
  629.                         LabelWord.setHorizontalAlignment(JTextField.CENTER);
  630.                         break;
  631.                     case WORD_POSITION_RIGHT:
  632.                         LabelWord.setHorizontalAlignment(JTextField.RIGHT);
  633.                     default:
  634.                         break;
  635.                 }
  636.                
  637.                //------------------------translatesList-------------------------
  638.                TranslatesList.setFont((Font)setting.currentSettings.get("foc_Default_translatesListFont"));
  639.                TranslatesList.setForeground((Color)setting.currentSettings.get("foc_Default_translatesListForeground"));
  640.                switch ((BackgroundType)setting.currentSettings.get("foc_Default_translatesListBackgroundType")) {
  641.                     case COLOR:
  642.                         TranslatesList.setOpaque(true);
  643.                         TranslatesList.setBackground((Color)setting.currentSettings.get("foc_Default_translatesListBackground"));
  644.                         break;
  645.                     case TRANSPARENT:
  646.                         //проверка, что установлено фоном главного окна
  647.                         switch ((BackgroundType)setting.currentSettings.get("foc_Default_mainFrameBackgroundType")) {
  648.                             case COLOR:
  649.                                 TranslatesList.setOpaque(true);
  650.                                 TranslatesList.setBackground((Color)setting.currentSettings.get("foc_Default_mainFrameBackgroundColor"));
  651.                                 break;
  652.                             case IMAGE:
  653.                                 //установка фона TranslatesList
  654.                                 ((ImageJList)TranslatesList).SetBackgroundImage(CreateTranslatesListBackImg((File)setting.currentSettings.get("foc_Default_mainFrameBackgroundImage")));
  655.                                
  656.                                 TranslatesList.setOpaque(false);
  657.                                 TranslatesList.repaint();
  658.                                 break;
  659.                             default:
  660.                                 break;
  661.                         }
  662.                         break;
  663.                     default:
  664.                         break;
  665.                 }
  666.                ScrollPaneTranslatesList.setBorder(BorderFactory.createLineBorder((Color)setting.currentSettings.get("foc_Default_translatesListBorderColor"), (int)setting.currentSettings.get("foc_Default_translatesListBorderSize")));
  667.                
  668.                //установка ListCellRenderer
  669.                Font font = (Font)setting.currentSettings.get("foc_Default_translatesListFont");
  670.                Color fontColor = (Color)setting.currentSettings.get("foc_Default_translatesListForeground");
  671.                BackgroundType backgroundType = (BackgroundType)setting.currentSettings.get("foc_Default_translatesListBackgroundType");
  672.                Color backgroundColor = (Color)setting.currentSettings.get("foc_Default_translatesListBackground");
  673.                BackgroundType selectionType  = (BackgroundType)setting.currentSettings.get("foc_Default_translatesListSelectionType");  
  674.                Color selectionBackgroundColor = (Color)setting.currentSettings.get("foc_Default_translatesListSelectionBackground");
  675.                ((ImageJList)TranslatesList).setListCellRenderer(font, fontColor, backgroundType, backgroundColor, selectionType, selectionBackgroundColor);
  676.                //перезагрузка списка переводов
  677.                ((ImageJList)TranslatesList).Reload();
  678.                
  679.                //------------------------строка статистики----------------------
  680.                LabelStatPanelMainFrame.setFont((Font)setting.currentSettings.get("foc_Default_statStringFont"));
  681.                LabelStatPanelMainFrame.setForeground((Color)setting.currentSettings.get("foc_Default_statStringForeground"));
  682.                switch ((BackgroundType)setting.currentSettings.get("foc_Default_statStringBackgroundType")) {
  683.                     case COLOR:
  684.                         LabelStatPanelMainFrame.setOpaque(true);
  685.                         LabelStatPanelMainFrame.setBackground((Color)setting.currentSettings.get("foc_Default_statStringBackground"));
  686.                         break;
  687.                     case TRANSPARENT:
  688.                         LabelStatPanelMainFrame.setOpaque(false);
  689.                         LabelStatPanelMainFrame.repaint();
  690.                         break;
  691.                     default:
  692.                         break;
  693.                 }
  694.                LabelStatPanelMainFrame.setBorder(BorderFactory.createLineBorder((Color)setting.currentSettings.get("foc_Default_statStringBorderColor"), (int)setting.currentSettings.get("foc_Default_statStringBorderSize")));
  695.                
  696.                //-------------------------фон окна------------------------------
  697.                switch ((BackgroundType)setting.currentSettings.get("foc_Default_mainFrameBackgroundType")) {
  698.                     case COLOR:
  699.                         ((ImageJPanel)PanelMainFrame).SetBackground((Color)setting.currentSettings.get("foc_Default_mainFrameBackgroundColor"));
  700.                         PanelAnswerResult.setOpaque(true);
  701.                         break;
  702.                     case IMAGE:
  703.                         ((ImageJPanel)PanelMainFrame).SetBackground((File)setting.currentSettings.get("foc_Default_mainFrameBackgroundImage"));
  704.                         PanelAnswerResult.setOpaque(false);
  705.                         break;
  706.                     default:
  707.                         break;
  708.                 }
  709.                PanelMainFrame.repaint();
  710.                
  711.                //-------------------окошко PanelAnswerResult--------------------
  712.                PanelAnswerResult.setBorder(BorderFactory.createLineBorder((Color)setting.currentSettings.get("foc_Default_translatesListBorderColor"), 1));
  713.                PanelAnswerResult.setBackground(TranslatesList.getBackground());
  714.                
  715.                //пункт меню "Закрыть словарь"
  716.                if(isStarted)
  717.                    CloseDictionary.setEnabled(true);
  718.                else
  719.                    CloseDictionary.setEnabled(false);
  720.                
  721.                //пункт меню "Старт"
  722.                if((File)setting.currentSettings.get("dic_selectedDictionary") != null)
  723.                    Start.setEnabled(true);
  724.                else
  725.                    Start.setEnabled(false);
  726.         }      
  727.            catch (Exception e) {
  728.                setting = new Setting();//в случае ошибки применения настроек - использовать настройки по умолчанию
  729.                WriteSetting();
  730.            }
  731.     }
  732.    
  733.     //функция запускающаяся при первом запуске программы и создающая необходимые файлы
  734.     private void CreateAppFiles() {  
  735.         try {            
  736.             //файл настроек
  737.             File settingFile = new File(setting.appData, "setting.bin");
  738.             if(!settingFile.exists()){
  739.                 settingFile.createNewFile();
  740.                 setting = new Setting();
  741.                 WriteSetting();
  742.             }
  743.         }
  744.         catch (Exception e) {
  745.             JOptionPane.showMessageDialog(this, "Ошибка создания необходимых файлов игры.", "Ошибка", JOptionPane.ERROR_MESSAGE);
  746.             setting = new Setting();
  747.         }
  748.     }
  749.    
  750.     //чтение настроек из файла
  751.     private void ReadSetting() {  
  752.         try {
  753.            FileInputStream fis = new FileInputStream(setting.appData + File.separator + "setting.bin");
  754.            ObjectInputStream oin = new ObjectInputStream(fis);
  755.            setting = (Setting)oin.readObject();
  756.         }
  757.         catch (Exception e) {
  758.             JOptionPane.showMessageDialog(this, "Ошибка чтения настроек программы из файла.", "Ошибка", JOptionPane.ERROR_MESSAGE);
  759.             setting = new Setting();//в случае ошибки чтения файла настроек - использовать настройки по умолчанию
  760.         }
  761.     }
  762.    
  763.     //запись настроек в файл
  764.     private void WriteSetting() {  
  765.         try {
  766.             FileOutputStream fos = new FileOutputStream(setting.appData + File.separator + "setting.bin");
  767.             ObjectOutputStream oos = new ObjectOutputStream(fos);
  768.             oos.writeObject(setting);
  769.             oos.flush();
  770.             oos.close();
  771.         }
  772.         catch (Exception e) {
  773.             JOptionPane.showMessageDialog(this, "Ошибка записи настроек программы в файл.", "Ошибка", JOptionPane.ERROR_MESSAGE);
  774.         }
  775.     }
  776.    
  777.     //выход из программы
  778.     private void Exit() {
  779.         WriteSetting();
  780.         System.exit(0);
  781.     }
  782.    
  783.     //функция выводящая статистику(сообщение) в строке сообщения(внизу)
  784.     private void ShowStat(String message) {  
  785.         //если message есть showStat - вывести статистику
  786.         if(message.equals("showStat")){
  787.             message = "Слов: " + currentDictionarySize + "/" + currentDictionary.size() + " " +
  788.                       "Переводов: " + translateCounter + "/" + TranslateCounter() + " " +
  789.                       "Ответов: " + rightAnswerCounter + "/" + wrongAnswerCounter;
  790.         }
  791.        
  792.         String text = "<html>"
  793.                     +     "<body style=\"margin-right:4px\">"
  794.                     +         message
  795.                     +     "</body>"
  796.                     + "</html>";
  797.         LabelStatPanelMainFrame.setText(text);
  798.     }
  799.  
  800.     //функция возвращает фоновый рисунок для TranslatesList
  801.     public BufferedImage CreateTranslatesListBackImg(File imgFile) {  
  802.         BufferedImage backImg = null;
  803.         try
  804.         {
  805.             backImg = ImageIO.read(imgFile);        
  806.         } catch (IOException e) {  
  807.         }
  808.        
  809.         //получение фонового изображения для ImageJList
  810.         int wordBorderSize = (int)setting.currentSettings.get("foc_Default_wordBorderSize");
  811.         int translatesListBorderSize = (int)setting.currentSettings.get("foc_Default_translatesListBorderSize");
  812.         int x = ScrollPaneTranslatesList.getLocation().x + translatesListBorderSize;
  813.         int y = LabelWord.getY() + LabelWord.getFontMetrics(LabelWord.getFont()).getHeight() + wordBorderSize * 2 + ScrollPaneTranslatesList.getY() - LabelWord.getY() - LabelWord.getHeight() + translatesListBorderSize;
  814.        
  815.         backImg = backImg.getSubimage(x, y, backImg.getWidth() - x - translatesListBorderSize, backImg.getHeight() - y - translatesListBorderSize);
  816.  
  817.         return backImg;
  818.     }
  819.    
  820.     /*
  821.      * This method is called from within the constructor to initialize the form.
  822.      * WARNING: Do NOT modify this code. The content of this method is always
  823.      * regenerated by the Form Editor.
  824.      */
  825.     @SuppressWarnings("unchecked")
  826.     // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
  827.     private void initComponents() {
  828.  
  829.         jLayeredPane1 = new javax.swing.JLayeredPane();
  830.         PanelMainFrame = new ImageJPanel(Color.decode("#F0F0F0"));
  831.         LabelWord = new javax.swing.JLabel();
  832.         ScrollPaneTranslatesList = new javax.swing.JScrollPane();
  833.         TranslatesList = new ImageJList(ScrollPaneTranslatesList);
  834.         ShowTranslateButton = new javax.swing.JButton();
  835.         LabelStatPanelMainFrame = new javax.swing.JLabel();
  836.         NextWordButton = new javax.swing.JButton();
  837.         PanelAnswerResult = new javax.swing.JPanel();
  838.         PanelAmount = new ImageJPanel(new File(setting.appData + File.separator + "minecraftBack.jpg"));
  839.         jLabel1 = new javax.swing.JLabel();
  840.         ButtonRetest = new javax.swing.JButton();
  841.         LabelStatPanelAmount = new javax.swing.JLabel();
  842.         LabelEvaluation = new javax.swing.JLabel();
  843.         TopMenu = new javax.swing.JMenuBar();
  844.         jmFile = new javax.swing.JMenu();
  845.         OpenDictionary = new javax.swing.JMenuItem();
  846.         CloseDictionary = new javax.swing.JMenuItem();
  847.         Start = new javax.swing.JMenuItem();
  848.         MenuSeparator1 = new javax.swing.JPopupMenu.Separator();
  849.         Setting = new javax.swing.JMenuItem();
  850.         MenuSeparator2 = new javax.swing.JPopupMenu.Separator();
  851.         Exit = new javax.swing.JMenuItem();
  852.         jmEdit = new javax.swing.JMenu();
  853.         ShowTranslate = new javax.swing.JMenuItem();
  854.         NextWord = new javax.swing.JMenuItem();
  855.         jmHelp = new javax.swing.JMenu();
  856.         About = new javax.swing.JMenuItem();
  857.  
  858.         setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
  859.         setBounds(new java.awt.Rectangle(0, 0, 0, 0));
  860.         setFocusCycleRoot(false);
  861.         setFocusable(false);
  862.         setLocationByPlatform(true);
  863.         setMinimumSize(new java.awt.Dimension(350, 300));
  864.         addWindowListener(new java.awt.event.WindowAdapter() {
  865.             public void windowClosing(java.awt.event.WindowEvent evt) {
  866.                 EVT_FormWindowClosing(evt);
  867.             }
  868.         });
  869.         addComponentListener(new java.awt.event.ComponentAdapter() {
  870.             public void componentResized(java.awt.event.ComponentEvent evt) {
  871.                 EVT_FormComponentResized(evt);
  872.             }
  873.         });
  874.         addWindowStateListener(new java.awt.event.WindowStateListener() {
  875.             public void windowStateChanged(java.awt.event.WindowEvent evt) {
  876.                 EVT_FormWindowStateChanged(evt);
  877.             }
  878.         });
  879.  
  880.         jLayeredPane1.setOpaque(true);
  881.  
  882.         PanelMainFrame.setMinimumSize(new java.awt.Dimension(0, 0));
  883.  
  884.         LabelWord.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
  885.         LabelWord.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
  886.         LabelWord.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(153, 153, 153)));
  887.         LabelWord.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
  888.         LabelWord.setMaximumSize(new java.awt.Dimension(2, 250));
  889.         LabelWord.addMouseListener(new java.awt.event.MouseAdapter() {
  890.             public void mouseClicked(java.awt.event.MouseEvent evt) {
  891.                 EVT_LabelWordMouseClicked(evt);
  892.             }
  893.         });
  894.  
  895.         ScrollPaneTranslatesList.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(153, 153, 153)));
  896.  
  897.         TranslatesList.setForeground(new java.awt.Color(102, 102, 102));
  898.         TranslatesList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
  899.         TranslatesList.setOpaque(false);
  900.         TranslatesList.addMouseListener(new java.awt.event.MouseAdapter() {
  901.             public void mouseClicked(java.awt.event.MouseEvent evt) {
  902.                 EVT_TranslatesListMouseClicked(evt);
  903.             }
  904.             public void mousePressed(java.awt.event.MouseEvent evt) {
  905.                 EVT_TranslatesListMousePressed(evt);
  906.             }
  907.         });
  908.         TranslatesList.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
  909.             public void mouseDragged(java.awt.event.MouseEvent evt) {
  910.                 EVT_TranslatesListMouseDragged(evt);
  911.             }
  912.             public void mouseMoved(java.awt.event.MouseEvent evt) {
  913.                 EVT_TranslatesListMouseMoved(evt);
  914.             }
  915.         });
  916.         ScrollPaneTranslatesList.setViewportView(TranslatesList);
  917.  
  918.         ShowTranslateButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/tip.png"))); // NOI18N
  919.         ShowTranslateButton.setEnabled(false);
  920.         ShowTranslateButton.setOpaque(false);
  921.         ShowTranslateButton.addActionListener(new java.awt.event.ActionListener() {
  922.             public void actionPerformed(java.awt.event.ActionEvent evt) {
  923.                 EVT_ShowTranslateButtonActionPerformed(evt);
  924.             }
  925.         });
  926.  
  927.         LabelStatPanelMainFrame.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
  928.         LabelStatPanelMainFrame.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
  929.         LabelStatPanelMainFrame.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(153, 153, 153)));
  930.         LabelStatPanelMainFrame.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
  931.         LabelStatPanelMainFrame.setOpaque(true);
  932.  
  933.         NextWordButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/next.png"))); // NOI18N
  934.         NextWordButton.setEnabled(false);
  935.         NextWordButton.setOpaque(false);
  936.         NextWordButton.addActionListener(new java.awt.event.ActionListener() {
  937.             public void actionPerformed(java.awt.event.ActionEvent evt) {
  938.                 EVT_NextWordButtonActionPerformed(evt);
  939.             }
  940.         });
  941.  
  942.         PanelAnswerResult.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(153, 153, 153)));
  943.  
  944.         javax.swing.GroupLayout PanelAnswerResultLayout = new javax.swing.GroupLayout(PanelAnswerResult);
  945.         PanelAnswerResult.setLayout(PanelAnswerResultLayout);
  946.         PanelAnswerResultLayout.setHorizontalGroup(
  947.             PanelAnswerResultLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  948.             .addGap(0, 43, Short.MAX_VALUE)
  949.         );
  950.         PanelAnswerResultLayout.setVerticalGroup(
  951.             PanelAnswerResultLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  952.             .addGap(0, 24, Short.MAX_VALUE)
  953.         );
  954.  
  955.         javax.swing.GroupLayout PanelMainFrameLayout = new javax.swing.GroupLayout(PanelMainFrame);
  956.         PanelMainFrame.setLayout(PanelMainFrameLayout);
  957.         PanelMainFrameLayout.setHorizontalGroup(
  958.             PanelMainFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  959.             .addGroup(PanelMainFrameLayout.createSequentialGroup()
  960.                 .addContainerGap()
  961.                 .addGroup(PanelMainFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  962.                     .addComponent(LabelWord, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
  963.                     .addGroup(PanelMainFrameLayout.createSequentialGroup()
  964.                         .addComponent(ShowTranslateButton)
  965.                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
  966.                         .addComponent(NextWordButton, javax.swing.GroupLayout.PREFERRED_SIZE, 49, javax.swing.GroupLayout.PREFERRED_SIZE)
  967.                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
  968.                         .addComponent(PanelAnswerResult, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
  969.                     .addComponent(LabelStatPanelMainFrame, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
  970.                     .addComponent(ScrollPaneTranslatesList, javax.swing.GroupLayout.DEFAULT_SIZE, 580, Short.MAX_VALUE))
  971.                 .addContainerGap())
  972.         );
  973.         PanelMainFrameLayout.setVerticalGroup(
  974.             PanelMainFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  975.             .addGroup(PanelMainFrameLayout.createSequentialGroup()
  976.                 .addContainerGap()
  977.                 .addComponent(LabelWord, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
  978.                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
  979.                 .addComponent(ScrollPaneTranslatesList, javax.swing.GroupLayout.DEFAULT_SIZE, 282, Short.MAX_VALUE)
  980.                 .addGap(9, 9, 9)
  981.                 .addGroup(PanelMainFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
  982.                     .addComponent(ShowTranslateButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
  983.                     .addComponent(NextWordButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
  984.                     .addComponent(PanelAnswerResult, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
  985.                 .addGap(10, 10, 10)
  986.                 .addComponent(LabelStatPanelMainFrame)
  987.                 .addGap(13, 13, 13))
  988.         );
  989.  
  990.         PanelMainFrame.setBounds(0, 0, 600, 366);
  991.         jLayeredPane1.add(PanelMainFrame, javax.swing.JLayeredPane.DEFAULT_LAYER);
  992.  
  993.         PanelAmount.setMinimumSize(new java.awt.Dimension(0, 0));
  994.  
  995.         jLabel1.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
  996.         jLabel1.setForeground(new java.awt.Color(255, 255, 255));
  997.         jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
  998.         jLabel1.setText("Тест окончен, статистика");
  999.  
  1000.         ButtonRetest.setText("Еще раз");
  1001.         ButtonRetest.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
  1002.         ButtonRetest.addActionListener(new java.awt.event.ActionListener() {
  1003.             public void actionPerformed(java.awt.event.ActionEvent evt) {
  1004.                 EVT_ButtonRetestActionPerformed(evt);
  1005.             }
  1006.         });
  1007.  
  1008.         LabelStatPanelAmount.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
  1009.         LabelStatPanelAmount.setForeground(new java.awt.Color(255, 255, 255));
  1010.         LabelStatPanelAmount.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
  1011.         LabelStatPanelAmount.setText("LabelStat");
  1012.  
  1013.         LabelEvaluation.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
  1014.         LabelEvaluation.setForeground(new java.awt.Color(255, 255, 255));
  1015.         LabelEvaluation.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
  1016.         LabelEvaluation.setText("LabelEvaluation");
  1017.  
  1018.         javax.swing.GroupLayout PanelAmountLayout = new javax.swing.GroupLayout(PanelAmount);
  1019.         PanelAmount.setLayout(PanelAmountLayout);
  1020.         PanelAmountLayout.setHorizontalGroup(
  1021.             PanelAmountLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  1022.             .addGroup(PanelAmountLayout.createSequentialGroup()
  1023.                 .addContainerGap()
  1024.                 .addGroup(PanelAmountLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  1025.                     .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 580, Short.MAX_VALUE)
  1026.                     .addComponent(LabelStatPanelAmount, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
  1027.                     .addComponent(LabelEvaluation, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
  1028.                 .addContainerGap())
  1029.             .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, PanelAmountLayout.createSequentialGroup()
  1030.                 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
  1031.                 .addComponent(ButtonRetest, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE)
  1032.                 .addGap(234, 234, 234))
  1033.         );
  1034.         PanelAmountLayout.setVerticalGroup(
  1035.             PanelAmountLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  1036.             .addGroup(PanelAmountLayout.createSequentialGroup()
  1037.                 .addGap(20, 20, 20)
  1038.                 .addComponent(jLabel1)
  1039.                 .addGap(32, 32, 32)
  1040.                 .addComponent(LabelStatPanelAmount)
  1041.                 .addGap(34, 34, 34)
  1042.                 .addComponent(LabelEvaluation)
  1043.                 .addGap(42, 42, 42)
  1044.                 .addComponent(ButtonRetest)
  1045.                 .addContainerGap())
  1046.         );
  1047.  
  1048.         PanelAmount.setBounds(0, 0, 600, 366);
  1049.         jLayeredPane1.add(PanelAmount, javax.swing.JLayeredPane.DEFAULT_LAYER);
  1050.  
  1051.         TopMenu.setFocusable(false);
  1052.         TopMenu.setOpaque(false);
  1053.  
  1054.         jmFile.setText("Файл");
  1055.         jmFile.setFocusable(false);
  1056.         jmFile.setRequestFocusEnabled(false);
  1057.  
  1058.         OpenDictionary.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/file.png"))); // NOI18N
  1059.         OpenDictionary.setText("Открыть словарь");
  1060.         OpenDictionary.addActionListener(new java.awt.event.ActionListener() {
  1061.             public void actionPerformed(java.awt.event.ActionEvent evt) {
  1062.                 EVT_TopMenuFileOpenDictionaryActionPerformed(evt);
  1063.             }
  1064.         });
  1065.         jmFile.add(OpenDictionary);
  1066.  
  1067.         CloseDictionary.setText("Закрыть словарь");
  1068.         CloseDictionary.setEnabled(false);
  1069.         CloseDictionary.addActionListener(new java.awt.event.ActionListener() {
  1070.             public void actionPerformed(java.awt.event.ActionEvent evt) {
  1071.                 EVT_TopMenuFileCloseDictionaryActionPerformed(evt);
  1072.             }
  1073.         });
  1074.         jmFile.add(CloseDictionary);
  1075.  
  1076.         Start.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/start.png"))); // NOI18N
  1077.         Start.setText("Старт");
  1078.         Start.setToolTipText("Начать обучение по выбранному в настройках словарю");
  1079.         Start.setEnabled(false);
  1080.         Start.addActionListener(new java.awt.event.ActionListener() {
  1081.             public void actionPerformed(java.awt.event.ActionEvent evt) {
  1082.                 EVT_TopMenuFileStartActionPerformed(evt);
  1083.             }
  1084.         });
  1085.         jmFile.add(Start);
  1086.         jmFile.add(MenuSeparator1);
  1087.  
  1088.         Setting.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/settings.png"))); // NOI18N
  1089.         Setting.setText("Настройки");
  1090.         Setting.addActionListener(new java.awt.event.ActionListener() {
  1091.             public void actionPerformed(java.awt.event.ActionEvent evt) {
  1092.                 EVT_TopMenuFileSettingActionPerformed(evt);
  1093.             }
  1094.         });
  1095.         jmFile.add(Setting);
  1096.         jmFile.add(MenuSeparator2);
  1097.  
  1098.         Exit.setText("Выход");
  1099.         Exit.addActionListener(new java.awt.event.ActionListener() {
  1100.             public void actionPerformed(java.awt.event.ActionEvent evt) {
  1101.                 EVT_TopMenuFileExitActionPerformed(evt);
  1102.             }
  1103.         });
  1104.         jmFile.add(Exit);
  1105.  
  1106.         TopMenu.add(jmFile);
  1107.  
  1108.         jmEdit.setText("Правка");
  1109.  
  1110.         ShowTranslate.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/tip.png"))); // NOI18N
  1111.         ShowTranslate.setText("Показать перевод");
  1112.         ShowTranslate.setEnabled(false);
  1113.         ShowTranslate.addActionListener(new java.awt.event.ActionListener() {
  1114.             public void actionPerformed(java.awt.event.ActionEvent evt) {
  1115.                 EVT_TopMenuEditShowTranslateActionPerformed(evt);
  1116.             }
  1117.         });
  1118.         jmEdit.add(ShowTranslate);
  1119.  
  1120.         NextWord.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/next.png"))); // NOI18N
  1121.         NextWord.setText("Следующее слово");
  1122.         NextWord.setEnabled(false);
  1123.         NextWord.addActionListener(new java.awt.event.ActionListener() {
  1124.             public void actionPerformed(java.awt.event.ActionEvent evt) {
  1125.                 EVT_TopMenuEditNextWordActionPerformed(evt);
  1126.             }
  1127.         });
  1128.         jmEdit.add(NextWord);
  1129.  
  1130.         TopMenu.add(jmEdit);
  1131.  
  1132.         jmHelp.setText("Справка");
  1133.  
  1134.         About.setText("О программе");
  1135.         About.addActionListener(new java.awt.event.ActionListener() {
  1136.             public void actionPerformed(java.awt.event.ActionEvent evt) {
  1137.                 EVT_TopMenuHelpAboutActionPerformed(evt);
  1138.             }
  1139.         });
  1140.         jmHelp.add(About);
  1141.  
  1142.         TopMenu.add(jmHelp);
  1143.  
  1144.         setJMenuBar(TopMenu);
  1145.  
  1146.         javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
  1147.         getContentPane().setLayout(layout);
  1148.         layout.setHorizontalGroup(
  1149.             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  1150.             .addComponent(jLayeredPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 600, Short.MAX_VALUE)
  1151.         );
  1152.         layout.setVerticalGroup(
  1153.             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  1154.             .addComponent(jLayeredPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 367, Short.MAX_VALUE)
  1155.         );
  1156.  
  1157.         pack();
  1158.     }// </editor-fold>                        
  1159.  
  1160.    
  1161.    
  1162. //============================ОБРАБОТЧИКИ СОБЫТИЙ===============================
  1163.     //меню - настройки
  1164.     private void EVT_TopMenuFileSettingActionPerformed(java.awt.event.ActionEvent evt) {                                                      
  1165.        DialogSetting dialog = new DialogSetting(this, true);
  1166.        dialog.dispose();
  1167.     }                                                      
  1168.    
  1169.     //меню - выход
  1170.     private void EVT_TopMenuFileExitActionPerformed(java.awt.event.ActionEvent evt) {                                                    
  1171.         Exit();
  1172.     }                                                  
  1173.  
  1174.     //меню - о программе
  1175.     private void EVT_TopMenuHelpAboutActionPerformed(java.awt.event.ActionEvent evt) {                                                    
  1176.         JOptionPane.showMessageDialog(this, "Программа для заучивания английских слов, версия: " + setting.version, "О программе", JOptionPane.INFORMATION_MESSAGE);
  1177.     }                                                    
  1178.    
  1179.     //перед выходом - сохранить настройки программы
  1180.     private void EVT_FormWindowClosing(java.awt.event.WindowEvent evt) {                                      
  1181.         Exit();
  1182.     }                                      
  1183.  
  1184.     //изменение размеров окна
  1185.     private void EVT_FormComponentResized(java.awt.event.ComponentEvent evt) {                                          
  1186.         PanelMainFrame.setSize(getContentPane().getSize().width, getContentPane().getSize().height);
  1187.         PanelAmount.setSize(getContentPane().getSize().width, getContentPane().getSize().height);
  1188.        
  1189.         //сохранять в настройках размеры окна только в том случае, если это пользователь изменяет размеры,
  1190.         //а не, например, в результате изменения размеров окна в функции ShowAmount().
  1191.         if(!blockEVT_FormComponentResized)
  1192.             setting.currentSettings.put("com_windowSize", new Dimension(this.getSize()));
  1193.     }                                        
  1194.  
  1195.     //запрещение кнопки maximized/minimized
  1196.     private void EVT_FormWindowStateChanged(java.awt.event.WindowEvent evt) {                                            
  1197.         if(evt.getNewState() == Frame.MAXIMIZED_BOTH){
  1198.             this.setExtendedState(Frame.NORMAL);
  1199.         }
  1200.     }                                          
  1201.  
  1202.     //меню - открыть словарь
  1203.     private void EVT_TopMenuFileOpenDictionaryActionPerformed(java.awt.event.ActionEvent evt) {                                                              
  1204.         OpenDictionary();        
  1205.     }                                                            
  1206.  
  1207.     //меню - закрыть словарь
  1208.     private void EVT_TopMenuFileCloseDictionaryActionPerformed(java.awt.event.ActionEvent evt) {                                                              
  1209.         Stop();
  1210.     }                                                              
  1211.  
  1212.     //меню - старт
  1213.     private void EVT_TopMenuFileStartActionPerformed(java.awt.event.ActionEvent evt) {                                                    
  1214.         //запуск изучения слов(если возможно)
  1215.         File currentDictionary = (File)setting.currentSettings.get("dic_selectedDictionary");
  1216.         if(currentDictionary != null){
  1217.             Start(currentDictionary);
  1218.         }
  1219.        
  1220.         SetSetting();//установка состояний элементов формы
  1221.     }                                                    
  1222.  
  1223.     //меню - показать правильный перевод
  1224.     private void EVT_TopMenuEditShowTranslateActionPerformed(java.awt.event.ActionEvent evt) {                                                            
  1225.         ShowRightTranslate();
  1226.     }                                                            
  1227.  
  1228.     //следующее слово(клик по строке со словом)
  1229.     private void EVT_LabelWordMouseClicked(java.awt.event.MouseEvent evt) {                                          
  1230.         NextWord();
  1231.     }                                          
  1232.  
  1233.     //кнопка - показать правильный перевод
  1234.     private void EVT_ShowTranslateButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                        
  1235.         ShowRightTranslate();
  1236.     }                                                      
  1237.    
  1238.     //кнопка - следующее слово
  1239.     private void EVT_NextWordButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                  
  1240.         NextWord();
  1241.     }                                                  
  1242.  
  1243.     //меню - следующее слово
  1244.     private void EVT_TopMenuEditNextWordActionPerformed(java.awt.event.ActionEvent evt) {                                                        
  1245.         NextWord();
  1246.     }                                                      
  1247.  
  1248.     //клик по списку с переводами(проверка ответа)
  1249.     private void EVT_TranslatesListMouseClicked(java.awt.event.MouseEvent evt) {                                                
  1250.         if(translatesListMouseListener){
  1251.             if(isStarted){
  1252.                 //если ответ верный
  1253.                 if(CheckAnswer(TranslatesList.getSelectedIndex())){
  1254.                     ShowWord();
  1255.  
  1256.                     Point p = new Point(evt.getX(),evt.getY());
  1257.                     TranslatesList.setSelectedIndex(TranslatesList.locationToIndex(p));
  1258.                 }
  1259.                 //если ответ неверный
  1260.                 else{
  1261.                     if((WrongAnswerMode)setting.currentSettings.get("mod_wrongAnswerMode") == WrongAnswerMode.STOP_SHOW_WORD){
  1262.                         translatesListMouseListener = false;//отключить обработчики событий TranslatesList
  1263.                         currentWrongTranslateIndex = TranslatesList.getSelectedIndex();  
  1264.                    
  1265.                         //выделение красным цветом неправильного варианта ответа
  1266.                         //установка ListCellRenderer
  1267.                         Font font = (Font)setting.currentSettings.get("foc_Default_translatesListFont");
  1268.                         Color fontColor = (Color)setting.currentSettings.get("foc_Default_translatesListForeground");
  1269.                         BackgroundType backgroundType = (BackgroundType)setting.currentSettings.get("foc_Default_translatesListBackgroundType");
  1270.                         Color backgroundColor = (Color)setting.currentSettings.get("foc_Default_translatesListBackground");
  1271.                         BackgroundType selectionType = BackgroundType.COLOR;  
  1272.                         Color selectionBackgroundColor = Color.RED;
  1273.                         ((ImageJList)TranslatesList).setListCellRenderer(font, fontColor, backgroundType, backgroundColor, selectionType, selectionBackgroundColor);
  1274.                         //перезагрузка списка переводов
  1275.                         ((ImageJList)TranslatesList).Reload();
  1276.                     }
  1277.                     else
  1278.                         ShowWord();
  1279.                    
  1280.                     ShowStat("showStat");
  1281.                 }
  1282.             }
  1283.         }
  1284.         else{
  1285.             TranslatesList.setSelectedIndex(currentWrongTranslateIndex);
  1286.         }
  1287.     }                                              
  1288.  
  1289.     //подсветка пунктов списка с переводами при наведении мыши
  1290.     private void EVT_TranslatesListMouseMoved(java.awt.event.MouseEvent evt) {                                              
  1291.         if(translatesListMouseListener){
  1292.             //восстановление цвета выделения переводов при наведении мыши с зеленого на цвет установленный в настройках,
  1293.             //если ранее пользователь нажимал кнопку Показать правильный перевод и правильный перевод был выделен зеленый цветом
  1294.            
  1295.             //установка ListCellRenderer
  1296.             Font font = (Font)setting.currentSettings.get("foc_Default_translatesListFont");
  1297.             Color fontColor = (Color)setting.currentSettings.get("foc_Default_translatesListForeground");
  1298.             BackgroundType backgroundType = (BackgroundType)setting.currentSettings.get("foc_Default_translatesListBackgroundType");
  1299.             Color backgroundColor = (Color)setting.currentSettings.get("foc_Default_translatesListBackground");
  1300.             BackgroundType selectionType  = (BackgroundType)setting.currentSettings.get("foc_Default_translatesListSelectionType");  
  1301.             Color selectionBackgroundColor = (Color)setting.currentSettings.get("foc_Default_translatesListSelectionBackground");
  1302.             ((ImageJList)TranslatesList).setListCellRenderer(font, fontColor, backgroundType, backgroundColor, selectionType, selectionBackgroundColor);
  1303.             //перезагрузка списка переводов
  1304.             ((ImageJList)TranslatesList).Reload();
  1305.            
  1306.             Point p = new Point(evt.getX(), evt.getY());
  1307.             TranslatesList.setSelectedIndex(TranslatesList.locationToIndex(p));
  1308.         }
  1309.     }                                            
  1310.  
  1311.     //используется для отмены стандартного поведения при клике после неправильного ответа
  1312.     private void EVT_TranslatesListMousePressed(java.awt.event.MouseEvent evt) {                                                
  1313.         if(!translatesListMouseListener){
  1314.             //установка ListCellRenderer
  1315.             Font font = (Font)setting.currentSettings.get("foc_Default_translatesListFont");
  1316.             Color fontColor = (Color)setting.currentSettings.get("foc_Default_translatesListForeground");
  1317.             BackgroundType backgroundType = (BackgroundType)setting.currentSettings.get("foc_Default_translatesListBackgroundType");
  1318.             Color backgroundColor = (Color)setting.currentSettings.get("foc_Default_translatesListBackground");
  1319.             BackgroundType selectionType = BackgroundType.COLOR;  
  1320.             Color selectionBackgroundColor = Color.RED;
  1321.             ((ImageJList)TranslatesList).setListCellRenderer(font, fontColor, backgroundType, backgroundColor, selectionType, selectionBackgroundColor);
  1322.             //перезагрузка списка переводов
  1323.             ((ImageJList)TranslatesList).Reload();
  1324.            
  1325.             TranslatesList.setSelectedIndex(currentWrongTranslateIndex);
  1326.         }
  1327.     }                                              
  1328.  
  1329.     //используется для отмены стандартного поведения при перетягивании мышью после неправильного ответа
  1330.     private void EVT_TranslatesListMouseDragged(java.awt.event.MouseEvent evt) {                                                
  1331.         if(!translatesListMouseListener)
  1332.             TranslatesList.setSelectedIndex(currentWrongTranslateIndex);
  1333.     }                                              
  1334.  
  1335.     //кнопка запуска текущего теста еще раз
  1336.     private void EVT_ButtonRetestActionPerformed(java.awt.event.ActionEvent evt) {                                                
  1337.         Start(currentDictionaryFile);
  1338.        
  1339.         SetSetting();//установка состояний элементов формы
  1340.     }                                                
  1341.  
  1342.            
  1343.    
  1344.     // Variables declaration - do not modify                    
  1345.     private javax.swing.JMenuItem About;
  1346.     private javax.swing.JButton ButtonRetest;
  1347.     private javax.swing.JMenuItem CloseDictionary;
  1348.     private javax.swing.JMenuItem Exit;
  1349.     private javax.swing.JLabel LabelEvaluation;
  1350.     private javax.swing.JLabel LabelStatPanelAmount;
  1351.     private javax.swing.JLabel LabelStatPanelMainFrame;
  1352.     public javax.swing.JLabel LabelWord;
  1353.     private javax.swing.JPopupMenu.Separator MenuSeparator1;
  1354.     private javax.swing.JPopupMenu.Separator MenuSeparator2;
  1355.     private javax.swing.JMenuItem NextWord;
  1356.     private javax.swing.JButton NextWordButton;
  1357.     private javax.swing.JMenuItem OpenDictionary;
  1358.     private javax.swing.JPanel PanelAmount;
  1359.     private javax.swing.JPanel PanelAnswerResult;
  1360.     private javax.swing.JPanel PanelMainFrame;
  1361.     private javax.swing.JScrollPane ScrollPaneTranslatesList;
  1362.     private javax.swing.JMenuItem Setting;
  1363.     private javax.swing.JMenuItem ShowTranslate;
  1364.     private javax.swing.JButton ShowTranslateButton;
  1365.     private javax.swing.JMenuItem Start;
  1366.     private javax.swing.JMenuBar TopMenu;
  1367.     private javax.swing.JList TranslatesList;
  1368.     private javax.swing.JLabel jLabel1;
  1369.     private javax.swing.JLayeredPane jLayeredPane1;
  1370.     private javax.swing.JMenu jmEdit;
  1371.     private javax.swing.JMenu jmFile;
  1372.     private javax.swing.JMenu jmHelp;
  1373.     // End of variables declaration                  
  1374. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement