content: package featurecat.lizzie.gui;
  
  import featurecat.lizzie.Lizzie;
  
  import javax.swing.*;
  import java.awt.*;
  import java.awt.event.ComponentAdapter;
  import java.awt.event.ComponentEvent;
  import java.awt.event.MouseAdapter;
  import java.awt.event.MouseEvent;
  import java.util.ResourceBundle;
  
  @SuppressWarnings("serial")
  public class AnalysisFrame extends JPanel {
      private static final ResourceBundle resourceBundle = ResourceBundle.getBundle("featurecat.lizzie.i18n.GuiBundle");
  
      private JTable analysisTable;
      private AnalysisTableModel analysisTableModel;
  
      public AnalysisTableModel getAnalysisTableModel() {
          return analysisTableModel;
      }
  
      public JTable getAnalysisTable() {
          return analysisTable;
      }
  
      public AnalysisFrame() {
          super(new BorderLayout());
  
          analysisTableModel = new AnalysisTableModel();
          analysisTable = new JTable(analysisTableModel);
          analysisTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
          analysisTable.setFillsViewportHeight(true);
  
          analysisTable.getColumnModel().getColumn(0).setPreferredWidth(50);
          analysisTable.getColumnModel().getColumn(1).setPreferredWidth(50);
          analysisTable.getColumnModel().getColumn(2).setPreferredWidth(65);
          analysisTable.getColumnModel().getColumn(3).setPreferredWidth(50);
          analysisTable.getColumnModel().getColumn(4).setPreferredWidth(650);
  
          // Create the scroll pane and add the table to it.
          // Official programming recommend, or the table head will not show
          JScrollPane scrollPane = new JScrollPane(analysisTable);
          add(scrollPane);
  
          analysisTableModel.setHostTable(analysisTable);
          analysisTable.addMouseListener(new MouseAdapter() {
              @Override
              public void mouseClicked(MouseEvent e) {
                  int row = analysisTable.rowAtPoint(e.getPoint());
                  int col = analysisTable.columnAtPoint(e.getPoint());
                  if (row >= 0 && col >= 0) {
                      try {
                          handleTableClick(row, col);
                      } catch (Exception ex) {
                          ex.printStackTrace();
                      }
                  }
              }
          });
      }
  
      private void handleTableClick(int row, int col) {
          if ((Lizzie.board.getData().isBlackToPlay() && Lizzie.optionSetting.isShowBlackSuggestion()
                  || !Lizzie.board.getData().isBlackToPlay() && Lizzie.optionSetting.isShowWhiteSuggestion())) {
              if (row == analysisTableModel.getSelectedMoveIndex()) {
                  analysisTable.clearSelection();
                  analysisTableModel.setSelectedMove(null);
              } else {
                  analysisTableModel.setSelectedMoveByIndex(row);
              }
  
              Lizzie.frame.repaint();
          } else {
              analysisTable.clearSelection();
          }
      }
  
      /**
       * Create the GUI and show it. For thread safety, this method should be
       * invoked from the event-dispatching thread.
       */
      public static JDialog createAnalysisDialog(JFrame owner) {
          // Create and set up the window.
          JDialog dialog = new JDialog(owner, resourceBundle.getString("AnalysisFrame.title"));
  
          // Create and set up the content pane.
          final AnalysisFrame newContentPane = new AnalysisFrame();
          newContentPane.setOpaque(true); // content panes must be opaque
          dialog.setContentPane(newContentPane);
  
          // Display the window.
          dialog.setSize(800, 600);
  
          // Handle close event
          dialog.addComponentListener(new ComponentAdapter() {
              @Override
              public void componentHidden(ComponentEvent e) {
                  newContentPane.getAnalysisTableModel().setSelectedMove(null);
                  Lizzie.optionSetting.setAnalysisWindowShow(false);
              }
          });
  
          return dialog;
      }
  }
  