/*
* Jajuk
* Copyright (C) The Jajuk Team
* http://jajuk.info
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
package org.jajuk.ui.views;
import java.awt.SystemTray;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.net.URL;
import java.util.HashMap;
import java.util.Locale;
import java.util.Properties;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.SwingWorker;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.apache.commons.lang.StringUtils;
import org.jajuk.base.AlbumManager;
import org.jajuk.base.DeviceManager;
import org.jajuk.base.File;
import org.jajuk.base.FileManager;
import org.jajuk.base.SearchResult.SearchResultType;
import org.jajuk.events.JajukEvent;
import org.jajuk.events.JajukEvents;
import org.jajuk.events.ObservationManager;
import org.jajuk.services.core.RatingService;
import org.jajuk.services.core.SessionService;
import org.jajuk.services.notification.NotificatorTypes;
import org.jajuk.services.webradio.WebRadio;
import org.jajuk.services.webradio.WebRadioHelper;
import org.jajuk.services.webradio.WebRadioManager;
import org.jajuk.ui.actions.ActionManager;
import org.jajuk.ui.actions.JajukActions;
import org.jajuk.ui.thumbnails.ThumbnailManager;
import org.jajuk.ui.widgets.InformationJPanel;
import org.jajuk.util.Conf;
import org.jajuk.util.Const;
import org.jajuk.util.DownloadManager;
import org.jajuk.util.LocaleManager;
import org.jajuk.util.Messages;
import org.jajuk.util.UtilGUI;
import org.jajuk.util.UtilString;
import org.jajuk.util.UtilSystem;
import org.jajuk.util.log.Log;
/**
* Helper class containing GUI update code from and to configuration.
*/
public class ParameterViewGUIHelper implements ActionListener, ItemListener, ChangeListener {
/** Associated Parameter view. */
ParameterView pv;
/** Do some updates require a restart ?. */
boolean someOptionsAppliedAtNextStartup = false;
/**
* Default constructor.
*
* @param pv the associated parameter view
*/
ParameterViewGUIHelper(ParameterView pv) {
this.pv = pv;
}
/**
* Apply parameters from GUI to configuration.
*/
void updateConfFromGUI() {
// Options
updateConfFromGUIOptions();
// Startup
updateConfFromGUIStartup();
// Confirmations
updateConfFromGUIConfirmation();
// History
updateConfFromGUIHistory();
// Patterns
updateConfFromGUIPatterns();
// Advanced
updateConfFromGUIAdvanced();
// GUI
updateConfFromGUIGUI();
// If jajuk home changes, write new path in bootstrap file
handleWorkspaceChange();
// Network
updateConfFromGUINetwork();
// Covers
updateConfFromGUICover();
// display a message
InformationJPanel.getInstance().setMessage(Messages.getString("ParameterView.109"),
InformationJPanel.MessageType.INFORMATIVE);
}
/**
* Set widgets to specified value in options.
*/
void updateGUIFromConf() {
// History
updateGUIFromConfHistory();
// Confirmations
updateGUIFromConfConfirmations();
// Options
updateGUIFromConfOptions();
// Advanced
updateGUIFromConfAdvanced();
//Startup
updateGUIFromConfStartup();
// Network
updateGUIFromConfNetwork();
// Covers
updateGUIFromConfCovers();
// UI
updateGUIFromConfGUI();
}
/**
* Update history tab.
*
*/
private void updateGUIFromConfHistory() {
pv.jtfHistory.setText(Conf.getString(Const.CONF_HISTORY));
pv.jcbManualRatings.setSelected(Conf.getBoolean(Const.CONF_MANUAL_RATINGS));
}
/**
* Update Confirmations tab.
*
*/
private void updateGUIFromConfConfirmations() {
pv.jcbBeforeDelete.setSelected(Conf.getBoolean(Const.CONF_CONFIRMATIONS_DELETE_FILE));
pv.jcbBeforeExit.setSelected(Conf.getBoolean(Const.CONF_CONFIRMATIONS_EXIT));
pv.jcbBeforeRemoveDevice.setSelected(Conf.getBoolean(Const.CONF_CONFIRMATIONS_REMOVE_DEVICE));
pv.jcbBeforeDeleteCover.setSelected(Conf.getBoolean(Const.CONF_CONFIRMATIONS_DELETE_COVER));
pv.jcbBeforeClearingHistory
.setSelected(Conf.getBoolean(Const.CONF_CONFIRMATIONS_CLEAR_HISTORY));
pv.jcbBeforeResetingRatings
.setSelected(Conf.getBoolean(Const.CONF_CONFIRMATIONS_RESET_RATINGS));
pv.jcbBeforeRefactorFiles.setSelected(Conf.getBoolean(Const.CONF_CONFIRMATIONS_REFACTOR_FILES));
pv.jcbBeforeWritingTag.setSelected(Conf.getBoolean(Const.CONF_CONFIRMATIONS_BEFORE_TAG_WRITE));
}
/**
* Update "Options", "LastFM" and "Modes" tabs.
*/
private void updateGUIFromConfOptions() {
pv.jcbDisplayUnmounted.setSelected(Conf.getBoolean(Const.CONF_OPTIONS_HIDE_UNMOUNTED));
pv.jcbDefaultActionClick.setSelected(Conf.getBoolean(Const.CONF_OPTIONS_PUSH_ON_CLICK));
pv.jcbDefaultActionDrop.setSelected(Conf.getBoolean(Const.CONF_OPTIONS_PUSH_ON_DROP));
pv.jcbHotkeys.setSelected(Conf.getBoolean(Const.CONF_OPTIONS_HOTKEYS));
String rightLanguageDesc = LocaleManager.getDescForLocale(Conf
.getString(Const.CONF_OPTIONS_LANGUAGE));
// Select the right language
int index = 0;
for (String desc : LocaleManager.getLocalesDescs()) {
if (desc.equals(rightLanguageDesc)) {
pv.scbLanguage.setSelectedIndex(index);
break;
}
index++;
}
pv.scbLanguage.addActionListener(this);
pv.scbLogLevel.setSelectedIndex(Integer.parseInt(Conf.getString(Const.CONF_OPTIONS_LOG_LEVEL)));
pv.introLength.setValue(Conf.getInt(Const.CONF_OPTIONS_INTRO_LENGTH));
pv.introPosition.setValue(Conf.getInt(Const.CONF_OPTIONS_INTRO_BEGIN));
pv.jtfBestofSize.setText(Conf.getString(Const.CONF_BESTOF_TRACKS_SIZE));
pv.jtfNoveltiesAge.setText(Conf.getString(Const.CONF_OPTIONS_NOVELTIES_AGE));
pv.crossFadeDuration.setValue(Conf.getInt(Const.CONF_FADE_DURATION));
pv.jcbUseParentDir.setSelected(Conf.getBoolean(Const.CONF_TAGS_USE_PARENT_DIR));
pv.jcbUseVolnorm.setSelected(Conf.getBoolean(Const.CONF_USE_VOLNORM));
pv.jcbEnableBitPerfect.setSelected(Conf.getBoolean(Const.CONF_BIT_PERFECT));
// Disable features incompatible with Bit-perfect mode
pv.jcbUseVolnorm.setEnabled(!pv.jcbEnableBitPerfect.isSelected());
pv.crossFadeDuration.setEnabled(!pv.jcbEnableBitPerfect.isSelected());
pv.jcbShowVideos.setSelected(Conf.getBoolean(Const.CONF_SHOW_VIDEOS));
pv.jcbPreserveFileDates.setSelected(Conf.getBoolean(Const.CONF_PRESERVE_FILE_DATES));
}
/**
* Update Start-up tab.
*/
private void updateGUIFromConfStartup() {
if (Conf.getString(Const.CONF_STARTUP_MODE).equals(Const.STARTUP_MODE_ITEM)) {
pv.jrbFile.setSelected(true);
pv.sbSearch.setEnabled(true);
} else if (Conf.getString(Const.CONF_STARTUP_MODE).equals(Const.STARTUP_MODE_LAST)) {
pv.jrbLast.setSelected(true);
} else if (Conf.getString(Const.CONF_STARTUP_MODE).equals(Const.STARTUP_MODE_LAST_KEEP_POS)) {
pv.jrbLastKeepPos.setSelected(true);
} else if (Conf.getString(Const.CONF_STARTUP_MODE).equals(Const.STARTUP_MODE_NOTHING)) {
pv.jrbNothing.setSelected(true);
} else if (Conf.getString(Const.CONF_STARTUP_MODE).equals(Const.STARTUP_MODE_SHUFFLE)) {
pv.jrbShuffle.setSelected(true);
} else if (Conf.getString(Const.CONF_STARTUP_MODE).equals(Const.STARTUP_MODE_BESTOF)) {
pv.jrbBestof.setSelected(true);
} else if (Conf.getString(Const.CONF_STARTUP_MODE).equals(Const.STARTUP_MODE_NOVELTIES)) {
pv.jrbNovelties.setSelected(true);
}
// set chosen track in file selection
String conf = Conf.getString(Const.CONF_STARTUP_ITEM);
String item = conf.substring(conf.indexOf('/') + 1, conf.length());
if (!StringUtils.isBlank(item)) {
if (conf.matches(SearchResultType.FILE.name() + ".*")) {
File file = FileManager.getInstance().getFileByID(item);
if (file != null) {
pv.sbSearch.setText(file.getTrack().getName());
} else {
// the file exists no more, remove its id as startup file
Conf.setProperty(Const.CONF_STARTUP_ITEM, "");
}
} else if (conf.matches(SearchResultType.WEBRADIO.name() + ".*")) {
WebRadio radio = WebRadioManager.getInstance().getWebRadioByName(item);
if (radio != null) {
pv.sbSearch.setText(radio.getName());
} else {
// the file exists no more, remove its id as startup file
Conf.setProperty(Const.CONF_STARTUP_ITEM, "");
}
}
} else {
pv.sbSearch.setText("");
}
}
/**
* Update advanced tab.
*
*/
private void updateGUIFromConfAdvanced() {
final int backupSize = Conf.getInt(Const.CONF_BACKUP_SIZE);
if (backupSize <= 0) { // backup size =0 means no backup
pv.jcbBackup.setSelected(false);
pv.backupSize.setEnabled(false);
} else {
pv.jcbBackup.setSelected(true);
pv.backupSize.setEnabled(true);
}
pv.backupSize.setValue(backupSize);
pv.jtfRefactorPattern.setText(Conf.getString(Const.CONF_PATTERN_REFACTOR));
pv.jtfAnimationPattern.setText(Conf.getString(Const.CONF_PATTERN_ANIMATION));
pv.jtfFrameTitle.setText(Conf.getString(Const.CONF_PATTERN_FRAME_TITLE));
pv.jtfBalloonNotifierPattern.setText(Conf.getString(Const.CONF_PATTERN_BALLOON_NOTIFIER));
pv.jtfInformationPattern.setText(Conf.getString(Const.CONF_PATTERN_INFORMATION));
pv.jtfMPlayerPath.setText(Conf.getString(Const.CONF_MPLAYER_PATH_FORCED));
pv.jtfMPlayerArgs.setText(Conf.getString(Const.CONF_MPLAYER_ARGS));
pv.jtfEnvVariables.setText(Conf.getString(Const.CONF_ENV_VARIABLES));
pv.jtfExplorerPath.setText(Conf.getString(Const.CONF_EXPLORER_PATH));
pv.jcbRegexp.setSelected(Conf.getBoolean(Const.CONF_REGEXP));
pv.jcbCheckUpdates.setSelected(Conf.getBoolean(Const.CONF_CHECK_FOR_UPDATE));
pv.jcbForceFileDate.setSelected(Conf.getBoolean(Const.CONF_FORCE_FILE_DATE));
pv.psJajukWorkspace.setURL(Conf.getString(Const.CONF_TARGET_WORKSPACE_PATH));
}
/**
* Update selection network.
*
*/
private void updateGUIFromConfNetwork() {
pv.jcbNoneInternetAccess.setSelected(Conf.getBoolean(Const.CONF_NETWORK_NONE_INTERNET_ACCESS));
final boolean bUseProxy = Conf.getBoolean(Const.CONF_NETWORK_USE_PROXY);
pv.jcbProxyNone.setSelected(bUseProxy);
pv.jtfProxyHostname.setText(Conf.getString(Const.CONF_NETWORK_PROXY_HOSTNAME));
pv.jtfProxyHostname.setEnabled(bUseProxy);
pv.jlProxyHostname.setEnabled(bUseProxy);
pv.jtfProxyPort.setText(Conf.getString(Const.CONF_NETWORK_PROXY_PORT));
pv.jtfProxyPort.setEnabled(bUseProxy);
pv.jlProxyPort.setEnabled(bUseProxy);
pv.jtfProxyLogin.setText(Conf.getString(Const.CONF_NETWORK_PROXY_LOGIN));
pv.jtfProxyLogin.setEnabled(bUseProxy);
pv.jlProxyLogin.setEnabled(bUseProxy);
pv.jtfProxyPwd.setText(UtilString.rot13(Conf.getString(Const.CONF_NETWORK_PROXY_PWD)));
pv.jtfProxyPwd.setEnabled(bUseProxy);
pv.jlProxyPwd.setEnabled(bUseProxy);
pv.connectionTO.setValue(Conf.getInt(Const.CONF_NETWORK_CONNECTION_TO));
if (!Conf.getBoolean(Const.CONF_NETWORK_USE_PROXY)) {
pv.jcbProxyNone.setSelected(true);
} else if (Const.PROXY_TYPE_HTTP.equals(Conf.getString(Const.CONF_NETWORK_PROXY_TYPE))) {
pv.jcbProxyHttp.setSelected(true);
} else if (Const.PROXY_TYPE_SOCKS.equals(Conf.getString(Const.CONF_NETWORK_PROXY_TYPE))) {
pv.jcbProxySocks.setSelected(true);
}
}
/**
* Update selection covers.
*
*/
private void updateGUIFromConfCovers() {
pv.jcbAutoCover.setSelected(Conf.getBoolean(Const.CONF_COVERS_AUTO_COVER));
pv.jlCoverSize.setEnabled(Conf.getBoolean(Const.CONF_COVERS_AUTO_COVER));
pv.jcb3dCover.setSelected(Conf.getBoolean(Const.CONF_COVERS_MIRROW_COVER));
pv.jcb3dCoverFS.setSelected(Conf.getBoolean(Const.CONF_COVERS_MIRROW_COVER_FS_MODE));
pv.jcbCoverSize.setEnabled(Conf.getBoolean(Const.CONF_COVERS_AUTO_COVER));
pv.jcbCoverSize.setSelectedIndex(Conf.getInt(Const.CONF_COVERS_SIZE));
pv.jcbShuffleCover.setSelected(Conf.getBoolean(Const.CONF_COVERS_SHUFFLE));
pv.jcbSaveExplorerFriendly.setSelected(Conf
.getBoolean(Const.CONF_COVERS_SAVE_EXPLORER_FRIENDLY));
pv.jtfDefaultCoverSearchPattern.setText(Conf.getString(Const.FILE_DEFAULT_COVER));
pv.jcbAudioScrobbler.setSelected(Conf.getBoolean(Const.CONF_LASTFM_AUDIOSCROBBLER_ENABLE));
pv.jcbEnableLastFMInformation.setSelected(Conf.getBoolean(Const.CONF_LASTFM_INFO));
pv.jtfASUser.setText(Conf.getString(Const.CONF_LASTFM_USER));
pv.jpfASPassword.setText(UtilString.rot13(Conf.getString(Const.CONF_LASTFM_PASSWORD)));
if (!Conf.getBoolean(Const.CONF_LASTFM_AUDIOSCROBBLER_ENABLE)) {
pv.jlASUser.setEnabled(false);
pv.jtfASUser.setEnabled(false);
pv.jlASPassword.setEnabled(false);
pv.jpfASPassword.setEnabled(false);
}
}
/**
* Update GUI tab.
*/
private void updateGUIFromConfGUI() {
String notificatorType = Messages.getString(ParameterView.NOTIFICATOR_PREFIX
+ Conf.getString(Const.CONF_UI_NOTIFICATOR_TYPE));
pv.jcbNotificationType.setSelectedItem(notificatorType);
pv.jcbShowSystray.setSelected(Conf.getBoolean(Const.CONF_SHOW_SYSTRAY));
pv.jcbMinimizeToTray.setEnabled(SystemTray.isSupported() && pv.jcbShowSystray.isSelected());
pv.jcbMinimizeToTray.setSelected(Conf.getBoolean(Const.CONF_MINIMIZE_TO_TRAY));
pv.jcbClickTrayAlwaysDisplayWindow.setSelected(Conf
.getBoolean(Const.CONF_TRAY_CLICK_DISPLAY_WINDOW));
pv.jcbClickTrayAlwaysDisplayWindow.setEnabled(SystemTray.isSupported());
pv.jcbSplashscreen.setSelected(Conf.getBoolean(Const.CONF_SPLASH_SCREEN));
pv.scbLAF.removeActionListener(this);
pv.scbLAF.setSelectedItem(Conf.getString(Const.CONF_OPTIONS_LNF));
pv.scbLAF.addActionListener(this);
pv.jsPerspectiveSize.setValue(Conf.getInt(Const.CONF_PERSPECTIVE_ICONS_SIZE));
pv.jcbTitleAnimation.setSelected(Conf.getBoolean(Const.CONF_TITLE_ANIMATION));
}
/**
* Apply parameters options.
* Options for "Options", "LastFM", "Sound" and "Modes" tabs
*
*/
private void updateConfFromGUIOptions() {
HashMap<String, String> properties = new HashMap<String, String>(10);
properties.put(Const.CONF_OPTIONS_HIDE_UNMOUNTED,
Boolean.toString(pv.jcbDisplayUnmounted.isSelected()));
properties.put(Const.CONF_OPTIONS_PUSH_ON_CLICK,
Boolean.toString(pv.jcbDefaultActionClick.isSelected()));
properties.put(Const.CONF_OPTIONS_PUSH_ON_DROP,
Boolean.toString(pv.jcbDefaultActionDrop.isSelected()));
properties.put(Const.CONF_OPTIONS_HOTKEYS, Boolean.toString(pv.jcbHotkeys.isSelected()));
properties.put(Const.CONF_LASTFM_AUDIOSCROBBLER_ENABLE,
Boolean.toString(pv.jcbAudioScrobbler.isSelected()));
properties.put(Const.CONF_LASTFM_INFO,
Boolean.toString(pv.jcbEnableLastFMInformation.isSelected()));
properties.put(Const.CONF_LASTFM_USER, pv.jtfASUser.getText());
properties.put(Const.CONF_LASTFM_PASSWORD,
UtilString.rot13(new String(pv.jpfASPassword.getPassword())));
final int iLogLevel = pv.scbLogLevel.getSelectedIndex();
Log.setVerbosity(iLogLevel);
properties.put(Const.CONF_OPTIONS_LOG_LEVEL, Integer.toString(iLogLevel));
properties.put(Const.CONF_OPTIONS_INTRO_BEGIN, Integer.toString(pv.introPosition.getValue()));
properties.put(Const.CONF_OPTIONS_INTRO_LENGTH, Integer.toString(pv.introLength.getValue()));
properties.put(Const.CONF_TAGS_USE_PARENT_DIR,
Boolean.toString(pv.jcbUseParentDir.isSelected()));
final String sBestofSize = pv.jtfBestofSize.getText();
if (!sBestofSize.isEmpty()) {
properties.put(Const.CONF_BESTOF_TRACKS_SIZE, sBestofSize);
}
Locale locale = LocaleManager.getLocaleForDesc(((JLabel) pv.scbLanguage.getSelectedItem())
.getText());
final String sLocal = locale.getLanguage();
properties.put(Const.CONF_OPTIONS_LANGUAGE, sLocal);
// force refresh of bestof files
RatingService.setRateHasChanged(true);
final String sNoveltiesAge = pv.jtfNoveltiesAge.getText();
if (!sNoveltiesAge.isEmpty()) {
properties.put(Const.CONF_OPTIONS_NOVELTIES_AGE, sNoveltiesAge);
}
final int oldDuration = Conf.getInt(Const.CONF_FADE_DURATION);
// Show an hideable message if user set cross fade under linux for sound
// server information
if (UtilSystem.isUnderLinux() && (oldDuration == 0)
&& (oldDuration != pv.crossFadeDuration.getValue())) {
Messages.showHideableWarningMessage(Messages.getString("ParameterView.210"),
Const.CONF_NOT_SHOW_AGAIN_CROSS_FADE);
}
properties.put(Const.CONF_FADE_DURATION, Integer.toString(pv.crossFadeDuration.getValue()));
properties.put(Const.CONF_USE_VOLNORM, Boolean.toString(pv.jcbUseVolnorm.isSelected()));
properties.put(Const.CONF_BIT_PERFECT, Boolean.toString(pv.jcbEnableBitPerfect.isSelected()));
boolean oldShowVideo = Conf.getBoolean(Const.CONF_SHOW_VIDEOS);
if (oldShowVideo != pv.jcbShowVideos.isSelected()) {
this.someOptionsAppliedAtNextStartup = true;
}
properties.put(Const.CONF_SHOW_VIDEOS, Boolean.toString(pv.jcbShowVideos.isSelected()));
properties.put(Const.CONF_PRESERVE_FILE_DATES,
Boolean.toString(pv.jcbPreserveFileDates.isSelected()));
Conf.setProperties(properties);
}
/**
* Apply parameters startup.
*
*/
private void updateConfFromGUIStartup() {
HashMap<String, String> properties = new HashMap<String, String>(10);
if (pv.jrbNothing.isSelected()) {
properties.put(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_NOTHING);
} else if (pv.jrbLast.isSelected()) {
properties.put(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_LAST);
} else if (pv.jrbLastKeepPos.isSelected()) {
properties.put(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_LAST_KEEP_POS);
} else if (pv.jrbShuffle.isSelected()) {
properties.put(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_SHUFFLE);
} else if (pv.jrbFile.isSelected()) {
properties.put(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_ITEM);
} else if (pv.jrbBestof.isSelected()) {
properties.put(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_BESTOF);
} else if (pv.jrbNovelties.isSelected()) {
properties.put(Const.CONF_STARTUP_MODE, Const.STARTUP_MODE_NOVELTIES);
}
Conf.setProperties(properties);
}
/**
* Apply parameters confirmation.
*
*/
private void updateConfFromGUIConfirmation() {
HashMap<String, String> properties = new HashMap<String, String>(10);
properties.put(Const.CONF_CONFIRMATIONS_DELETE_FILE,
Boolean.toString(pv.jcbBeforeDelete.isSelected()));
properties.put(Const.CONF_CONFIRMATIONS_EXIT, Boolean.toString(pv.jcbBeforeExit.isSelected()));
properties.put(Const.CONF_CONFIRMATIONS_REMOVE_DEVICE,
Boolean.toString(pv.jcbBeforeRemoveDevice.isSelected()));
properties.put(Const.CONF_CONFIRMATIONS_DELETE_COVER,
Boolean.toString(pv.jcbBeforeDeleteCover.isSelected()));
properties.put(Const.CONF_CONFIRMATIONS_CLEAR_HISTORY,
Boolean.toString(pv.jcbBeforeClearingHistory.isSelected()));
properties.put(Const.CONF_CONFIRMATIONS_RESET_RATINGS,
Boolean.toString(pv.jcbBeforeResetingRatings.isSelected()));
properties.put(Const.CONF_CONFIRMATIONS_REFACTOR_FILES,
Boolean.toString(pv.jcbBeforeRefactorFiles.isSelected()));
properties.put(Const.CONF_CONFIRMATIONS_BEFORE_TAG_WRITE,
Boolean.toString(pv.jcbBeforeWritingTag.isSelected()));
Conf.setProperties(properties);
}
/**
* Apply parameters history.
*
*/
private void updateConfFromGUIHistory() {
final String sHistoryDuration = pv.jtfHistory.getText();
if (!sHistoryDuration.isEmpty()) {
Conf.setProperty(Const.CONF_HISTORY, sHistoryDuration);
}
boolean oldManualValue = Conf.getBoolean(Const.CONF_MANUAL_RATINGS);
if (pv.jcbManualRatings.isSelected() != oldManualValue) {
Conf.setProperty(Const.CONF_MANUAL_RATINGS,
Boolean.toString(pv.jcbManualRatings.isSelected()));
ObservationManager.notify(new JajukEvent(JajukEvents.RATING_MODE_CHANGED));
}
}
/**
* Apply parameters patterns.
*
*/
private void updateConfFromGUIPatterns() {
HashMap<String, String> properties = new HashMap<String, String>(10);
properties.put(Const.CONF_PATTERN_REFACTOR, pv.jtfRefactorPattern.getText());
properties.put(Const.CONF_PATTERN_ANIMATION, pv.jtfAnimationPattern.getText());
properties.put(Const.CONF_PATTERN_FRAME_TITLE, pv.jtfFrameTitle.getText());
properties.put(Const.CONF_PATTERN_BALLOON_NOTIFIER, pv.jtfBalloonNotifierPattern.getText());
properties.put(Const.CONF_PATTERN_INFORMATION, pv.jtfInformationPattern.getText());
Conf.setProperties(properties);
}
/**
* Apply parameters advanced.
*
*/
private void updateConfFromGUIAdvanced() {
HashMap<String, String> properties = new HashMap<String, String>(10);
properties.put(Const.CONF_BACKUP_SIZE, Integer.toString(pv.backupSize.getValue()));
properties.put(Const.CONF_REGEXP, Boolean.toString(pv.jcbRegexp.isSelected()));
properties.put(Const.CONF_CHECK_FOR_UPDATE, Boolean.toString(pv.jcbCheckUpdates.isSelected()));
properties.put(Const.CONF_FORCE_FILE_DATE, Boolean.toString(pv.jcbForceFileDate.isSelected()));
// Apply new mplayer path and display a warning message if changed
final String oldMplayerPath = Conf.getString(Const.CONF_MPLAYER_PATH_FORCED);
if (!(oldMplayerPath.equals(pv.jtfMPlayerPath.getText()))) {
this.someOptionsAppliedAtNextStartup = true;
}
properties.put(Const.CONF_MPLAYER_PATH_FORCED, pv.jtfMPlayerPath.getText());
properties.put(Const.CONF_MPLAYER_ARGS, pv.jtfMPlayerArgs.getText());
properties.put(Const.CONF_ENV_VARIABLES, pv.jtfEnvVariables.getText());
properties.put(Const.CONF_EXPLORER_PATH, pv.jtfExplorerPath.getText());
Conf.setProperties(properties);
}
/**
* Apply parameters gui.
*
*/
private void updateConfFromGUIGUI() {
HashMap<String, String> properties = new HashMap<String, String>(10);
properties.put(Const.CONF_CATALOG_PAGE_SIZE, Integer.toString(pv.jsCatalogPages.getValue()));
properties.put(Const.CONF_SHOW_POPUPS, Boolean.toString(pv.jcbShowPopups.isSelected()));
properties.put(Const.CONF_SPLASH_SCREEN, Boolean.toString(pv.jcbSplashscreen.isSelected()));
final int oldFont = Conf.getInt(Const.CONF_FONTS_SIZE);
// Display a message if font size changed
if (oldFont != pv.jsFonts.getValue()) {
this.someOptionsAppliedAtNextStartup = true;
}
properties.put(Const.CONF_FONTS_SIZE, Integer.toString(pv.jsFonts.getValue()));
// Notificator type
String notificatorTypeDisplayed = (String) pv.jcbNotificationType.getSelectedItem();
for (NotificatorTypes notificatorType : NotificatorTypes.values()) {
if (Messages.getString(ParameterView.NOTIFICATOR_PREFIX + notificatorType).equals(
notificatorTypeDisplayed)) {
properties.put(Const.CONF_UI_NOTIFICATOR_TYPE, notificatorType.name());
}
}
// Message if show systray is changed
final boolean bOldShowSystray = Conf.getBoolean(Const.CONF_SHOW_SYSTRAY);
if (bOldShowSystray != pv.jcbShowSystray.isSelected()) {
this.someOptionsAppliedAtNextStartup = true;
}
properties.put(Const.CONF_SHOW_SYSTRAY, Boolean.toString(pv.jcbShowSystray.isSelected()));
properties.put(Const.CONF_TITLE_ANIMATION, Boolean.toString(pv.jcbTitleAnimation.isSelected()));
// Minimize to tray
properties
.put(Const.CONF_MINIMIZE_TO_TRAY, Boolean.toString(pv.jcbMinimizeToTray.isSelected()));
properties.put(Const.CONF_TRAY_CLICK_DISPLAY_WINDOW,
Boolean.toString(pv.jcbClickTrayAlwaysDisplayWindow.isSelected()));
final int oldPerspectiveSize = Conf.getInt(Const.CONF_PERSPECTIVE_ICONS_SIZE);
// If we perspective size changed and no font message have been already
// displayed, display a message
if (oldPerspectiveSize != pv.jsPerspectiveSize.getValue()) {
this.someOptionsAppliedAtNextStartup = true;
}
properties.put(Const.CONF_PERSPECTIVE_ICONS_SIZE,
Integer.toString(pv.jsPerspectiveSize.getValue()));
// LAF change
final String oldTheme = Conf.getString(Const.CONF_OPTIONS_LNF);
properties.put(Const.CONF_OPTIONS_LNF, (String) pv.scbLAF.getSelectedItem());
if (!oldTheme.equals(pv.scbLAF.getSelectedItem())) {
// theme will be applied at next startup
Messages.showHideableWarningMessage(Messages.getString("ParameterView.233"),
Const.CONF_NOT_SHOW_AGAIN_LAF_CHANGE);
pv.bLAFMessage = true;
}
Conf.setProperties(properties);
}
/**
* Apply parameters network.
*
*/
private void updateConfFromGUINetwork() {
HashMap<String, String> properties = new HashMap<String, String>(10);
properties.put(Const.CONF_NETWORK_NONE_INTERNET_ACCESS,
Boolean.toString(pv.jcbNoneInternetAccess.isSelected()));
properties.put(Const.CONF_NETWORK_USE_PROXY, Boolean.toString(!pv.jcbProxyNone.isSelected()));
if (pv.jcbProxyHttp.isSelected()) {
properties.put(Const.CONF_NETWORK_PROXY_TYPE, Const.PROXY_TYPE_HTTP);
} else if (pv.jcbProxySocks.isSelected()) {
properties.put(Const.CONF_NETWORK_PROXY_TYPE, Const.PROXY_TYPE_SOCKS);
}
properties.put(Const.CONF_NETWORK_PROXY_HOSTNAME, pv.jtfProxyHostname.getText());
properties.put(Const.CONF_NETWORK_PROXY_PORT, pv.jtfProxyPort.getText());
properties.put(Const.CONF_NETWORK_PROXY_LOGIN, pv.jtfProxyLogin.getText());
properties.put(Const.CONF_NETWORK_PROXY_PWD,
UtilString.rot13(new String(pv.jtfProxyPwd.getPassword())));
properties.put(Const.CONF_NETWORK_CONNECTION_TO, Integer.toString(pv.connectionTO.getValue()));
Conf.setProperties(properties);
// Force global reload of proxy variables
DownloadManager.setDefaultProxySettings();
}
/**
* Apply parameters cover.
*
*/
private void updateConfFromGUICover() {
HashMap<String, String> properties = new HashMap<String, String>(10);
properties.put(Const.CONF_COVERS_MIRROW_COVER, Boolean.toString(pv.jcb3dCover.isSelected()));
properties.put(Const.CONF_COVERS_MIRROW_COVER_FS_MODE,
Boolean.toString(pv.jcb3dCoverFS.isSelected()));
ObservationManager.notify(new JajukEvent(JajukEvents.COVER_NEED_REFRESH));
properties.put(Const.CONF_COVERS_AUTO_COVER, Boolean.toString(pv.jcbAutoCover.isSelected()));
properties.put(Const.CONF_COVERS_SHUFFLE, Boolean.toString(pv.jcbShuffleCover.isSelected()));
properties.put(Const.CONF_COVERS_SAVE_EXPLORER_FRIENDLY,
Boolean.toString(pv.jcbSaveExplorerFriendly.isSelected()));
properties.put(Const.CONF_COVERS_SIZE, Integer.toString(pv.jcbCoverSize.getSelectedIndex()));
properties.put(Const.FILE_DEFAULT_COVER, pv.jtfDefaultCoverSearchPattern.getText());
Conf.setProperties(properties);
}
/**
* Handle workspace change.
*
*/
private void handleWorkspaceChange() {
if (!Conf.getString(Const.CONF_TARGET_WORKSPACE_PATH).equals(pv.psJajukWorkspace.getUrl())) {
Conf.setProperty(Const.CONF_TARGET_WORKSPACE_PATH, pv.psJajukWorkspace.getUrl());
// Check workspace directory
if (!pv.psJajukWorkspace.getUrl().trim().isEmpty()) {
// Check workspace presence and create it if required
final java.io.File fWorkspace = new java.io.File(pv.psJajukWorkspace.getUrl());
if (!fWorkspace.exists() && !fWorkspace.mkdirs()) {
Log.warn("Could not create directory " + fWorkspace.toString());
}
if (!fWorkspace.canRead()) {
Messages.showErrorMessage(165);
return;
}
}
try {
final String newWorkspace = pv.psJajukWorkspace.getUrl();
// If target workspace doesn't exist, copy current repository to
// the new workspace
// (keep old repository for security and for use
// by others users in multi-session mode)
boolean bPreviousPathExist = true;
// bPreviousPathExist is true if destination workspace already
// exists,
// it is then only a workspace switch
if (!new java.io.File(pv.psJajukWorkspace.getUrl() + '/'
+ (SessionService.isTestMode() ? ".jajuk_test_" + Const.TEST_VERSION : ".jajuk"))
.exists()) {
UtilGUI.waiting();
final java.io.File from = SessionService.getConfFileByPath("");
final java.io.File dest = new java.io.File(newWorkspace + '/'
+ (SessionService.isTestMode() ? ".jajuk_test_" + Const.TEST_VERSION : ".jajuk"));
UtilSystem.copyRecursively(from, dest);
bPreviousPathExist = false;
}
// Change the workspace so the very last conf (like current
// track)
// will be saved directly to target workspace. We don't do
// this if the workspace already exist to avoid overwriting other
// configuration.
SessionService.setWorkspace(pv.psJajukWorkspace.getUrl());
//Commit the bootstrap file
SessionService.commitBootstrapFile();
UtilGUI.stopWaiting();
// Display a warning message and restart Jajuk
if (bPreviousPathExist) {
Messages.getChoice(Messages.getString("ParameterView.247"), JOptionPane.DEFAULT_OPTION,
JOptionPane.INFORMATION_MESSAGE);
} else {
Messages.getChoice(Messages.getString("ParameterView.209"), JOptionPane.DEFAULT_OPTION,
JOptionPane.INFORMATION_MESSAGE);
}
// Exit Jajuk
try {
ActionManager.getAction(JajukActions.EXIT).perform(null);
} catch (Exception e1) {
Log.error(e1);
}
} catch (final Exception e) {
Messages.showErrorMessage(24);
Log.error(e);
}
}
}
/*
* (non-Javadoc)
*
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
@Override
public void actionPerformed(final ActionEvent e) {
if (e.getSource() == pv.jbClearHistory) {
// show confirmation message if required
if (Conf.getBoolean(Const.CONF_CONFIRMATIONS_CLEAR_HISTORY)) {
final int iResu = Messages.getChoice(Messages.getString("Confirmation_clear_history"),
JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
if (iResu != JOptionPane.YES_OPTION) {
return;
}
}
ObservationManager.notify(new JajukEvent(JajukEvents.CLEAR_HISTORY));
} else if (e.getSource() == pv.scbLAF) {
// Refresh full GUI at each LAF change as a preview
UtilGUI.setupSubstanceLookAndFeel((String) pv.scbLAF.getSelectedItem());
UtilGUI.updateAllUIs();
} else if (e.getSource() == pv.jbResetRatings) {
// show confirmation message if required
if (Conf.getBoolean(Const.CONF_CONFIRMATIONS_RESET_RATINGS)) {
final int iResu = Messages.getChoice(Messages.getString("Confirmation_reset_ratings"),
JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
if (iResu != JOptionPane.YES_OPTION) {
return;
}
}
ObservationManager.notify(new JajukEvent(JajukEvents.RATE_RESET));
} else if (e.getSource() == pv.jbResetPreferences) {
// show confirmation message if required
if (Conf.getBoolean(Const.CONF_CONFIRMATIONS_RESET_RATINGS)) {
final int iResu = Messages.getChoice(Messages.getString("Confirmation_reset_preferences"),
JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
if (iResu != JOptionPane.YES_OPTION) {
return;
}
}
if (!DeviceManager.getInstance().isAnyDeviceRefreshing()) {
ObservationManager.notify(new JajukEvent(JajukEvents.PREFERENCES_RESET));
} else {
Messages.showErrorMessage(120);
}
} else if (e.getSource() == pv.jbOK) {
updateConfFromGUI();
// Notify any client than wait for parameters updates
final Properties details = new Properties();
details.put(Const.DETAIL_ORIGIN, this);
ObservationManager.notify(new JajukEvent(JajukEvents.PARAMETERS_CHANGE, details));
if (someOptionsAppliedAtNextStartup) {
// Inform user that some parameters will apply only at
// next startup
Messages.showInfoMessage(Messages.getString("ParameterView.198"));
someOptionsAppliedAtNextStartup = false;
}
// Update Mute state according to bit-perfect mode
ActionManager.getAction(JajukActions.MUTE_STATE).setEnabled(
!Conf.getBoolean(Const.CONF_BIT_PERFECT));
} else if (e.getSource() == pv.jbDefault) {
int resu = Messages.getChoice(Messages.getString("Confirmation_defaults"),
JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE);
if (resu == JOptionPane.OK_OPTION) {
Conf.setDefaultProperties();
updateGUIFromConf();// update UI
InformationJPanel.getInstance().setMessage(Messages.getString("ParameterView.110"),
InformationJPanel.MessageType.INFORMATIVE);
updateConfFromGUI();
Messages.showInfoMessage(Messages.getString("ParameterView.198"));
}
} else if (e.getSource() == pv.jcbBackup) {
// if backup option is unchecked, reset backup size
if (pv.jcbBackup.isSelected()) {
pv.backupSize.setEnabled(true);
pv.backupSize.setValue(Conf.getInt(Const.CONF_BACKUP_SIZE));
} else {
pv.backupSize.setEnabled(false);
pv.backupSize.setValue(0);
}
} else if ((e.getSource() == pv.jcbProxyNone) || (e.getSource() == pv.jcbProxyHttp)
|| (e.getSource() == pv.jcbProxySocks)) {
final boolean bUseProxy = !pv.jcbProxyNone.isSelected();
pv.jtfProxyHostname.setEnabled(bUseProxy);
pv.jtfProxyPort.setEnabled(bUseProxy);
pv.jtfProxyLogin.setEnabled(bUseProxy);
pv.jtfProxyPwd.setEnabled(bUseProxy);
pv.jlProxyHostname.setEnabled(bUseProxy);
pv.jlProxyPort.setEnabled(bUseProxy);
pv.jlProxyLogin.setEnabled(bUseProxy);
pv.jlProxyPwd.setEnabled(bUseProxy);
} else if (e.getSource() == pv.jcbAutoCover) {
if (pv.jcbAutoCover.isSelected()) {
pv.jcbCoverSize.setEnabled(true);
pv.jlCoverSize.setEnabled(true);
} else {
pv.jlCoverSize.setEnabled(false);
pv.jcbCoverSize.setEnabled(false);
}
} else if (e.getSource() == pv.jcbAudioScrobbler) {
if (pv.jcbAudioScrobbler.isSelected()) {
pv.jlASUser.setEnabled(true);
pv.jtfASUser.setEnabled(true);
pv.jlASPassword.setEnabled(true);
pv.jpfASPassword.setEnabled(true);
} else {
pv.jlASUser.setEnabled(false);
pv.jtfASUser.setEnabled(false);
pv.jlASPassword.setEnabled(false);
pv.jpfASPassword.setEnabled(false);
}
} else if (e.getSource() == pv.scbLanguage) {
Locale locale = LocaleManager.getLocaleForDesc(((JLabel) pv.scbLanguage.getSelectedItem())
.getText());
final String sLocal = locale.getLanguage();
final String sPreviousLocal = LocaleManager.getLocale().getLanguage();
if (!sPreviousLocal.equals(sLocal)) {
// local has changed
someOptionsAppliedAtNextStartup = true;
}
} else if (e.getSource() == pv.jcbHotkeys) {
someOptionsAppliedAtNextStartup = true;
} else if (e.getSource() == pv.jbCatalogRefresh) {
new Thread("Parameter Catalog refresh Thread") {
@Override
public void run() {
UtilGUI.waiting();
// Force albums to search for new covers
AlbumManager.getInstance().resetCoverCache();
// Clean thumbs
ThumbnailManager.cleanThumbs(Const.THUMBNAIL_SIZE_50X50);
ThumbnailManager.cleanThumbs(Const.THUMBNAIL_SIZE_100X100);
ThumbnailManager.cleanThumbs(Const.THUMBNAIL_SIZE_150X150);
ThumbnailManager.cleanThumbs(Const.THUMBNAIL_SIZE_200X200);
ThumbnailManager.cleanThumbs(Const.THUMBNAIL_SIZE_250X250);
ThumbnailManager.cleanThumbs(Const.THUMBNAIL_SIZE_300X300);
UtilGUI.stopWaiting();
// For catalog view's update
ObservationManager.notify(new JajukEvent(JajukEvents.DEVICE_REFRESH));
// Display a message
Messages.showInfoMessage(Messages.getString("Success"));
}
}.start();
}
// Bit-perfect and audio normalization/cross fade options are mutually exclusive
else if (e.getSource().equals(pv.jcbEnableBitPerfect)) {
pv.jcbUseVolnorm.setEnabled(!pv.jcbEnableBitPerfect.isSelected());
if (pv.jcbUseVolnorm.isSelected() && pv.jcbEnableBitPerfect.isSelected()) {
pv.jcbUseVolnorm.setSelected(false);
}
pv.crossFadeDuration.setEnabled(!pv.jcbEnableBitPerfect.isSelected());
} else if (e.getSource().equals(pv.jbReloadRadiosPreset)) {
SwingWorker<Boolean, Void> worker = new SwingWorker<Boolean, Void>() {
@Override
protected Boolean doInBackground() throws Exception {
try {
java.io.File fPresets = SessionService.getConfFileByPath(Const.FILE_WEB_RADIOS_PRESET);
DownloadManager.download(new URL(Const.URL_WEBRADIO_PRESETS), fPresets);
WebRadioHelper.loadPresetsRadios(fPresets);
return true;
} catch (Exception ex) {
Log.error(ex);
return false;
}
}
@Override
protected void done() {
try {
boolean result = get();
if (result) {
Messages.showInfoMessage(Messages.getString("Success"));
ObservationManager.notify(new JajukEvent(JajukEvents.DEVICE_REFRESH));
} else {
Messages.showErrorMessage(9);
}
} catch (Exception e) {
Log.error(e);
}
}
};
worker.execute();
}
}
/*
* (non-Javadoc)
*
* @see java.awt.event.ItemListener#itemStateChanged(java.awt.event.ItemEvent)
*/
@Override
public void itemStateChanged(final ItemEvent e) {
if (e.getSource() == pv.jrbFile) { // jrbFile has been selected or
// deselected
pv.sbSearch.setEnabled(pv.jrbFile.isSelected());
}
}
/*
* (non-Javadoc)
*
* @see javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent )
*/
@Override
public void stateChanged(final ChangeEvent e) {
// when changing tab, store it for future jajuk sessions
Conf.setProperty(Const.CONF_OPTIONS_TAB, Integer.toString(pv.jtpMain.getSelectedIndex()));
}
}