private JPanel getOfficeAiElements()

in languagetool-gui-commons/src/main/java/org/languagetool/gui/ConfigurationDialog.java [2247:2416]


  private JPanel getOfficeAiElements() {
    JPanel aiOptionPanel = new JPanel();
    aiOptionPanel.setLayout(new GridBagLayout());
    GridBagConstraints cons = new GridBagConstraints();
    cons.insets = new Insets(6, 6, 6, 6);
    cons.gridx = 0;
    cons.gridy = 0;
    cons.anchor = GridBagConstraints.NORTHWEST;
    cons.fill = GridBagConstraints.BOTH;
    cons.weightx = 0.0f;
    cons.weighty = 0.0f;
    
    JLabel otherUrlLabel = new JLabel(messages.getString("guiAiUrl") + ":");

    JTextField aiUrlField = new JTextField(config.aiUrl() ==  null ? "" : config.aiUrl(), 25);
    aiUrlField.setMinimumSize(new Dimension(100, 25));
    aiUrlField.getDocument().addDocumentListener(new DocumentListener() {
      @Override
      public void insertUpdate(DocumentEvent e) {
        changedUpdate(e);
      }
      @Override
      public void removeUpdate(DocumentEvent e) {
        changedUpdate(e);
      }
      @Override
      public void changedUpdate(DocumentEvent e) {
        String serverName = aiUrlField.getText();
        serverName = serverName.trim();
        if(serverName.isEmpty()) {
          serverName = null;
        }
        if (config.isValidAiServerUrl(serverName)) {
          aiUrlField.setForeground(Color.BLACK);
          config.setAiUrl(serverName);;
        } else {
          aiUrlField.setForeground(Color.RED);
        }
      }
    });

    JLabel modelLabel = new JLabel(messages.getString("guiAiModel") + ":");

    JTextField modelField = new JTextField(config.aiModel() ==  null ? "" : config.aiModel(), 25);
    modelField.setMinimumSize(new Dimension(100, 25));
    modelField.getDocument().addDocumentListener(new DocumentListener() {
      @Override
      public void insertUpdate(DocumentEvent e) {
        changedUpdate(e);
      }
      @Override
      public void removeUpdate(DocumentEvent e) {
        changedUpdate(e);
      }
      @Override
      public void changedUpdate(DocumentEvent e) {
        String model = modelField.getText();
        model = model.trim();
        if(model.isEmpty()) {
          model = null;
        }
        if (model != null) {
          config.setAiModel(model);
        }
      }
    });

    JLabel apiKeyLabel = new JLabel(messages.getString("guiAiApiKey") + ":");

    JTextField apiKeyField = new JTextField(config.aiApiKey() ==  null ? "" : config.aiApiKey(), 25);
    apiKeyField.setMinimumSize(new Dimension(100, 25));
    apiKeyField.getDocument().addDocumentListener(new DocumentListener() {
      @Override
      public void insertUpdate(DocumentEvent e) {
        changedUpdate(e);
      }
      @Override
      public void removeUpdate(DocumentEvent e) {
        changedUpdate(e);
      }
      @Override
      public void changedUpdate(DocumentEvent e) {
        String apiKey = apiKeyField.getText();
        apiKey = apiKey.trim();
        if(apiKey.isEmpty()) {
          apiKey = null;
        }
        if (apiKey != null) {
          config.setAiApiKey(apiKey);
        }
      }
    });
    
    JCheckBox showStylisticChangesBox = new JCheckBox(messages.getString("guiAiShowStylisticChanges"));
    showStylisticChangesBox.setSelected(config.aiShowStylisticChanges());
    showStylisticChangesBox.addItemListener(e -> {
      config.setAiShowStylisticChanges(showStylisticChangesBox.isSelected());
    });

    JCheckBox autoCorrectBox = new JCheckBox(messages.getString("guiAiAutoCorrect"));
    autoCorrectBox.setSelected(config.aiAutoCorrect());
    autoCorrectBox.addItemListener(e -> {
      config.setAiAutoCorrect(autoCorrectBox.isSelected());
      showStylisticChangesBox.setEnabled(autoCorrectBox.isSelected());
    });

    JCheckBox useAiSupportBox = new JCheckBox(messages.getString("guiUseAiSupport"));
    useAiSupportBox.setSelected(config.useAiSupport());
    useAiSupportBox.addItemListener(e -> {
      config.setUseAiSupport(useAiSupportBox.isSelected());
      aiUrlField.setEnabled(useAiSupportBox.isSelected());
      modelField.setEnabled(useAiSupportBox.isSelected());
      apiKeyField.setEnabled(useAiSupportBox.isSelected());
      autoCorrectBox.setEnabled(useAiSupportBox.isSelected());
      showStylisticChangesBox.setEnabled(useAiSupportBox.isSelected() && autoCorrectBox.isSelected());
    });
    
    aiUrlField.setEnabled(config.useAiSupport());
    modelField.setEnabled(config.useAiSupport());
    apiKeyField.setEnabled(config.useAiSupport());
    autoCorrectBox.setEnabled(config.useAiSupport());
    showStylisticChangesBox.setEnabled(config.useAiSupport() && config.aiAutoCorrect());

    JLabel experimentalHint = new JLabel(messages.getString("guiAiExperimentalHint"));
    experimentalHint.setForeground(Color.red);
    cons.gridy++;
    aiOptionPanel.add(experimentalHint, cons);
    JLabel qualityHint = new JLabel(messages.getString("guiAiQualityHint"));
    qualityHint.setForeground(Color.blue);
    cons.gridy++;
    aiOptionPanel.add(qualityHint, cons);
    JLabel tmp = new JLabel(" ");
    cons.gridy++;
    aiOptionPanel.add(tmp, cons);
    cons.insets = new Insets(0, SHIFT2, 0, 0);
    aiOptionPanel.add(useAiSupportBox, cons);
    JPanel serverPanel = new JPanel();
    serverPanel.setLayout(new GridBagLayout());
    GridBagConstraints cons1 = new GridBagConstraints();
    cons1.insets = new Insets(0, SHIFT2, 0, 0);
    cons1.gridx = 0;
    cons1.gridy = 0;
    cons1.anchor = GridBagConstraints.WEST;
    cons1.fill = GridBagConstraints.NONE;
    cons1.weightx = 0.0f;
    serverPanel.add(otherUrlLabel, cons1);
    cons1.gridy++;
    serverPanel.add(aiUrlField, cons1);
    cons1.gridy++;
    serverPanel.add(modelLabel, cons1);
    cons1.gridy++;
    serverPanel.add(modelField, cons1);
    cons1.gridy++;
    serverPanel.add(apiKeyLabel, cons1);
    cons1.gridy++;
    serverPanel.add(apiKeyField, cons1);

    cons.gridx = 0;
    cons.gridy++;
    aiOptionPanel.add(serverPanel, cons);
    
    cons.gridy++;
    aiOptionPanel.add(autoCorrectBox, cons);
    
    cons.gridy++;
    cons.insets = new Insets(0, SHIFT3, 0, 0);
    aiOptionPanel.add(showStylisticChangesBox, cons);
    
    return aiOptionPanel;
  }