/* (non-Javadoc)
   * @see forge.control.home.IControlSubmenu#update()
   */
  @Override
  public void update() {
    updating =
        true; // prevent itemStateChanged causing prefs to be saved or other logic occurring while
    // updating values

    this.view = VSubmenuPreferences.SINGLETON_INSTANCE;
    this.prefs = FModel.getPreferences();

    setPlayerNameButtonText();
    view.getCbDevMode().setSelected(ForgePreferences.DEV_MODE);
    view.getCbEnableMusic().setSelected(prefs.getPrefBoolean(FPref.UI_ENABLE_MUSIC));

    for (final Pair<JCheckBox, FPref> kv : lstControls) {
      kv.getKey().setSelected(prefs.getPrefBoolean(kv.getValue()));
    }
    view.reloadShortcuts();

    SwingUtilities.invokeLater(
        new Runnable() {
          @Override
          public void run() {
            view.getCbRemoveSmall().requestFocusInWindow();
          }
        });

    updating = false;
  }
  /* (non-Javadoc)
   * @see forge.control.home.IControlSubmenu#update()
   */
  @SuppressWarnings("serial")
  @Override
  public void initialize() {

    this.view = VSubmenuPreferences.SINGLETON_INSTANCE;
    this.prefs = FModel.getPreferences();

    // This updates variable right now and is not standard
    view.getCbDevMode()
        .addItemListener(
            new ItemListener() {
              @Override
              public void itemStateChanged(final ItemEvent arg0) {
                if (updating) {
                  return;
                }

                final boolean toggle = view.getCbDevMode().isSelected();
                prefs.setPref(FPref.DEV_MODE_ENABLED, String.valueOf(toggle));
                ForgePreferences.DEV_MODE = toggle;
                prefs.save();
              }
            });

    // This updates background track immediately and is not standard
    view.getCbEnableMusic()
        .addItemListener(
            new ItemListener() {
              @Override
              public void itemStateChanged(final ItemEvent arg0) {
                if (updating) {
                  return;
                }

                final boolean toggle = view.getCbEnableMusic().isSelected();
                prefs.setPref(FPref.UI_ENABLE_MUSIC, String.valueOf(toggle));
                prefs.save();
                SoundSystem.instance.changeBackgroundTrack();
              }
            });

    lstControls.clear(); // just in case
    lstControls.add(Pair.of(view.getCbAnte(), FPref.UI_ANTE));
    lstControls.add(Pair.of(view.getCbAnteMatchRarity(), FPref.UI_ANTE_MATCH_RARITY));
    lstControls.add(Pair.of(view.getCbManaBurn(), FPref.UI_MANABURN));
    lstControls.add(Pair.of(view.getCbScaleLarger(), FPref.UI_SCALE_LARGER));
    lstControls.add(Pair.of(view.getCbLargeCardViewers(), FPref.UI_LARGE_CARD_VIEWERS));
    lstControls.add(Pair.of(view.getCbRandomArtInPools(), FPref.UI_RANDOM_ART_IN_POOLS));
    lstControls.add(Pair.of(view.getCbEnforceDeckLegality(), FPref.ENFORCE_DECK_LEGALITY));
    lstControls.add(Pair.of(view.getCbCloneImgSource(), FPref.UI_CLONE_MODE_SOURCE));
    lstControls.add(Pair.of(view.getCbRemoveSmall(), FPref.DECKGEN_NOSMALL));
    lstControls.add(Pair.of(view.getCbRemoveArtifacts(), FPref.DECKGEN_ARTIFACTS));
    lstControls.add(Pair.of(view.getCbSingletons(), FPref.DECKGEN_SINGLETONS));
    lstControls.add(Pair.of(view.getCbEnableAICheats(), FPref.UI_ENABLE_AI_CHEATS));
    lstControls.add(Pair.of(view.getCbDisplayFoil(), FPref.UI_OVERLAY_FOIL_EFFECT));
    lstControls.add(Pair.of(view.getCbRandomFoil(), FPref.UI_RANDOM_FOIL));
    lstControls.add(Pair.of(view.getCbEnableSounds(), FPref.UI_ENABLE_SOUNDS));
    lstControls.add(Pair.of(view.getCbAltSoundSystem(), FPref.UI_ALT_SOUND_SYSTEM));
    lstControls.add(Pair.of(view.getCbUiForTouchScreen(), FPref.UI_FOR_TOUCHSCREN));
    lstControls.add(Pair.of(view.getCbCompactMainMenu(), FPref.UI_COMPACT_MAIN_MENU));
    lstControls.add(Pair.of(view.getCbPromptFreeBlocks(), FPref.MATCHPREF_PROMPT_FREE_BLOCKS));
    lstControls.add(Pair.of(view.getCbPauseWhileMinimized(), FPref.UI_PAUSE_WHILE_MINIMIZED));
    lstControls.add(Pair.of(view.getCbWorkshopSyntax(), FPref.DEV_WORKSHOP_SYNTAX));

    lstControls.add(Pair.of(view.getCbCompactPrompt(), FPref.UI_COMPACT_PROMPT));
    lstControls.add(Pair.of(view.getCbHideReminderText(), FPref.UI_HIDE_REMINDER_TEXT));
    lstControls.add(Pair.of(view.getCbOpenPacksIndiv(), FPref.UI_OPEN_PACKS_INDIV));
    lstControls.add(Pair.of(view.getCbTokensInSeparateRow(), FPref.UI_TOKENS_IN_SEPARATE_ROW));
    lstControls.add(Pair.of(view.getCbStackCreatures(), FPref.UI_STACK_CREATURES));
    lstControls.add(Pair.of(view.getCbManaLostPrompt(), FPref.UI_MANA_LOST_PROMPT));

    lstControls.add(
        Pair.of(view.getCbFilterLandsByColorId(), FPref.UI_FILTER_LANDS_BY_COLOR_IDENTITY));

    for (final Pair<JCheckBox, FPref> kv : lstControls) {
      kv.getKey()
          .addItemListener(
              new ItemListener() {
                @Override
                public void itemStateChanged(final ItemEvent arg0) {
                  if (updating) {
                    return;
                  }

                  prefs.setPref(kv.getValue(), String.valueOf(kv.getKey().isSelected()));
                  prefs.save();
                }
              });
    }

    view.getBtnReset()
        .setCommand(
            new UiCommand() {
              @Override
              public void run() {
                CSubmenuPreferences.this.resetForgeSettingsToDefault();
              }
            });

    view.getBtnDeleteEditorUI()
        .setCommand(
            new UiCommand() {
              @Override
              public void run() {
                CSubmenuPreferences.this.resetDeckEditorLayout();
              }
            });

    view.getBtnDeleteWorkshopUI()
        .setCommand(
            new UiCommand() {
              @Override
              public void run() {
                CSubmenuPreferences.this.resetWorkshopLayout();
              }
            });

    view.getBtnDeleteMatchUI()
        .setCommand(
            new UiCommand() {
              @Override
              public void run() {
                CSubmenuPreferences.this.resetMatchScreenLayout();
              }
            });

    view.getBtnUserProfileUI()
        .setCommand(
            new UiCommand() {
              @Override
              public void run() {
                CSubmenuPreferences.this.openUserProfileDirectory();
              }
            });

    view.getBtnContentDirectoryUI()
        .setCommand(
            new UiCommand() {
              @Override
              public void run() {
                CSubmenuPreferences.this.openContentDirectory();
              }
            });

    initializeGameLogVerbosityComboBox();
    initializeCloseActionComboBox();
    initializeAiProfilesComboBox();
    initializeColorIdentityCombobox();
    initializePlayerNameButton();
  }
 private void setPlayerNameButtonText() {
   final FLabel btn = view.getBtnPlayerName();
   final String name = prefs.getPref(FPref.PLAYER_NAME);
   btn.setText(StringUtils.isBlank(name) ? "Human" : name);
 }
 private void initializePlayerNameButton() {
   final FLabel btn = view.getBtnPlayerName();
   setPlayerNameButtonText();
   btn.setCommand(getPlayerNameButtonCommand());
 }