Java tutorial
/* * TV-Browser * Copyright (C) 04-2003 Martin Oberhauser (martin@tvbrowser.org) * * 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 (at your option) 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. * * CVS information: * $Date: 2010-12-18 12:46:19 +0100 (Sat, 18 Dec 2010) $ * $Author: bananeweizen $ * $Revision: 6846 $ */ package tvbrowser.ui.settings; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import javax.swing.ButtonGroup; import javax.swing.Icon; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JSpinner; import javax.swing.SpinnerNumberModel; import tvbrowser.TVBrowser; import tvbrowser.core.Settings; import tvbrowser.core.icontheme.IconLoader; import tvbrowser.ui.mainframe.MainFrame; import tvbrowser.ui.mainframe.PeriodItem; import util.ui.Localizer; import util.ui.UiUtilities; import ca.beq.util.win32.registry.RegistryKey; import ca.beq.util.win32.registry.RootKey; import com.jgoodies.forms.builder.PanelBuilder; import com.jgoodies.forms.factories.Borders; import com.jgoodies.forms.factories.DefaultComponentFactory; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.FormLayout; import com.jgoodies.forms.layout.RowSpec; /** * TV-Browser * * @author Martin Oberhauser */ public class StartupSettingsTab implements devplugin.SettingsTab { /** The localizer for this class. */ private static final util.ui.Localizer mLocalizer = util.ui.Localizer.getLocalizerFor(StartupSettingsTab.class); private JPanel mSettingsPn; private JCheckBox mShowSplashChB, mMinimizeAfterStartUpChB, mStartFullscreen, mAutostartWithWindows; private File mLinkFileFile; private LinkFile mLinkFile; /* Refresh settings */ private static final String[] AUTO_DOWNLOAD_MSG_ARR = new String[] { mLocalizer.msg("autoDownload.daily", "Once a day"), mLocalizer.msg("autoDownload.every3days", "Every three days"), mLocalizer.msg("autoDownload.weekly", "Weekly") }; private JCheckBox mAutoDownload; private JRadioButton mStartDownload; private JRadioButton mRecurrentDownload; private JComboBox mAutoDownloadCombo; private JComboBox mAutoDownloadPeriodCB; private JRadioButton mAskBeforeDownloadRadio; private JRadioButton mAskTimeRadio; private JLabel mHowOften; private JCheckBox mDateCheck; private JCheckBox mAutoDownloadWaitingTime; private JSpinner mAutoDownloadWaitingTimeSp; /* Close settings */ private JCheckBox mOnlyMinimizeWhenWindowClosingChB; private JCheckBox mAskForExitConfirmation; private JCheckBox mShowFinishDialog; private JLabel mSecondsLabel; /** * Creates the settings panel for this tab. */ public JPanel createSettingsPanel() { FormLayout layout = new FormLayout("5dlu, pref, 3dlu, pref, fill:3dlu:grow, 3dlu", "pref, 5dlu, pref, 1dlu, pref, 1dlu, pref, 10dlu, pref, 10dlu, pref, 5dlu, pref, pref"); mSettingsPn = new JPanel(layout); mSettingsPn.setBorder(Borders.DIALOG_BORDER); CellConstraints cc = new CellConstraints(); int y = 1; mSettingsPn.add(DefaultComponentFactory.getInstance().createSeparator(mLocalizer.msg("title", "Startup")), cc.xyw(1, y++, 5)); mMinimizeAfterStartUpChB = new JCheckBox( mLocalizer.msg("minimizeAfterStartup", "Minimize main window after start up"), Settings.propMinimizeAfterStartup.getBoolean()); mSettingsPn.add(mMinimizeAfterStartUpChB, cc.xy(2, ++y)); y++; mStartFullscreen = new JCheckBox(mLocalizer.msg("startFullscreen", "Start in fullscreen mode"), Settings.propIsUsingFullscreen.getBoolean()); mSettingsPn.add(mStartFullscreen, cc.xy(2, ++y)); mMinimizeAfterStartUpChB.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { mStartFullscreen.setSelected(false); } } }); mStartFullscreen.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { mMinimizeAfterStartUpChB.setSelected(false); } } }); y++; mShowSplashChB = new JCheckBox(mLocalizer.msg("showSplashScreen", "Show splash screen during start up"), Settings.propSplashShow.getBoolean()); mSettingsPn.add(mShowSplashChB, cc.xy(2, ++y)); if (System.getProperty("os.name").toLowerCase().startsWith("windows") && !TVBrowser.isTransportable()) { layout.insertRow(++y, RowSpec.decode("1dlu")); layout.insertRow(++y, RowSpec.decode("pref")); try { RegistryKey shellFolders = new RegistryKey(RootKey.HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"); String path = shellFolders.getValue("Startup").getData().toString(); if (path == null || path.length() < 1 || !(new File(path)).isDirectory()) { throw new Exception(); } mLinkFileFile = new File(path, "TV-Browser.url"); try { mLinkFile = new LinkFile(mLinkFileFile); if (mLinkFileFile.isFile()) { try { if (!mLinkFile.hasTarget((new File("tvbrowser.exe")).getAbsoluteFile())) { createLink(mLinkFile); } } catch (Exception linkException) { mLinkFileFile.delete(); } } } catch (FileNotFoundException fe) { } mAutostartWithWindows = new JCheckBox(mLocalizer.msg("autostart", "Start TV-Browser with Windows"), mLinkFileFile.isFile()); mSettingsPn.add(mAutostartWithWindows, cc.xy(2, y)); } catch (Throwable e) { e.printStackTrace(); } } y++; mSettingsPn.add(createRefreshPanel(), cc.xyw(1, ++y, 5)); y++; String msg = mLocalizer.msg("onlyMinimizeWhenWindowClosing", "When closing the main window only minimize TV-Browser, don't quit."); mOnlyMinimizeWhenWindowClosingChB = new JCheckBox(msg, Settings.propOnlyMinimizeWhenWindowClosing.getBoolean()); mAskForExitConfirmation = new JCheckBox( mLocalizer.msg("askForExitConfirmation", "Ask for confirmation on TV-Browser exit"), !Settings.propHiddenMessageBoxes.containsItem("MainFrame.askForExitConfirm")); mSettingsPn.add(DefaultComponentFactory.getInstance().createSeparator(mLocalizer.msg("closing", "Closing")), cc.xyw(1, ++y, 5)); y++; mSettingsPn.add(mOnlyMinimizeWhenWindowClosingChB, cc.xyw(2, ++y, 4)); mSettingsPn.add(mAskForExitConfirmation, cc.xyw(2, ++y, 4)); return mSettingsPn; } private void createLink(LinkFile link) throws Exception { File tvb = new File("tvbrowser.exe"); if (tvb.getAbsoluteFile().isFile()) { mLinkFile = new LinkFile(mLinkFileFile, tvb, new File(tvb.getAbsoluteFile().getParent() + "\\imgs\\desktop.ico"), 0); } } /** * Called by the host-application, if the user wants to save the settings. */ public void saveSettings() { Settings.propMinimizeAfterStartup.setBoolean(mMinimizeAfterStartUpChB.isSelected()); Settings.propSplashShow.setBoolean(mShowSplashChB.isSelected()); Settings.propIsUsingFullscreen.setBoolean(mStartFullscreen.isSelected()); if (mAutostartWithWindows != null) { if (mAutostartWithWindows.isSelected()) { if (!mLinkFileFile.isFile()) { try { createLink(mLinkFile); } catch (Exception createLink) { } if (!mLinkFileFile.isFile()) { mAutostartWithWindows.setSelected(false); JOptionPane.showMessageDialog(UiUtilities.getLastModalChildOf(MainFrame.getInstance()), mLocalizer.msg("creationError", "Couldn't create autostart shortcut.\nMaybe your have not the right to write in the autostart directory."), Localizer.getLocalization(Localizer.I18N_ERROR), JOptionPane.ERROR_MESSAGE); } } } else if (mLinkFileFile.isFile() && !mLinkFileFile.delete()) { mAutostartWithWindows.setSelected(true); JOptionPane.showMessageDialog(UiUtilities.getLastModalChildOf(MainFrame.getInstance()), mLocalizer.msg("deletionError", "Couldn't delete autostart shortcut.\nMaybe your have not the right to write in the autostart directory."), mLocalizer.msg("error", "Error"), JOptionPane.ERROR_MESSAGE); } } /* Refresh settings*/ int inx = mAutoDownloadCombo.getSelectedIndex(); if (!mAutoDownload.isSelected()) { Settings.propAutoDownloadType.setString("never"); } else if (inx == 0) { Settings.propAutoDownloadType.setString("daily"); } else if (inx == 1) { Settings.propAutoDownloadType.setString("every3days"); } else if (inx == 2) { Settings.propAutoDownloadType.setString("weekly"); } if (mShowFinishDialog.isSelected()) { Settings.propHiddenMessageBoxes.removeItem("downloadDone"); } else if (!Settings.propHiddenMessageBoxes.containsItem("downloadDone")) { Settings.propHiddenMessageBoxes.addItem("downloadDone"); } Settings.propAutoDataDownloadEnabled .setBoolean(mRecurrentDownload.isSelected() && mAutoDownload.isSelected()); Settings.propAskForAutoDownload.setBoolean(mAskBeforeDownloadRadio.isSelected()); PeriodItem periodItem = (PeriodItem) mAutoDownloadPeriodCB.getSelectedItem(); Settings.propAutoDownloadPeriod.setInt(periodItem.getDays()); Settings.propAutoDownloadWaitingTime .setShort(((Integer) mAutoDownloadWaitingTimeSp.getValue()).shortValue()); Settings.propAutoDownloadWaitingEnabled.setBoolean(mAutoDownloadWaitingTime.isSelected()); Settings.propNTPTimeCheck.setBoolean(mDateCheck.isSelected()); /* Close settings */ if (mOnlyMinimizeWhenWindowClosingChB != null) { boolean checked = mOnlyMinimizeWhenWindowClosingChB.isSelected(); Settings.propOnlyMinimizeWhenWindowClosing.setBoolean(checked); } if (mAskForExitConfirmation.isSelected()) { Settings.propHiddenMessageBoxes.removeItem("MainFrame.askForExitConfirm"); } else if (!Settings.propHiddenMessageBoxes.containsItem("MainFrame.askForExitConfirm")) { Settings.propHiddenMessageBoxes.addItem("MainFrame.askForExitConfirm"); } } /** * Returns the name of the tab-sheet. */ public Icon getIcon() { return IconLoader.getInstance().getIconFromTheme("actions", "document-properties", 16); } /** * Returns the title of the tab-sheet. */ public String getTitle() { return mLocalizer.msg("general", "General"); } private JPanel createRefreshPanel() { PanelBuilder refreshSettings = new PanelBuilder( new FormLayout("5dlu, 9dlu, pref, 3dlu, pref, fill:3dlu:grow, 3dlu", "pref, 5dlu, pref, 3dlu, pref, pref, 3dlu, pref, 5dlu, pref, 3dlu, pref")); CellConstraints cc = new CellConstraints(); refreshSettings.addSeparator(mLocalizer.msg("titleRefresh", "Startup"), cc.xyw(1, 1, 6)); mAutoDownload = new JCheckBox(mLocalizer.msg("autoUpdate", "Update TV listings automatically")); mStartDownload = new JRadioButton(mLocalizer.msg("onStartUp", "Only on TV-Browser startup")); mRecurrentDownload = new JRadioButton(mLocalizer.msg("recurrent", "Recurrent")); ButtonGroup bg = new ButtonGroup(); bg.add(mStartDownload); bg.add(mRecurrentDownload); refreshSettings.add(mAutoDownload, cc.xyw(2, 3, 5)); refreshSettings.add(mStartDownload, cc.xyw(3, 5, 4)); refreshSettings.add(mRecurrentDownload, cc.xyw(3, 6, 4)); mAutoDownloadCombo = new JComboBox(AUTO_DOWNLOAD_MSG_ARR); String dlType = Settings.propAutoDownloadType.getString(); if (dlType.equals("daily")) { mAutoDownloadCombo.setSelectedIndex(0); } else if (dlType.equals("every3days")) { mAutoDownloadCombo.setSelectedIndex(1); } else if (dlType.equals("weekly")) { mAutoDownloadCombo.setSelectedIndex(2); } JPanel panel = new JPanel( new FormLayout("10dlu, pref, 3dlu, pref", "pref, 3dlu, pref, 3dlu, pref, 5dlu, pref")); mStartDownload.setSelected(!dlType.equals("never") && !Settings.propAutoDataDownloadEnabled.getBoolean()); mRecurrentDownload.setSelected(Settings.propAutoDataDownloadEnabled.getBoolean()); mAutoDownload.setSelected(mStartDownload.isSelected() || mRecurrentDownload.isSelected()); mStartDownload.setSelected(!mAutoDownload.isSelected() || mStartDownload.isSelected()); mStartDownload.setEnabled(mAutoDownload.isSelected()); mRecurrentDownload.setEnabled(mAutoDownload.isSelected()); mHowOften = new JLabel(mLocalizer.msg("autoDownload.howOften", "How often?")); panel.add(mHowOften, cc.xy(2, 1)); panel.add(mAutoDownloadCombo, cc.xy(4, 1)); mAskBeforeDownloadRadio = new JRadioButton(mLocalizer.msg("autoDownload.ask", "Ask before downloading")); mAutoDownloadPeriodCB = new JComboBox(PeriodItem.getPeriodItems()); int autoDLPeriod = Settings.propAutoDownloadPeriod.getInt(); PeriodItem pi = new PeriodItem(autoDLPeriod); mAutoDownloadPeriodCB.setSelectedItem(pi); panel.add(mAskBeforeDownloadRadio, cc.xyw(2, 3, 3)); mAskTimeRadio = new JRadioButton(mLocalizer.msg("autoDownload.duration", "Automatically refresh for")); panel.add(mAskTimeRadio, cc.xy(2, 5)); panel.add(mAutoDownloadPeriodCB, cc.xy(4, 5)); ButtonGroup group = new ButtonGroup(); group.add(mAskBeforeDownloadRadio); group.add(mAskTimeRadio); mAskBeforeDownloadRadio.setSelected(Settings.propAskForAutoDownload.getBoolean()); mAskTimeRadio.setSelected(!Settings.propAskForAutoDownload.getBoolean()); mAutoDownloadWaitingTime = new JCheckBox(mLocalizer.msg("autoDownload.waiting", "Delay auto update for"), Settings.propAutoDownloadWaitingEnabled.getBoolean()); mAutoDownloadWaitingTimeSp = new JSpinner( new SpinnerNumberModel(Settings.propAutoDownloadWaitingTime.getShort(), 1, 60, 1)); mSecondsLabel = new JLabel(mLocalizer.msg("autoDownload.seconds", "seconds")); mAutoDownload.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { setAutoDownloadEnabled(e.getStateChange() == ItemEvent.SELECTED); } }); mAskBeforeDownloadRadio.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { setAutoDownloadEnabled(mAutoDownload.isSelected()); } }); mAskTimeRadio.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setAutoDownloadEnabled(mAskTimeRadio.isSelected()); }; }); mAutoDownloadWaitingTime.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { mAutoDownloadWaitingTimeSp.setEnabled(e.getStateChange() == ItemEvent.SELECTED); } }); JPanel waitingPanel = new JPanel(new FormLayout("pref,2dlu,pref,2dlu,pref", "pref")); waitingPanel.add(mAutoDownloadWaitingTime, cc.xy(1, 1)); waitingPanel.add(mAutoDownloadWaitingTimeSp, cc.xy(3, 1)); waitingPanel.add(mSecondsLabel, cc.xy(5, 1)); panel.add(waitingPanel, cc.xyw(1, 7, 4)); refreshSettings.add(panel, cc.xyw(3, 8, 4)); mDateCheck = new JCheckBox(mLocalizer.msg("checkDate", "Check date via NTP if data download fails")); mDateCheck.setSelected(Settings.propNTPTimeCheck.getBoolean()); refreshSettings.add(mDateCheck, cc.xyw(2, 10, 5)); mShowFinishDialog = new JCheckBox(mLocalizer.msg("showFinishDialog", "Show dialog when update is done")); mShowFinishDialog.setSelected(!Settings.propHiddenMessageBoxes.containsItem("downloadDone")); refreshSettings.add(mShowFinishDialog, cc.xyw(2, 12, 5)); setAutoDownloadEnabled(mAutoDownload.isSelected()); return refreshSettings.getPanel(); } private void setAutoDownloadEnabled(boolean enabled) { mRecurrentDownload.setEnabled(enabled); mStartDownload.setEnabled(enabled); mAskBeforeDownloadRadio.setEnabled(enabled); mHowOften.setEnabled(enabled); mAutoDownloadCombo.setEnabled(enabled); mAskTimeRadio.setEnabled(enabled); mAutoDownloadWaitingTime.setEnabled(enabled); mAutoDownloadWaitingTimeSp.setEnabled(enabled && mAutoDownloadWaitingTime.isSelected()); mSecondsLabel.setEnabled(enabled); enabled = !(mAskBeforeDownloadRadio.isSelected() || !enabled); mAutoDownloadPeriodCB.setEnabled(enabled); } /** * Used to create autostart link for Windows. * * @author Ren Mach */ private static class LinkFile { private String mTarget; private LinkFile(File linkFile, File target, File icon, int iconIndex) throws IOException { RandomAccessFile write = new RandomAccessFile(linkFile, "rw"); write.getChannel().truncate(0); write.writeBytes("[InternetShortcut]\r\n"); write.writeBytes("URL=" + target.getAbsoluteFile().toURI().toURL() + "\r\n"); write.writeBytes("WorkingDirectory=" + target.getParent()); if (icon != null && icon.isFile()) { write.writeBytes("\r\nIconFile=" + icon.getAbsolutePath() + "\r\n"); write.writeBytes("IconIndex=" + iconIndex); } write.close(); } /** * @param linkFile The file the link is stored in. * @throws IOException Thrown if something went wrong. */ public LinkFile(File linkFile) throws IOException { RandomAccessFile read = new RandomAccessFile(linkFile, "r"); String line = null; while ((line = read.readLine()) != null) { if (line.startsWith("URL")) { mTarget = line.substring(line.indexOf(":/") + 2); } } read.close(); } /** * If the link target equals the given file. * * @param file The file to check the target for. * @return <code>True</code> if the target matches the link of the file. */ public boolean hasTarget(File file) { return new File(mTarget).equals(file); } } }