package bluej.prefmgr;

import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import javax.swing.KeyStroke;

import bluej.pkgmgr.Project;
import bluej.debugger.RunOnThread;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Control;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCodeCombination;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;

import bluej.Boot;
import bluej.Config;
import bluej.collect.DataCollector;
import bluej.utility.javafx.JavaFXUtil;
import threadchecker.OnThread;
import threadchecker.Tag;


| A PrefPanel subclass to allow the user to interactively edit | various miscellaneous settings | | @author Andrew Patterson | @OnThread(Tag.FXPlatform) public class MiscPrefPanel extends VBox implements PrefPanelListener{ private static final String bluejJdkURL = "bluej.url.javaStdLib"; private static final String greenfootJdkURL = "greenfoot.url.javaStdLib"; private TextField jdkURLField; private CheckBox linkToLibBox; private CheckBox showUncheckedBox; private String jdkURLPropertyName; private TextField playerNameField; private TextField participantIdentifierField; private TextField experimentIdentifierField; private Label statusLabel; private ComboBox<RunOnThread> runOnThread; private Node threadRunSetting;
| Setup the UI for the dialog and event handlers for the buttons. | public MiscPrefPanel() { JavaFXUtil.addStyleClass(this, "prefmgr-pref-panel"); if (Config.isGreenfoot()) { jdkURLPropertyName = greenfootJdkURL; } else { jdkURLPropertyName = bluejJdkURL; } getChildren().add(makeDocumentationPanel()); if (Config.isGreenfoot()) { getChildren().add(makePlayerNamePanel()); if (Boot.isTrialRecording()) { getChildren().add(makeDataCollectionPanel()); } } else { getChildren().add(makeVMPanel()); getChildren().add(makeDataCollectionPanel()); } } private Node makeDataCollectionPanel() { List<Node> dataCollectionPanel = new ArrayList<>(); { statusLabel = new Label(DataCollector.getOptInOutStatus()); statusLabel.setMinWidth(100.0); Button optButton = new Button(Config.getString("prefmgr.collection.change")); optButton.setOnAction(e ->{ DataCollector.changeOptInOut(false); statusLabel.setText(DataCollector.getOptInOutStatus()); }); optButton.setMinWidth(Control.USE_PREF_SIZE); dataCollectionPanel.add(PrefMgrDialog.labelledItem(statusLabel, optButton)); } { Label identifierLabel = new Label(Config.getString("prefmgr.collection.identifier.explanation") + ":"); dataCollectionPanel.add(identifierLabel); GridPane experimentParticipantPanel = new GridPane(); JavaFXUtil.addStyleClass(experimentParticipantPanel, "prefmgr-experiment-participant"); Label experimentLabel = new Label(Config.getString("prefmgr.collection.identifier.experiment")); experimentParticipantPanel.add(experimentLabel, 0, 0); experimentIdentifierField = new TextField(); experimentParticipantPanel.add(experimentIdentifierField, 1, 0); Label participantLabel = new Label(Config.getString("prefmgr.collection.identifier.participant")); experimentParticipantPanel.add(participantLabel, 0, 1); participantIdentifierField = new TextField(); experimentParticipantPanel.add(participantIdentifierField, 1, 1); dataCollectionPanel.add(experimentParticipantPanel); } return PrefMgrDialog.headedVBox("prefmgr.collection.title", dataCollectionPanel); } private Node makeVMPanel() { showUncheckedBox = new CheckBox(Config.getString("prefmgr.misc.showUnchecked")); ObservableList<RunOnThread> runOnThreadPoss = FXCollections.observableArrayList(RunOnThread.DEFAULT, RunOnThread.FX, RunOnThread.SWING); runOnThread = new ComboBox<>(runOnThreadPoss); threadRunSetting = PrefMgrDialog.labelledItem("prefmgr.misc.runOnThread", runOnThread); return PrefMgrDialog.headedVBox("prefmgr.misc.vm.title", Arrays.asList(showUncheckedBox, threadRunSetting)); } private Node makePlayerNamePanel() { List<Node> contents = new ArrayList<>(); KeyCodeCombination accelerator = Config.GREENFOOT_SET_PLAYER_NAME_SHORTCUT; String shortcutText = " " + accelerator.getDisplayText(); playerNameField = new TextField(PrefMgr.getPlayerName().get()); playerNameField.setPrefColumnCount(20); contents.add(PrefMgrDialog.labelledItem("playername.dialog.help", playerNameField)); contents.add(PrefMgrDialog.wrappedLabel(Config.getString("prefmgr.misc.playerNameNote") + shortcutText)); return PrefMgrDialog.headedVBox("prefmgr.misc.playername.title", contents); } private Node makeDocumentationPanel() { List<Node> contents = new ArrayList<>(); this.jdkURLField = new TextField(); JavaFXUtil.addStyleClass(jdkURLField, "prefmgr-jdk-url"); contents.add(PrefMgrDialog.labelledItem("prefmgr.misc.jdkurlpath", jdkURLField)); linkToLibBox = new CheckBox(Config.getString("prefmgr.misc.linkToLib")); contents.add(linkToLibBox); contents.add(PrefMgrDialog.wrappedLabel(Config.getStringList("prefmgr.misc.linkToLibNoteLine").stream().collect(Collectors.joining(" ")))); return PrefMgrDialog.headedVBox("prefmgr.misc.documentation.title", contents); } public void beginEditing(Project project) { linkToLibBox.setSelected(PrefMgr.getFlag(PrefMgr.LINK_LIB)); jdkURLField.setText(Config.getPropString(jdkURLPropertyName)); if (!Config.isGreenfoot()) { showUncheckedBox.setSelected(PrefMgr.getFlag(PrefMgr.SHOW_UNCHECKED)); if (project == null) { threadRunSetting.setVisible(false); threadRunSetting.setManaged(false); } else { runOnThread.getSelectionModel().select(project.getRunOnThread()); threadRunSetting.setVisible(true); threadRunSetting.setManaged(true); } statusLabel.setText(DataCollector.getOptInOutStatus()); experimentIdentifierField.setText(DataCollector.getExperimentIdentifier()); participantIdentifierField.setText(DataCollector.getParticipantIdentifier()); } else { playerNameField.setText(PrefMgr.getPlayerName().get()); } } public void revertEditing(Project project) { } public void commitEditing(Project project) { PrefMgr.setFlag(PrefMgr.LINK_LIB, linkToLibBox.isSelected()); if (!Config.isGreenfoot()) { PrefMgr.setFlag(PrefMgr.SHOW_UNCHECKED, showUncheckedBox.isSelected()); if (project != null) { project.setRunOnThread(runOnThread.getSelectionModel().getSelectedItem()); } String expId = experimentIdentifierField.getText(); String partId = participantIdentifierField.getText(); DataCollector.setExperimentIdentifier(expId); DataCollector.setParticipantIdentifier(partId); } String jdkURL = jdkURLField.getText(); Config.putPropString(jdkURLPropertyName, jdkURL); if (Config.isGreenfoot()) { PrefMgr.getPlayerName().set(playerNameField.getText()); } } }
top, use, map, class MiscPrefPanel

.   MiscPrefPanel
.   makeDataCollectionPanel
.   makeVMPanel
.   makePlayerNamePanel
.   makeDocumentationPanel
.   beginEditing
.   revertEditing
.   commitEditing




250 neLoCode + 4 LoComm